libtiff/tif_jpeg.c: Fix regression introduced on 2010-05-07 that caused all tiles/strips to include quantization tables even when the jpegtablesmode had the JPEGTABLESMODE_QUANT bit set. Also add explicit removal of Huffman tables when jpegtablesmode has the JPEGTABLESMODE_HUFF bit set, which avoids Huffman tables to be emitted in the first tile/strip (only useful in update scenarios. create-only was fine)
This commit is contained in:
parent
570fd679f6
commit
59d4cb0b11
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
2014-12-15 Even Rouault <even.rouault@spatialys.com>
|
||||||
|
|
||||||
|
* libtiff/tif_jpeg.c: Fix regression introduced on 2010-05-07 that caused
|
||||||
|
all tiles/strips to include quantization tables even when the jpegtablesmode
|
||||||
|
had the JPEGTABLESMODE_QUANT bit set.
|
||||||
|
Also add explicit removal of Huffman tables when jpegtablesmode has the
|
||||||
|
JPEGTABLESMODE_HUFF bit set, which avoids Huffman tables to be emitted in the
|
||||||
|
first tile/strip (only useful in update scenarios. create-only was
|
||||||
|
fine)
|
||||||
|
|
||||||
2014-12-09 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
|
2014-12-09 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
|
||||||
|
|
||||||
* tools/tiff2pdf.c: Assure that memory size calculations for
|
* tools/tiff2pdf.c: Assure that memory size calculations for
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tif_jpeg.c,v 1.112 2014-11-20 14:34:51 erouault Exp $ */
|
/* $Id: tif_jpeg.c,v 1.113 2014-12-15 15:40:07 erouault Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1994-1997 Sam Leffler
|
* Copyright (c) 1994-1997 Sam Leffler
|
||||||
@ -1451,6 +1451,15 @@ unsuppress_quant_table (JPEGState* sp, int tblno)
|
|||||||
qtbl->sent_table = FALSE;
|
qtbl->sent_table = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
suppress_quant_table (JPEGState* sp, int tblno)
|
||||||
|
{
|
||||||
|
JQUANT_TBL* qtbl;
|
||||||
|
|
||||||
|
if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
|
||||||
|
qtbl->sent_table = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unsuppress_huff_table (JPEGState* sp, int tblno)
|
unsuppress_huff_table (JPEGState* sp, int tblno)
|
||||||
{
|
{
|
||||||
@ -1462,6 +1471,17 @@ unsuppress_huff_table (JPEGState* sp, int tblno)
|
|||||||
htbl->sent_table = FALSE;
|
htbl->sent_table = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
suppress_huff_table (JPEGState* sp, int tblno)
|
||||||
|
{
|
||||||
|
JHUFF_TBL* htbl;
|
||||||
|
|
||||||
|
if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
|
||||||
|
htbl->sent_table = TRUE;
|
||||||
|
if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
|
||||||
|
htbl->sent_table = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
prepare_JPEGTables(TIFF* tif)
|
prepare_JPEGTables(TIFF* tif)
|
||||||
{
|
{
|
||||||
@ -1726,14 +1746,30 @@ JPEGPreEncode(TIFF* tif, uint16 s)
|
|||||||
sp->cinfo.c.write_JFIF_header = FALSE;
|
sp->cinfo.c.write_JFIF_header = FALSE;
|
||||||
sp->cinfo.c.write_Adobe_marker = FALSE;
|
sp->cinfo.c.write_Adobe_marker = FALSE;
|
||||||
/* set up table handling correctly */
|
/* set up table handling correctly */
|
||||||
|
/* calling TIFFjpeg_set_quality() causes quantization tables to be flagged */
|
||||||
|
/* as being to be emitted, which we don't want in the JPEGTABLESMODE_QUANT */
|
||||||
|
/* mode, so we must manually suppress them. However TIFFjpeg_set_quality() */
|
||||||
|
/* should really be called when dealing with files with directories with */
|
||||||
|
/* mixed qualities. see http://trac.osgeo.org/gdal/ticket/3539 */
|
||||||
if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
|
if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
|
||||||
return (0);
|
return (0);
|
||||||
if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) {
|
if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
|
||||||
|
suppress_quant_table(sp, 0);
|
||||||
|
suppress_quant_table(sp, 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
unsuppress_quant_table(sp, 0);
|
unsuppress_quant_table(sp, 0);
|
||||||
unsuppress_quant_table(sp, 1);
|
unsuppress_quant_table(sp, 1);
|
||||||
}
|
}
|
||||||
if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
|
if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
|
||||||
|
{
|
||||||
|
/* Explicit suppression is only needed if we did not go through the */
|
||||||
|
/* prepare_JPEGTables() code path, which may be the case if updating */
|
||||||
|
/* an existing file */
|
||||||
|
suppress_huff_table(sp, 0);
|
||||||
|
suppress_huff_table(sp, 1);
|
||||||
sp->cinfo.c.optimize_coding = FALSE;
|
sp->cinfo.c.optimize_coding = FALSE;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sp->cinfo.c.optimize_coding = TRUE;
|
sp->cinfo.c.optimize_coding = TRUE;
|
||||||
if (downsampled_input) {
|
if (downsampled_input) {
|
||||||
|
Loading…
Reference in New Issue
Block a user