GDCM / DCMTK selection issues

Hello,

I run the latest version of osimis/orthanc Docker container, which uses GDCM for transcoding JPEG 2000 images only. I found situations where GDCM should transcode an image and DCMTK is used, and vice-versa.

Example 1 with https://github.com/pydicom/pylibjpeg-data/blob/master/ljdata/ds/JPEG2000/US1_J2KI.dcm (JPEG 2000):

http://[IP]/instances/[Instance ID]/preview redirects to unsupported.png (seems like transcoding did not work)

But:

curl -X POST http://[IP]/instances/[Instance ID]/modify -u orthanc:orthanc -d ‘{“Transcode”:“1.2.840.10008.1.2.1”}’ > ~/Downloads/Modified.dcm works because I can upload the transcoded in Orthanc and preview correctly (GDCM is shown as the transcoder)

Example 2 with https://github.com/pydicom/pylibjpeg-data/blob/master/ljdata/ds/JPEGBaseline/color3d_jpeg_baseline.dcm (JPEG Baseline):

curl -X POST http://[IP]/instances/[Instance ID]/modify -u orthanc:orthanc -d ‘{“Transcode”:“1.2.840.10008.1.2.50”}’ > ~/Downloads/Modified.dcm returns an image that has been transcoded with GDCM, but should be DCMTK.

If I upload this transcoded image to Orthanc, and transcode it to JPEG Baseline again, the result is a “green” image.

Am I doing something wrong?

Thanks
Nicolas

Here are the verbose logs:

Startup command: Orthanc --verbose /tmp/orthanc.json
W1022 14:56:02.818053 main.cpp:1956] Orthanc version: 1.9.7
I1022 14:56:02.818227 main.cpp:1988] Architecture: 64-bit, little endian
W1022 14:56:02.818305 OrthancConfiguration.cpp:66] Reading the configuration from: “/tmp/orthanc.json”
I1022 14:56:02.818656 Toolbox.cpp:1467] Using locale: “en_US.UTF-8” for case-insensitive comparison of strings
I1022 14:56:02.818809 Toolbox.cpp:1759] OpenSSL version: OpenSSL 1.1.1d 10 Sep 2019
I1022 14:56:02.820070 FromDcmtkBridge.cpp:291] (dicom) Using DCTMK version: 366
I1022 14:56:02.820157 FromDcmtkBridge.cpp:299] (dicom) Loading the embedded dictionaries
I1022 14:56:02.837407 FromDcmtkBridge.cpp:311] (dicom) Loading the embedded dictionary of private tags
I1022 14:56:02.863594 FromDcmtkBridge.cpp:2293] (dicom) Registering JPEG Lossless codecs in DCMTK
I1022 14:56:02.863677 FromDcmtkBridge.cpp:2301] (dicom) Registering JPEG codecs in DCMTK
I1022 14:56:02.863709 FromDcmtkBridge.cpp:2308] (dicom) Registering RLE codecs in DCMTK
I1022 14:56:02.863724 Enumerations.cpp:2315] Default encoding for DICOM was changed to: Latin1
I1022 14:56:02.888544 OrthancInitialization.cpp:322] Calling mallopt(M_ARENA_MAX, 5)
W1022 14:56:02.888766 main.cpp:878] Loading plugin(s) from: /run/orthanc/plugins
E1022 14:56:02.888804 PluginsManager.cpp:242] Inexistent path to plugins: /run/orthanc/plugins
W1022 14:56:02.888813 main.cpp:878] Loading plugin(s) from: /usr/share/orthanc/plugins
I1022 14:56:02.888831 PluginsManager.cpp:288] (plugins) Scanning folder /usr/share/orthanc/plugins for plugins
I1022 14:56:02.888899 PluginsManager.cpp:311] (plugins) Found a shared library: “/usr/share/orthanc/plugins/libOrthancGdcm.so”
W1022 14:56:02.912221 PluginsManager.cpp:269] Registering plugin ‘gdcm’ (version 1.4)
W1022 14:56:02.912460 PluginsManager.cpp:168] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.90
W1022 14:56:02.912478 PluginsManager.cpp:168] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.91
W1022 14:56:02.912485 PluginsManager.cpp:168] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.92
W1022 14:56:02.912493 PluginsManager.cpp:168] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.93
W1022 14:56:02.912502 PluginsManager.cpp:168] Throttling GDCM to 4 concurrent thread(s)
W1022 14:56:02.912520 PluginsManager.cpp:168] Version of GDCM: 3.0.8
I1022 14:56:02.912528 OrthancPlugins.cpp:2417] (plugins) Plugin has registered a callback to decode DICOM images (1 decoder(s) now active)
I1022 14:56:02.912539 OrthancPlugins.cpp:2430] (plugins) Plugin has registered a callback to transcode DICOM images (1 transcoder(s) now active)
W1022 14:56:02.912574 OrthancInitialization.cpp:358] SQLite index directory: “/var/lib/orthanc/db”
W1022 14:56:02.914072 OrthancInitialization.cpp:457] Storage directory: “/var/lib/orthanc/db”
I1022 14:56:02.919391 SQLiteDatabaseWrapper.cpp:1329] Creating the database
I1022 14:56:02.922648 SQLiteDatabaseWrapper.cpp:1345] Version of the Orthanc database: 6
I1022 14:56:02.923071 SQLiteDatabaseWrapper.cpp:1365] Installing the SQLite triggers to track the size of the attachments
W1022 14:56:02.923562 HttpClient.cpp:1176] HTTPS will use the CA certificates from this file: /etc/ssl/certs/ca-certificates.crt
I1022 14:56:02.923588 HttpClient.cpp:498] (http) Setting the default timeout for HTTP client connections: 0 seconds
I1022 14:56:02.923633 HttpClient.cpp:482] (http) Setting the default proxy for HTTP client connections:
I1022 14:56:02.923662 DicomAssociationParameters.cpp:375] (dicom) Default timeout for DICOM connections if Orthanc acts as SCU (client): 10 seconds (0 = no timeout)
I1022 14:56:02.925226 ServerIndex.cpp:438] Starting the monitor for stable resources (stable age = 60)
I1022 14:56:02.925253 ServerIndex.cpp:300] Starting the database flushing thread (sleep = 10 seconds)
I1022 14:56:02.925515 LuaJobManager.cpp:79] (lua) Lua: DICOM associations will be closed after 5 seconds of inactivity
I1022 14:56:02.925631 LuaScripting.cpp:782] Initializing Lua for the event handler
W1022 14:56:02.925974 LuaContext.cpp:93] Lua says: Lua toolbox installed
I1022 14:56:02.927365 LuaJobManager.cpp:79] (lua) Lua: DICOM associations will be closed after 5 seconds of inactivity
I1022 14:56:02.927410 LuaScripting.cpp:782] Initializing Lua for the event handler
W1022 14:56:02.927650 LuaContext.cpp:93] Lua says: Lua toolbox installed
I1022 14:56:02.927683 ServerContext.cpp:373] Automated transcoding of incoming DICOM instances is disabled
I1022 14:56:02.927692 ServerContext.cpp:380] (dicom) Deidentification of log contents (notably for DIMSE queries) is enabled
I1022 14:56:02.927700 ServerContext.cpp:384] (dicom) Version of DICOM standard used for deidentification is 2021b
I1022 14:56:02.927923 ServerContext.cpp:403] (dicom) Preferred transfer syntax for Orthanc C-STORE SCU: 1.2.840.10008.1.2.1
I1022 14:56:02.928048 DcmtkTranscoder.cpp:75] Quality for lossy transcoding using DCMTK is set to: 90
W1022 14:56:02.928067 ServerContext.cpp:478] Disk compression is disabled
I1022 14:56:02.928074 ServerContext.cpp:1155] Storing MD5 for attachments: yes
W1022 14:56:02.928083 ServerIndex.cpp:391] No limit on the number of stored patients
W1022 14:56:02.928090 ServerIndex.cpp:411] No limit on the size of the storage area
I1022 14:56:02.929788 ServerContext.cpp:234] The last execution of Orthanc has archived no job
W1022 14:56:02.930019 JobsEngine.cpp:271] The jobs engine has started with 2 threads
I1022 14:56:02.930013 JobsEngine.cpp:125] (jobs) Worker thread 0 has started
I1022 14:56:02.931522 DicomServer.cpp:132] (dicom) Setting timeout for DICOM connections if Orthanc acts as SCP (server): 30 seconds (0 = no timeout)
I1022 14:56:02.931857 DicomServer.cpp:420] (dicom) Orthanc SCP will not use DICOM TLS
W1022 14:56:02.932081 main.cpp:1263] DICOM server listening with AET ORTHANC on port: 4242
I1022 14:56:02.932105 DicomServer.cpp:63] (dicom) DICOM server started
I1022 14:56:02.932248 HttpServer.cpp:1579] (http) This Orthanc server uses CivetWeb as its embedded HTTP server
I1022 14:56:02.932338 HttpServer.cpp:2068] (http) The embedded HTTP server will use 50 threads
I1022 14:56:02.932433 HttpServer.cpp:1928] (http) HTTP keep alive is enabled
W1022 14:56:02.932444 HttpServer.cpp:1992] HTTP compression is enabled
I1022 14:56:02.932452 HttpServer.cpp:2081] (http) TCP_NODELAY for the HTTP sockets is set to true
I1022 14:56:02.932460 HttpServer.cpp:2101] (http) Request timeout in the HTTP server is set to 30 seconds
W1022 14:56:02.932472 main.cpp:1050] ====> HTTP authentication is enabled, but no user is declared. Creating a default user: Review your configuration option “RegisteredUsers”. Your setup is INSECURE <====
I1022 14:56:02.932484 main.cpp:1127] Version of Lua: Lua 5.3
W1022 14:56:02.932491 main.cpp:1138] Remote LUA script execution is disabled
I1022 14:56:02.933894 HttpServer.cpp:2148] (http) Branching WebDAV bucket at: /webdav
I1022 14:56:02.933942 HttpServer.cpp:1624] (http) Starting embedded Web server using Civetweb
I1022 14:56:02.937404 OrthancWebDav.cpp:1705] Starting the WebDAV upload thread
W1022 14:56:02.937460 HttpServer.cpp:1769] HTTP server listening on port: 8042 (HTTPS encryption is disabled, remote access is allowed)
W1022 14:56:02.937479 main.cpp:890] Orthanc has started
I1022 14:56:02.937489 LuaScripting.cpp:841] Starting the Lua engine
I1022 14:56:02.937890 JobsEngine.cpp:125] (jobs) Worker thread 1 has started
I1022 14:56:16.453192 HttpServer.cpp:1238] (http) GET /app/explorer.html
I1022 14:56:16.519855 HttpServer.cpp:1238] (http) GET /app/libs/jquery.mobile.min.css
I1022 14:56:16.540099 HttpServer.cpp:1238] (http) GET /app/libs/jqtree.css
I1022 14:56:16.540337 HttpServer.cpp:1238] (http) GET /app/libs/slimbox2/slimbox2.css
I1022 14:56:16.540337 HttpServer.cpp:1238] (http) GET /app/libs/jquery-file-upload/css/style.css
I1022 14:56:16.542074 HttpServer.cpp:1238] (http) GET /app/libs/jquery-file-upload/css/jquery.fileupload-ui.css
I1022 14:56:16.544529 HttpServer.cpp:1238] (http) GET /app/libs/jquery.mobile.simpledialog.min.css
I1022 14:56:16.544820 HttpServer.cpp:1238] (http) GET /app/explorer.css
I1022 14:56:16.560931 HttpServer.cpp:1238] (http) GET /app/libs/jquery.mobile.min.js
I1022 14:56:16.560959 HttpServer.cpp:1238] (http) GET /app/libs/jquery.min.js
I1022 14:56:16.563737 HttpServer.cpp:1238] (http) GET /app/libs/jqm.page.params.js
I1022 14:56:16.564204 HttpServer.cpp:1238] (http) GET /app/libs/tree.jquery.js
I1022 14:56:16.567467 HttpServer.cpp:1238] (http) GET /app/libs/date.js
I1022 14:56:16.569837 HttpServer.cpp:1238] (http) GET /app/libs/jquery.mobile.simpledialog2.js
I1022 14:56:16.585610 HttpServer.cpp:1238] (http) GET /app/libs/slimbox2.js
I1022 14:56:16.588790 HttpServer.cpp:1238] (http) GET /app/libs/jquery.blockui.js
I1022 14:56:16.594190 HttpServer.cpp:1238] (http) GET /app/libs/jquery-file-upload/js/vendor/jquery.ui.widget.js
I1022 14:56:16.595313 HttpServer.cpp:1238] (http) GET /app/libs/jquery-file-upload/js/jquery.iframe-transport.js
I1022 14:56:16.609086 HttpServer.cpp:1238] (http) GET /app/libs/jquery-file-upload/js/jquery.fileupload.js
I1022 14:56:16.611332 HttpServer.cpp:1238] (http) GET /app/file-upload.js
I1022 14:56:16.611714 HttpServer.cpp:1238] (http) GET /app/explorer.js
I1022 14:56:16.613932 HttpServer.cpp:1238] (http) GET /app/query-retrieve.js
I1022 14:56:16.618103 HttpServer.cpp:1238] (http) GET /plugins/explorer.js
I1022 14:56:16.663147 HttpServer.cpp:1238] (http) GET /app/orthanc-logo.png
I1022 14:56:16.670339 HttpServer.cpp:1238] (http) GET /app/libs/images/ajax-loader.gif
I1022 14:56:16.706158 HttpServer.cpp:1238] (http) GET /system
I1022 14:56:16.734627 HttpServer.cpp:1238] (http) GET /app/libs/images/icons-18-white.png
I1022 14:56:29.427283 HttpServer.cpp:1238] (http) POST /instances
I1022 14:56:29.477547 OrthancRestApi.cpp:173] (http) Receiving a DICOM file of 59140 bytes through HTTP
I1022 14:56:29.478907 FilesystemStorage.cpp:124] Creating attachment “557ae3b0-9dff-44ac-86d5-7eed24690a01” of “DICOM” type (size: 1MB)
I1022 14:56:29.482782 ServerContext.cpp:624] New instance stored
I1022 14:56:45.148963 HttpServer.cpp:1238] (http) GET /system
I1022 14:56:46.230693 HttpServer.cpp:1238] (http) GET /system
I1022 14:56:46.262669 HttpServer.cpp:1238] (http) GET /studies
I1022 14:56:46.979707 HttpServer.cpp:1238] (http) GET /system
I1022 14:56:47.010916 HttpServer.cpp:1238] (http) GET /studies/33a9f8f0-06f13d15-bc18624e-b609c90c-2e0b7138
I1022 14:56:47.040671 HttpServer.cpp:1238] (http) GET /patients/c649beb8-0b4e8e8e-2cff235f-9c0401e7-fce01c82
I1022 14:56:47.071179 HttpServer.cpp:1238] (http) GET /studies/33a9f8f0-06f13d15-bc18624e-b609c90c-2e0b7138/series
I1022 14:56:47.898984 HttpServer.cpp:1238] (http) GET /system
I1022 14:56:47.929522 HttpServer.cpp:1238] (http) GET /series/75634bd2-9254a3b0-00b87851-afd071d1-82682193
I1022 14:56:47.960453 HttpServer.cpp:1238] (http) GET /studies/33a9f8f0-06f13d15-bc18624e-b609c90c-2e0b7138
I1022 14:56:47.990766 HttpServer.cpp:1238] (http) GET /patients/c649beb8-0b4e8e8e-2cff235f-9c0401e7-fce01c82
I1022 14:56:48.021986 HttpServer.cpp:1238] (http) GET /series/75634bd2-9254a3b0-00b87851-afd071d1-82682193/instances
I1022 14:56:49.259043 HttpServer.cpp:1238] (http) GET /system
I1022 14:56:49.291525 HttpServer.cpp:1238] (http) GET /instances/96006759-401687b4-22eb5918-129a0331-814dba6a
I1022 14:56:49.321733 HttpServer.cpp:1238] (http) GET /series/75634bd2-9254a3b0-00b87851-afd071d1-82682193
I1022 14:56:49.350000 HttpServer.cpp:1238] (http) GET /studies/33a9f8f0-06f13d15-bc18624e-b609c90c-2e0b7138
I1022 14:56:49.379505 HttpServer.cpp:1238] (http) GET /patients/c649beb8-0b4e8e8e-2cff235f-9c0401e7-fce01c82
I1022 14:56:49.411500 HttpServer.cpp:1238] (http) GET /instances/96006759-401687b4-22eb5918-129a0331-814dba6a/tags
I1022 14:56:49.412027 FilesystemStorage.cpp:175] Reading attachment “557ae3b0-9dff-44ac-86d5-7eed24690a01” of “DICOM” content type (range from 0 to 1514)
I1022 14:56:49.448489 HttpServer.cpp:1238] (http) GET /instances/96006759-401687b4-22eb5918-129a0331-814dba6a/header
I1022 14:56:49.448636 FilesystemStorage.cpp:160] Reading attachment “557ae3b0-9dff-44ac-86d5-7eed24690a01” of “DICOM” content type
I1022 14:56:49.479246 HttpServer.cpp:1238] (http) GET /instances/96006759-401687b4-22eb5918-129a0331-814dba6a/metadata
I1022 14:56:49.664063 HttpServer.cpp:1238] (http) GET /app/libs/jqtree-icons.png
I1022 14:57:00.449354 HttpServer.cpp:1238] (http) GET /app/images/unsupported.png
I1022 14:57:21.333906 HttpServer.cpp:1238] (http) POST /instances/96006759-401687b4-22eb5918-129a0331-814dba6a/modify
I1022 14:57:21.334122 FilesystemStorage.cpp:160] Reading attachment “557ae3b0-9dff-44ac-86d5-7eed24690a01” of “DICOM” content type
I1022 14:57:29.755401 HttpServer.cpp:1238] (http) GET /system
I1022 14:57:34.402941 HttpServer.cpp:1238] (http) POST /instances
I1022 14:57:34.867827 OrthancRestApi.cpp:173] (http) Receiving a DICOM file of 6143990 bytes through HTTP
I1022 14:57:34.917317 FilesystemStorage.cpp:124] Creating attachment “bcde4800-4462-4de8-9eed-dab9e99eacb1” of “DICOM” type (size: 6MB)
I1022 14:57:34.957712 ServerContext.cpp:624] New instance stored
I1022 14:57:36.559799 HttpServer.cpp:1238] (http) GET /system
I1022 14:57:37.765150 HttpServer.cpp:1238] (http) GET /system
I1022 14:57:37.795682 HttpServer.cpp:1238] (http) GET /studies
I1022 14:57:40.362366 HttpServer.cpp:1238] (http) GET /system
I1022 14:57:40.391291 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:57:40.419280 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:57:40.447779 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2/series
I1022 14:57:41.048044 HttpServer.cpp:1238] (http) GET /system
I1022 14:57:41.078582 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9
I1022 14:57:41.107791 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:57:41.138049 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:57:41.166773 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9/instances
I1022 14:57:42.004136 HttpServer.cpp:1238] (http) GET /system
I1022 14:57:42.033057 HttpServer.cpp:1238] (http) GET /instances/85e9ae66-bb4b4e00-afa2dd4b-676bb792-7130a7f7
I1022 14:57:42.061544 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9
I1022 14:57:42.089322 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:57:42.117046 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:57:42.150954 HttpServer.cpp:1238] (http) GET /instances/85e9ae66-bb4b4e00-afa2dd4b-676bb792-7130a7f7/tags
I1022 14:57:42.151076 FilesystemStorage.cpp:175] Reading attachment “bcde4800-4462-4de8-9eed-dab9e99eacb1” of “DICOM” content type (range from 0 to 35042)
I1022 14:57:42.200057 HttpServer.cpp:1238] (http) GET /instances/85e9ae66-bb4b4e00-afa2dd4b-676bb792-7130a7f7/header
I1022 14:57:42.200341 FilesystemStorage.cpp:160] Reading attachment “bcde4800-4462-4de8-9eed-dab9e99eacb1” of “DICOM” content type
I1022 14:57:42.257317 HttpServer.cpp:1238] (http) GET /instances/85e9ae66-bb4b4e00-afa2dd4b-676bb792-7130a7f7/metadata
I1022 14:57:53.137731 HttpServer.cpp:1238] (http) POST /instances/85e9ae66-bb4b4e00-afa2dd4b-676bb792-7130a7f7/modify
I1022 14:57:53.138314 FilesystemStorage.cpp:160] Reading attachment “bcde4800-4462-4de8-9eed-dab9e99eacb1” of “DICOM” content type
I1022 14:58:00.409740 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:05.193541 HttpServer.cpp:1238] (http) POST /instances
I1022 14:58:12.068709 OrthancRestApi.cpp:173] (http) Receiving a DICOM file of 110627082 bytes through HTTP
I1022 14:58:12.406415 FilesystemStorage.cpp:124] Creating attachment “7fac2988-39fd-4a04-bd14-892a0124c423” of “DICOM” type (size: 106MB)
I1022 14:58:12.790822 ServerContext.cpp:624] New instance stored
I1022 14:58:14.804076 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:16.313884 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:16.343538 HttpServer.cpp:1238] (http) GET /studies
I1022 14:58:17.169126 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:17.201570 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:58:17.231177 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:58:17.261208 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2/series
I1022 14:58:18.095559 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:18.126061 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9
I1022 14:58:18.155819 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:58:18.186305 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:58:18.216082 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9/instances
I1022 14:58:21.808940 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:21.838517 HttpServer.cpp:1238] (http) GET /instances/39f45db1-4a436e84-8f00561a-73bfdaa2-e5b69e24
I1022 14:58:21.866782 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9
I1022 14:58:21.895018 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:58:21.923017 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:58:21.958398 HttpServer.cpp:1238] (http) GET /instances/39f45db1-4a436e84-8f00561a-73bfdaa2-e5b69e24/tags
I1022 14:58:21.958607 FilesystemStorage.cpp:175] Reading attachment “7fac2988-39fd-4a04-bd14-892a0124c423” of “DICOM” content type (range from 0 to 35070)
I1022 14:58:21.999260 HttpServer.cpp:1238] (http) GET /instances/39f45db1-4a436e84-8f00561a-73bfdaa2-e5b69e24/header
I1022 14:58:21.999374 FilesystemStorage.cpp:160] Reading attachment “7fac2988-39fd-4a04-bd14-892a0124c423” of “DICOM” content type
I1022 14:58:22.217549 HttpServer.cpp:1238] (http) GET /instances/39f45db1-4a436e84-8f00561a-73bfdaa2-e5b69e24/metadata
I1022 14:58:38.544352 HttpServer.cpp:1238] (http) POST /instances/39f45db1-4a436e84-8f00561a-73bfdaa2-e5b69e24/modify
I1022 14:58:38.544555 FilesystemStorage.cpp:160] Reading attachment “7fac2988-39fd-4a04-bd14-892a0124c423” of “DICOM” content type
I1022 14:58:41.849073 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:46.081627 HttpServer.cpp:1238] (http) POST /instances
I1022 14:58:46.837081 OrthancRestApi.cpp:173] (http) Receiving a DICOM file of 9430458 bytes through HTTP
I1022 14:58:46.899232 FilesystemStorage.cpp:124] Creating attachment “d107f75e-00f1-42c7-a5ca-9b48b3cd0daf” of “DICOM” type (size: 9MB)
I1022 14:58:46.936678 ServerContext.cpp:624] New instance stored
I1022 14:58:47.581863 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:48.641964 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:48.670481 HttpServer.cpp:1238] (http) GET /studies
I1022 14:58:49.329479 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:49.358975 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:58:49.386956 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:58:49.413977 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2/series
I1022 14:58:50.493706 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:50.525276 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9
I1022 14:58:50.554219 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:58:50.583967 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:58:50.613234 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9/instances
I1022 14:58:56.368611 HttpServer.cpp:1238] (http) GET /system
I1022 14:58:56.395923 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041
I1022 14:58:56.423933 HttpServer.cpp:1238] (http) GET /series/a4b72eb8-1506716d-d8f570a6-56f238e6-be8947e9
I1022 14:58:56.450683 HttpServer.cpp:1238] (http) GET /studies/73e5152a-53e3d1fc-d0d64298-9bc161b3-9e871df2
I1022 14:58:56.480688 HttpServer.cpp:1238] (http) GET /patients/1cc64195-4099c249-e0e4ef04-02da3fd0-364d95f0
I1022 14:58:56.513208 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/tags
I1022 14:58:56.513344 FilesystemStorage.cpp:175] Reading attachment “d107f75e-00f1-42c7-a5ca-9b48b3cd0daf” of “DICOM” content type (range from 0 to 35092)
I1022 14:58:56.552946 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/header
I1022 14:58:56.553063 FilesystemStorage.cpp:160] Reading attachment “d107f75e-00f1-42c7-a5ca-9b48b3cd0daf” of “DICOM” content type
I1022 14:58:56.588700 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/metadata
I1022 14:59:00.966930 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/pdf
I1022 14:59:00.967051 FilesystemStorage.cpp:160] Reading attachment “d107f75e-00f1-42c7-a5ca-9b48b3cd0daf” of “DICOM” content type
I1022 14:59:01.013082 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/frames
I1022 14:59:01.044038 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/frames/0/preview
I1022 14:59:01.044313 FilesystemStorage.cpp:160] Reading attachment “d107f75e-00f1-42c7-a5ca-9b48b3cd0daf” of “DICOM” content type
I1022 14:59:01.048295 ServerContext.cpp:1839] The installed image decoding plugins cannot handle an image, fallback to the built-in DCMTK decoder
I1022 14:59:01.048358 DicomImageDecoder.cpp:787] Decoding a JPEG baseline (process 1) DICOM image
I1022 14:59:01.066216 HttpServer.cpp:1238] (http) GET /app/libs/slimbox2/loading.gif
I1022 14:59:01.213809 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/frames/119/preview
I1022 14:59:01.214064 FilesystemStorage.cpp:160] Reading attachment “d107f75e-00f1-42c7-a5ca-9b48b3cd0daf” of “DICOM” content type
I1022 14:59:01.216595 HttpServer.cpp:1238] (http) GET /instances/5d17d47e-182d1f1d-48fb7601-aa09c9f0-244fc041/frames/1/preview
I1022 14:59:01.216783 FilesystemStorage.cpp:160] Reading attachment “d107f75e-00f1-42c7-a5ca-9b48b3cd0daf” of “DICOM” content type
I1022 14:59:01.221922 ServerContext.cpp:1839] The installed image decoding plugins cannot handle an image, fallback to the built-in DCMTK decoder
I1022 14:59:01.221964 DicomImageDecoder.cpp:787] Decoding a JPEG baseline (process 1) DICOM image
I1022 14:59:01.225087 ServerContext.cpp:1839] The installed image decoding plugins cannot handle an image, fallback to the built-in DCMTK decoder
I1022 14:59:01.270224 HttpServer.cpp:1238] (http) GET /app/libs/slimbox2/closelabel.gif
I1022 14:59:01.296912 DicomImageDecoder.cpp:787] Decoding a JPEG baseline (process 1) DICOM image

Hi Nicolas,

For the first problematic image, there are actually 2 callbacks implemented by the GDCM plugin:

  • Decode → called by the /preview route
  • Transcode → called by the /modify route

It’s weird indeed that GDCM does not provide the same features in both cases. We don’t really want to adapt GDCM itself. So, we could eventually implement a fallback behaviour when the Decoding fails, we may try to Transcode the image in a temporary buffer and then extract the preview from this temporary image. I’ve added a TODO for this: https://hg.orthanc-server.com/orthanc/rev/1eca4378d761

For the second issue, I’ve not been able to reproduce the green image issue. In my understanding, the image is in JPEG Baseline and is always transcoded to JPEG Baseline which means there’s actually no transcoding no ?

Note that you’re right that GDCM is called while DCMTK should. I’ve fixed it in the GDCM plugin: https://hg.orthanc-server.com/orthanc-gdcm/rev/ca604fa6714a

Best regards,

Alain

Hi Alain

Many thanks for your answer and for the actions you already took!

Regarding the last test scenario with the 120-frame US image, sorry I did a typo on the transfer syntax, so I understand your point. Here are the correct steps to reproduce :

  • Download a copy of the DICOM file transcoded to 1.2.840.10008.1.2.1 (not .50) using the /modify API.

  • Upload the transcoded copy to Orthanc. This will duplicate the Orthanc instance.

  • Download a copy of this new DICOM file transcoded to 1.2.840.10008.1.2.4.50 (the original transfer syntax) using the /modify API.

  • Upload then preview this second transcoded copy to Orthanc. You’ll see that it doesn’t look like the original file.

That is probably a GDCM issue. I don’t have the same problem when GDCM is disabled.

Regarding the GDCM transcode/decode issue, it would be great to add an attribute to the /preview API so that a HTTP error is returned is Orthanc fails to decode the image, rather than redirecting to the unsupported.png file.

Thanks

Nicolas

Hi Nicolas,

Ok, I’ve tried with an Orthanc version including my previous patch and I can confirm that the last file is now previewed correctly. Since GDCM is not involved anymore, we may assume that this was a bug in GDCM.

I also agree with you with your proposal wrt the unsupported.png file and I’ve implemented it in this commit: https://hg.orthanc-server.com/orthanc/rev/ae643f664628. The API will now send a 415 error code if the preview can not be computed.

Best regards,

Alain.