diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 934d1a2f92..f5993c314e 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -1476,150 +1476,150 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, av_log(avctx, AV_LOG_ERROR, "MJPEG packet 0x%x too big (0x%x/0x%x), corrupt data?\n", start_code, unescaped_buf_size, buf_size); return AVERROR_INVALIDDATA; - } else { - av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", - start_code, buf_end - buf_ptr); + } - init_get_bits(&s->gb, unescaped_buf_ptr, unescaped_buf_size * 8); + av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", + start_code, buf_end - buf_ptr); - s->start_code = start_code; - if (s->avctx->debug & FF_DEBUG_STARTCODE) - av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code); + init_get_bits(&s->gb, unescaped_buf_ptr, unescaped_buf_size * 8); - /* process markers */ - if (start_code >= 0xd0 && start_code <= 0xd7) - av_log(avctx, AV_LOG_DEBUG, - "restart marker: %d\n", start_code & 0x0f); - /* APP fields */ - else if (start_code >= APP0 && start_code <= APP15) - mjpeg_decode_app(s); - /* Comment */ - else if (start_code == COM) - mjpeg_decode_com(s); + s->start_code = start_code; + if (s->avctx->debug & FF_DEBUG_STARTCODE) + av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code); - if (!CONFIG_JPEGLS_DECODER && - (start_code == SOF48 || start_code == LSE)) { - av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n"); - return AVERROR(ENOSYS); + /* process markers */ + if (start_code >= 0xd0 && start_code <= 0xd7) + av_log(avctx, AV_LOG_DEBUG, + "restart marker: %d\n", start_code & 0x0f); + /* APP fields */ + else if (start_code >= APP0 && start_code <= APP15) + mjpeg_decode_app(s); + /* Comment */ + else if (start_code == COM) + mjpeg_decode_com(s); + + if (!CONFIG_JPEGLS_DECODER && + (start_code == SOF48 || start_code == LSE)) { + av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n"); + return AVERROR(ENOSYS); + } + + switch (start_code) { + case SOI: + s->restart_interval = 0; + s->restart_count = 0; + /* nothing to do on SOI */ + break; + case DQT: + ff_mjpeg_decode_dqt(s); + break; + case DHT: + if ((ret = ff_mjpeg_decode_dht(s)) < 0) { + av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n"); + return ret; } - - switch (start_code) { - case SOI: - s->restart_interval = 0; - s->restart_count = 0; - /* nothing to do on SOI */ + break; + case SOF0: + case SOF1: + s->lossless = 0; + s->ls = 0; + s->progressive = 0; + if ((ret = ff_mjpeg_decode_sof(s)) < 0) + return ret; + break; + case SOF2: + s->lossless = 0; + s->ls = 0; + s->progressive = 1; + if ((ret = ff_mjpeg_decode_sof(s)) < 0) + return ret; + break; + case SOF3: + s->lossless = 1; + s->ls = 0; + s->progressive = 0; + if ((ret = ff_mjpeg_decode_sof(s)) < 0) + return ret; + break; + case SOF48: + s->lossless = 1; + s->ls = 1; + s->progressive = 0; + if ((ret = ff_mjpeg_decode_sof(s)) < 0) + return ret; + break; + case LSE: + if (!CONFIG_JPEGLS_DECODER || + (ret = ff_jpegls_decode_lse(s)) < 0) + return ret; + break; + case EOI: + s->cur_scan = 0; + if ((s->buggy_avid && !s->interlaced) || s->restart_interval) break; - case DQT: - ff_mjpeg_decode_dqt(s); - break; - case DHT: - if ((ret = ff_mjpeg_decode_dht(s)) < 0) { - av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n"); - return ret; - } - break; - case SOF0: - case SOF1: - s->lossless = 0; - s->ls = 0; - s->progressive = 0; - if ((ret = ff_mjpeg_decode_sof(s)) < 0) - return ret; - break; - case SOF2: - s->lossless = 0; - s->ls = 0; - s->progressive = 1; - if ((ret = ff_mjpeg_decode_sof(s)) < 0) - return ret; - break; - case SOF3: - s->lossless = 1; - s->ls = 0; - s->progressive = 0; - if ((ret = ff_mjpeg_decode_sof(s)) < 0) - return ret; - break; - case SOF48: - s->lossless = 1; - s->ls = 1; - s->progressive = 0; - if ((ret = ff_mjpeg_decode_sof(s)) < 0) - return ret; - break; - case LSE: - if (!CONFIG_JPEGLS_DECODER || - (ret = ff_jpegls_decode_lse(s)) < 0) - return ret; - break; - case EOI: - s->cur_scan = 0; - if ((s->buggy_avid && !s->interlaced) || s->restart_interval) - break; eoi_parser: - if (!s->got_picture) { - av_log(avctx, AV_LOG_WARNING, - "Found EOI before any SOF, ignoring\n"); - break; - } - if (s->interlaced) { - s->bottom_field ^= 1; - /* if not bottom field, do not output image yet */ - if (s->bottom_field == !s->interlace_polarity) - goto not_the_end; - } - if ((ret = av_frame_ref(data, s->picture_ptr)) < 0) - return ret; - *got_frame = 1; - - if (!s->lossless && - avctx->debug & FF_DEBUG_QP) { - av_log(avctx, AV_LOG_DEBUG, - "QP: %d\n", FFMAX3(s->qscale[0], - s->qscale[1], - s->qscale[2])); - } - - goto the_end; - case SOS: - if (!s->got_picture) { - av_log(avctx, AV_LOG_WARNING, - "Can not process SOS before SOF, skipping\n"); - break; - } - if ((ret = ff_mjpeg_decode_sos(s, NULL, NULL)) < 0 && - (avctx->err_recognition & AV_EF_EXPLODE)) - return ret; - /* buggy avid puts EOI every 10-20th frame */ - /* if restart period is over process EOI */ - if ((s->buggy_avid && !s->interlaced) || s->restart_interval) - goto eoi_parser; - break; - case DRI: - mjpeg_decode_dri(s); - break; - case SOF5: - case SOF6: - case SOF7: - case SOF9: - case SOF10: - case SOF11: - case SOF13: - case SOF14: - case SOF15: - case JPG: - av_log(avctx, AV_LOG_ERROR, - "mjpeg: unsupported coding type (%x)\n", start_code); + if (!s->got_picture) { + av_log(avctx, AV_LOG_WARNING, + "Found EOI before any SOF, ignoring\n"); break; } + if (s->interlaced) { + s->bottom_field ^= 1; + /* if not bottom field, do not output image yet */ + if (s->bottom_field == !s->interlace_polarity) + goto not_the_end; + } + if ((ret = av_frame_ref(data, s->picture_ptr)) < 0) + return ret; + *got_frame = 1; + + if (!s->lossless && + avctx->debug & FF_DEBUG_QP) { + av_log(avctx, AV_LOG_DEBUG, + "QP: %d\n", FFMAX3(s->qscale[0], + s->qscale[1], + s->qscale[2])); + } + + goto the_end; + case SOS: + if (!s->got_picture) { + av_log(avctx, AV_LOG_WARNING, + "Can not process SOS before SOF, skipping\n"); + break; + } + if ((ret = ff_mjpeg_decode_sos(s, NULL, NULL)) < 0 && + (avctx->err_recognition & AV_EF_EXPLODE)) + return ret; + /* buggy avid puts EOI every 10-20th frame */ + /* if restart period is over process EOI */ + if ((s->buggy_avid && !s->interlaced) || s->restart_interval) + goto eoi_parser; + break; + case DRI: + mjpeg_decode_dri(s); + break; + case SOF5: + case SOF6: + case SOF7: + case SOF9: + case SOF10: + case SOF11: + case SOF13: + case SOF14: + case SOF15: + case JPG: + av_log(avctx, AV_LOG_ERROR, + "mjpeg: unsupported coding type (%x)\n", start_code); + break; + } not_the_end: - /* eof process start code */ - buf_ptr += (get_bits_count(&s->gb) + 7) / 8; - av_log(avctx, AV_LOG_DEBUG, - "marker parser used %d bytes (%d bits)\n", - (get_bits_count(&s->gb) + 7) / 8, get_bits_count(&s->gb)); - } + /* eof process start code */ + buf_ptr += (get_bits_count(&s->gb) + 7) / 8; + av_log(avctx, AV_LOG_DEBUG, + "marker parser used %d bytes (%d bits)\n", + (get_bits_count(&s->gb) + 7) / 8, get_bits_count(&s->gb)); } if (s->got_picture) { av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");