Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2015-11-04 23:27:04 +0300
committerMichael Niedermayer <michael@niedermayer.cc>2015-11-05 00:16:38 +0300
commit4567cba0b8b85ce9c4cef1dbf2bbe056ff5dc9e4 (patch)
tree61bb296bb82149c6f5f2be1db9565392bd6543b9 /libavcodec/mjpegdec.c
parentfdb884263974b19584a4f37508d71bc60189f512 (diff)
avcodec/mjpegdec: Reinitialize IDCT on BPP changes
Fixes misaligned access Fixes: dc9262a469f6f315f74c087a7b3a7f35/signal_sigsegv_2e95bcd_9_9c0f9f4a9ba82aa9b3ab2b91ce4d5277.jpg Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind Signed-off-by: Michael Niedermayer <michael@niedermayer.cc> (cherry picked from commit cc35f6f4768ffe57cc4fcfa56ecb89aee409e3d5) Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/mjpegdec.c')
-rw-r--r--libavcodec/mjpegdec.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 1fb077a58b..6c6598ffd3 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -98,6 +98,15 @@ static void parse_avid(MJpegDecodeContext *s, uint8_t *buf, int len)
av_log(s->avctx, AV_LOG_INFO, "AVID: len:%d %d\n", len, len > 14 ? buf[12] : -1);
}
+static void init_idct(AVCodecContext *avctx)
+{
+ MJpegDecodeContext *s = avctx->priv_data;
+
+ ff_idctdsp_init(&s->idsp, avctx);
+ ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
+ ff_zigzag_direct);
+}
+
av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
{
MJpegDecodeContext *s = avctx->priv_data;
@@ -112,9 +121,7 @@ av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
s->avctx = avctx;
ff_blockdsp_init(&s->bdsp, avctx);
ff_hpeldsp_init(&s->hdsp, avctx->flags);
- ff_idctdsp_init(&s->idsp, avctx);
- ff_init_scantable(s->idsp.idct_permutation, &s->scantable,
- ff_zigzag_direct);
+ init_idct(avctx);
s->buffer_size = 0;
s->buffer = NULL;
s->start_code = -1;
@@ -267,7 +274,6 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
/* XXX: verify len field validity */
len = get_bits(&s->gb, 16);
- s->avctx->bits_per_raw_sample =
bits = get_bits(&s->gb, 8);
if (bits > 16 || bits < 1) {
@@ -275,6 +281,11 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
return AVERROR_INVALIDDATA;
}
+ if (s->avctx->bits_per_raw_sample != bits) {
+ av_log(s->avctx, AV_LOG_INFO, "Changeing bps to %d\n", bits);
+ s->avctx->bits_per_raw_sample = bits;
+ init_idct(s->avctx);
+ }
if (s->pegasus_rct)
bits = 9;
if (bits == 9 && !s->pegasus_rct)