|
|
|
@ -70,8 +70,7 @@ read_header: |
|
|
|
|
|
|
|
|
|
skip_bits(&hgb, 32); /* reserved zeros */ |
|
|
|
|
|
|
|
|
|
if (get_bits_long(&hgb, 32) != MKBETAG('m','j','p','g')) |
|
|
|
|
{ |
|
|
|
|
if (get_bits_long(&hgb, 32) != MKBETAG('m','j','p','g')) { |
|
|
|
|
av_log(avctx, AV_LOG_WARNING, "not mjpeg-b (bad fourcc)\n"); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
@ -85,19 +84,17 @@ read_header: |
|
|
|
|
|
|
|
|
|
dqt_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "dqt is %d and size is %d\n"); |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "dqt offs: 0x%"PRIx32"\n", dqt_offs); |
|
|
|
|
if (dqt_offs) |
|
|
|
|
{ |
|
|
|
|
if (dqt_offs) { |
|
|
|
|
init_get_bits(&s->gb, buf_ptr+dqt_offs, (buf_end - (buf_ptr+dqt_offs))*8); |
|
|
|
|
s->start_code = DQT; |
|
|
|
|
if (ff_mjpeg_decode_dqt(s) < 0 && |
|
|
|
|
(avctx->err_recognition & AV_EF_EXPLODE)) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dht_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "dht is %d and size is %d\n"); |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "dht offs: 0x%"PRIx32"\n", dht_offs); |
|
|
|
|
if (dht_offs) |
|
|
|
|
{ |
|
|
|
|
if (dht_offs) { |
|
|
|
|
init_get_bits(&s->gb, buf_ptr+dht_offs, (buf_end - (buf_ptr+dht_offs))*8); |
|
|
|
|
s->start_code = DHT; |
|
|
|
|
ff_mjpeg_decode_dht(s); |
|
|
|
@ -105,8 +102,7 @@ read_header: |
|
|
|
|
|
|
|
|
|
sof_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "sof is %d and size is %d\n"); |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "sof offs: 0x%"PRIx32"\n", sof_offs); |
|
|
|
|
if (sof_offs) |
|
|
|
|
{ |
|
|
|
|
if (sof_offs) { |
|
|
|
|
init_get_bits(&s->gb, buf_ptr+sof_offs, (buf_end - (buf_ptr+sof_offs))*8); |
|
|
|
|
s->start_code = SOF0; |
|
|
|
|
if (ff_mjpeg_decode_sof(s) < 0) |
|
|
|
@ -117,25 +113,23 @@ read_header: |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "sos offs: 0x%"PRIx32"\n", sos_offs); |
|
|
|
|
sod_offs = read_offs(avctx, &hgb, buf_end - buf_ptr, "sof is %d and size is %d\n"); |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "sod offs: 0x%"PRIx32"\n", sod_offs); |
|
|
|
|
if (sos_offs) |
|
|
|
|
{ |
|
|
|
|
if (sos_offs) { |
|
|
|
|
init_get_bits(&s->gb, buf_ptr + sos_offs, |
|
|
|
|
8 * FFMIN(field_size, buf_end - buf_ptr - sos_offs)); |
|
|
|
|
s->mjpb_skiptosod = (sod_offs - sos_offs - show_bits(&s->gb, 16)); |
|
|
|
|
s->start_code = SOS; |
|
|
|
|
if (ff_mjpeg_decode_sos(s, NULL, 0, NULL) < 0 && |
|
|
|
|
(avctx->err_recognition & AV_EF_EXPLODE)) |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (s->interlaced) { |
|
|
|
|
s->bottom_field ^= 1; |
|
|
|
|
/* if not bottom field, do not output image yet */ |
|
|
|
|
if (s->bottom_field != s->interlace_polarity && second_field_offs) |
|
|
|
|
{ |
|
|
|
|
if (s->bottom_field != s->interlace_polarity && second_field_offs) { |
|
|
|
|
buf_ptr = buf + second_field_offs; |
|
|
|
|
goto read_header; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//XXX FIXME factorize, this looks very similar to the EOI code
|
|
|
|
|