comparison Core/DicomParsing/MemoryBufferTranscoder.cpp @ 3929:7dc5e7e0045d transcoding

simplifying MemoryBufferTranscoder::Transcode() interface
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 14 May 2020 14:40:13 +0200
parents 1f71c2f20e16
children b99acc213937
comparison
equal deleted inserted replaced
3928:4cdc875510d1 3929:7dc5e7e0045d
35 #include "MemoryBufferTranscoder.h" 35 #include "MemoryBufferTranscoder.h"
36 36
37 #include "../OrthancException.h" 37 #include "../OrthancException.h"
38 #include "FromDcmtkBridge.h" 38 #include "FromDcmtkBridge.h"
39 39
40 #if !defined(NDEBUG) // For debugging
41 # include "ParsedDicomFile.h"
42 #endif
43
40 namespace Orthanc 44 namespace Orthanc
41 { 45 {
42 MemoryBufferTranscoder::MemoryBufferTranscoder() 46 MemoryBufferTranscoder::MemoryBufferTranscoder()
43 { 47 {
44 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 48 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
61 65
62 useDcmtk_ = used; 66 useDcmtk_ = used;
63 } 67 }
64 68
65 69
70 static void CheckTargetSyntax(const std::string& transcoded,
71 const std::set<DicomTransferSyntax>& allowedSyntaxes)
72 {
73 #if !defined(NDEBUG)
74 // Debug mode
75 ParsedDicomFile parsed(transcoded);
76
77 std::string s;
78 DicomTransferSyntax a, b;
79 if (!parsed.LookupTransferSyntax(s) ||
80 !FromDcmtkBridge::LookupOrthancTransferSyntax(a, parsed.GetDcmtkObject()) ||
81 !LookupTransferSyntax(b, s) ||
82 a != b ||
83 allowedSyntaxes.find(a) == allowedSyntaxes.end())
84 {
85 throw OrthancException(
86 ErrorCode_Plugin,
87 "DEBUG - The transcoding plugin has not written to one of the allowed transfer syntaxes");
88 }
89 #endif
90 }
91
92
66 bool MemoryBufferTranscoder::TranscodeParsedToBuffer( 93 bool MemoryBufferTranscoder::TranscodeParsedToBuffer(
67 std::string& target /* out */, 94 std::string& target /* out */,
68 DicomTransferSyntax& sourceSyntax /* out */,
69 bool& hasSopInstanceUidChanged /* out */, 95 bool& hasSopInstanceUidChanged /* out */,
70 DcmFileFormat& dicom /* in, possibly modified */, 96 DcmFileFormat& dicom /* in, possibly modified */,
71 DicomTransferSyntax targetSyntax, 97 DicomTransferSyntax targetSyntax,
72 bool allowNewSopInstanceUid) 98 bool allowNewSopInstanceUid)
73 { 99 {
79 std::string source; 105 std::string source;
80 FromDcmtkBridge::SaveToMemoryBuffer(source, *dicom.getDataset()); 106 FromDcmtkBridge::SaveToMemoryBuffer(source, *dicom.getDataset());
81 107
82 const void* data = source.empty() ? NULL : source.c_str(); 108 const void* data = source.empty() ? NULL : source.c_str();
83 109
84 std::set<DicomTransferSyntax> tmp; 110 std::set<DicomTransferSyntax> allowedSyntaxes;
85 tmp.insert(targetSyntax); 111 allowedSyntaxes.insert(targetSyntax);
86 112
87 DicomTransferSyntax targetSyntax2; 113 bool success = Transcode(target, hasSopInstanceUidChanged,
88 bool success = Transcode(target, sourceSyntax, targetSyntax2, hasSopInstanceUidChanged, 114 data, source.size(), allowedSyntaxes, allowNewSopInstanceUid);
89 data, source.size(), tmp, allowNewSopInstanceUid);
90 115
91 if (success &&
92 targetSyntax != targetSyntax2)
93 {
94 throw OrthancException(ErrorCode_InternalError);
95 }
96
97 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 116 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
98 if (!success && 117 if (!success &&
99 useDcmtk_ && 118 useDcmtk_ &&
100 dcmtk_.TranscodeParsedToBuffer( 119 dcmtk_.TranscodeParsedToBuffer(
101 target, sourceSyntax, hasSopInstanceUidChanged, 120 target, hasSopInstanceUidChanged, dicom, targetSyntax, allowNewSopInstanceUid))
102 dicom, targetSyntax, allowNewSopInstanceUid))
103 { 121 {
104 success = true; 122 success = true;
105 } 123 }
106 #endif 124 #endif
107 125
126 CheckTargetSyntax(target, allowedSyntaxes);
108 return success; 127 return success;
109 } 128 }
110 129
111 130
112 IDicomTranscoder::TranscodedDicom* MemoryBufferTranscoder::TranscodeToParsed( 131 IDicomTranscoder::TranscodedDicom* MemoryBufferTranscoder::TranscodeToParsed(
114 const void* buffer /* in, same DICOM file as "dicom" */, 133 const void* buffer /* in, same DICOM file as "dicom" */,
115 size_t size, 134 size_t size,
116 const std::set<DicomTransferSyntax>& allowedSyntaxes, 135 const std::set<DicomTransferSyntax>& allowedSyntaxes,
117 bool allowNewSopInstanceUid) 136 bool allowNewSopInstanceUid)
118 { 137 {
119 DicomTransferSyntax sourceSyntax, targetSyntax;
120 bool hasSopInstanceUidChanged; 138 bool hasSopInstanceUidChanged;
121 139
122 std::string target; 140 std::string target;
123 if (Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, 141 if (Transcode(target, hasSopInstanceUidChanged,
124 buffer, size, allowedSyntaxes, allowNewSopInstanceUid)) 142 buffer, size, allowedSyntaxes, allowNewSopInstanceUid))
125 { 143 {
144 CheckTargetSyntax(target, allowedSyntaxes);
145
126 const void* data = target.empty() ? NULL : target.c_str(); 146 const void* data = target.empty() ? NULL : target.c_str();
127 return IDicomTranscoder::TranscodedDicom::CreateFromInternal( 147 return IDicomTranscoder::TranscodedDicom::CreateFromInternal(
128 FromDcmtkBridge::LoadFromMemoryBuffer(data, target.size()), hasSopInstanceUidChanged); 148 FromDcmtkBridge::LoadFromMemoryBuffer(data, target.size()), hasSopInstanceUidChanged);
129 } 149 }
130 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 150 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1