Thanks a lot! That is exactly what I needed to know. 
The additional context makes all the difference.

>> Since the decompressor automatically handles lossless vs. lossy mode, it 
isn't functionally critical for applications to have that information. 
A brief description of the motivation for having lossless vs. lossy mode 
information available:
>From what I can gather, the DCMTK library bundles an adapted libjpeg v6b 
version with Ken's patch applied and some additional fixes.
When it comes to color space conversion, there is a flag that allows color 
space conversion only when the file has been stored lossy:

https://github.com/DCMTK/dcmtk/blob/master/dcmjpeg/libsrc/djdijg12.cc#L329

Upon looking into the possibility of replacing the bundled libjpeg version 
with libjpeg-turbo, knowing when the code is dealing with decompressing a 
lossless image was one of the roadblocks.

Thanks again!

Best regards,
Kevin
On Sunday, January 21, 2024 at 6:21:10 PM UTC+1 DRC wrote:

> The lossless JPEG feature was originally implemented by Ken Murchison as a 
> patch against libjpeg v6b in 1999.  (The patch was never adopted into 
> libjpeg, probably because Tom Lane was already moving away from the project 
> at that point.)  As implemented, Ken's patch introduced new fields into the 
> public jpeg_compress_struct/jpeg_decompress_struct structures that allowed 
> lossless mode to be enabled (compression) and queried (decompression.)  
> However, that broke backward API/ABI compatibility, which is a non-starter 
> for libjpeg-turbo.  Thus, in the process of integrating Ken's patch, I 
> heavily restructured it and moved the new lossless parameters into the 
> private jpeg_comp_master/jpeg_decomp_master structures.  (Refer to 
> https://github.com/libjpeg-turbo/ijg/commits/6b_lossless to see how this 
> all played out prior to the feature being merged into libjpeg-turbo.)
>
> The lack of an intuitive way to query lossless mode in the public 
> decompressor API was an oversight on my part.  However, the good news is 
> that you can still do it.  It's just really subtle and requires digging 
> through wizard.txt to figure it out.  In a lossless JPEG image, Ss will 
> always be non-zero and Se will always be 0.  That's because Ss in a 
> lossless JPEG image is the predictor selection value, which must be between 
> 1 and 7 (inclusive), and Se is specified to be 0.  That combination of scan 
> parameters is illegal for a lossy JPEG image, in which Se must be greater 
> than or equal to Ss.  Thus, if any scan has Ss != 0 and Se == 0, then the 
> JPEG image is lossless.  The compressor takes advantage of that fact to 
> automatically enable lossless mode if a scan script specifies a scan with 
> Ss != 0 and Se == 0:
>
>
> https://github.com/libjpeg-turbo/libjpeg-turbo/blob/335ed793f92370edbb425d56fe9c07aab5a93d9a/jcmaster.c#L184-L193
>
> Thus, lossless mode can implicitly be enabled through a scan script 
> without explicitly calling jpeg_enable_lossless(), just like progressive 
> mode can implicitly be enabled through a scan script without explicitly 
> calling jpeg_simple_progression().
>
> To make this more intuitive, I would probably need to introduce the 
> get/set API that I implemented for mozjpeg, which extends the public 
> libjpeg API to allow getting and setting the value of arbitrary parameters 
> (including those that are stored in the opaque master structures.)  That 
> would not break backward API/ABI compatibility, but it would break forward 
> API/ABI compatibility (meaning that applications that took advantage of the 
> new functions would not work with prior versions of libjpeg-turbo.)  Thus, 
> I would have to be really careful when integrating the feature, and it 
> would probably have to land in a major new release rather than a bug-fix 
> release.
>
> Since the decompressor automatically handles lossless vs. lossy mode, it 
> isn't functionally critical for applications to have that information.  
> Thus, since there is already a non-intuitive but still straightforward and 
> reliable way to obtain that information, my inclination is not to introduce 
> a major new feature solely for that purpose.
>
>
> On 1/21/24 6:01 AM, kevle wrote:
>
> Hello everyone,
>
> I have been trying to find out if I can determine whether a jpeg file is 
> lossless or lossy when decompressing it using the libjpeg API.
> From what I can tell, it might be possible that the internal state in 
> "master->lossless" is setup after a call to "jpeg_read_header".
> However, I have not seen a way to access that property by using the public 
> API.
>
> In TurboJPEG API 3, there is "tj3Get" and "TJPARAM_LOSSLESS" that can 
> probably be used for the same purpose.
>
> The question is, can I also access the "lossless" property using the 
> public libjpeg API or is there an indirect way of deriving that information 
> with public API calls?
>
> Best regards,
> Kevin
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "libjpeg-turbo User Discussion/Support" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to libjpeg-turbo-u...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/libjpeg-turbo-users/1ddcbe50-7118-4aa6-a6ec-99e99b91627bn%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/libjpeg-turbo-users/1ddcbe50-7118-4aa6-a6ec-99e99b91627bn%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"libjpeg-turbo User Discussion/Support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to libjpeg-turbo-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/libjpeg-turbo-users/c3778aa4-77c7-4e6b-88bc-46bdeb721ae3n%40googlegroups.com.

Reply via email to