Skip to content

Commit d55e92c

Browse files
authored
Merge pull request OSGeo#5156 from rouault/fix_jpeg9e
Updates for IJG libjpeg-9e
2 parents 53f038b + c1a0173 commit d55e92c

File tree

9 files changed

+203
-22
lines changed

9 files changed

+203
-22
lines changed

autotest/gcore/cog.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,10 @@ def my_cbk(pct, _, arg):
395395
if gt[i] != pytest.approx(expected_gt[i], abs=1e-10 * abs(expected_gt[i])):
396396
assert False, gt
397397
got_cs = [ds.GetRasterBand(i+1).Checksum() for i in range(3)]
398-
assert got_cs == [26293, 23439, 14955] or got_cs == [26228, 22085, 12992]
398+
assert got_cs in ([26293, 23439, 14955],
399+
[26228, 22085, 12992],
400+
[25088, 23140, 13265], # libjpeg 9e
401+
)
399402
assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 17849
400403
assert ds.GetRasterBand(1).GetOverviewCount() == 0
401404
ds = None
@@ -444,7 +447,11 @@ def my_cbk(pct, _, arg):
444447
for i in range(6):
445448
if gt[i] != pytest.approx(expected_gt[i], abs=1e-10 * abs(expected_gt[i])):
446449
assert False, gt
447-
assert ds.GetRasterBand(1).Checksum() in (4363, 4264, 4362) # 4264 on Mac , 4362 on Mac / Conda
450+
assert ds.GetRasterBand(1).Checksum() in (4363,
451+
4264, # got on Mac at some point
452+
4362, # libjpeg 9d
453+
4569, # libjpeg 9e
454+
)
448455
assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 4356
449456
assert ds.GetRasterBand(1).GetOverviewCount() == 2
450457
ds = None
@@ -525,7 +532,11 @@ def test_cog_byte_to_web_mercator_manual():
525532
for i in range(6):
526533
if gt[i] != pytest.approx(expected_gt[i], abs=1e-10 * abs(expected_gt[i])):
527534
assert False, gt
528-
assert ds.GetRasterBand(1).Checksum() in (4363, 4264, 4362) # 4264 on Mac , 4362 on Mac / Conda
535+
assert ds.GetRasterBand(1).Checksum() in (4363,
536+
4264, # got on Mac at some point
537+
4362, # libjpeg 9d
538+
4569, # libjpeg 9e
539+
)
529540
assert ds.GetRasterBand(1).GetMaskBand().Checksum() == 4356
530541
assert ds.GetRasterBand(1).GetOverviewCount() == 2
531542
ds = None

autotest/gcore/tiff_ovr.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -347,21 +347,23 @@ def test_tiff_ovr_9(both_endian):
347347
ds.BuildOverviews('AVERAGE', overviewlist=[2])
348348

349349
cs = ds.GetRasterBand(1).GetOverview(0).Checksum()
350-
exp_cs = 5562
350+
exp_cs_list = (5562,
351+
5635,
352+
5601, # libjpeg 9e
353+
)
351354

352355
ds = None
353356

354-
assert cs == exp_cs or cs == 5635, 'got wrong overview checksum.'
357+
assert cs in exp_cs_list
355358

356359
# Re-check after dataset reopening
357360
ds = gdal.Open('tmp/ovr9.tif', gdal.GA_ReadOnly)
358361

359362
cs = ds.GetRasterBand(1).GetOverview(0).Checksum()
360-
exp_cs = 5562
361363

362364
ds = None
363365

364-
assert cs == exp_cs or cs == 5635, 'got wrong overview checksum.'
366+
assert cs in exp_cs_list
365367

366368
###############################################################################
367369
# Similar to tiff_ovr_9 but with internal overviews.
@@ -386,11 +388,13 @@ def test_tiff_ovr_10(both_endian):
386388
assert ds is not None, 'Failed to open copy of test dataset.'
387389

388390
cs = ds.GetRasterBand(1).GetOverview(0).Checksum()
389-
exp_cs = 5562
390391

391392
ds = None
392393

393-
assert cs == exp_cs or cs == 5635, 'got wrong overview checksum.'
394+
assert cs in (5562,
395+
5635,
396+
5601, # libjpeg 9e
397+
)
394398

395399
###############################################################################
396400
# Overview on a dataset with NODATA_VALUES

autotest/gcore/tiff_write.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,9 @@ def test_tiff_write_13():
369369
size = os.stat('tmp/sasha.tif').st_size
370370

371371
gdaltest.tiff_drv.Delete('tmp/sasha.tif')
372-
assert cs == 17347 or cs == 14445, 'fail: bad checksum'
372+
assert cs in (17347, 14445,
373+
14135, # libjpeg 9e
374+
)
373375

374376
if md['LIBTIFF'] == 'INTERNAL':
375377
# 22816 with libjpeg-6b or libjpeg-turbo
@@ -3309,6 +3311,7 @@ def test_tiff_write_92():
33093311
ds = None
33103312

33113313
ds = gdal.Open('tmp/tiff_write_92.tif', gdal.GA_Update)
3314+
assert ds.GetMetadataItem('JPEG_QUALITY', 'IMAGE_STRUCTURE') == str(quality)
33123315
if jpeg_quality_overview is not False:
33133316
gdal.SetConfigOption('JPEG_QUALITY_OVERVIEW', '%d' % jpeg_quality_overview)
33143317
ds.BuildOverviews('NEAR', overviewlist=[2, 4])
@@ -4629,11 +4632,11 @@ def test_tiff_write_126():
46294632

46304633
src_ds = gdal.Open('../gdrivers/data/small_world_400pct.vrt')
46314634

4632-
options_list = [(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]),
4633-
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEGTABLESMODE=0'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]),
4634-
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'TILED=YES'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]),
4635-
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=800'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]),
4636-
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=64'], [48788, 56561], [61397, 2463, 2454], [29605, 33654], [10904, 10453]),
4635+
options_list = [(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]),
4636+
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'JPEGTABLESMODE=0'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]),
4637+
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'TILED=YES'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]),
4638+
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=800'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]),
4639+
(['COMPRESS=JPEG', 'PHOTOMETRIC=YCBCR', 'BLOCKYSIZE=64'], [48788, 56561, 56462], [61397, 2463, 2454, 2727], [29605, 33654, 34633], [10904, 10453, 10361]),
46374640
(['COMPRESS=JPEG'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]),
46384641
(['COMPRESS=JPEG', 'INTERLEAVE=BAND'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]),
46394642
(['COMPRESS=JPEG', 'INTERLEAVE=BAND', 'TILED=YES'], [49887, 58937], [59311, 2826], [30829, 34806], [11664, 58937]),

autotest/gdrivers/nitf.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,10 @@ def test_nitf_10():
249249
src_ds = gdal.Open('tmp/nitf9.ntf')
250250
expected_cs = src_ds.GetRasterBand(2).Checksum()
251251
src_ds = None
252-
assert expected_cs == 22296 or expected_cs == 22259
252+
assert expected_cs in (22296,
253+
22259,
254+
22415, # libjpeg 9e
255+
)
253256

254257
tst = gdaltest.GDALTest('NITF', '../tmp/nitf9.ntf', 2, expected_cs)
255258
return tst.testCreateCopy()

autotest/gdrivers/rmf.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -625,13 +625,12 @@ def test_rmf_31c():
625625
assert ds is not None, ('Can\'t open ' + ds_name)
626626
expected_cs1 = [25789, 27405, 31974]
627627
expected_cs2 = [23764, 25265, 33585] # osx
628+
expected_cs_jpeg9e = [21031, 26574, 34780] # libjpeg 9e
628629
cs = [ds.GetRasterBand(1).Checksum(),
629630
ds.GetRasterBand(2).Checksum(),
630631
ds.GetRasterBand(3).Checksum()]
631632

632-
assert cs == expected_cs1 or cs == expected_cs2, \
633-
('Invalid checksum %s expected %s or %s.' %
634-
(str(cs), str(expected_cs1), str(expected_cs2)))
633+
assert cs in (expected_cs1, expected_cs2, expected_cs_jpeg9e)
635634

636635

637636
def test_rmf_31d():

frmts/gtiff/CMakeLists.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,40 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
8686
set_property(SOURCE gt_citation.cpp gt_wkt_srs.cpp geotiff.cpp gt_jpeg_copy.cpp tifvsi.cpp gt_overview.cpp
8787
PROPERTY SKIP_UNITY_BUILD_INCLUSION ON)
8888
endif ()
89+
90+
add_executable(generate_quant_table_md5sum EXCLUDE_FROM_ALL generate_quant_table_md5sum.cpp)
91+
gdal_standard_includes(generate_quant_table_md5sum)
92+
target_link_libraries(generate_quant_table_md5sum PRIVATE ${GDAL_LIB_TARGET_NAME})
93+
if (GDAL_USE_LIBTIFF_INTERNAL)
94+
target_sources(generate_quant_table_md5sum PRIVATE $<TARGET_OBJECTS:libtiff> ../../port/cpl_md5.cpp)
95+
target_include_directories(generate_quant_table_md5sum PRIVATE $<TARGET_PROPERTY:libtiff,SOURCE_DIR>)
96+
if (RENAME_INTERNAL_LIBTIFF_SYMBOLS)
97+
target_compile_definitions(generate_quant_table_md5sum PRIVATE -DRENAME_INTERNAL_LIBTIFF_SYMBOLS)
98+
endif ()
99+
target_link_libraries(generate_quant_table_md5sum PRIVATE ZLIB::ZLIB)
100+
if (GDAL_USE_DEFLATE)
101+
target_link_libraries(generate_quant_table_md5sum PRIVATE Deflate::Deflate)
102+
endif ()
103+
if (GDAL_USE_LIBJPEG_INTERNAL)
104+
target_sources(generate_quant_table_md5sum PRIVATE $<TARGET_OBJECTS:libjpeg>)
105+
else ()
106+
target_link_libraries(generate_quant_table_md5sum PRIVATE JPEG::JPEG)
107+
endif ()
108+
if (GDAL_JPEG12_SUPPORTED)
109+
target_sources(generate_quant_table_md5sum PRIVATE $<TARGET_OBJECTS:libjpeg12>)
110+
endif ()
111+
if (GDAL_USE_ZSTD)
112+
target_link_libraries(generate_quant_table_md5sum PRIVATE ZSTD::zstd)
113+
endif ()
114+
if (GDAL_USE_LIBLZMA)
115+
target_link_libraries(generate_quant_table_md5sum PRIVATE LibLZMA::LibLZMA)
116+
endif ()
117+
if (GDAL_USE_WEBP)
118+
target_link_libraries(generate_quant_table_md5sum PRIVATE WEBP::WebP)
119+
endif ()
120+
if (GDAL_USE_LIBLERC_INTERNAL)
121+
target_sources(generate_quant_table_md5sum PRIVATE $<TARGET_OBJECTS:lerc>)
122+
endif ()
123+
else ()
124+
target_link_libraries(generate_quant_table_md5sum PRIVATE TIFF::TIFF)
125+
endif ()

frmts/gtiff/generate_quant_table_md5sum.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,20 @@
2727
****************************************************************************/
2828

2929
#include <cassert>
30-
#include "cpl_md5.h"
30+
3131
#include "cpl_error.h"
3232
#include "cpl_string.h"
3333
#include <tiffio.h>
3434
#include "gdal_priv.h"
3535

36+
#define CPLMD5Init internal_CPLMD5Init
37+
#define CPLMD5Update internal_CPLMD5Update
38+
#define CPLMD5Final internal_CPLMD5Final
39+
#define CPLMD5Transform internal_CPLMD5Transform
40+
#define CPLMD5String internal_CPLMD5String
41+
#include "cpl_md5.h"
42+
#include "cpl_md5.cpp"
43+
3644
static const GByte* GTIFFFindNextTable( const GByte* paby, GByte byMarker,
3745
int nLen, int* pnLenTable )
3846
{
@@ -79,7 +87,7 @@ void generate(int nBands, uint16_t nPhotometric, uint16_t nBitsPerSample)
7987
"NBITS", "12");
8088

8189
CPLString osTmpFilename;
82-
osTmpFilename.Printf( "/vsimem/gtiffdataset_guess_jpeg_quality_tmp" );
90+
osTmpFilename.Printf( "gtiffdataset_guess_jpeg_quality_tmp" );
8391

8492
for( int nQuality = 1; nQuality <= 100; ++nQuality )
8593
{
@@ -135,6 +143,8 @@ void generate(int nBands, uint16_t nPhotometric, uint16_t nBitsPerSample)
135143
TIFFClose(hTIFFTmp);
136144
}
137145

146+
VSIUnlink(osTmpFilename);
147+
138148
CSLDestroy(papszOpts);
139149
}
140150

frmts/gtiff/geotiff.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
#include "tifvsi.h"
105105
#include "xtiffio.h"
106106
#include "quant_table_md5sum.h"
107+
#include "quant_table_md5sum_jpeg9e.h"
107108

108109
CPL_CVSID("$Id$")
109110

@@ -17158,9 +17159,17 @@ int GTiffDataset::GuessJPEGQuality( bool& bOutHasQuantizationTable,
1715817159

1715917160
if( nBands == 3 && m_nBitsPerSample == 8 && m_nPhotometric == PHOTOMETRIC_YCBCR )
1716017161
{
17161-
return GuessJPEGQualityFromMD5(md5JPEGQuantTable_3_YCBCR_8bit,
17162+
int nRet = GuessJPEGQualityFromMD5(md5JPEGQuantTable_3_YCBCR_8bit,
1716217163
static_cast<const GByte*>(pJPEGTable),
1716317164
static_cast<int>(nJPEGTableSize));
17165+
if( nRet < 0 )
17166+
{
17167+
// libjpeg 9e has modified the YCbCr quantization tables.
17168+
nRet = GuessJPEGQualityFromMD5(md5JPEGQuantTable_3_YCBCR_8bit_jpeg9e,
17169+
static_cast<const GByte*>(pJPEGTable),
17170+
static_cast<int>(nJPEGTableSize));
17171+
}
17172+
return nRet;
1716417173
}
1716517174

1716617175
char** papszLocalParameters = nullptr;

0 commit comments

Comments
 (0)