diff OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp @ 5363:3c8286e5d07b multiple-jpeg-decoders

wip: try to add a jpeg decoder without colorspace conversion: not working now
author Alain Mazy <am@osimis.io>
date Tue, 11 Jul 2023 10:25:58 +0200
parents 138e9d0c08c1
children
line wrap: on
line diff
--- a/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp	Thu Jul 06 21:08:05 2023 +0200
+++ b/OrthancFramework/Sources/DicomParsing/FromDcmtkBridge.cpp	Tue Jul 11 10:25:58 2023 +0200
@@ -100,9 +100,12 @@
 
 #if ORTHANC_ENABLE_DCMTK_JPEG == 1
 #  include <dcmtk/dcmjpeg/djdecode.h>
+#  include <dcmtk/dcmjpeg/djcparam.h>
+#  include <dcmtk/dcmjpeg/djdecbas.h>
 #  if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
 #    include <dcmtk/dcmjpeg/djencode.h>
 #  endif
+
 #endif
 
 #if ORTHANC_ENABLE_DCMTK_JPEG_LOSSLESS == 1
@@ -125,6 +128,41 @@
 
 namespace Orthanc
 {
+#if ORTHANC_ENABLE_DCMTK_JPEG == 1
+/** representation parameter for JPEG compression without colorspace conversion.
+ */
+class DcmJpegNoConversionRepresentationParameter: public DcmRepresentationParameter
+{
+public:
+
+  DcmJpegNoConversionRepresentationParameter()
+  {}
+
+  DcmJpegNoConversionRepresentationParameter(const DcmJpegNoConversionRepresentationParameter& arg)
+  {}
+
+  virtual ~DcmJpegNoConversionRepresentationParameter()
+  {}
+  
+  virtual DcmRepresentationParameter *clone() const
+  {
+    return new DcmJpegNoConversionRepresentationParameter();
+  }
+
+  virtual const char *className() const
+  {
+    return "DcmJpegNoConversion";
+  }
+
+  virtual OFBool operator==(const DcmRepresentationParameter &arg) const
+  {
+    return arg.className() == className();
+  }
+
+};
+#endif
+
+
   static bool IsBinaryTag(const DcmTag& key)
   {
     return (key.isUnknownVR() ||
@@ -1653,7 +1691,8 @@
 
   bool FromDcmtkBridge::Transcode(DcmFileFormat& dicom,
                                   DicomTransferSyntax syntax,
-                                  const DcmRepresentationParameter* representation)
+                                  const DcmRepresentationParameter* representation,
+                                  bool enableColorMapConversion)
   {
     E_TransferSyntax xfer;
     if (!LookupDcmtkTransferSyntax(xfer, syntax))
@@ -1665,6 +1704,27 @@
       DicomTransferSyntax sourceSyntax;
       bool known = LookupOrthancTransferSyntax(sourceSyntax, dicom);
       
+      if (enableColorMapConversion && representation == NULL)
+      {
+        DcmJpegNoConversionRepresentationParameter param;
+        return Transcode(dicom, syntax, &param, enableColorMapConversion);
+      }
+
+    // DJCodecParameter* cp = new DJCodecParameter(
+    //   ECC_lossyYCbCr, // ignored, compression only
+    //   EDC_never,
+    //   EUC_default,
+    //   EPC_default,
+    //   OFFalse,
+    //   OFFalse,
+    //   OFFalse);
+
+    // // baseline JPEG
+    // DJDecoderBaseline* decbas = new DJDecoderBaseline();
+    // if (decbas) DcmCodecList::registerCodec(decbas, NULL, cp);
+
+
+
       if (!dicom.chooseRepresentation(xfer, representation).good() ||
           !dicom.canWriteXfer(xfer) ||
           !dicom.validateMetaInfo(xfer, EWM_updateMeta).good())
@@ -2468,6 +2528,25 @@
 #if ORTHANC_ENABLE_DCMTK_JPEG == 1
     CLOG(INFO, DICOM) << "Registering JPEG codecs in DCMTK";
     DJDecoderRegistration::registerCodecs();
+
+    // register a "no colorspace conversion" codec (this is a copy of part of DJDecoderRegistration::registerCodecs())
+    TODO: this does not work -> ask DCMTK forum
+    DJCodecParameter* cp = new DJCodecParameter(
+      ECC_lossyYCbCr, // ignored, compression only
+      EDC_never,
+      EUC_default,
+      EPC_default,
+      OFFalse,
+      OFFalse,
+      OFFalse);
+
+    // // baseline JPEG
+    DJDecoderBaseline* decbas = new DJDecoderBaseline();
+    if (decbas) 
+    {
+      DcmCodecList::registerCodec(decbas, new DcmJpegNoConversionRepresentationParameter(), cp);
+    }
+
 # if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
     DJEncoderRegistration::registerCodecs();
 # endif