From 331a90cec42f600c8b63231bb0d5be6df6bf1717 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 17 Nov 2013 15:05:51 +0100 Subject: avcodec/h261: trellis quantization support Fixes ticket3143 Signed-off-by: Michael Niedermayer --- libavcodec/h261enc.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'libavcodec/h261enc.c') diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c index d7f40de..e04856d 100644 --- a/libavcodec/h261enc.c +++ b/libavcodec/h261enc.c @@ -32,6 +32,9 @@ #include "h263.h" #include "h261.h" +static uint8_t uni_h261_rl_len [64*64*2*2]; +#define UNI_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level)) + int ff_h261_get_picture_format(int width, int height) { // QCIF @@ -313,6 +316,47 @@ void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64], } } +static av_cold void init_uni_h261_rl_tab(RLTable *rl, uint32_t *bits_tab, + uint8_t *len_tab) +{ + int slevel, run, last; + + av_assert0(MAX_LEVEL >= 64); + av_assert0(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_ENC_INDEX(last, run, slevel+64); + int level= slevel < 0 ? -slevel : slevel; + int sign= slevel < 0 ? 1 : 0; + int bits, len, code; + + len_tab[index]= 100; + + /* ESC0 */ + code= get_rl_index(rl, 0, run, level); + len= rl->table_vlc[code][1] + 1; + if(last) + len += 2; + + if(code!=rl->n && len < len_tab[index]){ + len_tab [index]= len; + } + /* ESC */ + len = rl->table_vlc[rl->n][1]; + if(last) + len += 2; + + if(len < len_tab[index]){ + len_tab [index]= len; + } + } + } + } +} + av_cold void ff_h261_encode_init(MpegEncContext *s) { ff_h261_common_init(); @@ -321,6 +365,12 @@ av_cold void ff_h261_encode_init(MpegEncContext *s) s->max_qcoeff = 127; s->y_dc_scale_table = s->c_dc_scale_table = ff_mpeg1_dc_scale_table; + s->ac_esc_length = 6+6+8; + + init_uni_h261_rl_tab(&ff_h261_rl_tcoeff, NULL, uni_h261_rl_len); + + s->intra_ac_vlc_length = s->inter_ac_vlc_length = uni_h261_rl_len; + s->intra_ac_vlc_last_length = s->inter_ac_vlc_last_length = uni_h261_rl_len + 128*64; } FF_MPV_GENERIC_CLASS(h261) -- cgit v1.1