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 */
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);
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) */
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;
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];
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];