AWARE [SYSTEMS] Imaging expertise for the Delphi developer
AWare Systems, Imaging expertise for the Delphi developer, Home TIFF and LibTiff Mailing List Archive

LibTiff Mailing List

TIFF and LibTiff Mailing List Archive
December 2016

Previous Thread
Next Thread

Previous by Thread
Next by Thread

Previous by Date
Next by Date

Contact

The TIFF Mailing List Homepage
This list is run by Frank Warmerdam
Archive maintained by AWare Systems



Valid HTML 4.01!



Thread

2016.12.17 15:15 "Thoughts about a proposed patch to fix a heap-based buffer overflow in putcontig8bitYCbCr44tile ?", by Even Rouault
2016.12.17 18:46 "Re: =?utf-8?q?Thoughts_about_a_proposed_patch_to_fix_a_heap-ba?= =?utf-8?q?sed_buffer=09overflow_in_putcontig8bitYCbCr44tile_=3F?=", by Mickey Rose
2016.12.17 20:35 "Re: Thoughts about a proposed patch to fix a heap-based buffer overflow in putcontig8bitYCbCr44tile ?", by Even Rouault

2016.12.17 20:35 "Re: Thoughts about a proposed patch to fix a heap-based buffer overflow in putcontig8bitYCbCr44tile ?", by Even Rouault

Mickey


Thanks for your thoughts.

> 
> I wonder how you managed to create tiled YCbCr tiff. Some time ago I wanted
> to create some
> 
> such images for testing, and couldn't figure out how, as the rgb2ycbcr tool
> only creates stripped,
> 
> and tiffcp and tiffcrop refuse to copy subsampled non-JPEG images.

with the gdal_translate tool from GDAL (www.gdal.org), slightly patched with

Index: frmts/gtiff/geotiff.cpp
===================================================================
--- frmts/gtiff/geotiff.cpp	(revision 36934)
+++ frmts/gtiff/geotiff.cpp	(working copy)
@@ -14384,6 +14384,8 @@
 
             TIFFSetField( l_hTIFF, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR );
             nSamplesAccountedFor = 3;
+
+            TIFFSetField( l_hTIFF, TIFFTAG_YCBCRSUBSAMPLING, 4, 4 );
         }
         else if( EQUAL( pszValue, "CIELAB" ))
         {

and with libjpeg patched to have C_MAX_BLOCKS_IN_MCU/D_MAX_BLOCKS_IN_MCU = 20 in 
jpeglib.h (18 would be OK as you noted)

And then:
gdal_translate byte.tif test.tif -b 1 -b 1 -b 1 -co compress=jpeg \
-co photometric=ycbcr -co tiled=yes -co blockxsize=32 -co blockysize=32 \
-outsize 63 63


> I've recently re-written a considerable portion of `get_image.c` put*
> functions because I needed to extract
> regions with arbitrary `col_offset` and `row_offset` from any kind of image.
> Although partial support for
> arbitrary `col_offset` was recently added to libtiff, it's still broken for
> paletted and subsampled images,
> so I had to roll my own. I can turn my modifications into a proper patch,
> but that's not a priority for me and
> I'd very much prefer to do that after libtiff will have migrated to git or
> mercurial.

Your fixes would be welcome. You can create a patch against this mirror if you wish: https://
github.com/vadz/libtiff

> 
> Therefore it is impossible to create or decode a JPEG-compressed TIFF with 4
> x4 subsampling
> 
> (which would require 18 blocks in MCU), unless you use a custom-built
> libjpeg with higher limits.
> 
> IMO not worth it, totally defeats portability.

Agreed. Was just trying to fix a bug. What surprises me is that the old-JPEG decompression 
doesn't require a patched libjpeg to handle 4x4 subsampling. Presumably it must use libjpeg 
in another way than the new JPEG method.

> 
> The second reason I think 4x4 subsampling is not worth supporting is that it
> complicates implementation.
> 
> But there's a bigger issue. Here's a part of `TIFFScanlineSize64` comment
> from `tif_strip.c`
>
> If (1 <= width % 8  <= 4) then ScanlineSize is not a whole number.

ok, I actually reproduce decoding issues with rgb2ycbcr in the exact conditions you mention 
(so no need to involve JPEG compression. forgot that YCbCr subsampling can be used in 
other cases)


Even

-- 
Spatialys - Geospatial professional services
http://www.spatialys.com