diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-07-14 18:36:24 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-07-14 18:36:24 +0000 |
commit | 4f68b0847e2884ad5818d98715a0f1440b7b60a5 (patch) | |
tree | 3db2c8cead16f5b645a75b8f29eea47e91218faa | |
parent | 02e0aa20a8e55534624d23be92f040ef8a8c7a5c (diff) | |
download | ffmpeg-4f68b0847e2884ad5818d98715a0f1440b7b60a5.tar.gz |
rl vlc table optimization (not yet used)
Originally committed as revision 758 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/mpeg12.c | 68 |
1 files changed, 52 insertions, 16 deletions
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index 4a8c080f81..890cdad35c 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -33,6 +33,14 @@ #define EXT_START_CODE 0x000001b5 #define USER_START_CODE 0x000001b2 +#define DC_VLC_BITS 9 +#define MV_VLC_BITS 9 +#define MBINCR_VLC_BITS 9 +#define MB_PAT_VLC_BITS 9 +#define MB_PTYPE_VLC_BITS 6 +#define MB_BTYPE_VLC_BITS 6 +#define TEX_VLC_BITS 9 + static void mpeg1_encode_block(MpegEncContext *s, DCTELEM *block, int component); @@ -52,6 +60,46 @@ static int mpeg_decode_motion(MpegEncContext *s, int fcode, int pred); static UINT16 mv_penalty[MAX_FCODE+1][MAX_MV*2+1]; static UINT8 fcode_tab[MAX_MV*2+1]; +static void init_2d_vlc_rl(RLTable *rl) +{ + int i, q; + + init_vlc(&rl->vlc, TEX_VLC_BITS, rl->n + 2, + &rl->table_vlc[0][1], 4, 2, + &rl->table_vlc[0][0], 4, 2); + + + rl->rl_vlc[0]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); + for(i=0; i<rl->vlc.table_size; i++){ + int code= rl->vlc.table[i][0]; + int len = rl->vlc.table[i][1]; + int level, run; + + if(len==0){ // illegal code + run= 65; + level= MAX_LEVEL; + }else if(len<0){ //more bits needed + run= 0; + level= code; + }else{ + if(code==rl->n){ //esc + run= 65; + level= 0; + }else if(code==rl->n+1){ //eob + run= 192; + level= 1; + }else{ + run= rl->table_run [code] + 1; + level= rl->table_level[code]; + } + } + rl->rl_vlc[0][i].len= len; + rl->rl_vlc[0][i].level= level; + rl->rl_vlc[0][i].run= run; + } +} + + static void put_header(MpegEncContext *s, int header) { align_put_bits(&s->pb); @@ -533,14 +581,6 @@ static VLC mb_ptype_vlc; static VLC mb_btype_vlc; static VLC mb_pat_vlc; -#define DC_VLC_BITS 9 -#define MV_VLC_BITS 9 -#define MBINCR_VLC_BITS 9 -#define MB_PAT_VLC_BITS 9 -#define MB_PTYPE_VLC_BITS 6 -#define MB_BTYPE_VLC_BITS 6 -#define TEX_VLC_BITS 9 - void mpeg1_init_vlc(MpegEncContext *s) { static int done = 0; @@ -572,13 +612,9 @@ void mpeg1_init_vlc(MpegEncContext *s) &table_mb_btype[0][0], 2, 1); init_rl(&rl_mpeg1); init_rl(&rl_mpeg2); - /* cannot use generic init because we must add the EOB code */ - init_vlc(&rl_mpeg1.vlc, TEX_VLC_BITS, rl_mpeg1.n + 2, - &rl_mpeg1.table_vlc[0][1], 4, 2, - &rl_mpeg1.table_vlc[0][0], 4, 2); - init_vlc(&rl_mpeg2.vlc, TEX_VLC_BITS, rl_mpeg2.n + 2, - &rl_mpeg2.table_vlc[0][1], 4, 2, - &rl_mpeg2.table_vlc[0][0], 4, 2); + + init_2d_vlc_rl(&rl_mpeg1); + init_2d_vlc_rl(&rl_mpeg2); } } @@ -1416,7 +1452,7 @@ static int mpeg_decode_slice(AVCodecContext *avctx, /* start frame decoding */ if (s->first_slice) { s->first_slice = 0; - MPV_frame_start(s); + MPV_frame_start(s, avctx); } init_get_bits(&s->gb, buf, buf_size); |