Mercurial > hg > orthanc
diff 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 |
line wrap: on
line diff
--- a/Core/DicomParsing/DcmtkTranscoder.cpp Mon May 18 11:16:18 2020 +0200 +++ b/Core/DicomParsing/DcmtkTranscoder.cpp Mon May 18 15:59:50 2020 +0200 @@ -55,18 +55,10 @@ namespace Orthanc { - static uint16_t GetBitsStored(DcmDataset& dataset) + static bool GetBitsStored(uint16_t& bitsStored, + DcmDataset& dataset) { - uint16_t bitsStored; - if (dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good()) - { - return bitsStored; - } - else - { - throw OrthancException(ErrorCode_BadFileFormat, - "Missing \"Bits Stored\" tag in DICOM instance"); - } + return dataset.findAndGetUint16(DCM_BitsStored, bitsStored).good(); } @@ -94,18 +86,26 @@ { throw OrthancException(ErrorCode_InternalError); } - + bool ok; - if (mustEqual) + if (dicom.getDataset()->tagExists(DCM_PixelData)) { - ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid); + if (mustEqual) + { + ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid); + } + else + { + ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid); + } } else { - ok = (GetSopInstanceUid(*dicom.getDataset()) != sopInstanceUid); + // No pixel data: Transcoding must not change the SOP instance UID + ok = (GetSopInstanceUid(*dicom.getDataset()) == sopInstanceUid); } - + if (!ok) { throw OrthancException(ErrorCode_InternalError, @@ -148,7 +148,9 @@ "Cannot determine the transfer syntax"); } - const uint16_t bitsStored = GetBitsStored(*dicom.getDataset()); + uint16_t bitsStored; + bool hasBitsStored = GetBitsStored(bitsStored, *dicom.getDataset()); + std::string sourceSopInstanceUid = GetSopInstanceUid(*dicom.getDataset()); if (allowedSyntaxes.find(syntax) != allowedSyntaxes.end()) @@ -188,7 +190,7 @@ #if ORTHANC_ENABLE_DCMTK_JPEG == 1 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess1) != allowedSyntaxes.end() && allowNewSopInstanceUid && - bitsStored == 8) + (!hasBitsStored || bitsStored == 8)) { // Check out "dcmjpeg/apps/dcmcjpeg.cc" DJ_RPLossy parameters(lossyQuality_); @@ -205,7 +207,7 @@ #if ORTHANC_ENABLE_DCMTK_JPEG == 1 if (allowedSyntaxes.find(DicomTransferSyntax_JPEGProcess2_4) != allowedSyntaxes.end() && allowNewSopInstanceUid && - bitsStored <= 12) + (!hasBitsStored || bitsStored <= 12)) { // Check out "dcmjpeg/apps/dcmcjpeg.cc" DJ_RPLossy parameters(lossyQuality_);