|  |  | @@ -1666,150 +1666,149 @@ 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); | 
		
	
		
			
			|  |  |  | if ((ret = init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size)) < 0) { | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_ERROR, "invalid buffer\n"); | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", | 
		
	
		
			
			|  |  |  | start_code, buf_end - buf_ptr); | 
		
	
		
			
			|  |  |  | if ((ret = init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size)) < 0) { | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_ERROR, "invalid buffer\n"); | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | s->start_code = start_code; | 
		
	
		
			
			|  |  |  | if (s->avctx->debug & FF_DEBUG_STARTCODE) | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* 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); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | ret = -1; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 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); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | s->start_code = start_code; | 
		
	
		
			
			|  |  |  | if (s->avctx->debug & FF_DEBUG_STARTCODE) | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 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"); | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF0: | 
		
	
		
			
			|  |  |  | case SOF1: | 
		
	
		
			
			|  |  |  | s->lossless    = 0; | 
		
	
		
			
			|  |  |  | s->ls          = 0; | 
		
	
		
			
			|  |  |  | s->progressive = 0; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF2: | 
		
	
		
			
			|  |  |  | s->lossless    = 0; | 
		
	
		
			
			|  |  |  | s->ls          = 0; | 
		
	
		
			
			|  |  |  | s->progressive = 1; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF3: | 
		
	
		
			
			|  |  |  | s->lossless    = 1; | 
		
	
		
			
			|  |  |  | s->ls          = 0; | 
		
	
		
			
			|  |  |  | s->progressive = 0; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF48: | 
		
	
		
			
			|  |  |  | s->lossless    = 1; | 
		
	
		
			
			|  |  |  | s->ls          = 1; | 
		
	
		
			
			|  |  |  | s->progressive = 0; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case LSE: | 
		
	
		
			
			|  |  |  | if (!CONFIG_JPEGLS_DECODER || | 
		
	
		
			
			|  |  |  | (ret = ff_jpegls_decode_lse(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case EOI: | 
		
	
		
			
			|  |  |  | /* 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); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | ret = -1; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | 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"); | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF0: | 
		
	
		
			
			|  |  |  | case SOF1: | 
		
	
		
			
			|  |  |  | s->lossless    = 0; | 
		
	
		
			
			|  |  |  | s->ls          = 0; | 
		
	
		
			
			|  |  |  | s->progressive = 0; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF2: | 
		
	
		
			
			|  |  |  | s->lossless    = 0; | 
		
	
		
			
			|  |  |  | s->ls          = 0; | 
		
	
		
			
			|  |  |  | s->progressive = 1; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF3: | 
		
	
		
			
			|  |  |  | s->lossless    = 1; | 
		
	
		
			
			|  |  |  | s->ls          = 0; | 
		
	
		
			
			|  |  |  | s->progressive = 0; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case SOF48: | 
		
	
		
			
			|  |  |  | s->lossless    = 1; | 
		
	
		
			
			|  |  |  | s->ls          = 1; | 
		
	
		
			
			|  |  |  | s->progressive = 0; | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sof(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case LSE: | 
		
	
		
			
			|  |  |  | if (!CONFIG_JPEGLS_DECODER || | 
		
	
		
			
			|  |  |  | (ret = ff_jpegls_decode_lse(s)) < 0) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | case EOI: | 
		
	
		
			
			|  |  |  | eoi_parser: | 
		
	
		
			
			|  |  |  | s->cur_scan = 0; | 
		
	
		
			
			|  |  |  | if (!s->got_picture) { | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_WARNING, | 
		
	
		
			
			|  |  |  | "Found EOI before any SOF, ignoring\n"); | 
		
	
		
			
			|  |  |  | s->cur_scan = 0; | 
		
	
		
			
			|  |  |  | 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) | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (s->interlaced) { | 
		
	
		
			
			|  |  |  | s->bottom_field ^= 1; | 
		
	
		
			
			|  |  |  | /* if not bottom field, do not output image yet */ | 
		
	
		
			
			|  |  |  | if (s->bottom_field == !s->interlace_polarity) | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if ((ret = av_frame_ref(data, s->picture_ptr)) < 0) | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
		
			
			|  |  |  | *got_frame = 1; | 
		
	
		
			
			|  |  |  | s->got_picture = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!s->lossless) { | 
		
	
		
			
			|  |  |  | int qp = FFMAX3(s->qscale[0], | 
		
	
		
			
			|  |  |  | s->qscale[1], | 
		
	
		
			
			|  |  |  | s->qscale[2]); | 
		
	
		
			
			|  |  |  | int qpw = (s->width + 15) / 16; | 
		
	
		
			
			|  |  |  | AVBufferRef *qp_table_buf = av_buffer_alloc(qpw); | 
		
	
		
			
			|  |  |  | if (qp_table_buf) { | 
		
	
		
			
			|  |  |  | memset(qp_table_buf->data, qp, qpw); | 
		
	
		
			
			|  |  |  | av_frame_set_qp_table(data, qp_table_buf, 0, FF_QSCALE_TYPE_MPEG1); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if(avctx->debug & FF_DEBUG_QP) | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if ((ret = av_frame_ref(data, s->picture_ptr)) < 0) | 
		
	
		
			
			|  |  |  | return ret; | 
		
	
		
			
			|  |  |  | *got_frame = 1; | 
		
	
		
			
			|  |  |  | s->got_picture = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (!s->lossless) { | 
		
	
		
			
			|  |  |  | int qp = FFMAX3(s->qscale[0], | 
		
	
		
			
			|  |  |  | s->qscale[1], | 
		
	
		
			
			|  |  |  | s->qscale[2]); | 
		
	
		
			
			|  |  |  | int qpw = (s->width + 15) / 16; | 
		
	
		
			
			|  |  |  | AVBufferRef *qp_table_buf = av_buffer_alloc(qpw); | 
		
	
		
			
			|  |  |  | if (qp_table_buf) { | 
		
	
		
			
			|  |  |  | memset(qp_table_buf->data, qp, qpw); | 
		
	
		
			
			|  |  |  | av_frame_set_qp_table(data, qp_table_buf, 0, FF_QSCALE_TYPE_MPEG1); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | goto the_end; | 
		
	
		
			
			|  |  |  | case SOS: | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sos(s, NULL, NULL)) < 0 && | 
		
	
		
			
			|  |  |  | (avctx->err_recognition & AV_EF_EXPLODE)) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | 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; | 
		
	
		
			
			|  |  |  | if(avctx->debug & FF_DEBUG_QP) | 
		
	
		
			
			|  |  |  | av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* 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)); | 
		
	
		
			
			|  |  |  | goto the_end; | 
		
	
		
			
			|  |  |  | case SOS: | 
		
	
		
			
			|  |  |  | if ((ret = ff_mjpeg_decode_sos(s, NULL, NULL)) < 0 && | 
		
	
		
			
			|  |  |  | (avctx->err_recognition & AV_EF_EXPLODE)) | 
		
	
		
			
			|  |  |  | goto fail; | 
		
	
		
			
			|  |  |  | 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; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* 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"); | 
		
	
	
		
			
				|  |  | 
 |