]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/tiff.c
revert bad checkin
[ffmpeg] / libavcodec / tiff.c
index 7d1ea80580ed8f18331101914964499e1f883051..5925af1ae9bfca10cdc38479576fe8b1922fa850 100644 (file)
@@ -35,6 +35,7 @@ enum TiffTags{
     TIFF_STRIP_OFFS = 0x111,
     TIFF_ROWSPERSTRIP = 0x116,
     TIFF_STRIP_SIZE,
+    TIFF_PLANAR = 0x11C,
     TIFF_XPOS = 0x11E,
     TIFF_YPOS = 0x11F,
     TIFF_PREDICTOR = 0x13D,
@@ -62,6 +63,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;
@@ -110,10 +116,6 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, uint8_t *
 
     if(s->compr == TIFF_DEFLATE || s->compr == TIFF_ADOBE_DEFLATE){
         outlen = width * lines;
-        if(lines != s->height){
-            av_log(s->avctx, AV_LOG_ERROR, "This decoder won't decode ZLib-packed TIFF with %i lines per strip\n", lines);
-            return -1;
-        }
         zbuf = av_malloc(outlen);
         if(uncompress(zbuf, &outlen, src, size) != Z_OK){
             av_log(s->avctx, AV_LOG_ERROR, "Uncompressing failed (%lu of %lu)\n", outlen, (unsigned long)width * lines);
@@ -212,6 +214,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;
     }
@@ -251,8 +255,16 @@ static int tiff_decode_tag(TiffContext *s, uint8_t *start, uint8_t *buf, uint8_t
         case 24:
             s->avctx->pix_fmt = PIX_FMT_RGB24;
             break;
+        case 16:
+            if(count == 1){
+                s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
+            }else{
+                av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%i)\n", s->bpp);
+                return -1;
+            }
+            break;
         default:
-            av_log(s->avctx, AV_LOG_ERROR, "Only RGB24 is supported (this bpp=%i)\n", s->bpp);
+            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%i)\n", s->bpp);
             return -1;
         }
         if(s->width != s->avctx->width || s->height != s->avctx->height){
@@ -387,6 +399,12 @@ static int tiff_decode_tag(TiffContext *s, uint8_t *start, uint8_t *buf, uint8_t
         case 1:
             s->invert = 0;
             break;
+        case 2:
+        case 3:
+            break;
+        default:
+            av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n", value);
+            return -1;
         }
         break;
     case TIFF_PAL:
@@ -395,17 +413,24 @@ 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;
             j |= tget(&bp, type, s->le) >> off;
             pal[i] = j;
         }
+        break;
+    case TIFF_PLANAR:
+        if(value == 2){
+            av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");
+            return -1;
+        }
+        break;
     }
     return 0;
 }