comparison OrthancFramework/Sources/DicomParsing/DcmtkTranscoder.cpp @ 5363:3c8286e5d07b multiple-jpeg-decoders

wip: try to add a jpeg decoder without colorspace conversion: not working now
author Alain Mazy <am@osimis.io>
date Tue, 11 Jul 2023 10:25:58 +0200
parents 0ea402b4d901
children
comparison
equal deleted inserted replaced
5360:165b67c02927 5363:3c8286e5d07b
85 85
86 86
87 bool DcmtkTranscoder::InplaceTranscode(DicomTransferSyntax& selectedSyntax /* out */, 87 bool DcmtkTranscoder::InplaceTranscode(DicomTransferSyntax& selectedSyntax /* out */,
88 DcmFileFormat& dicom, 88 DcmFileFormat& dicom,
89 const std::set<DicomTransferSyntax>& allowedSyntaxes, 89 const std::set<DicomTransferSyntax>& allowedSyntaxes,
90 bool allowNewSopInstanceUid) 90 bool allowNewSopInstanceUid,
91 bool enableColorMapConversion)
91 { 92 {
92 if (dicom.getDataset() == NULL) 93 if (dicom.getDataset() == NULL)
93 { 94 {
94 throw OrthancException(ErrorCode_InternalError); 95 throw OrthancException(ErrorCode_InternalError);
95 } 96 }
109 // No transcoding is needed 110 // No transcoding is needed
110 return true; 111 return true;
111 } 112 }
112 113
113 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianImplicit) != allowedSyntaxes.end() && 114 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianImplicit) != allowedSyntaxes.end() &&
114 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianImplicit, NULL)) 115 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianImplicit, NULL, enableColorMapConversion))
115 { 116 {
116 selectedSyntax = DicomTransferSyntax_LittleEndianImplicit; 117 selectedSyntax = DicomTransferSyntax_LittleEndianImplicit;
117 return true; 118 return true;
118 } 119 }
119 120
120 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianExplicit) != allowedSyntaxes.end() && 121 if (allowedSyntaxes.find(DicomTransferSyntax_LittleEndianExplicit) != allowedSyntaxes.end() &&
121 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianExplicit, NULL)) 122 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_LittleEndianExplicit, NULL, enableColorMapConversion))
122 { 123 {
123 selectedSyntax = DicomTransferSyntax_LittleEndianExplicit; 124 selectedSyntax = DicomTransferSyntax_LittleEndianExplicit;
124 return true; 125 return true;
125 } 126 }
126 127
127 if (allowedSyntaxes.find(DicomTransferSyntax_BigEndianExplicit) != allowedSyntaxes.end() && 128 if (allowedSyntaxes.find(DicomTransferSyntax_BigEndianExplicit) != allowedSyntaxes.end() &&
128 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_BigEndianExplicit, NULL)) 129 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_BigEndianExplicit, NULL, enableColorMapConversion))
129 { 130 {
130 selectedSyntax = DicomTransferSyntax_BigEndianExplicit; 131 selectedSyntax = DicomTransferSyntax_BigEndianExplicit;
131 return true; 132 return true;
132 } 133 }
133 134
134 if (allowedSyntaxes.find(DicomTransferSyntax_DeflatedLittleEndianExplicit) != allowedSyntaxes.end() && 135 if (allowedSyntaxes.find(DicomTransferSyntax_DeflatedLittleEndianExplicit) != allowedSyntaxes.end() &&
135 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_DeflatedLittleEndianExplicit, NULL)) 136 FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_DeflatedLittleEndianExplicit, NULL, enableColorMapConversion))
136 { 137 {
137 selectedSyntax = DicomTransferSyntax_DeflatedLittleEndianExplicit; 138 selectedSyntax = DicomTransferSyntax_DeflatedLittleEndianExplicit;
138 return true; 139 return true;
139 } 140 }
140 141
144 (!hasBitsStored || bitsStored == 8)) 145 (!hasBitsStored || bitsStored == 8))
145 { 146 {
146 // Check out "dcmjpeg/apps/dcmcjpeg.cc" 147 // Check out "dcmjpeg/apps/dcmcjpeg.cc"
147 DJ_RPLossy parameters(lossyQuality_); 148 DJ_RPLossy parameters(lossyQuality_);
148 149
149 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, &parameters)) 150 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, &parameters, enableColorMapConversion))
150 { 151 {
151 selectedSyntax = DicomTransferSyntax_JPEGProcess1; 152 selectedSyntax = DicomTransferSyntax_JPEGProcess1;
152 return true; 153 return true;
153 } 154 }
154 } 155 }
159 allowNewSopInstanceUid && 160 allowNewSopInstanceUid &&
160 (!hasBitsStored || bitsStored <= 12)) 161 (!hasBitsStored || bitsStored <= 12))
161 { 162 {
162 // Check out "dcmjpeg/apps/dcmcjpeg.cc" 163 // Check out "dcmjpeg/apps/dcmcjpeg.cc"
163 DJ_RPLossy parameters(lossyQuality_); 164 DJ_RPLossy parameters(lossyQuality_);
164 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, &parameters)) 165 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, &parameters, enableColorMapConversion))
165 { 166 {
166 selectedSyntax = DicomTransferSyntax_JPEGProcess2_4; 167 selectedSyntax = DicomTransferSyntax_JPEGProcess2_4;
167 return true; 168 return true;
168 } 169 }
169 } 170 }
173 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14) != allowedSyntaxes.end()) 174 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14) != allowedSyntaxes.end())
174 { 175 {
175 // Check out "dcmjpeg/apps/dcmcjpeg.cc" 176 // Check out "dcmjpeg/apps/dcmcjpeg.cc"
176 DJ_RPLossless parameters(6 /* opt_selection_value */, 177 DJ_RPLossless parameters(6 /* opt_selection_value */,
177 0 /* opt_point_transform */); 178 0 /* opt_point_transform */);
178 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14, &parameters)) 179 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14, &parameters, enableColorMapConversion))
179 { 180 {
180 selectedSyntax = DicomTransferSyntax_JPEGProcess14; 181 selectedSyntax = DicomTransferSyntax_JPEGProcess14;
181 return true; 182 return true;
182 } 183 }
183 } 184 }
187 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14SV1) != allowedSyntaxes.end()) 188 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess14SV1) != allowedSyntaxes.end())
188 { 189 {
189 // Check out "dcmjpeg/apps/dcmcjpeg.cc" 190 // Check out "dcmjpeg/apps/dcmcjpeg.cc"
190 DJ_RPLossless parameters(6 /* opt_selection_value */, 191 DJ_RPLossless parameters(6 /* opt_selection_value */,
191 0 /* opt_point_transform */); 192 0 /* opt_point_transform */);
192 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14SV1, &parameters)) 193 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess14SV1, &parameters, enableColorMapConversion))
193 { 194 {
194 selectedSyntax = DicomTransferSyntax_JPEGProcess14SV1; 195 selectedSyntax = DicomTransferSyntax_JPEGProcess14SV1;
195 return true; 196 return true;
196 } 197 }
197 } 198 }
206 207
207 /** 208 /**
208 * WARNING: This call results in a segmentation fault if using 209 * WARNING: This call results in a segmentation fault if using
209 * the DCMTK package 3.6.2 from Ubuntu 18.04. 210 * the DCMTK package 3.6.2 from Ubuntu 18.04.
210 **/ 211 **/
211 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossless, &parameters)) 212 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossless, &parameters, enableColorMapConversion))
212 { 213 {
213 selectedSyntax = DicomTransferSyntax_JPEGLSLossless; 214 selectedSyntax = DicomTransferSyntax_JPEGLSLossless;
214 return true; 215 return true;
215 } 216 }
216 } 217 }
226 227
227 /** 228 /**
228 * WARNING: This call results in a segmentation fault if using 229 * WARNING: This call results in a segmentation fault if using
229 * the DCMTK package 3.6.2 from Ubuntu 18.04. 230 * the DCMTK package 3.6.2 from Ubuntu 18.04.
230 **/ 231 **/
231 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossy, &parameters)) 232 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGLSLossy, &parameters, enableColorMapConversion))
232 { 233 {
233 selectedSyntax = DicomTransferSyntax_JPEGLSLossy; 234 selectedSyntax = DicomTransferSyntax_JPEGLSLossy;
234 return true; 235 return true;
235 } 236 }
236 } 237 }
272 273
273 274
274 bool DcmtkTranscoder::Transcode(DicomImage& target, 275 bool DcmtkTranscoder::Transcode(DicomImage& target,
275 DicomImage& source /* in, "GetParsed()" possibly modified */, 276 DicomImage& source /* in, "GetParsed()" possibly modified */,
276 const std::set<DicomTransferSyntax>& allowedSyntaxes, 277 const std::set<DicomTransferSyntax>& allowedSyntaxes,
277 bool allowNewSopInstanceUid) 278 bool allowNewSopInstanceUid,
279 bool enableColorMapConversion)
278 { 280 {
279 target.Clear(); 281 target.Clear();
280 282
281 DicomTransferSyntax sourceSyntax; 283 DicomTransferSyntax sourceSyntax;
282 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, source.GetParsed())) 284 if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, source.GetParsed()))
318 target.AcquireParsed(source); 320 target.AcquireParsed(source);
319 target.AcquireBuffer(source); 321 target.AcquireBuffer(source);
320 return true; 322 return true;
321 } 323 }
322 else if (InplaceTranscode(targetSyntax, source.GetParsed(), 324 else if (InplaceTranscode(targetSyntax, source.GetParsed(),
323 allowedSyntaxes, allowNewSopInstanceUid)) 325 allowedSyntaxes, allowNewSopInstanceUid, enableColorMapConversion))
324 { 326 {
325 // Sanity check 327 // Sanity check
326 DicomTransferSyntax targetSyntax2; 328 DicomTransferSyntax targetSyntax2;
327 if (FromDcmtkBridge::LookupOrthancTransferSyntax(targetSyntax2, source.GetParsed()) && 329 if (FromDcmtkBridge::LookupOrthancTransferSyntax(targetSyntax2, source.GetParsed()) &&
328 targetSyntax == targetSyntax2 && 330 targetSyntax == targetSyntax2 &&