Merge commit 'f86f39cb9b1fcd063d5e4812132a75c06cc7acd2'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 15 Jan 2015 05:00:25 +0000 (06:00 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 15 Jan 2015 05:11:32 +0000 (06:11 +0100)
* commit 'f86f39cb9b1fcd063d5e4812132a75c06cc7acd2':
  tiff: support decoding GBRP and GBRAP formats

Conflicts:
libavcodec/tiff.c

See: 379ad9788b80e05c0379adc49b26704dfd27d564
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/tiff.c

@@@ -1257,62 -626,62 +1257,72 @@@ static int decode_frame(AVCodecContext 
      planes = s->planar ? s->bppcount : 1;
      for (plane = 0; plane < planes; plane++) {
          stride = p->linesize[plane];
-         dst    = p->data[plane];
-     for (i = 0; i < s->height; i += s->rps) {
-         if (s->stripsizesoff)
-             ssize = ff_tget(&stripsizes, s->sstype, le);
-         else
-             ssize = s->stripsize;
-         if (s->strippos)
-             soff = ff_tget(&stripdata, s->sot, le);
-         else
-             soff = s->stripoff;
-         if (soff > avpkt->size || ssize > avpkt->size - soff) {
-             av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
-             return AVERROR_INVALIDDATA;
-         }
-         if ((ret = tiff_unpack_strip(s, p, dst, stride, avpkt->data + soff, ssize, i,
-                                      FFMIN(s->rps, s->height - i))) < 0) {
-             if (avctx->err_recognition & AV_EF_EXPLODE)
-                 return ret;
-             break;
-         }
-         dst += s->rps * stride;
-     }
-     if (s->predictor == 2) {
-         if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
-             av_log(s->avctx, AV_LOG_ERROR, "predictor == 2 with YUV is unsupported");
-             return AVERROR_PATCHWELCOME;
+         dst = p->data[plane];
+         for (i = 0; i < s->height; i += s->rps) {
+             if (s->stripsizesoff)
 -                ssize = tget(&stripsizes, s->sstype, le);
++                ssize = ff_tget(&stripsizes, s->sstype, le);
+             else
+                 ssize = s->stripsize;
+             if (s->strippos)
 -                soff = tget(&stripdata, s->sot, le);
++                soff = ff_tget(&stripdata, s->sot, le);
+             else
+                 soff = s->stripoff;
+             if (soff > avpkt->size || ssize > avpkt->size - soff) {
+                 av_log(avctx, AV_LOG_ERROR, "Invalid strip size/offset\n");
+                 return AVERROR_INVALIDDATA;
+             }
 -            if ((ret = tiff_unpack_strip(s, dst, stride, avpkt->data + soff, ssize,
++            if ((ret = tiff_unpack_strip(s, p, dst, stride, avpkt->data + soff, ssize, i,
+                                          FFMIN(s->rps, s->height - i))) < 0) {
+                 if (avctx->err_recognition & AV_EF_EXPLODE)
+                     return ret;
+                 break;
+             }
+             dst += s->rps * stride;
          }
-         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_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;
+         if (s->predictor == 2) {
++            if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
++                av_log(s->avctx, AV_LOG_ERROR, "predictor == 2 with YUV is unsupported");
++                return AVERROR_PATCHWELCOME;
 +            }
-         } 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_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));
-                 dst += stride;
+             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));
+                     dst += stride;
+                 }
+             } else {
+                 for (i = 0; i < s->height; i++) {
+                     for (j = soff; j < ssize; j++)
+                         dst[j] += dst[j - soff];
+                     dst += stride;
+                 }
              }
-         } else {
+         }
+         if (s->photometric == TIFF_PHOTOMETRIC_WHITE_IS_ZERO) {
+             dst = p->data[plane];
              for (i = 0; i < s->height; i++) {
-                 for (j = soff; j < ssize; j++)
-                     dst[j] += dst[j - soff];
+                 for (j = 0; j < stride; j++)
 -                    dst[j] = 255 - dst[j];
++                    dst[j] = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<<s->bpp) - 1 : 255) - dst[j];
                  dst += stride;
              }
          }