comparison Core/DicomParsing/DcmtkTranscoder.cpp @ 3938:54dbebbcc032 transcoding

fix
author Sebastien Jodogne <s.jodogne@gmail.com>
date Mon, 18 May 2020 15:59:50 +0200
parents 7dc5e7e0045d
children c205f670098e
comparison
equal deleted inserted replaced
3937:41eec97c23ef 3938:54dbebbcc032
53 #include <dcmtk/dcmjpls/djrparam.h> // for DJLSRepresentationParameter 53 #include <dcmtk/dcmjpls/djrparam.h> // for DJLSRepresentationParameter
54 54
55 55
56 namespace Orthanc 56 namespace Orthanc
57 { 57 {
58 static uint16_t GetBitsStored(DcmDataset& dataset) 58 static bool GetBitsStored(uint16_t& bitsStored,
59 { 59 DcmDataset& dataset)
60 uint16_t bitsStored; 60 {
61 if (dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good()) 61 return dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good();
62 {
63 return bitsStored;
64 }
65 else
66 {
67 throw OrthancException(ErrorCode_BadFileFormat,
68 "Missing \"Bits Stored\" tag in DICOM instance");
69 }
70 } 62 }
71 63
72 64
73 static std::string GetSopInstanceUid(DcmDataset& dataset) 65 static std::string GetSopInstanceUid(DcmDataset& dataset)
74 { 66 {
92 { 84 {
93 if (dicom.getDataset() == NULL) 85 if (dicom.getDataset() == NULL)
94 { 86 {
95 throw OrthancException(ErrorCode_InternalError); 87 throw OrthancException(ErrorCode_InternalError);
96 } 88 }
97 89
98 bool ok; 90 bool ok;
99 91
100 if (mustEqual) 92 if (dicom.getDataset()->tagExists(DCM_PixelData))
101 { 93 {
94 if (mustEqual)
95 {
96 ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid);
97 }
98 else
99 {
100 ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid);
101 }
102 }
103 else
104 {
105 // No pixel data: Transcoding must not change the SOP instance UID
102 ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid); 106 ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid);
103 } 107 }
104 else 108
105 {
106 ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid);
107 }
108
109 if (!ok) 109 if (!ok)
110 { 110 {
111 throw OrthancException(ErrorCode_InternalError, 111 throw OrthancException(ErrorCode_InternalError,
112 mustEqual ? "The SOP instance UID has changed unexpectedly during transcoding" : 112 mustEqual ? "The SOP instance UID has changed unexpectedly during transcoding" :
113 "The SOP instance UID has not changed as expected during transcoding"); 113 "The SOP instance UID has not changed as expected during transcoding");
146 { 146 {
147 throw OrthancException(ErrorCode_BadFileFormat, 147 throw OrthancException(ErrorCode_BadFileFormat,
148 "Cannot determine the transfer syntax"); 148 "Cannot determine the transfer syntax");
149 } 149 }
150 150
151 const uint16_t bitsStored = GetBitsStored(*dicom.getDataset()); 151 uint16_t bitsStored;
152 bool hasBitsStored = GetBitsStored(bitsStored, *dicom.getDataset());
153
152 std::string sourceSopInstanceUid = GetSopInstanceUid(*dicom.getDataset()); 154 std::string sourceSopInstanceUid = GetSopInstanceUid(*dicom.getDataset());
153 155
154 if (allowedSyntaxes.find(syntax) != allowedSyntaxes.end()) 156 if (allowedSyntaxes.find(syntax) != allowedSyntaxes.end())
155 { 157 {
156 // No transcoding is needed 158 // No transcoding is needed
186 } 188 }
187 189
188 #if ORTHANC_ENABLE_DCMTK_JPEG == 1 190 #if ORTHANC_ENABLE_DCMTK_JPEG == 1
189 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess1) != allowedSyntaxes.end() && 191 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess1) != allowedSyntaxes.end() &&
190 allowNewSopInstanceUid && 192 allowNewSopInstanceUid &&
191 bitsStored == 8) 193 (!hasBitsStored || bitsStored == 8))
192 { 194 {
193 // Check out "dcmjpeg/apps/dcmcjpeg.cc" 195 // Check out "dcmjpeg/apps/dcmcjpeg.cc"
194 DJ_RPLossy parameters(lossyQuality_); 196 DJ_RPLossy parameters(lossyQuality_);
195 197
196 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, &parameters)) 198 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess1, &parameters))
203 #endif 205 #endif
204 206
205 #if ORTHANC_ENABLE_DCMTK_JPEG == 1 207 #if ORTHANC_ENABLE_DCMTK_JPEG == 1
206 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess2_4) != allowedSyntaxes.end() && 208 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess2_4) != allowedSyntaxes.end() &&
207 allowNewSopInstanceUid && 209 allowNewSopInstanceUid &&
208 bitsStored <= 12) 210 (!hasBitsStored || bitsStored <= 12))
209 { 211 {
210 // Check out "dcmjpeg/apps/dcmcjpeg.cc" 212 // Check out "dcmjpeg/apps/dcmcjpeg.cc"
211 DJ_RPLossy parameters(lossyQuality_); 213 DJ_RPLossy parameters(lossyQuality_);
212 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, &parameters)) 214 if (FromDcmtkBridge::Transcode(dicom, DicomTransferSyntax_JPEGProcess2_4, &parameters))
213 { 215 {