diff Core/DicomParsing/MemoryBufferTranscoder.cpp @ 3906:f0dd5ded8927 transcoding

refactoring using IDicomTranscoder::TranscodedDicom
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 08 May 2020 11:16:16 +0200
parents 061f3d031b5d
children 1555feda39e2
line wrap: on
line diff
--- a/Core/DicomParsing/MemoryBufferTranscoder.cpp	Fri May 08 08:27:18 2020 +0200
+++ b/Core/DicomParsing/MemoryBufferTranscoder.cpp	Fri May 08 11:16:16 2020 +0200
@@ -81,7 +81,8 @@
     }
 #endif
 
-    return Transcode(target, hasSopInstanceUidChanged, buffer, size,
+    DicomTransferSyntax sourceSyntax, targetSyntax;
+    return Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, buffer, size,
                      allowedSyntaxes, allowNewSopInstanceUid);
   }
 
@@ -106,7 +107,9 @@
 #endif
 
     std::string transcoded;
-    if (Transcode(transcoded, hasSopInstanceUidChanged, buffer, size, allowedSyntaxes, allowNewSopInstanceUid))
+    DicomTransferSyntax sourceSyntax, targetSyntax;
+    if (Transcode(transcoded, sourceSyntax, targetSyntax, hasSopInstanceUidChanged,
+                  buffer, size, allowedSyntaxes, allowNewSopInstanceUid))
     {
       return FromDcmtkBridge::LoadFromMemoryBuffer(
         transcoded.empty() ? NULL : transcoded.c_str(), transcoded.size());
@@ -176,4 +179,73 @@
       throw OrthancException(ErrorCode_BadSequenceOfCalls);
     }
   }
+
+
+
+  
+  bool MemoryBufferTranscoder::TranscodeParsedToBuffer(
+    std::string& target /* out */,
+    DicomTransferSyntax& sourceSyntax /* out */,
+    DicomTransferSyntax& targetSyntax /* out */,
+    bool& hasSopInstanceUidChanged /* out */,
+    DcmFileFormat& dicom /* in, possibly modified */,
+    const std::set<DicomTransferSyntax>& allowedSyntaxes,
+    bool allowNewSopInstanceUid)
+  {
+    if (dicom.getDataset() == NULL)
+    {
+      throw OrthancException(ErrorCode_InternalError);
+    }
+
+    std::string source;
+    FromDcmtkBridge::SaveToMemoryBuffer(source, *dicom.getDataset());
+
+    const void* data = source.empty() ? NULL : source.c_str();
+
+    bool success = Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged,
+                             data, source.size(), allowedSyntaxes, allowNewSopInstanceUid);
+
+#if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
+    if (useDcmtk_ &&
+        dcmtk_.TranscodeParsedToBuffer(
+          target, sourceSyntax, targetSyntax,hasSopInstanceUidChanged,
+          dicom, allowedSyntaxes, allowNewSopInstanceUid))
+    {
+      success = true;
+    }
+#endif
+
+    return success;
+  }
+  
+
+  IDicomTranscoder::TranscodedDicom* MemoryBufferTranscoder::TranscodeToParsed2(
+    DcmFileFormat& dicom /* in, possibly modified */,
+    const void* buffer /* in, same DICOM file as "dicom" */,
+    size_t size,
+    const std::set<DicomTransferSyntax>& allowedSyntaxes,
+    bool allowNewSopInstanceUid)
+  {
+    DicomTransferSyntax sourceSyntax, targetSyntax;
+    bool hasSopInstanceUidChanged;
+    
+    std::string target;
+    if (Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged,
+                  buffer, size, allowedSyntaxes, allowNewSopInstanceUid))
+    {
+      const void* data = target.empty() ? NULL : target.c_str();
+      return IDicomTranscoder::TranscodedDicom::CreateFromInternal(
+        FromDcmtkBridge::LoadFromMemoryBuffer(data, target.size()), hasSopInstanceUidChanged);
+    }
+#if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
+    else if (useDcmtk_)
+    {
+      return dcmtk_.TranscodeToParsed2(dicom, buffer, size, allowedSyntaxes, allowNewSopInstanceUid);
+    }
+#endif
+    else
+    {
+      return NULL;
+    }
+  }
 }