h261, h263 decoders: convert to RL_VLC.

Some additional optimizations in following patch.

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
pull/88/head
Reimar Döffinger 10 years ago
parent 3efc174fd6
commit da0a670b3c
  1. 1
      libavcodec/flv.h
  2. 12
      libavcodec/flvdec.c
  3. 27
      libavcodec/h261dec.c
  4. 58
      libavcodec/ituh263dec.c

@ -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); void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level, int run, int last);
int ff_flv_decode_picture_header(MpegEncContext *s); 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 */ #endif /* AVCODEC_FLV_H */

@ -22,18 +22,6 @@
#include "flv.h" #include "flv.h"
#include "libavutil/imgutils.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 ff_flv_decode_picture_header(MpegEncContext *s)
{ {
int format, width, height; int format, width, height;

@ -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) static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
{ {
MpegEncContext *const s = &h->s; MpegEncContext *const s = &h->s;
int code, level, i, j, run; int level, i, j, run;
RLTable *rl = &ff_h261_rl_tcoeff; RLTable *rl = &ff_h261_rl_tcoeff;
const uint8_t *scan_table; 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; s->block_last_index[n] = i - 1;
return 0; return 0;
} }
{
OPEN_READER(re, &s->gb);
for (;;) { for (;;) {
code = get_vlc2(&s->gb, rl->vlc.table, TCOEFF_VLC_BITS, 2); UPDATE_CACHE(re, &s->gb);
if (code < 0) { 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", av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n",
s->mb_x, s->mb_y); s->mb_x, s->mb_y);
return -1; return -1;
} }
if (code == rl->n) { if (run == 66) {
/* escape */ /* escape */
/* The remaining combinations of (run, level) are encoded with a /* The remaining combinations of (run, level) are encoded with a
* 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits * 20-bit word consisting of 6 bits escape, 6 bits run and 8 bits
* level. */ * level. */
run = get_bits(&s->gb, 6); run = SHOW_UBITS(re, &s->gb, 6);
level = get_sbits(&s->gb, 8); SKIP_CACHE(re, &s->gb, 6);
} else if (code == 0) { level = SHOW_SBITS(re, &s->gb, 8);
SKIP_COUNTER(re, &s->gb, 6 + 8);
} else if (level == 0) {
break; break;
} else { } else {
run = rl->table_run[code]; run--;
level = rl->table_level[code]; if (SHOW_UBITS(re, &s->gb, 1))
if (get_bits1(&s->gb))
level = -level; level = -level;
SKIP_COUNTER(re, &s->gb, 1);
} }
i += run; i += run;
if (i >= 64) { if (i >= 64) {
@ -335,6 +340,8 @@ static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
block[j] = level; block[j] = level;
i++; i++;
} }
CLOSE_READER(re, &s->gb);
}
s->block_last_index[n] = i - 1; s->block_last_index[n] = i - 1;
return 0; return 0;
} }

@ -418,7 +418,7 @@ static void h263_decode_dquant(MpegEncContext *s){
static int h263_decode_block(MpegEncContext * s, int16_t * block, static int h263_decode_block(MpegEncContext * s, int16_t * block,
int n, int coded) int n, int coded)
{ {
int code, level, i, j, last, run; int level, i, j, last, run;
RLTable *rl = &ff_h263_rl_inter; RLTable *rl = &ff_h263_rl_inter;
const uint8_t *scan_table; const uint8_t *scan_table;
GetBitContext gb= s->gb; GetBitContext gb= s->gb;
@ -479,40 +479,66 @@ static int h263_decode_block(MpegEncContext * s, int16_t * block,
return 0; return 0;
} }
retry: retry:
{
OPEN_READER(re, &s->gb);
for(;;) { for(;;) {
code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2); UPDATE_CACHE(re, &s->gb);
if (code < 0){ 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); av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
return -1; return -1;
} }
if (code == rl->n) { if (run == 66) {
/* escape */ /* escape */
if (CONFIG_FLV_DECODER && s->h263_flv > 1) { 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 { } else {
last = get_bits1(&s->gb); last = SHOW_UBITS(re, &s->gb, 1);
run = get_bits(&s->gb, 6); SKIP_CACHE(re, &s->gb, 1);
level = (int8_t)get_bits(&s->gb, 8); 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){ if(level == -128){
UPDATE_CACHE(re, &s->gb);
if (s->codec_id == AV_CODEC_ID_RV10) { if (s->codec_id == AV_CODEC_ID_RV10) {
/* XXX: should patch encoder too */ /* 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{ }else{
level = get_bits(&s->gb, 5); level = SHOW_UBITS(re, &s->gb, 5);
level |= get_sbits(&s->gb, 6)<<5; SKIP_CACHE(re, &s->gb, 5);
level |= SHOW_SBITS(re, &s->gb, 6)<<5;
SKIP_COUNTER(re, &s->gb, 5 + 6);
} }
} }
} }
} else { } else {
run = rl->table_run[code]; run--;
level = rl->table_level[code]; last = run >= 192;
last = code >= rl->last; run &= 63;
if (get_bits1(&s->gb)) if (SHOW_UBITS(re, &s->gb, 1))
level = -level; level = -level;
SKIP_COUNTER(re, &s->gb, 1);
} }
i += run; i += run;
if (i >= 64){ if (i >= 64){
if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){ 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 ... //Looks like a hack but no, it's the way it is supposed to work ...
rl = &ff_rl_intra_aic; rl = &ff_rl_intra_aic;
i = 0; i = 0;
@ -529,6 +555,8 @@ retry:
break; break;
i++; i++;
} }
CLOSE_READER(re, &s->gb);
}
not_coded: not_coded:
if (s->mb_intra && s->h263_aic) { if (s->mb_intra && s->h263_aic) {
ff_h263_pred_acdc(s, block, n); ff_h263_pred_acdc(s, block, n);

Loading…
Cancel
Save