diff Core/DicomParsing/DcmtkTranscoder.cpp @ 3938:54dbebbcc032 transcoding

fix
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 18 May 2020 15:59:50 +0200
parents 7dc5e7e0045d
children c205f670098e
line wrap: on
line diff
--- a/Core/DicomParsing/DcmtkTranscoder.cpp	Mon May 18 11:16:18 2020 +0200
+++ b/Core/DicomParsing/DcmtkTranscoder.cpp	Mon May 18 15:59:50 2020 +0200
@@ -55,18 +55,10 @@
 
 namespace Orthanc
 {
-  static uint16_t GetBitsStored(DcmDataset& dataset)
+  static bool GetBitsStored(uint16_t& bitsStored,
+                            DcmDataset& dataset)
   {
-    uint16_t bitsStored;
-    if (dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good())
-    {
-      return bitsStored;
-    }
-    else
-    {
-      throw OrthancException(ErrorCode_BadFileFormat,
-                             "Missing \"Bits Stored\" tag in DICOM instance");
-    }      
+    return dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good();
   }
 
   
@@ -94,18 +86,26 @@
     {
       throw OrthancException(ErrorCode_InternalError);
     }
-      
+
     bool ok;
       
-    if (mustEqual)
+    if (dicom.getDataset()->tagExists(DCM_PixelData))
     {
-      ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid);
+      if (mustEqual)
+      {
+        ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid);
+      }
+      else
+      {
+        ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid);
+      }
     }
     else
     {
-      ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid);
+      // No pixel data: Transcoding must not change the SOP instance UID
+      ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid);
     }
-
+    
     if (!ok)
     {
       throw OrthancException(ErrorCode_InternalError,
@@ -148,7 +148,9 @@
                              "Cannot determine the transfer syntax");
     }
 
-    const uint16_t bitsStored = GetBitsStored(*dicom.getDataset());
+    uint16_t bitsStored;
+    bool hasBitsStored = GetBitsStored(bitsStored, *dicom.getDataset());
+    
     std::string sourceSopInstanceUid = GetSopInstanceUid(*dicom.getDataset());
     
     if (allowedSyntaxes.find(syntax) != allowedSyntaxes.end())
@@ -188,7 +190,7 @@
 #if ORTHANC_ENABLE_DCMTK_JPEG == 1
     if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess1) != allowedSyntaxes.end() &&
         allowNewSopInstanceUid &&
-        bitsStored == 8)
+        (!hasBitsStored || bitsStored == 8))
     {
       // Check out "dcmjpeg/apps/dcmcjpeg.cc"
       DJ_RPLossy parameters(lossyQuality_);
@@ -205,7 +207,7 @@
 #if ORTHANC_ENABLE_DCMTK_JPEG == 1
     if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess2_4) != allowedSyntaxes.end() &&
         allowNewSopInstanceUid &&
-        bitsStored <= 12)
+        (!hasBitsStored || bitsStored <= 12))
     {
       // Check out "dcmjpeg/apps/dcmcjpeg.cc"
       DJ_RPLossy parameters(lossyQuality_);