added correct component id handling

Originally committed as revision 37 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Fabrice Bellard 2001-08-06 01:04:59 +00:00
parent 98be975df1
commit e23884046d
1 changed files with 15 additions and 11 deletions

View File

@ -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;
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];