aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2001-08-06 01:04:59 +0000
committerFabrice Bellard <fabrice@bellard.org>2001-08-06 01:04:59 +0000
commite23884046dc86761539056b72883bcce874ba31b (patch)
tree0a302991af56496c873282db86a8a71fd30c9f0e
parent98be975df1f6bb88ebeca3eada597e3f20fd5c46 (diff)
downloadffmpeg-e23884046dc86761539056b72883bcce874ba31b.tar.gz
added correct component id handling
Originally committed as revision 37 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/mjpeg.c26
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];