diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index a42b27f..2ac8355 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -166,6 +166,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uin
         return ret;
     }
     for(line = 0; line < lines; line++){
+        int i;
         if(src - ssrc > size){
             av_log(s->avctx, AV_LOG_ERROR, "Source data overread\n");
             return -1;
@@ -173,9 +174,22 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uin
         switch(s->compr){
         case TIFF_RAW:
             if (!s->fill_order) {
-                memcpy(dst, src, width);
+                if (s->bpp == 2) {
+                    for(i = 0; i < width; i++) {
+                        dst[i*4+0] = src[i] >> 6;
+                        dst[i*4+1] = src[i] >> 4 & 0x3;
+                        dst[i*4+2] = src[i] >> 2 & 0x3;
+                        dst[i*4+3] = src[i] & 0x3;
+                    }
+                } else if (s->bpp == 4) {
+                    for(i = 0; i < width; i++) {
+                        dst[i*2+0] = src[i] >> 4;
+                        dst[i*2+1] = src[i] & 0xF;
+                    }
+                } else {
+                    memcpy(dst, src, width);
+                }
             } else {
-                int i;
                 for (i = 0; i < width; i++)
                     dst[i] = av_reverse[src[i]];
             }
@@ -190,7 +204,21 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uin
                         av_log(s->avctx, AV_LOG_ERROR, "Copy went out of bounds\n");
                         return -1;
                     }
-                    memcpy(dst + pixels, src, code);
+                    if (s->bpp == 2) {
+                        for (i = 0; i < code; i++) {
+                            dst[(pixels+i)*4+0] = src[i] >> 6;
+                            dst[(pixels+i)*4+1] = src[i] >> 4 & 0x3;
+                            dst[(pixels+i)*4+2] = src[i] >> 2 & 0x3;
+                            dst[(pixels+i)*4+3] = src[i] & 0x3;
+                        }
+                    } else if (s->bpp == 4) {
+                        for(i = 0; i < code; i++) {
+                            dst[(pixels+i)*2+0] = src[i] >> 4;
+                            dst[(pixels+i)*2+1] = src[i] & 0xF;
+                        }
+                    } else {
+                        memcpy(dst + pixels, src, code);
+                    }
                     src += code;
                     pixels += code;
                 }else if(code != -128){ // -127..-1
@@ -200,7 +228,21 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t* dst, int stride, const uin
                         return -1;
                     }
                     c = *src++;
-                    memset(dst + pixels, c, code);
+                    if (s->bpp == 2) {
+                        for (i = 0; i < code; i++) {
+                            dst[(pixels+i)*4+0] = c >> 6;
+                            dst[(pixels+i)*4+1] = c >> 4 & 0x3;
+                            dst[(pixels+i)*4+2] = c >> 2 & 0x3;
+                            dst[(pixels+i)*4+3] = c & 0x3;
+                        }
+                    } else if (s->bpp == 4) {
+                        for(i = 0; i < code; i++) {
+                            dst[(pixels+i)*2+0] = c >> 4;
+                            dst[(pixels+i)*2+1] = c & 0xF;
+                        }
+                    } else {
+                        memset(dst + pixels, c, code);
+                    }
                     pixels += code;
                 }
             }
@@ -227,6 +269,8 @@ static int init_image(TiffContext *s)
     case 11:
         s->avctx->pix_fmt = PIX_FMT_MONOBLACK;
         break;
+    case 21:
+    case 41:
     case 81:
         s->avctx->pix_fmt = PIX_FMT_PAL8;
         break;
