Index: libavcodec/tiff.c
===================================================================
--- libavcodec/tiff.c	(revision 23363)
+++ libavcodec/tiff.c	(working copy)
@@ -39,7 +39,7 @@
     AVFrame picture;
 
     int width, height;
-    unsigned int bpp;
+    unsigned int bpp, bppcount;
     int le;
     int compr;
     int invert;
@@ -209,7 +209,54 @@
     return 0;
 }
 
+static int init_image(TiffContext *s)
+{
+    int i;
+    uint32_t *pal;
 
+        switch(s->bpp*10 + s->bppcount){
+        case 11:
+            s->avctx->pix_fmt = PIX_FMT_MONOBLACK;
+            break;
+        case 81:
+            s->avctx->pix_fmt = PIX_FMT_PAL8;
+            break;
+        case 243:
+            s->avctx->pix_fmt = PIX_FMT_RGB24;
+            break;
+        case 161:
+            s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
+            break;
+        case 324:
+            s->avctx->pix_fmt = PIX_FMT_RGBA;
+            break;
+        case 483:
+            s->avctx->pix_fmt = s->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;
+            break;
+        default:
+            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, s->bppcount);
+            return -1;
+        }
+        if(s->width != s->avctx->width || s->height != s->avctx->height){
+            if(avcodec_check_dimensions(s->avctx, s->width, s->height))
+                return -1;
+            avcodec_set_dimensions(s->avctx, s->width, s->height);
+        }
+        if(s->picture.data[0])
+            s->avctx->release_buffer(s->avctx, &s->picture);
+        if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
+            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+            return -1;
+        }
+        if(s->bpp == 8 && s->picture.data[1]){
+            /* make default grayscale pal */
+            pal = (uint32_t *) s->picture.data[1];
+            for(i = 0; i < 256; i++)
+                pal[i] = i * 0x010101;
+        }
+        return 0;
+}
+
 static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *buf, const uint8_t *end_buf)
 {
     int tag, type, count, off, value = 0;
@@ -262,6 +309,7 @@
         s->height = value;
         break;
     case TIFF_BPP:
+        s->bppcount = count;
         if(count == 1) s->bpp = value;
         else{
             switch(type){
@@ -281,46 +329,18 @@
             av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);
             return -1;
         }
-        switch(s->bpp*10 + count){
-        case 11:
-            s->avctx->pix_fmt = PIX_FMT_MONOBLACK;
-            break;
-        case 81:
-            s->avctx->pix_fmt = PIX_FMT_PAL8;
-            break;
-        case 243:
-            s->avctx->pix_fmt = PIX_FMT_RGB24;
-            break;
-        case 161:
-            s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
-            break;
-        case 324:
-            s->avctx->pix_fmt = PIX_FMT_RGBA;
-            break;
-        case 483:
-            s->avctx->pix_fmt = s->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;
-            break;
-        default:
-            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);
+        if(init_image(s))
             return -1;
+        break;
+    case TIFF_SAMPLES_PER_PIXEL:
+        if(count != 1){
+            av_log(s->avctx, AV_LOG_ERROR, "Samples per pixel is not a single value\n");
+            return -1;
         }
-        if(s->width != s->avctx->width || s->height != s->avctx->height){
-            if(avcodec_check_dimensions(s->avctx, s->width, s->height))
-                return -1;
-            avcodec_set_dimensions(s->avctx, s->width, s->height);
-        }
-        if(s->picture.data[0])
-            s->avctx->release_buffer(s->avctx, &s->picture);
-        if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
-            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+        s->bpp *= value;
+        s->bppcount = value;
+        if(init_image(s))
             return -1;
-        }
-        if(s->bpp == 8){
-            /* make default grayscale pal */
-            pal = (uint32_t *) s->picture.data[1];
-            for(i = 0; i < 256; i++)
-                pal[i] = i * 0x010101;
-        }
         break;
     case TIFF_COMPR:
         s->compr = value;
