diff mjpeg.c @ 26:ce751dfbcace libavcodec

added correct component id handling
author glantau
date Mon, 06 Aug 2001 01:04:59 +0000
parents 1e131bc21101
children b611fafddf9e
line wrap: on
line diff
--- 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;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 @@
             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;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];