rl vlc table optimization (not yet used)

Originally committed as revision 758 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Michael Niedermayer 23 years ago
parent 02e0aa20a8
commit 4f68b0847e
  1. 68
      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);

Loading…
Cancel
Save