From 7cac568b39703934b6ee62411dfe949816f7f840 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 11 Feb 2015 00:47:15 +0100 Subject: [PATCH] avcodec/mjpegenc: support trellis quantization Signed-off-by: Michael Niedermayer --- libavcodec/mjpegenc.c | 36 ++++++++++++++++++++++++++++++++++++ libavcodec/mpegvideo_enc.c | 6 +++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c index 14701e22f4..001833c35a 100644 --- a/libavcodec/mjpegenc.c +++ b/libavcodec/mjpegenc.c @@ -38,6 +38,35 @@ #include "mjpeg.h" #include "mjpegenc.h" +static uint8_t uni_ac_vlc_len[64 * 64 * 2]; +static uint8_t uni_chroma_ac_vlc_len[64 * 64 * 2]; + +static av_cold void init_uni_ac_vlc(const uint8_t huff_size_ac[256], uint8_t *uni_ac_vlc_len) +{ + int i; + + for (i = 0; i < 128; i++) { + int level = i - 64; + int run; + if (!level) + continue; + for (run = 0; run < 64; run++) { + int len, code, nbits; + int alevel = FFABS(level); + + len = (run >> 4) * huff_size_ac[0xf0]; + + nbits= av_log2_16bit(alevel) + 1; + code = ((15&run) << 4) | nbits; + + len += huff_size_ac[code] + nbits; + + uni_ac_vlc_len[UNI_AC_ENC_INDEX(run, i)] = len; + // We ignore EOB as its just a constant which does not change generally + } + } +} + av_cold int ff_mjpeg_encode_init(MpegEncContext *s) { MJpegContext *m; @@ -72,6 +101,13 @@ av_cold int ff_mjpeg_encode_init(MpegEncContext *s) avpriv_mjpeg_bits_ac_chrominance, avpriv_mjpeg_val_ac_chrominance); + init_uni_ac_vlc(m->huff_size_ac_luminance, uni_ac_vlc_len); + init_uni_ac_vlc(m->huff_size_ac_chrominance, uni_chroma_ac_vlc_len); + s->intra_ac_vlc_length = + s->intra_ac_vlc_last_length = uni_ac_vlc_len; + s->intra_chroma_ac_vlc_length = + s->intra_chroma_ac_vlc_last_length = uni_chroma_ac_vlc_len; + s->mjpeg_ctx = m; return 0; } diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index f17c6b33b2..811fbe870f 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -3811,8 +3811,9 @@ static int dct_quantize_trellis_c(MpegEncContext *s, start_i = 1; last_non_zero = 0; qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale]; - if(s->mpeg_quant || s->out_format == FMT_MPEG1) + if(s->mpeg_quant || s->out_format == FMT_MPEG1 || s->out_format == FMT_MJPEG) bias= 1<<(QMAT_SHIFT-1); + if (n > 3 && s->intra_chroma_ac_vlc_length) { length = s->intra_chroma_ac_vlc_length; last_length= s->intra_chroma_ac_vlc_last_length; @@ -3899,6 +3900,9 @@ static int dct_quantize_trellis_c(MpegEncContext *s, if(s->out_format == FMT_H263 || s->out_format == FMT_H261){ unquant_coeff= alevel*qmul + qadd; + } else if(s->out_format == FMT_MJPEG) { + j = s->idsp.idct_permutation[scantable[i]]; + unquant_coeff = alevel * s->intra_matrix[j] * 8; }else{ //MPEG1 j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize if(s->mb_intra){