Issue with using 1.2.840.10008.1.2.4.201 for IngestTranscoding

Greetings everyone,

We had tried using both the images orthancteam/orthanc:26.4.2-full and orthancteam/orthanc:26.4.2. In the config of our orthanc.json we had set the value to 1.2.840.10008.1.2.4.201. The scans got uploaded, but the change of transfer syntax to 1.2.840.10008.1.2.4.201 did not happen. We noticed the following in the logs

Since we had a lot of log lines, I am going to attach only 2 sections

Grepped the logs with gdcm keyword in the startup section and this is the logs output

Gdcm is enabled
Applying defaults for Gdcm plugin
Installing .so file for Gdcm plugin
Linked /usr/share/orthanc/plugins-available/libOrthancGdcm.so → /usr/share/orthanc/plugins/libOrthancGdcm.so
“Gdcm”: {
I0507 13:23:01.237935 MAIN PluginsManager.cpp:329] (plugins) Found a shared library: “/usr/share/orthanc/plugins/libOrthancGdcm.so”
W0507 13:23:01.245910 MAIN PluginsManager.cpp:287] Registering plugin ‘gdcm’ (version 1.8)
I0507 13:23:01.245939 MAIN PluginsManager.cpp:163] (plugins) Initializing the decoder/transcoder of medical images using GDCM
T0507 13:23:01.245954 MAIN OrthancPlugins.cpp:6653] (plugins) Calling service 7 from plugin “/usr/share/orthanc/plugins/libOrthancGdcm.so”
T0507 13:23:01.245966 MAIN OrthancPlugins.cpp:6653] (plugins) Calling service 13 from plugin “/usr/share/orthanc/plugins/libOrthancGdcm.so”
T0507 13:23:01.246120 MAIN OrthancPlugins.cpp:6653] (plugins) Calling service 13 from plugin “/usr/share/orthanc/plugins/libOrthancGdcm.so”
W0507 13:23:01.246274 MAIN PluginsManager.cpp:159] Gdcm.RestrictTransferSyntaxes configuration is set and not empty, Orthanc will use GDCM to transcode SOME transfer syntaxes:
W0507 13:23:01.246285 MAIN PluginsManager.cpp:159] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.90
W0507 13:23:01.246292 MAIN PluginsManager.cpp:159] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.91
W0507 13:23:01.246298 MAIN PluginsManager.cpp:159] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.92
W0507 13:23:01.246314 MAIN PluginsManager.cpp:159] Orthanc will use GDCM to decode transfer syntax: 1.2.840.10008.1.2.4.93
W0507 13:23:01.246321 MAIN PluginsManager.cpp:159] Throttling GDCM to 4 concurrent thread(s)
W0507 13:23:01.246334 MAIN PluginsManager.cpp:159] Version of GDCM: 3.0.24
T0507 13:23:01.246343 MAIN OrthancPlugins.cpp:6653] (plugins) Calling service 1006 from plugin “/usr/share/orthanc/plugins/libOrthancGdcm.so”
T0507 13:23:01.246357 MAIN OrthancPlugins.cpp:6653] (plugins) Calling service 1015 from plugin “/usr/share/orthanc/plugins/libOrthancGdcm.so”
I0507 13:23:01.329674 MAIN OrthancPlugins.cpp:3587] (plugins) Plugin making REST GET call on URI /plugins/gdcm (built-in API)

This is a portion of the logs where the transcoding by gdcm failed

I0507 13:36:08.718369 HTTP-0 OrthancRestApi.cpp:166] (http) Receiving a DICOM file of 144.18KB through HTTP
I0507 13:36:08.719350 HTTP-0 PluginsManager.cpp:163] (plugins) Cannot transcode image using GDCM: Not implemented yet
I0507 13:36:08.719371 HTTP-0 ServerContext.cpp:2161] The installed transcoding plugins cannot handle an image, fallback to the built-in DCMTK transcoder
I0507 13:36:08.719624 HTTP-0 DcmtkTranscoder.cpp:372] DCMTK transcoding from 1.2.840.10008.1.2.4.90 to one of: 1.2.840.10008.1.2.4.201
W0507 13:36:08.719640 HTTP-0 DcmtkTranscoder.cpp:419] DCMTK was unable to transcode from 1.2.840.10008.1.2.4.90 to one of: 1.2.840.10008.1.2.4.201

In the orthanc release notes

Version 1.12.11 (2026-04-14)

I see the following in the General section

Basic support for High Throughput JPEG 2000 transfer syntaxes. Orthanc will not be able to
compress/decompress or preview these images without a plugin.

So tried using the above mentioned docker images to check if we can use 1.2.840.10008.1.2.4.201 for IngestTranscoding, but then we have got the above logs lines.

This the config orthanc.json used


{
“Name”: “Orthanc inside Docker”,
“PostgreSQL” : {
“EnableIndex” : true,
“EnableStorage” : false,
“Host” : “xyz”,
“Port” : xyz,
“Database” : “xyz”,
“Username” : “xyz”,
“Password” : “xyz”,
“IndexConnectionsCount” : 20,
“Lock”: false,
“EnableSsl” : false
},
“StorageDirectory”: “/etc/orthanc/OrthancStorage”,
“StorageCompression”: false,
“MaximumStorageSize”: 0,
“MaximumPatientCount”: 0,
“LuaScripts”: 
,
“Plugins”: [“/usr/share/orthanc/plugins”, “/usr/local/share/orthanc/plugins”],
“BuiltinDecoderTranscoderOrder”: “After”,
“Gdcm” : {
“Enable”: true,
“Throttling”: 4
},
“ConcurrentJobs”: 2,
“HttpServerEnabled”: true,
“HttpPort”: 8043,
“HttpDescribeErrors”: true,
“HttpCompressionEnabled”: true,
“DicomServerEnabled”: true,
“DicomAet”: “AIKENIST”,
“DicomCheckCalledAet”: false,
“DicomPort”: 4243,
“DefaultEncoding”: “Latin1”,
“DeflatedTransferSyntaxAccepted”: true,
“JpegTransferSyntaxAccepted”: true,
“Jpeg2000TransferSyntaxAccepted”: true,
“JpegLosslessTransferSyntaxAccepted”: true,
“JpipTransferSyntaxAccepted”: true,
“Mpeg2TransferSyntaxAccepted”: true,
“RleTransferSyntaxAccepted”: true,
“UnknownSopClassAccepted”: false,
“DicomScpTimeout”: 30,

“RemoteAccessAllowed”: true,
“SslEnabled”: false,
“SslCertificate”: “certificate.pem”,
“AuthenticationEnabled”: false,
“RegisteredUsers”: {
“test”: “test”
},
“DicomModalities”: {
},
“DicomModalitiesInDatabase”: true,
“DatabaseServerIdentifier” : “Orthanc_quickrad”,
“DicomAlwaysAllowEcho”: true,
“DicomAlwaysAllowStore”: true,
“DicomCheckModalityHost”: false,
“DicomScuTimeout”: 30,
“OrthancPeers”: {},
“OrthancPeersInDatabase”: false,
“HttpProxy”: “”,

“HttpVerbose”: true,

“HttpTimeout”: 60,
“HttpsVerifyPeers”: true,
“HttpsCACertificates”: “”,
“UserMetadata”: {},
“UserContentType”: {},
“StableAge”: 60,
“StrictAetComparison”: false,
“StoreMD5ForAttachments”: true,
“LimitFindResults”: 0,
“LimitFindInstances”: 0,
“LimitJobs”: 10,
“LogExportedResources”: false,
“KeepAlive”: true,
“TcpNoDelay”: true,
“HttpThreadsCount”: 50,
“StoreDicom”: true,
“DicomAssociationCloseDelay”: 5,
“QueryRetrieveSize”: 10,
“CaseSensitivePN”: false,
“LoadPrivateDictionary”: true,
“Dictionary”: {},
“SynchronousCMove”: true,
“JobsHistorySize”: 10,
“SaveJobs”: true,
“OverwriteInstances”: true,
“MediaArchiveSize”: 1,
“StorageAccessOnFind”: “Always”,
“MetricsEnabled”: true,
“IngestTranscoding”: “1.2.840.10008.1.2.4.201”,

“DicomWeb”: {
“Enable”: true,
“Root”: “/dicom-web/”,
“EnableWado”: true,
“WadoRoot”: “/wado”,
“Host”: “xyz”,
“Ssl”: true,
“StowMaxInstances”: 10,
“StowMaxSize”: 10,
“QidoCaseSensitive”: false,
“StudiesMetadata” : “MainDicomTags”,
“SeriesMetadata” : “Full”
},
}

Kindly let us know what could we do to use 1.2.840.10008.1.2.4.201 for IngestTranscoding

Hi,

1.2.840.10008.1.2.4.201 aka HTJ2K is currently not supported by GDCM or by any other plugins.

If you are willing to fund the development of such a plugin, feel free to get in touch with https://orthanc.team/

Best regards,

Alain.

Hi @alainmazy ,

Thanks for the reply. If we can build a custom docker image ourselves, could you recommend any docs/resources to be followed.

Hello,

Docker is not relevant here. You’ll have to create a C++ plugin similar to orthanc-gdcm.

My best bet would be to create an Orthanc plugin wrapping either Grok or OpenJPH, the same way as GDCM got wrapped. OpenJPEG is another candidate library, but it only supports the decoding of HTJ2K (no transcoding to HTJ2K as you seem to wish in your original post).

As far as I’m concerned, I could develop such a plugin if it were needed for a scientific research project I could contribute to.

Regards,
Sébastien-