Skip to content

JPEGLossless Bugs: SOF3 P in [9,15] and DHT-before-SOF3 Streams #50

Description

@bluna301

Version

0.8.0

Describe the bug.

The nvjpeg lossless JPEG decoder (NVJPEG_BACKEND_LOSSLESS_JPEG) silently produces zero-filled output buffers for two classes of JPEG Lossless (SOF3) stream. nvjpegDecodeBatchedSupported incorrectly returns isSupported == 0 ("supported") for both, making the failures silent — no error is returned, the decode appears to succeed, but the output buffer contains only zeros.

These bugs were discovered when testing MAPs built using MONAI Deploy App SDK - CT and MR DICOM studies from Philips scanners were identified that produced zero-filled images that propagated silently through model inference, manifesting as empty segmentations. See PR on App SDK for additional background.

Expected behaviour: canDecode should return PROCESSING_STATUS_SAMPLE_TYPE_UNSUPPORTED or PROCESSING_STATUS_CODEC_UNSUPPORTED for these streams, allowing the framework to fall back to a capable CPU decoder (e.g. libjpeg-turbo) that handles them correctly.

Two independent bugs:

Bug 1 — Sub-16-bit SOF3 precision (P in [9,15]):
When the SOF3 P byte encodes a precision of 9–15 (e.g. a Philips scanner writing P=12 for a 12-bit series), nvjpegDecodeBatched silently zero-fills the output buffer. The GPU kernel appears to assume P=16 for all UINT16 lossless streams and misreads the Huffman-coded bitstream when P is smaller.

Bug 2 — DHT segment before SOF3:
When a DHT (0xFFC4) segment appears before the SOF3 marker (0xFFC3) — non-standard ordering that is technically valid per ITU-T T.81 Annex B, but emitted by some Philips scanners — nvjpegDecodeBatched fails to build decode tables correctly and silently zero-fills.

In both cases nvjpegDecodeBatchedSupported returns "supported", which is the core defect.

The issue is isolated to lossless_decoder.cpp / NVJPEG_BACKEND_LOSSLESS_JPEG. The baseline JPEG decoder (cuda_decoder.cpp) and the JPEG 2000 decoder (nvjpeg2k_ext) do not seem to be affected.

Minimum reproducible example

Three JPEG Lossless frames extracted from DICOM files reproduce the two bugs. All have BitsStored=12 in their DICOM tags but differ in JPEG stream encoding. Anonymized test frames and a proposed fix (with passing tests) are available in the linked PR (below).

File Manufacturer SOF3 P byte Segment order Result
bad_sequence_frame.jpg Siemens SOMATOM 16 SOI → SOF3(P=16) → DHT → SOS ✅ Correct
MR_frame.jpg Philips Ingenia 12 SOI → SOF3(P=12) → DHT → SOS ❌ Silent zeros (Bug 1)
CT_frame.jpg Philips iCT SP 16 SOI → COM → DHT → SOF3(P=16) → SOS ❌ Silent zeros (Bug 2)

Environment details

$ ./tools/print_env.sh
<details><summary>Click here to see environment details</summary><pre>
     
     **git***
     commit 36b4ee8c91de66070a09fa08fa1abbdc1a89144f (HEAD -> bl/jpeglossless_DHT_bugfix, origin/main, origin/HEAD, main)
     Merge: 89500f3 3a7ac73
     Author: Sebastian Matysik <146925399+smatysik-nv@users.noreply.github.com>
     Date:   Tue Apr 14 15:19:37 2026 +0200
     
     Merge pull request #49 from NVIDIA/release_v0.8
     
     Adding code for release v0.8.0 (commit 93bcb05)
     **git submodules***
     e170594ac7cf1dac584da473d4ca9301087090c1 external/NVTX (e170594)
     cd1b1bd03900b68505822cfa25cb16851bd6caf1 external/boost/preprocessor (boost-1.89.0)
     93c8f2a3c774b84af6f652b1992c48164fae60fc external/dlpack (93c8f2a)
     52eb8108c5bdec04579160ae17225d66034bd723 external/googletest (52eb810)
     f5fbe867d2d26e4a0a9177a51f6e568868ad3dc8 external/pybind11 (f5fbe86)
     
     ***OS Information***
     DISTRIB_ID=Ubuntu
     DISTRIB_RELEASE=22.04
     DISTRIB_CODENAME=jammy
     DISTRIB_DESCRIPTION="Ubuntu 22.04.5 LTS"
     PRETTY_NAME="Ubuntu 22.04.5 LTS"
     NAME="Ubuntu"
     VERSION_ID="22.04"
     VERSION="22.04.5 LTS (Jammy Jellyfish)"
     VERSION_CODENAME=jammy
     ID=ubuntu
     ID_LIKE=debian
     HOME_URL="https://www.ubuntu.com/"
     SUPPORT_URL="https://help.ubuntu.com/"
     BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
     PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
     UBUNTU_CODENAME=jammy
     Linux EW22-04661 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
     
     ***GPU Information***
     Wed May  6 13:47:59 2026
     +-----------------------------------------------------------------------------------------+
     | NVIDIA-SMI 575.64.04              Driver Version: 577.00         CUDA Version: 12.9     |
     |-----------------------------------------+------------------------+----------------------+
     | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
     | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
     |                                         |                        |               MIG M. |
     |=========================================+========================+======================|
     |   0  NVIDIA GeForce RTX 3090        On  |   00000000:01:00.0 Off |                  N/A |
     |  0%   42C    P8             18W /  350W |    1335MiB /  24576MiB |      6%      Default |
     |                                         |                        |                  N/A |
     +-----------------------------------------+------------------------+----------------------+
     
     +-----------------------------------------------------------------------------------------+
     | Processes:                                                                              |
     |  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
     |        ID   ID                                                               Usage      |
     |=========================================================================================|
     |  No running processes found                                                             |
     +-----------------------------------------------------------------------------------------+
     
     ***CPU***
     Architecture:                       x86_64
     CPU op-mode(s):                     32-bit, 64-bit
     Address sizes:                      39 bits physical, 48 bits virtual
     Byte Order:                         Little Endian
     CPU(s):                             16
     On-line CPU(s) list:                0-15
     Vendor ID:                          GenuineIntel
     Model name:                         11th Gen Intel(R) Core(TM) i7-11700 @ 2.50GHz
     CPU family:                         6
     Model:                              167
     Thread(s) per core:                 2
     Core(s) per socket:                 8
     Socket(s):                          1
     Stepping:                           1
     BogoMIPS:                           4991.99
     Flags:                              fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid pni pclmulqdq vmx ssse3 fma cx16 pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves avx512vbmi umip avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid fsrm md_clear flush_l1d arch_capabilities
     Virtualization:                     VT-x
     Hypervisor vendor:                  Microsoft
     Virtualization type:                full
     L1d cache:                          384 KiB (8 instances)
     L1i cache:                          256 KiB (8 instances)
     L2 cache:                           4 MiB (8 instances)
     L3 cache:                           16 MiB (1 instance)
     Vulnerability Gather data sampling: Unknown: Dependent on hypervisor status
     Vulnerability Itlb multihit:        Not affected
     Vulnerability L1tf:                 Not affected
     Vulnerability Mds:                  Not affected
     Vulnerability Meltdown:             Not affected
     Vulnerability Mmio stale data:      Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
     Vulnerability Retbleed:             Mitigation; Enhanced IBRS
     Vulnerability Spec rstack overflow: Not affected
     Vulnerability Spec store bypass:    Mitigation; Speculative Store Bypass disabled via prctl and seccomp
     Vulnerability Spectre v1:           Mitigation; usercopy/swapgs barriers and __user pointer sanitization
     Vulnerability Spectre v2:           Mitigation; Enhanced IBRS, IBPB conditional, RSB filling, PBRSB-eIBRS SW sequence
     Vulnerability Srbds:                Not affected
     Vulnerability Tsx async abort:      Not affected
     
     ***CMake***
     /usr/bin/cmake
cmake: /home/bluna301/miniconda3/envs/nvimgcodec/lib/libcurl.so.4: no version information available (required by cmake)
     cmake version 3.22.1
     
     CMake suite maintained and supported by Kitware (kitware.com/cmake).
     
     ***g++***
     /usr/bin/g++
     g++ (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0
     Copyright (C) 2021 Free Software Foundation, Inc.
     This is free software; see the source for copying conditions.  There is NO
     warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     
     
     ***nvcc***
     /usr/local/cuda/bin/nvcc
     nvcc: NVIDIA (R) Cuda compiler driver
     Copyright (c) 2005-2024 NVIDIA Corporation
     Built on Thu_Jun__6_02:18:23_PDT_2024
     Cuda compilation tools, release 12.5, V12.5.82
     Build cuda_12.5.r12.5/compiler.34385749_0
     
     ***Python***
     /home/bluna301/miniconda3/envs/nvimgcodec/bin/python
     Python 3.10.20
     
     ***Environment Variables***
     PATH                            : /usr/local/cuda/bin:/home/bluna301/.vscode-server/data/User/globalStorage/github.copilot-chat/debugCommand:/home/bluna301/.vscode-server/data/User/globalStorage/github.copilot-chat/copilotCli:/home/bluna301/.vscode-server/bin/10c8e557c8b9f9ed0a87f61f1c9a44bde731c409/bin/remote-cli:/home/bluna301/.local/bin:/home/bluna301/miniconda3/envs/nvimgcodec/bin:/home/bluna301/miniconda3/condabin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Program
     Files/NVIDIA                    : GPU
     Computing                       : Toolkit/CUDA/v12.0/bin:/mnt/c/Program
     Files/NVIDIA                    : GPU
     Computing                       : Toolkit/CUDA/v12.0/libnvvp:/mnt/c/Program
     Files                           : (x86)/Common
     Files/Oracle/Java/javapath:/mnt/c/ProgramData/Oracle/Java/javapath:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0:/mnt/c/WINDOWS/System32/OpenSSH:/mnt/c/PROGRA~2/CMWeb/bin:/mnt/c/Program: Files/MATLAB/MATLAB
     Compiler                        : Runtime/v84/runtime/win64:/mnt/c/Users/mahfq2/AppData/Local/Programs/Python/Python310:/mnt/c/Users/mahfq2/AppData/Local/pip:/mnt/c/Users/mahfq2/AppData/Local/Programs/Python/Python310/Scripts:/mnt/c/Program
     Files/Plastimatch/bin:/mnt/c/Program: Files/Plastimatch:/mnt/c/Program
     Files/NVIDIA                    : Corporation/Nsight
     Compute                         : 2022.4.0:/mnt/c/Program
     Files                           : (x86)/NVIDIA
     Corporation/PhysX/Common:/mnt/c/Program: Files/NVIDIA
     Corporation/NVIDIA              : NvDLISR:/mnt/c/Program
     Files/Git/cmd:/mnt/c/Program    : Files/dotnet:/Docker/host/bin:/mnt/c/Users/LUNPB9/AppData/Local/anaconda3:/mnt/c/Users/LUNPB9/AppData/Local/anaconda3/Library/mingw-w64/bin:/mnt/c/Users/LUNPB9/AppData/Local/anaconda3/Library/usr/bin:/mnt/c/Users/LUNPB9/AppData/Local/anaconda3/Library/bin:/mnt/c/Users/LUNPB9/AppData/Local/anaconda3/Scripts:/mnt/c/Users/LUNPB9/AppData/Local/Programs/Python/Python312/Scripts:/mnt/c/Users/LUNPB9/AppData/Local/Programs/Python/Python312:/mnt/c/Users/LUNPB9/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/LUNPB9/AppData/Local/Programs/Microsoft
     VS                              : Code/bin:/snap/bin:/home/bluna301/.vscode-server/extensions/ms-python.debugpy-2026.6.0-linux-x64/bundled/scripts/noConfigScripts
     LD_LIBRARY_PATH                 : /home/bluna301/miniconda3/envs/nvimgcodec/lib/python3.10/site-packages/nvidia/libnvcomp/lib64:/home/bluna301/miniconda3/envs/nvimgcodec/lib/python3.10/site-packages/nvidia/nvjpeg2k/lib:/home/bluna301/miniconda3/envs/nvimgcodec/lib/python3.10/site-packages/nvidia/nvtiff/lib:/home/bluna301/miniconda3/envs/nvimgcodec/lib:/usr/lib/llvm-14/lib:/usr/local/cuda/lib64:/home/bluna301/nvImageCodec/build_feature/bin/lib64:/home/bluna301/nvImageCodec/build_feature/bin/lib:/home/bluna301/nvImageCodec/build_feature/src:/home/bluna301/nvImageCodec/build_feature/extensions/nvjpeg:/home/bluna301/nvImageCodec/build_feature/extensions/nvjpeg2k:/home/bluna301/nvImageCodec/build_feature/extensions/nvtiff:/home/bluna301/nvImageCodec/build_feature/extensions/opencv:/home/bluna301/nvImageCodec/build_feature/extensions/nvbmp:/home/bluna301/nvImageCodec/build_feature/extensions/nvpnm:/home/bluna301/nvImageCodec/build_feature/extensions/libjpeg_turbo:/home/bluna301/nvImageCodec/build_feature/extensions/libtiff
     NUMBAPRO_NVVM                   :
     NUMBAPRO_LIBDEVICE              :
     CONDA_PREFIX                    : /home/bluna301/miniconda3/envs/nvimgcodec
     PYTHON_PATH                     :
     
     ***conda packages***
     /home/bluna301/miniconda3/condabin/conda
     # packages in environment at /home/bluna301/miniconda3/envs/nvimgcodec:
     #
     # Name                    Version                   Build  Channel
     _openmp_mutex             4.5                      20_gnu    conda-forge
     alabaster                 0.7.16             pyhd8ed1ab_0    conda-forge
     alsa-lib                  1.2.15.3             hb03c661_0    conda-forge
     aom                       3.9.1                hac33072_0    conda-forge
     aws-c-auth                0.10.1               ha62d5e7_3    conda-forge
     aws-c-cal                 0.9.13               h2c9d079_1    conda-forge
     aws-c-common              0.12.6               hb03c661_0    conda-forge
     aws-c-compression         0.3.2                h8b1a151_0    conda-forge
     aws-c-http                0.10.13              h4bacb7b_0    conda-forge
     aws-c-io                  0.26.3               h692f434_1    conda-forge
     aws-c-s3                  0.12.2               he6ee468_1    conda-forge
     aws-c-sdkutils            0.2.4                h8b1a151_4    conda-forge
     aws-checksums             0.2.10               h8b1a151_0    conda-forge
     babel                     2.18.0             pyhcf101f3_1    conda-forge
     backports.zstd            1.4.0           py310h69bd2ac_0    conda-forge
     binutils_impl_linux-64    2.45.1          default_hfdba357_102    conda-forge
     blas                      1.0                    openblas
     breathe                   4.35.0             pyhd8ed1ab_4    conda-forge
     brotli-python             1.2.0           py310hba01987_1    conda-forge
     bzip2                     1.0.8                hda65f42_9    conda-forge
     c-ares                    1.34.6               hb03c661_0    conda-forge
     ca-certificates           2026.4.22            hbd8a1cb_0    conda-forge
     cairo                     1.18.4               he90730b_1    conda-forge
     certifi                   2026.4.22          pyhd8ed1ab_0    conda-forge
     charset-normalizer        3.4.7              pyhd8ed1ab_0    conda-forge
     clang                     14.0.6                   pypi_0    pypi
     clang-14                  14.0.6          default_h7634d5b_1    conda-forge
     colorama                  0.4.6              pyhd8ed1ab_1    conda-forge
     cyrus-sasl                2.1.28               hac629b4_1    conda-forge
     dav1d                     1.2.1                hd590300_0    conda-forge
     dbus                      1.16.2               h24cb091_1    conda-forge
     docutils                  0.17.1          py310hff52083_7    conda-forge
     double-conversion         3.4.0                hecca717_0    conda-forge
     exceptiongroup            1.3.1                    pypi_0    pypi
     ffmpeg                    8.1.1           gpl_hee00b0e_901    conda-forge
     flake8                    7.3.0              pyhd8ed1ab_0    conda-forge
     font-ttf-dejavu-sans-mono 2.37                 hab24e00_0    conda-forge
     font-ttf-inconsolata      3.000                h77eed37_0    conda-forge
     font-ttf-source-code-pro  2.038                h77eed37_0    conda-forge
     font-ttf-ubuntu           0.83                 h77eed37_3    conda-forge
     fontconfig                2.17.1               h27c8c51_0    conda-forge
     fonts-conda-ecosystem     1                             0    conda-forge
     fonts-conda-forge         1                    hc364b38_1    conda-forge
     fribidi                   1.0.16               hb03c661_0    conda-forge
     future                    1.0.0              pyhd8ed1ab_2    conda-forge
     gcc_impl_linux-64         15.2.0              he420e7e_18    conda-forge
     gdk-pixbuf                2.44.6               h2b0a6b4_0    conda-forge
     glslang                   16.3.0               h96af755_0    conda-forge
     gmp                       6.3.0                hac33072_2    conda-forge
     graphite2                 1.3.14               hecca717_2    conda-forge
     h2                        4.3.0              pyhcf101f3_0    conda-forge
     harfbuzz                  14.2.0               h6083320_0    conda-forge
     hdf5                      2.1.0           nompi_h87a9417_105    conda-forge
     hpack                     4.1.0              pyhd8ed1ab_0    conda-forge
     hyperframe                6.1.0              pyhd8ed1ab_0    conda-forge
     icu                       78.3                 h33c6efd_0    conda-forge
     idna                      3.13               pyhcf101f3_0    conda-forge
     imageio                   2.37.3                   pypi_0    pypi
     imagesize                 2.0.0              pyhd8ed1ab_0    conda-forge
     imath                     3.2.2                hde8ca8f_0    conda-forge
     importlib-metadata        8.8.0              pyhcf101f3_0    conda-forge
     iniconfig                 2.3.0                    pypi_0    pypi
     intel-gmmlib              22.10.0              hb700be7_0    conda-forge
     intel-media-driver        26.1.6               hecca717_0    conda-forge
     jinja2                    3.1.6              pyhcf101f3_1    conda-forge
     kernel-headers_linux-64   5.14.0               he073ed8_3    conda-forge
     keyutils                  1.6.3                hb9d3cd8_0    conda-forge
     krb5                      1.22.2               ha1258a1_0    conda-forge
     lame                      3.100             h166bdaf_1003    conda-forge
     lcms2                     2.19                 h0c24ade_0    conda-forge
     ld_impl_linux-64          2.45.1          default_hbd61a6d_102    conda-forge
     lerc                      4.1.0                hdb68285_0    conda-forge
     level-zero                1.28.4               hb700be7_0    conda-forge
     libabseil                 20260107.1      cxx17_h7b12aa8_0    conda-forge
     libaec                    1.1.5                h088129d_0    conda-forge
     libass                    0.17.4               h96ad9f0_0    conda-forge
     libavif16                 1.4.1                hcfa2d63_0    conda-forge
     libblas                   3.9.0           1_h86c2bf4_netlib    conda-forge
     libbrotlicommon           1.2.0                hb03c661_1    conda-forge
     libbrotlidec              1.2.0                hb03c661_1    conda-forge
     libbrotlienc              1.2.0                hb03c661_1    conda-forge
     libcap                    2.77                 hd0affe5_1    conda-forge
     libcblas                  3.9.0           13_h8e06fc2_netlib    conda-forge
     libclang                  14.0.6          default_h7634d5b_1    conda-forge
     libclang-cpp14            14.0.6          default_h7634d5b_1    conda-forge
     libclang13                14.0.6          default_h9986a30_1    conda-forge
     libcups                   2.3.3                h7a8fb5f_6    conda-forge
     libcurl                   8.20.0               hcf29cc6_0    conda-forge
     libdeflate                1.25                 h17f619e_0    conda-forge
     libdovi                   3.3.2                ha23c83e_4    conda-forge
     libdrm                    2.4.125              hb03c661_1    conda-forge
     libedit                   3.1.20250104    pl5321h7949ede_0    conda-forge
     libegl                    1.7.0                ha4b6fd6_2    conda-forge
     libegl-devel              1.7.0                ha4b6fd6_2    conda-forge
     libev                     4.33                 hd590300_2    conda-forge
     libexpat                  2.8.0                hecca717_0    conda-forge
     libffi                    3.5.2                h3435931_0    conda-forge
     libflac                   1.5.0                he200343_1    conda-forge
     libfreetype               2.14.3               ha770c72_0    conda-forge
     libfreetype6              2.14.3               h73754d4_0    conda-forge
     libgcc                    15.2.0              he0feb66_18    conda-forge
     libgcc-devel_linux-64     15.2.0             hcc6f6b0_118    conda-forge
     libgcc-ng                 15.2.0              h69a702a_18    conda-forge
     libgfortran               15.2.0               h166f726_7
     libgfortran-ng            15.2.0               h166f726_7
     libgfortran5              15.2.0               hc633d37_7
     libgl                     1.7.0                ha4b6fd6_2    conda-forge
     libgl-devel               1.7.0                ha4b6fd6_2    conda-forge
     libglib                   2.88.1               h0d30a3d_1    conda-forge
     libglvnd                  1.7.0                ha4b6fd6_2    conda-forge
     libglx                    1.7.0                ha4b6fd6_2    conda-forge
     libglx-devel              1.7.0                ha4b6fd6_2    conda-forge
     libgomp                   15.2.0              he0feb66_18    conda-forge
     libhwloc                  2.12.2          default_hafda6a7_1000    conda-forge
     libhwy                    1.4.0                h10be129_0    conda-forge
     libiconv                  1.18                 h3b78370_2    conda-forge
     libjpeg-turbo             3.1.4.1              hb03c661_0    conda-forge
     libjxl                    0.11.2               h174a0a3_1    conda-forge
     liblapack                 3.9.0           13_h8876d29_netlib    conda-forge
     liblapacke                3.9.0           13_hb041515_netlib    conda-forge
     libllvm14                 14.0.6               hcd5def8_4    conda-forge
     liblzma                   5.8.3                hb03c661_0    conda-forge
     libnghttp2                1.68.1               h877daf1_0    conda-forge
     libnsl                    2.0.1                hb9d3cd8_1    conda-forge
     libntlm                   1.8                  hb9d3cd8_0    conda-forge
     libogg                    1.3.5                hd0c01bc_1    conda-forge
     libopenblas               0.3.31               hf7dbefb_2
     libopencv                 4.13.0          qt6_py310h7d3a38c_608    conda-forge
     libopenvino               2026.0.0             hb56ce9e_1    conda-forge
     libopenvino-auto-batch-plugin 2026.0.0             hd85de46_1    conda-forge
     libopenvino-auto-plugin   2026.0.0             hd85de46_1    conda-forge
     libopenvino-hetero-plugin 2026.0.0             hd41364c_1    conda-forge
     libopenvino-intel-cpu-plugin 2026.0.0             hb56ce9e_1    conda-forge
     libopenvino-intel-gpu-plugin 2026.0.0             hb56ce9e_1    conda-forge
     libopenvino-intel-npu-plugin 2026.0.0             hb56ce9e_1    conda-forge
     libopenvino-ir-frontend   2026.0.0             hd41364c_1    conda-forge
     libopenvino-onnx-frontend 2026.0.0             h7a07914_1    conda-forge
     libopenvino-paddle-frontend 2026.0.0             h7a07914_1    conda-forge
     libopenvino-pytorch-frontend 2026.0.0             hecca717_1    conda-forge
     libopenvino-tensorflow-frontend 2026.0.0             h78e8023_1    conda-forge
     libopenvino-tensorflow-lite-frontend 2026.0.0             hecca717_1    conda-forge
     libopus                   1.6.1                h280c20c_0    conda-forge
     libpciaccess              0.18                 hb9d3cd8_0    conda-forge
     libplacebo                7.360.1              h9eeb4b2_0    conda-forge
     libpng                    1.6.58               h421ea60_0    conda-forge
     libpq                     18.3                 h9abb657_0    conda-forge
     libprotobuf               6.33.5               h2b00c02_0    conda-forge
     librsvg                   2.62.1               h4c96295_0    conda-forge
     libsanitizer              15.2.0              h90f66d4_18    conda-forge
     libsndfile                1.2.2                hc7d488a_2    conda-forge
     libsqlite                 3.53.1               h0c1763c_0    conda-forge
     libssh2                   1.11.1               hcf80075_0    conda-forge
     libstdcxx                 15.2.0              h934c35e_18    conda-forge
     libstdcxx-devel_linux-64  15.2.0             hd446a21_118    conda-forge
     libstdcxx-ng              15.2.0              hdf11a46_18    conda-forge
     libsystemd0               260.1                h6569c3e_0    conda-forge
     libtiff                   4.7.1                h9d88235_1    conda-forge
     libudev1                  260.1                h6569c3e_0    conda-forge
     libunwind                 1.8.3                h65a8314_0    conda-forge
     liburing                  2.14                 hb700be7_0    conda-forge
     libusb                    1.0.29               h73b1eb8_0    conda-forge
     libuuid                   2.42                 h5347b49_0    conda-forge
     libva                     2.23.0               he1eb515_0    conda-forge
     libvorbis                 1.3.7                h54a6638_2    conda-forge
     libvpl                    2.16.0               h54a6638_0    conda-forge
     libvpx                    1.15.2               hecca717_0    conda-forge
     libvulkan-loader          1.4.341.0            h5279c79_0    conda-forge
     libwebp-base              1.6.0                hd42ef1d_0    conda-forge
     libxcb                    1.17.0               h8a09558_0    conda-forge
     libxcrypt                 4.4.36               hd590300_1    conda-forge
     libxkbcommon              1.13.1               hca5e8e5_0    conda-forge
     libxml2                   2.15.3               h49c6c72_0    conda-forge
     libxml2-16                2.15.3               hca6bf5a_0    conda-forge
     libzlib                   1.3.2                h25fd6f3_2    conda-forge
     markupsafe                3.0.3           py310h3406613_1    conda-forge
     mccabe                    0.7.0              pyhd8ed1ab_1    conda-forge
     mpg123                    1.32.9               hc50e24c_0    conda-forge
     ncurses                   6.6                  hdb14827_0    conda-forge
     numpy                     2.2.5           py310h35d6838_3
     numpy-base                2.2.5           py310h4bc27c9_3
     nvidia-libnvcomp-cu12     5.2.0.13                 pypi_0    pypi
     nvidia-nvjpeg2k-cu12      0.10.0.49                pypi_0    pypi
     nvidia-nvtiff-cu12        0.7.0.79                 pypi_0    pypi
     ocl-icd                   2.3.3                hb9d3cd8_0    conda-forge
     opencl-headers            2025.06.13           hecca717_0    conda-forge
     opencv                    4.13.0          qt6_py310h1a5f3ab_608    conda-forge
     openexr                   3.4.11               h9f1635d_0    conda-forge
     openh264                  2.6.0                hc22cd8d_0    conda-forge
     openjpeg                  2.5.4                h55fea9a_0    conda-forge
     openjph                   0.27.0               h8d634f6_0    conda-forge
     openldap                  2.6.13               hbde042b_0    conda-forge
     openssl                   3.6.2                h35e630c_0    conda-forge
     packaging                 26.2               pyhc364b38_0    conda-forge
     pango                     1.56.4               hda50119_1    conda-forge
     pcre2                     10.47                haa7fec5_0    conda-forge
     pillow                    12.2.0                   pypi_0    pypi
     pip                       26.1.1             pyh8b19718_0    conda-forge
     pixman                    0.46.4               h54a6638_1    conda-forge
     pkg-config                0.29.2            h4bc722e_1009    conda-forge
     pluggy                    1.6.0                    pypi_0    pypi
     pthread-stubs             0.4               hb9d3cd8_1002    conda-forge
     pugixml                   1.15                 h3f63f65_0    conda-forge
     pulseaudio-client         17.0                 h9a6aba3_3    conda-forge
     py-opencv                 4.13.0          qt6_py310h510e9db_608    conda-forge
     pycodestyle               2.14.0             pyhd8ed1ab_0    conda-forge
     pydicom                   3.0.2                    pypi_0    pypi
     pyflakes                  3.4.0              pyhd8ed1ab_0    conda-forge
     pygments                  2.20.0             pyhd8ed1ab_0    conda-forge
     pylibjpeg                 2.1.0                    pypi_0    pypi
     pylibjpeg-libjpeg         2.4.0                    pypi_0    pypi
     pylibjpeg-openjpeg        2.5.0                    pypi_0    pypi
     pysocks                   1.7.1              pyha55dd90_7    conda-forge
     pytest                    9.0.3                    pypi_0    pypi
     python                    3.10.20         h3c07f61_0_cpython    conda-forge
     python-clang              14.0.6          default_hccd1708_1    conda-forge
     python_abi                3.10                    8_cp310    conda-forge
     qt6-main                  6.11.0          pl5321h16c4a6b_4    conda-forge
     rav1e                     0.8.1                h1fbca29_0    conda-forge
     readline                  8.3                  h853b02a_0    conda-forge
     requests                  2.33.1             pyhcf101f3_1    conda-forge
     s2n                       1.7.2                hc5a330e_1    conda-forge
     sdl2                      2.32.56              h54a6638_0    conda-forge
     sdl3                      3.4.8                hdeec2a5_0    conda-forge
     setuptools                82.0.1             pyh332efcf_0    conda-forge
     shaderc                   2026.2               h718be3e_0    conda-forge
     snappy                    1.2.2                h03e3b7b_1    conda-forge
     snowballstemmer           3.0.1              pyhd8ed1ab_0    conda-forge
     sphinx                    4.5.0              pyh6c4a22f_0    conda-forge
     sphinx_rtd_theme          1.3.0              pyha770c72_0    conda-forge
     sphinxcontrib-applehelp   1.0.4              pyhd8ed1ab_0    conda-forge
     sphinxcontrib-devhelp     1.0.2                      py_0    conda-forge
     sphinxcontrib-htmlhelp    2.0.1              pyhd8ed1ab_0    conda-forge
     sphinxcontrib-jquery      4.1                pyhd8ed1ab_1    conda-forge
     sphinxcontrib-jsmath      1.0.1              pyhd8ed1ab_1    conda-forge
     sphinxcontrib-qthelp      1.0.3                      py_0    conda-forge
     sphinxcontrib-serializinghtml 1.1.5              pyhd8ed1ab_2    conda-forge
     spirv-tools               2026.1               hb700be7_0    conda-forge
     svt-av1                   4.0.1                hecca717_0    conda-forge
     sysroot_linux-64          2.34                 h087de78_3    conda-forge
     tbb                       2023.0.0             h51de99f_1    conda-forge
     tk                        8.6.13          noxft_h366c992_103    conda-forge
     tomli                     2.4.1                    pypi_0    pypi
     typing-extensions         4.15.0                   pypi_0    pypi
     tzdata                    2025c                hc9c84f9_1    conda-forge
     urllib3                   2.6.3              pyhd8ed1ab_0    conda-forge
     wayland                   1.25.0               hd6090a7_0    conda-forge
     wayland-protocols         1.47                 hd8ed1ab_0    conda-forge
     wheel                     0.47.0             pyhd8ed1ab_0    conda-forge
     x264                      1!164.3095           h166bdaf_2    conda-forge
     x265                      3.5                  h924138e_3    conda-forge
     xcb-util                  0.4.1                h4f16b4b_2    conda-forge
     xcb-util-cursor           0.1.6                hb03c661_0    conda-forge
     xcb-util-image            0.4.0                hb711507_2    conda-forge
     xcb-util-keysyms          0.4.1                hb711507_0    conda-forge
     xcb-util-renderutil       0.3.10               hb711507_0    conda-forge
     xcb-util-wm               0.4.2                hb711507_0    conda-forge
     xkeyboard-config          2.47                 hb03c661_0    conda-forge
     xorg-libice               1.1.2                hb9d3cd8_0    conda-forge
     xorg-libsm                1.2.6                he73a12e_0    conda-forge
     xorg-libx11               1.8.13               he1eb515_0    conda-forge
     xorg-libxau               1.0.12               hb03c661_1    conda-forge
     xorg-libxcomposite        0.4.7                hb03c661_0    conda-forge
     xorg-libxcursor           1.2.3                hb9d3cd8_0    conda-forge
     xorg-libxdamage           1.1.6                hb9d3cd8_0    conda-forge
     xorg-libxdmcp             1.1.5                hb03c661_1    conda-forge
     xorg-libxext              1.3.7                hb03c661_0    conda-forge
     xorg-libxfixes            6.0.2                hb03c661_0    conda-forge
     xorg-libxi                1.8.2                hb9d3cd8_0    conda-forge
     xorg-libxrandr            1.5.5                hb03c661_0    conda-forge
     xorg-libxrender           0.9.12               hb9d3cd8_0    conda-forge
     xorg-libxscrnsaver        1.2.4                hb9d3cd8_0    conda-forge
     xorg-libxtst              1.2.5                hb9d3cd8_3    conda-forge
     xorg-libxxf86vm           1.1.7                hb03c661_0    conda-forge
     xorg-xorgproto            2025.1               hb03c661_0    conda-forge
     zipp                      3.23.1             pyhcf101f3_0    conda-forge
     zlib                      1.3.2                h25fd6f3_2    conda-forge
     zstd                      1.5.7                hb78ec9c_6    conda-forge
     
</pre></details>

Relevant log output

I created a script that attempts to use nvImageCodec, GDCM, and decoder_nvimgcodec.py (attempts to use nvImageCodec decoders first before falling back to any others present, like GDCM) to handle these compressed DICOM cases, and then compares GDCM to decoder_nvimgcodec outputs. Results for 3 files of interest shown below:

bad_sequence.dcm (no issues):

File  : bad_sequence.dcm
       TS=1.2.840.10008.1.2.4.70  BitsAllocated=16  BitsStored=12
       [nvimgcodec decoder] decoded  shape=(512, 512, 1)  dtype=uint16  all_zero=False
       [gdcm decoder     ] decoded  shape=(512, 512)  dtype=uint16  all_zero=False
       [decoder pipeline ] decoded  shape=(512, 512)  dtype=uint16  all_zero=False  [via nvimgcodec]
       [comparison       ] MATCH  (decoder pipeline pixel-identical to GDCM)

MR (SOF3 P = 12):

File  : MR.dcm
       TS=1.2.840.10008.1.2.4.70  BitsAllocated=16  BitsStored=12
       [nvimgcodec decoder] decoded  shape=(320, 320, 1)  dtype=uint16  all_zero=True  <-- SILENT ZERO-FILL BUG
       [gdcm decoder     ] decoded  shape=(320, 320)  dtype=uint16  all_zero=False
       [decoder pipeline ] decoded  shape=(320, 320)  dtype=uint16  all_zero=True  [via nvimgcodec]  <-- ALL ZERO
       [comparison       ] MISMATCH  <-- PIXEL CORRUPTION  max_diff=1092  mean_diff=75.5825

CT (DHT before SOF3):

File  : CT.dcm
       TS=1.2.840.10008.1.2.4.70  BitsAllocated=16  BitsStored=12
       [nvimgcodec decoder] decoded  shape=(512, 512, 1)  dtype=uint16  all_zero=True  <-- SILENT ZERO-FILL BUG
       [gdcm decoder     ] decoded  shape=(512, 512)  dtype=uint16  all_zero=False
       [decoder pipeline ] decoded  shape=(512, 512)  dtype=uint16  all_zero=True  [via nvimgcodec]  <-- ALL ZERO
       [comparison       ] MISMATCH  <-- PIXEL CORRUPTION  max_diff=2540  mean_diff=467.2943

Other/Misc.

A fix is implemented in extensions/nvjpeg/lossless_decoder.cpp in canDecode, adding:

  1. A precision check using cs_image_info.plane_info[0].precision (the SOF3 P byte read by the nvimgcodec JPEG parser) to reject P in [9,15]
  2. A has_dht_before_sof3() pre-scan of the raw bitstream before calling nvjpegJpegStreamParse to reject DHT-before-SOF3 streams

The three aforementioned anonymized DICOM files were converted to .jpeg and used for testing - test/extensions/nvjpeg_ext_lossless_decoder_test.cpp was updated to include these new tests.

References:

  • ITU-T T.81 (ISO/IEC 10918-1), Annex B — JPEG interchange format syntax
  • MONAI Deploy App SDK PR

Check for duplicates

  • I have searched the open bugs/issues and have found no duplicates for this bug report

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions