diff --git a/libtiff/tif_jpeg.c b/libtiff/tif_jpeg.c index a967827..ec8485b 100644 --- a/libtiff/tif_jpeg.c +++ b/libtiff/tif_jpeg.c @@ -988,8 +988,15 @@ JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) tsize_t nrows; (void) s; - /* data is expected to be read in multiples of a scanline */ - if ( (nrows = sp->cinfo.d.image_height) ) { + nrows = cc / sp->bytesperline; + if (cc % sp->bytesperline) + TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline not read"); + + if( nrows > (int) sp->cinfo.d.image_height ) + nrows = sp->cinfo.d.image_height; + + /* data is expected to be read in multiples of a scanline */ + if (nrows) { /* Cb,Cr both have sampling factors 1, so this is correct */ JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width; int samples_per_clump = sp->samplesperclump; @@ -1087,8 +1094,7 @@ JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s) * TODO: resolve this */ buf += sp->bytesperline; cc -= sp->bytesperline; - nrows -= sp->v_sampling; - } while (nrows > 0); + } while (--nrows > 0); #ifdef JPEG_LIB_MK1 _TIFFfree(tmpbuf); diff --git a/libtiff/tif_strip.c b/libtiff/tif_strip.c index 63dec6b..b019b74 100644 --- a/libtiff/tif_strip.c +++ b/libtiff/tif_strip.c @@ -238,23 +238,19 @@ TIFFScanlineSize(TIFF* tif) ycbcrsubsampling + 0, ycbcrsubsampling + 1); - if (ycbcrsubsampling[0] == 0) { + if (ycbcrsubsampling[0]*ycbcrsubsampling[1] == 0) { TIFFErrorExt(tif->tif_clientdata, tif->tif_name, "Invalid YCbCr subsampling"); return 0; } - scanline = TIFFroundup(td->td_imagewidth, + /* number of sample clumps per line */ + scanline = TIFFhowmany(td->td_imagewidth, ycbcrsubsampling[0]); - scanline = TIFFhowmany8(multiply(tif, scanline, - td->td_bitspersample, - "TIFFScanlineSize")); - return ((tsize_t) - summarize(tif, scanline, - multiply(tif, 2, - scanline / ycbcrsubsampling[0], - "TIFFVStripSize"), - "TIFFVStripSize")); + /* number of samples per line */ + scanline = multiply(tif, scanline, + ycbcrsubsampling[0]*ycbcrsubsampling[1] + 2, + "TIFFScanlineSize"); } else { scanline = multiply(tif, td->td_imagewidth, td->td_samplesperpixel,