mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
trellis quantization for h263(p)
Originally committed as revision 3503 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
d7d51926dd
commit
15c5fa7b7f
@ -91,6 +91,8 @@ static uint32_t uni_mpeg4_intra_rl_bits[64*64*2*2];
|
||||
static uint8_t uni_mpeg4_intra_rl_len [64*64*2*2];
|
||||
static uint32_t uni_mpeg4_inter_rl_bits[64*64*2*2];
|
||||
static uint8_t uni_mpeg4_inter_rl_len [64*64*2*2];
|
||||
static uint8_t uni_h263_intra_aic_rl_len [64*64*2*2];
|
||||
static uint8_t uni_h263_inter_rl_len [64*64*2*2];
|
||||
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128 + (run)*256 + (level))
|
||||
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
|
||||
#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
|
||||
@ -1876,6 +1878,50 @@ static void init_uni_mpeg4_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_
|
||||
}
|
||||
}
|
||||
|
||||
static void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, uint8_t *len_tab){
|
||||
int slevel, run, last;
|
||||
|
||||
assert(MAX_LEVEL >= 64);
|
||||
assert(MAX_RUN >= 63);
|
||||
|
||||
for(slevel=-64; slevel<64; slevel++){
|
||||
if(slevel==0) continue;
|
||||
for(run=0; run<64; run++){
|
||||
for(last=0; last<=1; last++){
|
||||
const int index= UNI_MPEG4_ENC_INDEX(last, run, slevel+64);
|
||||
int level= slevel < 0 ? -slevel : slevel;
|
||||
int sign= slevel < 0 ? 1 : 0;
|
||||
int bits, len, code;
|
||||
int level1, run1;
|
||||
|
||||
len_tab[index]= 100;
|
||||
|
||||
/* ESC0 */
|
||||
code= get_rl_index(rl, last, run, level);
|
||||
bits= rl->table_vlc[code][0];
|
||||
len= rl->table_vlc[code][1];
|
||||
bits=bits*2+sign; len++;
|
||||
|
||||
if(code!=rl->n && len < len_tab[index]){
|
||||
if(bits_tab) bits_tab[index]= bits;
|
||||
len_tab [index]= len;
|
||||
}
|
||||
/* ESC */
|
||||
bits= rl->table_vlc[rl->n][0];
|
||||
len = rl->table_vlc[rl->n][1];
|
||||
bits=bits*2+last; len++;
|
||||
bits=bits*64+run; len+=6;
|
||||
bits=bits*256+(level&0xff); len+=8;
|
||||
|
||||
if(len < len_tab[index]){
|
||||
if(bits_tab) bits_tab[index]= bits;
|
||||
len_tab [index]= len;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void h263_encode_init(MpegEncContext *s)
|
||||
{
|
||||
static int done = 0;
|
||||
@ -1892,10 +1938,21 @@ void h263_encode_init(MpegEncContext *s)
|
||||
init_uni_mpeg4_rl_tab(&rl_intra, uni_mpeg4_intra_rl_bits, uni_mpeg4_intra_rl_len);
|
||||
init_uni_mpeg4_rl_tab(&rl_inter, uni_mpeg4_inter_rl_bits, uni_mpeg4_inter_rl_len);
|
||||
|
||||
init_uni_h263_rl_tab(&rl_intra_aic, NULL, uni_h263_intra_aic_rl_len);
|
||||
init_uni_h263_rl_tab(&rl_inter , NULL, uni_h263_inter_rl_len);
|
||||
|
||||
init_mv_penalty_and_fcode(s);
|
||||
}
|
||||
s->me.mv_penalty= mv_penalty; //FIXME exact table for msmpeg4 & h263p
|
||||
|
||||
s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
|
||||
s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
|
||||
if(s->h263_aic){
|
||||
s->intra_ac_vlc_length = uni_h263_intra_aic_rl_len;
|
||||
s->intra_ac_vlc_last_length= uni_h263_intra_aic_rl_len + 128*64;
|
||||
}
|
||||
s->ac_esc_length= 7+1+6+8;
|
||||
|
||||
// use fcodes >1 only for mpeg4 & h263 & h263p FIXME
|
||||
switch(s->codec_id){
|
||||
case CODEC_ID_MPEG4:
|
||||
|
Loading…
Reference in New Issue
Block a user