Glad I could help.  It's good to see uptake of the new lossless feature in downstream software.

On 1/22/24 1:24 PM, kevle wrote:
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 <https://groups.google.com/d/msgid/libjpeg-turbo-users/c3778aa4-77c7-4e6b-88bc-46bdeb721ae3n%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/a5cb8189-3d17-49c6-8618-aac58455a195%40virtualgl.org.

Reply via email to