diff options
author | Fabrice Bellard <fabrice@bellard.org> | 2001-08-06 01:04:59 +0000 |
---|---|---|
committer | Fabrice Bellard <fabrice@bellard.org> | 2001-08-06 01:04:59 +0000 |
commit | e23884046dc86761539056b72883bcce874ba31b (patch) | |
tree | 0a302991af56496c873282db86a8a71fd30c9f0e /libavcodec/mjpeg.c | |
parent | 98be975df1f6bb88ebeca3eada597e3f20fd5c46 (diff) | |
download | ffmpeg-e23884046dc86761539056b72883bcce874ba31b.tar.gz |
added correct component id handling
Originally committed as revision 37 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mjpeg.c')
-rw-r--r-- | libavcodec/mjpeg.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/libavcodec/mjpeg.c b/libavcodec/mjpeg.c index 3a6aad3fd4..1dcc9ac48d 100644 --- a/libavcodec/mjpeg.c +++ b/libavcodec/mjpeg.c @@ -442,6 +442,8 @@ typedef struct MJpegDecodeContext { INT16 quant_matrixes[4][64]; VLC vlcs[2][4]; int width, height; + int nb_components; + int component_id[MAX_COMPONENTS]; int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */ int v_count[MAX_COMPONENTS]; int h_max, v_max; /* maximum h and v counts */ @@ -552,7 +554,7 @@ static int mjpeg_decode_dht(MJpegDecodeContext *s, static int mjpeg_decode_sof0(MJpegDecodeContext *s, UINT8 *buf, int buf_size) { - int len, nb_components, i, index, width, height; + int len, nb_components, i, width, height; init_get_bits(&s->gb, buf, buf_size); @@ -568,14 +570,12 @@ static int mjpeg_decode_sof0(MJpegDecodeContext *s, if (nb_components <= 0 || nb_components > MAX_COMPONENTS) return -1; + s->nb_components = nb_components; s->h_max = 1; s->v_max = 1; for(i=0;i<nb_components;i++) { /* component id */ - index = get_bits(&s->gb, 8) - 1; - /* XXX: avoid this limitation */ - if (index < 0 || index >= MAX_COMPONENTS) - return -1; + 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); /* compute hmax and vmax (only used in interleaved case) */ @@ -583,11 +583,12 @@ static int mjpeg_decode_sof0(MJpegDecodeContext *s, s->h_max = s->h_count[i]; if (s->v_count[i] > s->v_max) s->v_max = s->v_count[i]; - +#if 1 /* XXX: only 420 is accepted */ if ((i == 0 && (s->h_count[i] != 2 || s->v_count[i] != 2)) || (i != 0 && (s->h_count[i] != 1 || s->v_count[i] != 1))) return -1; +#endif s->quant_index[i] = get_bits(&s->gb, 8); if (s->quant_index[i] >= 4) return -1; @@ -696,7 +697,7 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s, UINT8 *buf, int buf_size) { int len, nb_components, i, j, n, h, v; - int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index; + int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id; int comp_index[4]; int dc_index[4]; int ac_index[4]; @@ -714,12 +715,15 @@ static int mjpeg_decode_sos(MJpegDecodeContext *s, vmax = 0; hmax = 0; for(i=0;i<nb_components;i++) { - index = get_bits(&s->gb, 8) - 1; - /* XXX: this limitation is not OK */ - if (index < 0 || index >= 4) + id = get_bits(&s->gb, 8) - 1; + /* find component index */ + for(index=0;index<s->nb_components;index++) + if (id == s->component_id[index]) + break; + if (index == s->nb_components) return -1; + comp_index[i] = index; - nb_blocks[i] = s->h_count[index] * s->v_count[index]; h_count[i] = s->h_count[index]; v_count[i] = s->v_count[index]; |