Commit de0bcea6 authored by Michael Niedermayer's avatar Michael Niedermayer

avcodec/mjpegdec: Do not permute quantization tables

This fixes issues if the permutation changes, as quantizations tables would need to be reread
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent c1f9734f
...@@ -166,7 +166,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx) ...@@ -166,7 +166,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
/* quantize tables */ /* quantize tables */
int ff_mjpeg_decode_dqt(MJpegDecodeContext *s) int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
{ {
int len, index, i, j; int len, index, i;
len = get_bits(&s->gb, 16) - 2; len = get_bits(&s->gb, 16) - 2;
...@@ -187,13 +187,12 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s) ...@@ -187,13 +187,12 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index); av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
/* read quant table */ /* read quant table */
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
j = s->scantable.permutated[i]; s->quant_matrixes[index][i] = get_bits(&s->gb, pr ? 16 : 8);
s->quant_matrixes[index][j] = get_bits(&s->gb, pr ? 16 : 8);
} }
// XXX FIXME finetune, and perhaps add dc too // XXX FIXME finetune, and perhaps add dc too
s->qscale[index] = FFMAX(s->quant_matrixes[index][s->scantable.permutated[1]], s->qscale[index] = FFMAX(s->quant_matrixes[index][1],
s->quant_matrixes[index][s->scantable.permutated[8]]) >> 1; s->quant_matrixes[index][8]) >> 1;
av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n", av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
index, s->qscale[index]); index, s->qscale[index]);
len -= 1 + 64 * (1+pr); len -= 1 + 64 * (1+pr);
...@@ -723,7 +722,7 @@ static int decode_block(MJpegDecodeContext *s, int16_t *block, int component, ...@@ -723,7 +722,7 @@ static int decode_block(MJpegDecodeContext *s, int16_t *block, int component,
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
j = s->scantable.permutated[i]; j = s->scantable.permutated[i];
block[j] = level * quant_matrix[j]; block[j] = level * quant_matrix[i];
} }
} while (i < 63); } while (i < 63);
CLOSE_READER(re, &s->gb);} CLOSE_READER(re, &s->gb);}
...@@ -785,14 +784,14 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, ...@@ -785,14 +784,14 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
if (i >= se) { if (i >= se) {
if (i == se) { if (i == se) {
j = s->scantable.permutated[se]; j = s->scantable.permutated[se];
block[j] = level * (quant_matrix[j] << Al); block[j] = level * (quant_matrix[se] << Al);
break; break;
} }
av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
j = s->scantable.permutated[i]; j = s->scantable.permutated[i];
block[j] = level * (quant_matrix[j] << Al); block[j] = level * (quant_matrix[i] << Al);
} else { } else {
if (run == 0xF) {// ZRL - skip 15 coefficients if (run == 0xF) {// ZRL - skip 15 coefficients
i += 15; i += 15;
...@@ -825,7 +824,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block, ...@@ -825,7 +824,7 @@ static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
UPDATE_CACHE(re, &s->gb); \ UPDATE_CACHE(re, &s->gb); \
sign = block[j] >> 15; \ sign = block[j] >> 15; \
block[j] += SHOW_UBITS(re, &s->gb, 1) * \ block[j] += SHOW_UBITS(re, &s->gb, 1) * \
((quant_matrix[j] ^ sign) - sign) << Al; \ ((quant_matrix[i] ^ sign) - sign) << Al; \
LAST_SKIP_BITS(re, &s->gb, 1); \ LAST_SKIP_BITS(re, &s->gb, 1); \
} }
...@@ -871,7 +870,7 @@ static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block, ...@@ -871,7 +870,7 @@ static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block,
ZERO_RUN; ZERO_RUN;
j = s->scantable.permutated[i]; j = s->scantable.permutated[i];
val--; val--;
block[j] = ((quant_matrix[j] << Al) ^ val) - val; block[j] = ((quant_matrix[i] << Al) ^ val) - val;
if (i == se) { if (i == se) {
if (i > *last_nnz) if (i > *last_nnz)
*last_nnz = i; *last_nnz = i;
......
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