On Tue, Aug 19, 2014 at 01:54:58AM -0300, James Almer wrote: > Signed-off-by: James Almer <jamr...@gmail.com> > --- > Seems to work great with yuv deflate tiff images created with our tiff encoder > > libavcodec/tiff.c | 71 > +++++++++++++++++++++++++++---------------------------- > 1 file changed, 35 insertions(+), 36 deletions(-) > > diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c > index 73bf828..7acfe7b 100644 > --- a/libavcodec/tiff.c > +++ b/libavcodec/tiff.c > @@ -283,6 +283,34 @@ static int deinvert_buffer(TiffContext *s, const uint8_t > *src, int size) > return 0; > } > > +static void unpack_yuv(TiffContext *s, AVFrame *p, > + const uint8_t *src, int lnum) > +{ > + int i, j, k; > + int w = (s->width - 1) / s->subsampling[0] + 1; > + uint8_t *pu = &p->data[1][lnum / s->subsampling[1] * p->linesize[1]]; > + uint8_t *pv = &p->data[2][lnum / s->subsampling[1] * p->linesize[2]]; > + if (s->width % s->subsampling[0] || s->height % s->subsampling[1]) { > + for (i = 0; i < w; i++) { > + for (j = 0; j < s->subsampling[1]; j++) > + for (k = 0; k < s->subsampling[0]; k++) > + p->data[0][FFMIN(lnum + j, s->height-1) * p->linesize[0] > + > + FFMIN(i * s->subsampling[0] + k, s->width-1)] > = *src++; > + *pu++ = *src++; > + *pv++ = *src++; > + } > + }else{ > + for (i = 0; i < w; i++) { > + for (j = 0; j < s->subsampling[1]; j++) > + for (k = 0; k < s->subsampling[0]; k++) > + p->data[0][(lnum + j) * p->linesize[0] + > + i * s->subsampling[0] + k] = *src++; > + *pu++ = *src++; > + *pv++ = *src++; > + } > + } > +} > + > #if CONFIG_ZLIB > static int tiff_uncompress(uint8_t *dst, unsigned long *len, const uint8_t > *src, > int size) > @@ -305,9 +333,9 @@ static int tiff_uncompress(uint8_t *dst, unsigned long > *len, const uint8_t *src, > return zret == Z_STREAM_END ? Z_OK : zret; > } > > -static int tiff_unpack_zlib(TiffContext *s, uint8_t *dst, int stride, > +static int tiff_unpack_zlib(TiffContext *s, AVFrame *p, uint8_t *dst, int > stride, > const uint8_t *src, int size, > - int width, int lines) > + int width, int lines, int strip_start) > { > uint8_t *zbuf; > unsigned long outlen; > @@ -338,6 +366,10 @@ static int tiff_unpack_zlib(TiffContext *s, uint8_t > *dst, int stride, > } else { > memcpy(dst, src, width); > } > + if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) { > + unpack_yuv(s, p, dst, strip_start + line); > + line += s->subsampling[1] - 1; > + }
is photometric guranteed to match the pix_fmt ? iam asking as i dont see that being ensured by the code but i might be missing something if they could mismatch, id assume it might crash [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB The real ebay dictionary, page 2 "100% positive feedback" - "All either got their money back or didnt complain" "Best seller ever, very honest" - "Seller refunded buyer after failed scam"
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel