Mercurial > hg > orthanc
diff Core/DicomParsing/DcmtkTranscoder.cpp @ 3944:aae045f802f4 transcoding
preparing simplified interface for IDicomTranscoder
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 19 May 2020 10:17:06 +0200 |
parents | c205f670098e |
children | 0b3256c3ee14 |
line wrap: on
line diff
--- a/Core/DicomParsing/DcmtkTranscoder.cpp Mon May 18 21:37:31 2020 +0200 +++ b/Core/DicomParsing/DcmtkTranscoder.cpp Tue May 19 10:17:06 2020 +0200 @@ -398,4 +398,51 @@ return NULL; } } + + + bool DcmtkTranscoder::Transcode(DicomImage& target, + bool& hasSopInstanceUidChanged /* out */, + DicomImage& source /* in, "GetParsed()" possibly modified */, + const std::set<DicomTransferSyntax>& allowedSyntaxes, + bool allowNewSopInstanceUid) + { + target.Clear(); + + DicomTransferSyntax sourceSyntax; + if (!FromDcmtkBridge::LookupOrthancTransferSyntax(sourceSyntax, source.GetParsed())) + { + LOG(ERROR) << "Unsupport transfer syntax for transcoding"; + return false; + } + + if (allowedSyntaxes.find(sourceSyntax) != allowedSyntaxes.end()) + { + // No transcoding is needed + target.AcquireParsed(source); + target.AcquireBuffer(source); + return true; + } + else if (InplaceTranscode(hasSopInstanceUidChanged, source.GetParsed(), + allowedSyntaxes, allowNewSopInstanceUid)) + { + // Sanity check + DicomTransferSyntax targetSyntax; + if (FromDcmtkBridge::LookupOrthancTransferSyntax(targetSyntax, source.GetParsed()) && + allowedSyntaxes.find(targetSyntax) != allowedSyntaxes.end()) + { + target.AcquireParsed(source); + source.Clear(); + return true; + } + else + { + throw OrthancException(ErrorCode_InternalError); + } + } + else + { + // Cannot transcode + return false; + } + } }