# HG changeset patch # User glantau # Date 997059899 0 # Node ID ce751dfbcace031a6aa1da5a8822736bc39b559c # Parent 2f603eb2f23d5a4f31d164924bbc8d7432772030 added correct component id handling diff -r 2f603eb2f23d -r ce751dfbcace mjpeg.c --- a/mjpeg.c Mon Aug 06 00:47:50 2001 +0000 +++ b/mjpeg.c Mon Aug 06 01:04:59 2001 +0000 @@ -442,6 +442,8 @@ 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_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 @@ 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;igb, 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 @@ 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 @@ 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 @@ vmax = 0; hmax = 0; for(i=0;igb, 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;indexnb_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];