avcodec/mjpegenc: support trellis quantization

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2015-02-11 00:47:15 +01:00
parent 7366bb38f1
commit 7cac568b39
2 changed files with 41 additions and 1 deletions

View File

@ -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;
}

View File

@ -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){