comparison 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
comparison
equal deleted inserted replaced
3905:061f3d031b5d 3906:f0dd5ded8927
79 return true; 79 return true;
80 } 80 }
81 } 81 }
82 #endif 82 #endif
83 83
84 return Transcode(target, hasSopInstanceUidChanged, buffer, size, 84 DicomTransferSyntax sourceSyntax, targetSyntax;
85 return Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, buffer, size,
85 allowedSyntaxes, allowNewSopInstanceUid); 86 allowedSyntaxes, allowNewSopInstanceUid);
86 } 87 }
87 88
88 89
89 DcmFileFormat* MemoryBufferTranscoder::TranscodeToParsed(bool& hasSopInstanceUidChanged, 90 DcmFileFormat* MemoryBufferTranscoder::TranscodeToParsed(bool& hasSopInstanceUidChanged,
104 } 105 }
105 } 106 }
106 #endif 107 #endif
107 108
108 std::string transcoded; 109 std::string transcoded;
109 if (Transcode(transcoded, hasSopInstanceUidChanged, buffer, size, allowedSyntaxes, allowNewSopInstanceUid)) 110 DicomTransferSyntax sourceSyntax, targetSyntax;
111 if (Transcode(transcoded, sourceSyntax, targetSyntax, hasSopInstanceUidChanged,
112 buffer, size, allowedSyntaxes, allowNewSopInstanceUid))
110 { 113 {
111 return FromDcmtkBridge::LoadFromMemoryBuffer( 114 return FromDcmtkBridge::LoadFromMemoryBuffer(
112 transcoded.empty() ? NULL : transcoded.c_str(), transcoded.size()); 115 transcoded.empty() ? NULL : transcoded.c_str(), transcoded.size());
113 } 116 }
114 else 117 else
174 { 177 {
175 // "HasInplaceTranscode()" should have been called 178 // "HasInplaceTranscode()" should have been called
176 throw OrthancException(ErrorCode_BadSequenceOfCalls); 179 throw OrthancException(ErrorCode_BadSequenceOfCalls);
177 } 180 }
178 } 181 }
182
183
184
185
186 bool MemoryBufferTranscoder::TranscodeParsedToBuffer(
187 std::string& target /* out */,
188 DicomTransferSyntax& sourceSyntax /* out */,
189 DicomTransferSyntax& targetSyntax /* out */,
190 bool& hasSopInstanceUidChanged /* out */,
191 DcmFileFormat& dicom /* in, possibly modified */,
192 const std::set<DicomTransferSyntax>& allowedSyntaxes,
193 bool allowNewSopInstanceUid)
194 {
195 if (dicom.getDataset() == NULL)
196 {
197 throw OrthancException(ErrorCode_InternalError);
198 }
199
200 std::string source;
201 FromDcmtkBridge::SaveToMemoryBuffer(source, *dicom.getDataset());
202
203 const void* data = source.empty() ? NULL : source.c_str();
204
205 bool success = Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged,
206 data, source.size(), allowedSyntaxes, allowNewSopInstanceUid);
207
208 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
209 if (useDcmtk_ &&
210 dcmtk_.TranscodeParsedToBuffer(
211 target, sourceSyntax, targetSyntax,hasSopInstanceUidChanged,
212 dicom, allowedSyntaxes, allowNewSopInstanceUid))
213 {
214 success = true;
215 }
216 #endif
217
218 return success;
219 }
220
221
222 IDicomTranscoder::TranscodedDicom* MemoryBufferTranscoder::TranscodeToParsed2(
223 DcmFileFormat& dicom /* in, possibly modified */,
224 const void* buffer /* in, same DICOM file as "dicom" */,
225 size_t size,
226 const std::set<DicomTransferSyntax>& allowedSyntaxes,
227 bool allowNewSopInstanceUid)
228 {
229 DicomTransferSyntax sourceSyntax, targetSyntax;
230 bool hasSopInstanceUidChanged;
231
232 std::string target;
233 if (Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged,
234 buffer, size, allowedSyntaxes, allowNewSopInstanceUid))
235 {
236 const void* data = target.empty() ? NULL : target.c_str();
237 return IDicomTranscoder::TranscodedDicom::CreateFromInternal(
238 FromDcmtkBridge::LoadFromMemoryBuffer(data, target.size()), hasSopInstanceUidChanged);
239 }
240 #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1
241 else if (useDcmtk_)
242 {
243 return dcmtk_.TranscodeToParsed2(dicom, buffer, size, allowedSyntaxes, allowNewSopInstanceUid);
244 }
245 #endif
246 else
247 {
248 return NULL;
249 }
250 }
179 } 251 }