tiff: correctly decode saparate planes with horizontal differencing predictor
authorPaul B Mahol <onemda@gmail.com>
Thu, 6 Jun 2013 19:42:01 +0000 (19:42 +0000)
committerPaul B Mahol <onemda@gmail.com>
Thu, 6 Jun 2013 19:47:46 +0000 (19:47 +0000)
Closes #2648.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavcodec/tiff.c

index 48807fa..922aed0 100644 (file)
@@ -1178,16 +1178,22 @@ static int decode_frame(AVCodecContext *avctx,
     if (s->predictor == 2) {
         dst   = p->data[plane];
         soff  = s->bpp >> 3;
+        if (s->planar)
+            soff  = FFMAX(soff / s->bppcount, 1);
         ssize = s->width * soff;
         if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48LE ||
-            s->avctx->pix_fmt == AV_PIX_FMT_RGBA64LE) {
+            s->avctx->pix_fmt == AV_PIX_FMT_RGBA64LE ||
+            s->avctx->pix_fmt == AV_PIX_FMT_GBRP16LE ||
+            s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16LE) {
             for (i = 0; i < s->height; i++) {
                 for (j = soff; j < ssize; j += 2)
                     AV_WL16(dst + j, AV_RL16(dst + j) + AV_RL16(dst + j - soff));
                 dst += stride;
             }
         } else if (s->avctx->pix_fmt == AV_PIX_FMT_RGB48BE ||
-                   s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE) {
+                   s->avctx->pix_fmt == AV_PIX_FMT_RGBA64BE ||
+                   s->avctx->pix_fmt == AV_PIX_FMT_GBRP16BE ||
+                   s->avctx->pix_fmt == AV_PIX_FMT_GBRAP16BE) {
             for (i = 0; i < s->height; i++) {
                 for (j = soff; j < ssize; j += 2)
                     AV_WB16(dst + j, AV_RB16(dst + j) + AV_RB16(dst + j - soff));