strip size related bugfix in tif_jpeg encode raw
This commit is contained in:
parent
64bd1138df
commit
84281a8949
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2006-03-25 Joris Van Damme <joris.at.lebbeke@skynet.be>
|
||||||
|
|
||||||
|
* libtiff/tif_jpeg.c: strip size related bugfix in encode raw
|
||||||
|
|
||||||
|
* libtiff/tif_strip.c: temporarilly added two new versions of
|
||||||
|
- TIFFNewScanlineSize: proposed new version, after all related
|
||||||
|
issues and side-effects are sorted out
|
||||||
|
- TIFFOldScanlineSize: old version, from prior to 2006-03-21 change
|
||||||
|
This needs further sorting out.
|
||||||
|
|
||||||
2006-03-25 Joris Van Damme <joris.at.lebbeke@skynet.be>
|
2006-03-25 Joris Van Damme <joris.at.lebbeke@skynet.be>
|
||||||
|
|
||||||
* contrib/addtiffo/tif_ovrcache.c: bugfix to correctly pass size
|
* contrib/addtiffo/tif_ovrcache.c: bugfix to correctly pass size
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tif_jpeg.c,v 1.46 2006-03-25 08:01:08 joris Exp $ */
|
/* $Id: tif_jpeg.c,v 1.47 2006-03-25 18:04:34 joris Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994-1997 Sam Leffler
|
* Copyright (c) 1994-1997 Sam Leffler
|
||||||
@ -1049,7 +1049,8 @@ JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
|
|||||||
|
|
||||||
sp->scancount ++;
|
sp->scancount ++;
|
||||||
tif->tif_row += sp->v_sampling;
|
tif->tif_row += sp->v_sampling;
|
||||||
/* increment/decrement of buf and cc is still incorrect, but should not matter */
|
/* increment/decrement of buf and cc is still incorrect, but should not matter
|
||||||
|
* TODO: resolve this */
|
||||||
buf += sp->bytesperline;
|
buf += sp->bytesperline;
|
||||||
cc -= sp->bytesperline;
|
cc -= sp->bytesperline;
|
||||||
nrows -= sp->v_sampling;
|
nrows -= sp->v_sampling;
|
||||||
@ -1198,9 +1199,9 @@ JPEGSetupEncode(TIFF* tif)
|
|||||||
/* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
|
/* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
|
||||||
if (td->td_bitspersample != 8 && td->td_bitspersample != 12)
|
if (td->td_bitspersample != 8 && td->td_bitspersample != 12)
|
||||||
#else
|
#else
|
||||||
if (td->td_bitspersample != BITS_IN_JSAMPLE )
|
if (td->td_bitspersample != BITS_IN_JSAMPLE )
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG",
|
TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG",
|
||||||
(int) td->td_bitspersample);
|
(int) td->td_bitspersample);
|
||||||
return (0);
|
return (0);
|
||||||
@ -1278,7 +1279,7 @@ JPEGPreEncode(TIFF* tif, tsample_t s)
|
|||||||
segment_height = td->td_imagelength - tif->tif_row;
|
segment_height = td->td_imagelength - tif->tif_row;
|
||||||
if (segment_height > td->td_rowsperstrip)
|
if (segment_height > td->td_rowsperstrip)
|
||||||
segment_height = td->td_rowsperstrip;
|
segment_height = td->td_rowsperstrip;
|
||||||
sp->bytesperline = TIFFScanlineSize(tif);
|
sp->bytesperline = TIFFOldScanlineSize(tif);
|
||||||
}
|
}
|
||||||
if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
|
if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
|
||||||
/* for PC 2, scale down the strip/tile size
|
/* for PC 2, scale down the strip/tile size
|
||||||
@ -1416,18 +1417,25 @@ JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
|
|||||||
int clumpoffset, ci, xpos, ypos;
|
int clumpoffset, ci, xpos, ypos;
|
||||||
jpeg_component_info* compptr;
|
jpeg_component_info* compptr;
|
||||||
int samples_per_clump = sp->samplesperclump;
|
int samples_per_clump = sp->samplesperclump;
|
||||||
|
tsize_t bytesperclumpline;
|
||||||
|
|
||||||
(void) s;
|
(void) s;
|
||||||
assert(sp != NULL);
|
assert(sp != NULL);
|
||||||
/* data is expected to be supplied in multiples of a scanline */
|
/* data is expected to be supplied in multiples of a clumpline */
|
||||||
nrows = cc / sp->bytesperline;
|
/* a clumpline is equivalent to v_sampling desubsampled scanlines */
|
||||||
if (cc % sp->bytesperline)
|
/* TODO: the following calculation of bytesperclumpline, should substitute calculation of sp->bytesperline, except that it is per v_sampling lines */
|
||||||
|
bytesperclumpline = (((sp->cinfo.c.image_width+sp->h_sampling-1)/sp->h_sampling)
|
||||||
|
*(sp->h_sampling*sp->v_sampling+2)*sp->cinfo.c.data_precision+7)
|
||||||
|
/8;
|
||||||
|
|
||||||
|
nrows = ( cc / bytesperclumpline ) * sp->v_sampling;
|
||||||
|
if (cc % bytesperclumpline)
|
||||||
TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded");
|
TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded");
|
||||||
|
|
||||||
/* Cb,Cr both have sampling factors 1, so this is correct */
|
/* Cb,Cr both have sampling factors 1, so this is correct */
|
||||||
clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
|
clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
|
||||||
|
|
||||||
while (nrows-- > 0) {
|
while (nrows > 0) {
|
||||||
/*
|
/*
|
||||||
* Fastest way to separate the data is to make one pass
|
* Fastest way to separate the data is to make one pass
|
||||||
* over the scanline for each row of each component.
|
* over the scanline for each row of each component.
|
||||||
@ -1472,9 +1480,9 @@ JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
|
|||||||
return (0);
|
return (0);
|
||||||
sp->scancount = 0;
|
sp->scancount = 0;
|
||||||
}
|
}
|
||||||
if (nrows > 0)
|
tif->tif_row += sp->v_sampling;
|
||||||
tif->tif_row++;
|
|
||||||
buf += sp->bytesperline;
|
buf += sp->bytesperline;
|
||||||
|
nrows -= sp->v_sampling;
|
||||||
}
|
}
|
||||||
return (1);
|
return (1);
|
||||||
}
|
}
|
||||||
@ -1703,7 +1711,6 @@ JPEGVGetField(TIFF* tif, ttag_t tag, va_list ap)
|
|||||||
case TIFFTAG_YCBCRSUBSAMPLING:
|
case TIFFTAG_YCBCRSUBSAMPLING:
|
||||||
JPEGFixupTestSubsampling( tif );
|
JPEGFixupTestSubsampling( tif );
|
||||||
return (*sp->vgetparent)(tif, tag, ap);
|
return (*sp->vgetparent)(tif, tag, ap);
|
||||||
break;
|
|
||||||
case TIFFTAG_FAXRECVPARAMS:
|
case TIFFTAG_FAXRECVPARAMS:
|
||||||
*va_arg(ap, uint32*) = sp->recvparams;
|
*va_arg(ap, uint32*) = sp->recvparams;
|
||||||
break;
|
break;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tif_strip.c,v 1.18 2006-03-25 08:01:08 joris Exp $ */
|
/* $Id: tif_strip.c,v 1.19 2006-03-25 18:04:35 joris Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1991-1997 Sam Leffler
|
* Copyright (c) 1991-1997 Sam Leffler
|
||||||
@ -121,12 +121,12 @@ TIFFVStripSize(TIFF* tif, uint32 nrows)
|
|||||||
* horizontal/vertical subsampling area include
|
* horizontal/vertical subsampling area include
|
||||||
* YCbCr data for the extended image.
|
* YCbCr data for the extended image.
|
||||||
*/
|
*/
|
||||||
uint16 ycbcrsubsampling[2];
|
uint16 ycbcrsubsampling[2];
|
||||||
tsize_t w, scanline, samplingarea;
|
tsize_t w, scanline, samplingarea;
|
||||||
|
|
||||||
TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
|
TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||||
ycbcrsubsampling + 0,
|
ycbcrsubsampling + 0,
|
||||||
ycbcrsubsampling + 1 );
|
ycbcrsubsampling + 1 );
|
||||||
|
|
||||||
samplingarea = ycbcrsubsampling[0]*ycbcrsubsampling[1];
|
samplingarea = ycbcrsubsampling[0]*ycbcrsubsampling[1];
|
||||||
if (samplingarea == 0) {
|
if (samplingarea == 0) {
|
||||||
@ -285,6 +285,57 @@ TIFFOldScanlineSize(TIFF* tif)
|
|||||||
return ((tsize_t) TIFFhowmany8(scanline));
|
return ((tsize_t) TIFFhowmany8(scanline));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the number of bytes to read/write in a call to
|
||||||
|
* one of the scanline-oriented i/o routines. Note that
|
||||||
|
* this number may be 1/samples-per-pixel if data is
|
||||||
|
* stored as separate planes.
|
||||||
|
* The ScanlineSize in case of YCbCrSubsampling is defined as the
|
||||||
|
* strip size divided by the strip height, i.e. the size of a pack of vertical
|
||||||
|
* subsampling lines divided by vertical subsampling. It should thus make
|
||||||
|
* sense when multiplied by a multiple of vertical subsampling.
|
||||||
|
* Some stuff depends on this newer version of TIFFScanlineSize
|
||||||
|
* TODO: resolve this
|
||||||
|
*/
|
||||||
|
tsize_t
|
||||||
|
TIFFNewScanlineSize(TIFF* tif)
|
||||||
|
{
|
||||||
|
TIFFDirectory *td = &tif->tif_dir;
|
||||||
|
tsize_t scanline;
|
||||||
|
|
||||||
|
if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
|
||||||
|
if (td->td_photometric == PHOTOMETRIC_YCBCR
|
||||||
|
&& !isUpSampled(tif)) {
|
||||||
|
uint16 ycbcrsubsampling[2];
|
||||||
|
|
||||||
|
TIFFGetField(tif, TIFFTAG_YCBCRSUBSAMPLING,
|
||||||
|
ycbcrsubsampling + 0,
|
||||||
|
ycbcrsubsampling + 1);
|
||||||
|
|
||||||
|
if (ycbcrsubsampling[0]*ycbcrsubsampling[1] == 0) {
|
||||||
|
TIFFErrorExt(tif->tif_clientdata, tif->tif_name,
|
||||||
|
"Invalid YCbCr subsampling");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return((tsize_t) ((((td->td_imagewidth+ycbcrsubsampling[0]-1)
|
||||||
|
/ycbcrsubsampling[0])
|
||||||
|
*(ycbcrsubsampling[0]*ycbcrsubsampling[1]+2)
|
||||||
|
*td->td_bitspersample+7)
|
||||||
|
/8)/ycbcrsubsampling[1]);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
scanline = multiply(tif, td->td_imagewidth,
|
||||||
|
td->td_samplesperpixel,
|
||||||
|
"TIFFScanlineSize");
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
scanline = td->td_imagewidth;
|
||||||
|
return ((tsize_t) TIFFhowmany8(multiply(tif, scanline,
|
||||||
|
td->td_bitspersample,
|
||||||
|
"TIFFScanlineSize")));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the number of bytes required to store a complete
|
* Return the number of bytes required to store a complete
|
||||||
* decoded and packed raster scanline (as opposed to the
|
* decoded and packed raster scanline (as opposed to the
|
||||||
|
Loading…
Reference in New Issue
Block a user