Mercurial > hg > orthanc
diff Core/DicomParsing/MemoryBufferTranscoder.cpp @ 3906:f0dd5ded8927 transcoding
refactoring using IDicomTranscoder::TranscodedDicom
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 08 May 2020 11:16:16 +0200 |
parents | 061f3d031b5d |
children | 1555feda39e2 |
line wrap: on
line diff
--- a/Core/DicomParsing/MemoryBufferTranscoder.cpp Fri May 08 08:27:18 2020 +0200 +++ b/Core/DicomParsing/MemoryBufferTranscoder.cpp Fri May 08 11:16:16 2020 +0200 @@ -81,7 +81,8 @@ } #endif - return Transcode(target, hasSopInstanceUidChanged, buffer, size, + DicomTransferSyntax sourceSyntax, targetSyntax; + return Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, buffer, size, allowedSyntaxes, allowNewSopInstanceUid); } @@ -106,7 +107,9 @@ #endif std::string transcoded; - if (Transcode(transcoded, hasSopInstanceUidChanged, buffer, size, allowedSyntaxes, allowNewSopInstanceUid)) + DicomTransferSyntax sourceSyntax, targetSyntax; + if (Transcode(transcoded, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, + buffer, size, allowedSyntaxes, allowNewSopInstanceUid)) { return FromDcmtkBridge::LoadFromMemoryBuffer( transcoded.empty() ? NULL : transcoded.c_str(), transcoded.size()); @@ -176,4 +179,73 @@ throw OrthancException(ErrorCode_BadSequenceOfCalls); } } + + + + + bool MemoryBufferTranscoder::TranscodeParsedToBuffer( + std::string& target /* out */, + DicomTransferSyntax& sourceSyntax /* out */, + DicomTransferSyntax& targetSyntax /* out */, + bool& hasSopInstanceUidChanged /* out */, + DcmFileFormat& dicom /* in, possibly modified */, + const std::set<DicomTransferSyntax>& allowedSyntaxes, + bool allowNewSopInstanceUid) + { + if (dicom.getDataset() == NULL) + { + throw OrthancException(ErrorCode_InternalError); + } + + std::string source; + FromDcmtkBridge::SaveToMemoryBuffer(source, *dicom.getDataset()); + + const void* data = source.empty() ? NULL : source.c_str(); + + bool success = Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, + data, source.size(), allowedSyntaxes, allowNewSopInstanceUid); + +#if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 + if (useDcmtk_ && + dcmtk_.TranscodeParsedToBuffer( + target, sourceSyntax, targetSyntax,hasSopInstanceUidChanged, + dicom, allowedSyntaxes, allowNewSopInstanceUid)) + { + success = true; + } +#endif + + return success; + } + + + IDicomTranscoder::TranscodedDicom* MemoryBufferTranscoder::TranscodeToParsed2( + DcmFileFormat& dicom /* in, possibly modified */, + const void* buffer /* in, same DICOM file as "dicom" */, + size_t size, + const std::set<DicomTransferSyntax>& allowedSyntaxes, + bool allowNewSopInstanceUid) + { + DicomTransferSyntax sourceSyntax, targetSyntax; + bool hasSopInstanceUidChanged; + + std::string target; + if (Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, + buffer, size, allowedSyntaxes, allowNewSopInstanceUid)) + { + const void* data = target.empty() ? NULL : target.c_str(); + return IDicomTranscoder::TranscodedDicom::CreateFromInternal( + FromDcmtkBridge::LoadFromMemoryBuffer(data, target.size()), hasSopInstanceUidChanged); + } +#if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 + else if (useDcmtk_) + { + return dcmtk_.TranscodeToParsed2(dicom, buffer, size, allowedSyntaxes, allowNewSopInstanceUid); + } +#endif + else + { + return NULL; + } + } }