summaryrefslogtreecommitdiffstats
path: root/libavcodec/h261enc.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-11-17 15:05:51 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-11-17 15:08:56 +0100
commit331a90cec42f600c8b63231bb0d5be6df6bf1717 (patch)
tree2eb91c67a5b68b9aaf231b8f8c05307d256e99c2 /libavcodec/h261enc.c
parentbe1e6e7503b2f10b0176201418eb97912cee093f (diff)
downloadffmpeg-streaming-331a90cec42f600c8b63231bb0d5be6df6bf1717.zip
ffmpeg-streaming-331a90cec42f600c8b63231bb0d5be6df6bf1717.tar.gz
avcodec/h261: trellis quantization support
Fixes ticket3143 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/h261enc.c')
-rw-r--r--libavcodec/h261enc.c50
1 files changed, 50 insertions, 0 deletions
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)
OpenPOWER on IntegriCloud