X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftiff.c;h=8047f384ef0c454843bb3693448fe2cc2b4bee0d;hb=2bc841815c9c0ae37657e40f94d0dce2770f1e27;hp=ee16d7805d76aa601043346940120894e8be2a13;hpb=2a741baeff359aa7e8a5bb2c1a225d6ac9cf10ee;p=ffmpeg diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c index ee16d7805d7..8047f384ef0 100644 --- a/libavcodec/tiff.c +++ b/libavcodec/tiff.c @@ -1257,77 +1257,77 @@ static int decode_frame(AVCodecContext *avctx, 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 = 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; } - 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_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_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] = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<bpp) - 1 : 255) - dst[j]; dst += stride; } } } - if (s->photometric == TIFF_PHOTOMETRIC_WHITE_IS_ZERO) { - dst = p->data[plane]; - for (i = 0; i < s->height; i++) { - for (j = 0; j < p->linesize[plane]; j++) - dst[j] = (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 ? (1<bpp) - 1 : 255) - dst[j]; - dst += stride; - } - } - } - if (s->planar && s->bppcount > 2) { FFSWAP(uint8_t*, p->data[0], p->data[2]); FFSWAP(int, p->linesize[0], p->linesize[2]);