|
|
@@ -211,6 +211,8 @@ int ff_mjpeg_decode_dht(MJpegDecodeContext *s) |
|
|
|
int ff_mjpeg_decode_sof(MJpegDecodeContext *s) |
|
|
|
{ |
|
|
|
int len, nb_components, i, width, height, pix_fmt_id; |
|
|
|
int h_count[MAX_COMPONENTS]; |
|
|
|
int v_count[MAX_COMPONENTS]; |
|
|
|
|
|
|
|
s->cur_scan = 0; |
|
|
|
s->upscale_h = s->upscale_v = 0; |
|
|
@@ -264,19 +266,19 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) |
|
|
|
s->nb_components = nb_components; |
|
|
|
s->h_max = 1; |
|
|
|
s->v_max = 1; |
|
|
|
memset(s->h_count, 0, sizeof(s->h_count)); |
|
|
|
memset(s->v_count, 0, sizeof(s->v_count)); |
|
|
|
memset(h_count, 0, sizeof(h_count)); |
|
|
|
memset(v_count, 0, sizeof(v_count)); |
|
|
|
for (i = 0; i < nb_components; i++) { |
|
|
|
/* component id */ |
|
|
|
s->component_id[i] = get_bits(&s->gb, 8) - 1; |
|
|
|
s->h_count[i] = get_bits(&s->gb, 4); |
|
|
|
s->v_count[i] = get_bits(&s->gb, 4); |
|
|
|
h_count[i] = get_bits(&s->gb, 4); |
|
|
|
v_count[i] = get_bits(&s->gb, 4); |
|
|
|
/* compute hmax and vmax (only used in interleaved case) */ |
|
|
|
if (s->h_count[i] > s->h_max) |
|
|
|
s->h_max = s->h_count[i]; |
|
|
|
if (s->v_count[i] > s->v_max) |
|
|
|
s->v_max = s->v_count[i]; |
|
|
|
if (!s->h_count[i] || !s->v_count[i]) { |
|
|
|
if (h_count[i] > s->h_max) |
|
|
|
s->h_max = h_count[i]; |
|
|
|
if (v_count[i] > s->v_max) |
|
|
|
s->v_max = v_count[i]; |
|
|
|
if (!h_count[i] || !v_count[i]) { |
|
|
|
av_log(s->avctx, AV_LOG_ERROR, "h/v_count is 0\n"); |
|
|
|
return -1; |
|
|
|
} |
|
|
@@ -284,7 +286,7 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) |
|
|
|
if (s->quant_index[i] >= 4) |
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n", |
|
|
|
i, s->h_count[i], s->v_count[i], |
|
|
|
i, h_count[i], v_count[i], |
|
|
|
s->component_id[i], s->quant_index[i]); |
|
|
|
} |
|
|
|
|
|
|
@@ -297,13 +299,17 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) |
|
|
|
s->rgb = 1; |
|
|
|
|
|
|
|
/* if different size, realloc/alloc picture */ |
|
|
|
/* XXX: also check h_count and v_count */ |
|
|
|
if (width != s->width || height != s->height) { |
|
|
|
if ( width != s->width || height != s->height |
|
|
|
|| memcmp(s->h_count, h_count, sizeof(h_count[0])*nb_components) |
|
|
|
|| memcmp(s->v_count, v_count, sizeof(v_count[0])*nb_components)) { |
|
|
|
av_freep(&s->qscale_table); |
|
|
|
|
|
|
|
s->width = width; |
|
|
|
s->height = height; |
|
|
|
memcpy(s->h_count, h_count, sizeof(h_count)); |
|
|
|
memcpy(s->v_count, v_count, sizeof(v_count)); |
|
|
|
s->interlaced = 0; |
|
|
|
s->got_picture = 0; |
|
|
|
|
|
|
|
/* test interlaced mode */ |
|
|
|
if (s->first_picture && |
|
|
|