diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index f371dc6..c7aee32 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -173,7 +173,23 @@ 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) {
+                    int i;
+                    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) {
+                    int i;
+                    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++)
@@ -227,6 +243,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;
@@ -248,6 +266,10 @@ static int init_image(TiffContext *s)
                s->bpp, s->bppcount);
         return AVERROR_INVALIDDATA;
     }
+    if (s->bpp == 2 && s->compr != TIFF_RAW || s->bpp == 4 && s->compr != TIFF_RAW) {
+        av_log(s->avctx, AV_LOG_ERROR, "2/4bpp with compression is not supported\n");
+        return AVERROR_INVALIDDATA;
+    }
     if (s->width != s->avctx->width || s->height != s->avctx->height) {
         if ((ret = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0)
             return ret;
