diff Core/DicomParsing/DcmtkTranscoder.cpp @ 3944:aae045f802f4 transcoding

preparing simplified interface for IDicomTranscoder
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 19 May 2020 10:17:06 +0200
parents c205f670098e
children 0b3256c3ee14
line wrap: on
line diff
--- a/Core/DicomParsing/DcmtkTranscoder.cpp	Mon May 18 21:37:31 2020 +0200
+++ b/Core/DicomParsing/DcmtkTranscoder.cpp	Tue May 19 10:17:06 2020 +0200
@@ -398,4 +398,51 @@
       return NULL;
     }
   }
+
+
+  bool DcmtkTranscoder::Transcode(DicomImage& target,
+                                  bool& hasSopInstanceUidChanged /* out */,
+                                  DicomImage& source /* in, "GetParsed()" possibly modified */,
+                                  const std::set<DicomTransferSyntax>& allowedSyntaxes,
+                                  bool allowNewSopInstanceUid)
+  {
+    target.Clear();
+    
+    DicomTransferSyntax sourceSyntax;
+    if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, source.GetParsed()))
+    {
+      LOG(ERROR) << "Unsupport transfer syntax for transcoding";
+      return false;
+    }
+
+    if (allowedSyntaxes.find(sourceSyntax) != allowedSyntaxes.end())
+    {
+      // No transcoding is needed
+      target.AcquireParsed(source);
+      target.AcquireBuffer(source);
+      return true;
+    }
+    else if (InplaceTranscode(hasSopInstanceUidChanged, source.GetParsed(),
+                              allowedSyntaxes, allowNewSopInstanceUid))
+    {
+      // Sanity check
+      DicomTransferSyntax targetSyntax;
+      if (FromDcmtkBridge::LookupOrthancTransferSyntax(targetSyntax, source.GetParsed()) &&
+          allowedSyntaxes.find(targetSyntax) != allowedSyntaxes.end())
+      {
+        target.AcquireParsed(source);
+        source.Clear();
+        return true;
+      }
+      else
+      {
+        throw OrthancException(ErrorCode_InternalError);
+      }  
+    }
+    else
+    {
+      // Cannot transcode
+      return false;
+    }
+  }
 }