Mercurial > hg > orthanc
diff OrthancServer/ServerContext.cpp @ 3928:4cdc875510d1 transcoding
ServerContext::DecodeDicomFrame()
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 14 May 2020 13:31:05 +0200 |
parents | 6ddad3e0b569 |
children | b99acc213937 |
line wrap: on
line diff
--- a/OrthancServer/ServerContext.cpp Thu May 14 07:37:44 2020 +0200 +++ b/OrthancServer/ServerContext.cpp Thu May 14 13:31:05 2020 +0200 @@ -34,6 +34,7 @@ #include "PrecompiledHeadersServer.h" #include "ServerContext.h" +#include "../Core/DicomParsing/Internals/DicomImageDecoder.h" #include "../Core/Cache/SharedArchive.h" #include "../Core/DicomParsing/DcmtkTranscoder.h" #include "../Core/DicomParsing/FromDcmtkBridge.h" @@ -1193,6 +1194,69 @@ } + ImageAccessor* ServerContext::DecodeDicomFrame(const std::string& publicId, + unsigned int frameIndex) + { + // TODO => Reorder given the global parameter + +#if ORTHANC_ENABLE_PLUGINS == 1 + if (HasPlugins() && + GetPlugins().HasCustomImageDecoder()) + { + // TODO: Store the raw buffer in the DicomCacheLocker + std::string dicomContent; + ReadDicom(dicomContent, publicId); + + std::unique_ptr<ImageAccessor> decoded( + GetPlugins().Decode(dicomContent.c_str(), dicomContent.size(), frameIndex)); + if (decoded.get() != NULL) + { + return decoded.release(); + } + else + { + LOG(INFO) << "The installed image decoding plugins cannot handle an image, " + << "fallback to the built-in decoder"; + } + } +#endif + + { + // Use Orthanc's built-in decoder, using the cache to speed-up + // things on multi-frame images + ServerContext::DicomCacheLocker locker(*this, publicId); + return DicomImageDecoder::Decode(locker.GetDicom(), frameIndex); + } + } + + + ImageAccessor* ServerContext::DecodeDicomFrame(const DicomInstanceToStore& dicom, + unsigned int frameIndex) + { + // TODO => Reorder given the global parameter + +#if ORTHANC_ENABLE_PLUGINS == 1 + if (HasPlugins() && + GetPlugins().HasCustomImageDecoder()) + { + std::unique_ptr<ImageAccessor> decoded( + GetPlugins().Decode(dicom.GetBufferData(), dicom.GetBufferSize(), frameIndex)); + if (decoded.get() != NULL) + { + return decoded.release(); + } + else + { + LOG(INFO) << "The installed image decoding plugins cannot handle an image, " + << "fallback to the built-in decoder"; + } + } +#endif + + return DicomImageDecoder::Decode(dicom.GetParsedDicomFile(), frameIndex); + } + + void ServerContext::StoreWithTranscoding(std::string& sopClassUid, std::string& sopInstanceUid, DicomStoreUserConnection& connection,