|
|
|
@ -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"); |
|
|
|
|