From 7cac568b39703934b6ee62411dfe949816f7f840 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 11 Feb 2015 00:47:15 +0100 Subject: avcodec/mjpegenc: support trellis quantization Signed-off-by: Michael Niedermayer --- libavcodec/mjpegenc.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'libavcodec/mjpegenc.c') 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; } -- cgit v1.2.3