Commit 7cac568b authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/mjpegenc: support trellis quantization

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 7366bb38
...@@ -38,6 +38,35 @@ ...@@ -38,6 +38,35 @@
#include "mjpeg.h" #include "mjpeg.h"
#include "mjpegenc.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) av_cold int ff_mjpeg_encode_init(MpegEncContext *s)
{ {
MJpegContext *m; MJpegContext *m;
...@@ -72,6 +101,13 @@ av_cold int ff_mjpeg_encode_init(MpegEncContext *s) ...@@ -72,6 +101,13 @@ av_cold int ff_mjpeg_encode_init(MpegEncContext *s)
avpriv_mjpeg_bits_ac_chrominance, avpriv_mjpeg_bits_ac_chrominance,
avpriv_mjpeg_val_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; s->mjpeg_ctx = m;
return 0; return 0;
} }
......
...@@ -3811,8 +3811,9 @@ static int dct_quantize_trellis_c(MpegEncContext *s, ...@@ -3811,8 +3811,9 @@ static int dct_quantize_trellis_c(MpegEncContext *s,
start_i = 1; start_i = 1;
last_non_zero = 0; last_non_zero = 0;
qmat = n < 4 ? s->q_intra_matrix[qscale] : s->q_chroma_intra_matrix[qscale]; 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); bias= 1<<(QMAT_SHIFT-1);
if (n > 3 && s->intra_chroma_ac_vlc_length) { if (n > 3 && s->intra_chroma_ac_vlc_length) {
length = s->intra_chroma_ac_vlc_length; length = s->intra_chroma_ac_vlc_length;
last_length= s->intra_chroma_ac_vlc_last_length; last_length= s->intra_chroma_ac_vlc_last_length;
...@@ -3899,6 +3900,9 @@ static int dct_quantize_trellis_c(MpegEncContext *s, ...@@ -3899,6 +3900,9 @@ static int dct_quantize_trellis_c(MpegEncContext *s,
if(s->out_format == FMT_H263 || s->out_format == FMT_H261){ if(s->out_format == FMT_H263 || s->out_format == FMT_H261){
unquant_coeff= alevel*qmul + qadd; 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 }else{ //MPEG1
j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize j = s->idsp.idct_permutation[scantable[i]]; // FIXME: optimize
if(s->mb_intra){ if(s->mb_intra){
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment