diff Core/DicomParsing/DcmtkTranscoder.cpp @ 3894:8f7ad4989fec transcoding

transcoding to uncompressed transfer syntaxes over DICOM protocol is implemented
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 07 May 2020 11:13:29 +0200
parents 7a5fa8f307e9
children 7459fcb1bdf7
line wrap: on
line diff
--- a/Core/DicomParsing/DcmtkTranscoder.cpp	Wed May 06 12:48:28 2020 +0200
+++ b/Core/DicomParsing/DcmtkTranscoder.cpp	Thu May 07 11:13:29 2020 +0200
@@ -129,7 +129,8 @@
   }
 
     
-  DcmFileFormat* DcmtkTranscoder::TranscodeToParsed(const void* buffer,
+  DcmFileFormat* DcmtkTranscoder::TranscodeToParsed(bool& hasSopInstanceUidChanged /* out */,
+                                                    const void* buffer,
                                                     size_t size,
                                                     const std::set<DicomTransferSyntax>& allowedSyntaxes,
                                                     bool allowNewSopInstanceUid) 
@@ -141,7 +142,7 @@
       throw OrthancException(ErrorCode_InternalError);
     }
 
-    if (InplaceTranscode(*dicom, allowedSyntaxes, allowNewSopInstanceUid))
+    if (InplaceTranscode(hasSopInstanceUidChanged, *dicom, allowedSyntaxes, allowNewSopInstanceUid))
     {
       return dicom.release();
     }
@@ -152,7 +153,8 @@
   }
 
 
-  bool DcmtkTranscoder::InplaceTranscode(DcmFileFormat& dicom,
+  bool DcmtkTranscoder::InplaceTranscode(bool& hasSopInstanceUidChanged /* out */,
+                                         DcmFileFormat& dicom,
                                          const std::set<DicomTransferSyntax>& allowedSyntaxes,
                                          bool allowNewSopInstanceUid) 
   {
@@ -161,6 +163,8 @@
       throw OrthancException(ErrorCode_InternalError);
     }
 
+    hasSopInstanceUidChanged = false;
+
     DicomTransferSyntax syntax;
     if (!FromDcmtkBridge::LookupOrthancTransferSyntax(syntax, dicom))
     {
@@ -170,7 +174,7 @@
 
     const uint16_t bitsStored = GetBitsStored(*dicom.getDataset());
     std::string sourceSopInstanceUid = GetSopInstanceUid(*dicom.getDataset());
-
+    
     if (allowedSyntaxes.find(syntax) != allowedSyntaxes.end())
     {
       // No transcoding is needed
@@ -216,6 +220,7 @@
       if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, &parameters))
       {
         CheckSopInstanceUid(dicom, sourceSopInstanceUid, false);
+        hasSopInstanceUidChanged = true;
         return true;
       }
     }
@@ -231,6 +236,7 @@
       if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, &parameters))
       {
         CheckSopInstanceUid(dicom, sourceSopInstanceUid, false);
+        hasSopInstanceUidChanged = true;
         return true;
       }
     }
@@ -284,6 +290,7 @@
       if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossy, &parameters))
       {
         CheckSopInstanceUid(dicom, sourceSopInstanceUid, false);
+        hasSopInstanceUidChanged = true;
         return true;
       }
     }
@@ -294,13 +301,14 @@
 
     
   bool DcmtkTranscoder::TranscodeToBuffer(std::string& target,
+                                          bool& hasSopInstanceUidChanged /* out */,
                                           const void* buffer,
                                           size_t size,
                                           const std::set<DicomTransferSyntax>& allowedSyntaxes,
                                           bool allowNewSopInstanceUid) 
   {
     std::unique_ptr<DcmFileFormat> transcoded(
-      TranscodeToParsed(buffer, size, allowedSyntaxes, allowNewSopInstanceUid));
+      TranscodeToParsed(hasSopInstanceUidChanged, buffer, size, allowedSyntaxes, allowNewSopInstanceUid));
 
     if (transcoded.get() == NULL)
     {