OSDN Git Service

Use table for determining type sizes
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 13 Nov 2006 11:34:46 +0000 (11:34 +0000)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 13 Nov 2006 11:34:46 +0000 (11:34 +0000)
Originally committed as revision 7009 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/tiff.c

index ec7839c..d0177fa 100644 (file)
@@ -62,6 +62,11 @@ enum TiffTypes{
     TIFF_LONGLONG
 };
 
+/** sizes of various TIFF field types */
+static const int type_sizes[6] = {
+    0, 1, 100, 2, 4, 8
+};
+
 typedef struct TiffContext {
     AVCodecContext *avctx;
     AVFrame picture;
@@ -208,6 +213,8 @@ static int tiff_decode_tag(TiffContext *s, uint8_t *start, uint8_t *buf, uint8_t
             value = -1;
             buf = start + off;
         }
+    }else if(type_sizes[type] * count <= 4){
+        buf -= 4;
     }else{
         buf = start + off;
     }
@@ -397,11 +404,11 @@ static int tiff_decode_tag(TiffContext *s, uint8_t *start, uint8_t *buf, uint8_t
             return -1;
         }
         pal = s->picture.data[1];
-        off = (type == TIFF_SHORT) ? 2 : 1;
+        off = type_sizes[type];
         rp = buf;
         gp = buf + count / 3 * off;
         bp = buf + count / 3 * off * 2;
-        off = (type == TIFF_SHORT) ? 8 : 0;
+        off = (type_sizes[type] - 1) << 3;
         for(i = 0; i < count / 3; i++){
             j = (tget(&rp, type, s->le) >> off) << 16;
             j |= (tget(&gp, type, s->le) >> off) << 8;