Mercurial > hg > orthanc
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 |