X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmjpegdec.c;h=78a0453d57f693c1e5f1b1152acec3d3733c7106;hb=df4203ac6f00bb222e93438967a1e4b6209e7919;hp=c1712ea47abcbd3724c6ede31454cac6b9cafb9d;hpb=b61097fe0dc20d442be4fdbaf9bd97e2769d7f43;p=ffmpeg diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index c1712ea47ab..78a0453d57f 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -129,10 +129,10 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s) len = get_bits(&s->gb, 16) - 2; while (len >= 65) { - /* only 8 bit precision handled */ - if (get_bits(&s->gb, 4) != 0) { - av_log(s->avctx, AV_LOG_ERROR, "dqt: 16bit precision\n"); - return -1; + int pr = get_bits(&s->gb, 4); + if (pr > 1) { + av_log(s->avctx, AV_LOG_ERROR, "dqt: invalid precision\n"); + return AVERROR_INVALIDDATA; } index = get_bits(&s->gb, 4); if (index >= 4) @@ -141,7 +141,7 @@ int ff_mjpeg_decode_dqt(MJpegDecodeContext *s) /* read quant table */ for (i = 0; i < 64; i++) { j = s->scantable.permutated[i]; - s->quant_matrixes[index][j] = get_bits(&s->gb, 8); + s->quant_matrixes[index][j] = get_bits(&s->gb, pr ? 16 : 8); } // XXX FIXME finetune, and perhaps add dc too @@ -852,7 +852,7 @@ static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, point_transform += bits - s->bits; - av_assert0(nb_components==1 || nb_components==3); + av_assert0(nb_components>=1 && nb_components<=3); for (mb_y = 0; mb_y < s->mb_height; mb_y++) { for (mb_x = 0; mb_x < s->mb_width; mb_x++) { @@ -1423,9 +1423,9 @@ static int mjpeg_decode_app(MJpegDecodeContext *s) av_log(s->avctx, AV_LOG_INFO, "Pegasus lossless jpeg header found\n"); skip_bits(&s->gb, 16); /* version ? */ - skip_bits(&s->gb, 16); /* unknwon always 0? */ - skip_bits(&s->gb, 16); /* unknwon always 0? */ - skip_bits(&s->gb, 16); /* unknwon always 0? */ + skip_bits(&s->gb, 16); /* unknown always 0? */ + skip_bits(&s->gb, 16); /* unknown always 0? */ + skip_bits(&s->gb, 16); /* unknown always 0? */ switch (get_bits(&s->gb, 8)) { case 1: s->rgb = 1; @@ -1590,7 +1590,7 @@ int ff_mjpeg_find_marker(MJpegDecodeContext *s, while ((src + t < buf_end) && x == 0xff) x = src[t++]; if (x & 0x80) { - t -= 2; + t -= FFMIN(2, t); break; } }