diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2014-08-31 16:20:23 +0400 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2014-08-31 22:09:54 +0400 |
commit | da0a670b3c3eaa1e700cd54342dc609d7474af26 (patch) | |
tree | e0e54f6580aa2018db390a75e03cc18e59b68b71 | |
parent | 3efc174fd6f4f5186ed05a307aab58a4ac6db90a (diff) |
h261, h263 decoders: convert to RL_VLC.
Some additional optimizations in following patch.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
-rw-r--r-- | libavcodec/flv.h | 1 | ||||
-rw-r--r-- | libavcodec/flvdec.c | 12 | ||||
-rw-r--r-- | libavcodec/h261dec.c | 27 | ||||
-rw-r--r-- | libavcodec/ituh263dec.c | 58 |
4 files changed, 60 insertions, 38 deletions
diff --git a/libavcodec/flv.h b/libavcodec/flv.h index 16bc88b663..df508203b3 100644 --- a/libavcodec/flv.h +++ b/libavcodec/flv.h @@ -28,6 +28,5 @@ void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number); void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level, int run, int last); int ff_flv_decode_picture_header(MpegEncContext *s); -void ff_flv2_decode_ac_esc(GetBitContext *gb, int *level, int *run, int *last); #endif /* AVCODEC_FLV_H */ diff --git a/libavcodec/flvdec.c b/libavcodec/flvdec.c index 3b048f666d..db413f21f2 100644 --- a/libavcodec/flvdec.c +++ b/libavcodec/flvdec.c @@ -22,18 +22,6 @@ #include "flv.h" #include "libavutil/imgutils.h" -void ff_flv2_decode_ac_esc(GetBitContext *gb, int *level, int *run, int *last) -{ - int is11 = get_bits1(gb); - *last = get_bits1(gb); - *run = get_bits(gb, 6); - if (is11) { - *level = get_sbits(gb, 11); - } else { - *level = get_sbits(gb, 7); - } -} - int ff_flv_decode_picture_header(MpegEncContext *s) { int format, width, height; diff --git a/libavcodec/h261dec.c b/libavcodec/h261dec.c index 301ecc111f..5f0eb59e3c 100644 --- a/libavcodec/h261dec.c +++ b/libavcodec/h261dec.c @@ -258,7 +258,7 @@ static int decode_mv_component(GetBitContext *gb, int v) static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded) { MpegEncContext *const s = &h->s; - int code, level, i, j, run; + int level, i, j, run; RLTable *rl = &ff_h261_rl_tcoeff; const uint8_t *scan_table; @@ -303,27 +303,32 @@ static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded) s->block_last_index[n] = i - 1; return 0; } + { + OPEN_READER(re, &s->gb); for (;;) { - code = get_vlc2(&s->gb, rl->vlc.table, TCOEFF_VLC_BITS, 2); - if (code < 0) { + UPDATE_CACHE(re, &s->gb); + GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TCOEFF_VLC_BITS, 2, 0); + if (run == 66 && level) { av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y); return -1; } - if (code == rl->n) { + if (run == 66) { /* escape */ /* The remaining combinations of (run, level) are encoded with a * 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits * level. */ - run = get_bits(&s->gb, 6); - level = get_sbits(&s->gb, 8); - } else if (code == 0) { + run = SHOW_UBITS(re, &s->gb, 6); + SKIP_CACHE(re, &s->gb, 6); + level = SHOW_SBITS(re, &s->gb, 8); + SKIP_COUNTER(re, &s->gb, 6 + 8); + } else if (level == 0) { break; } else { - run = rl->table_run[code]; - level = rl->table_level[code]; - if (get_bits1(&s->gb)) + run--; + if (SHOW_UBITS(re, &s->gb, 1)) level = -level; + SKIP_COUNTER(re, &s->gb, 1); } i += run; if (i >= 64) { @@ -335,6 +340,8 @@ static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded) block[j] = level; i++; } + CLOSE_READER(re, &s->gb); + } s->block_last_index[n] = i - 1; return 0; } diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c index e64c2bb769..c481621fd2 100644 --- a/libavcodec/ituh263dec.c +++ b/libavcodec/ituh263dec.c @@ -418,7 +418,7 @@ static void h263_decode_dquant(MpegEncContext *s){ static int h263_decode_block(MpegEncContext * s, int16_t * block, int n, int coded) { - int code, level, i, j, last, run; + int level, i, j, last, run; RLTable *rl = &ff_h263_rl_inter; const uint8_t *scan_table; GetBitContext gb= s->gb; @@ -479,40 +479,66 @@ static int h263_decode_block(MpegEncContext * s, int16_t * block, return 0; } retry: + { + OPEN_READER(re, &s->gb); for(;;) { - code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); - if (code < 0){ + UPDATE_CACHE(re, &s->gb); + GET_RL_VLC(level, run, re, &s->gb, rl->rl_vlc[0], TEX_VLC_BITS, 2, 0); + if (run == 66 && level){ av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y); return -1; } - if (code == rl->n) { + if (run == 66) { /* escape */ if (CONFIG_FLV_DECODER && s->h263_flv > 1) { - ff_flv2_decode_ac_esc(&s->gb, &level, &run, &last); + int is11 = SHOW_UBITS(re, &s->gb, 1); + SKIP_CACHE(re, &s->gb, 1); + last = SHOW_UBITS(re, &s->gb, 1); + SKIP_CACHE(re, &s->gb, 1); + run = SHOW_UBITS(re, &s->gb, 6); + if (is11) { + SKIP_COUNTER(re, &s->gb, 6); + UPDATE_CACHE(re, &s->gb); + level = SHOW_SBITS(re, &s->gb, 11); + SKIP_COUNTER(re, &s->gb, 1 + 1 + 6 + 11); + } else { + SKIP_CACHE(re, &s->gb, 6); + level = SHOW_SBITS(re, &s->gb, 7); + SKIP_COUNTER(re, &s->gb, 1 + 1 + 6 + 7); + } } else { - last = get_bits1(&s->gb); - run = get_bits(&s->gb, 6); - level = (int8_t)get_bits(&s->gb, 8); + last = SHOW_UBITS(re, &s->gb, 1); + SKIP_CACHE(re, &s->gb, 1); + run = SHOW_UBITS(re, &s->gb, 6); + SKIP_CACHE(re, &s->gb, 6); + level = (int8_t)SHOW_UBITS(re, &s->gb, 8); + SKIP_COUNTER(re, &s->gb, 1 + 6 + 8); if(level == -128){ + UPDATE_CACHE(re, &s->gb); if (s->codec_id == AV_CODEC_ID_RV10) { /* XXX: should patch encoder too */ - level = get_sbits(&s->gb, 12); + level = SHOW_SBITS(re, &s->gb, 12); + SKIP_COUNTER(re, &s->gb, 12); }else{ - level = get_bits(&s->gb, 5); - level |= get_sbits(&s->gb, 6)<<5; + level = SHOW_UBITS(re, &s->gb, 5); + SKIP_CACHE(re, &s->gb, 5); + level |= SHOW_SBITS(re, &s->gb, 6)<<5; + SKIP_COUNTER(re, &s->gb, 5 + 6); } } } } else { - run = rl->table_run[code]; - level = rl->table_level[code]; - last = code >= rl->last; - if (get_bits1(&s->gb)) + run--; + last = run >= 192; + run &= 63; + if (SHOW_UBITS(re, &s->gb, 1)) level = -level; + SKIP_COUNTER(re, &s->gb, 1); } i += run; if (i >= 64){ if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){ + CLOSE_READER(re, &s->gb); //Looks like a hack but no, it's the way it is supposed to work ... rl = &ff_rl_intra_aic; i = 0; @@ -529,6 +555,8 @@ retry: break; i++; } + CLOSE_READER(re, &s->gb); + } not_coded: if (s->mb_intra && s->h263_aic) { ff_h263_pred_acdc(s, block, n); |