Mercurial > hg > orthanc
diff OrthancServer/ServerContext.cpp @ 3931:e6606d3ec892 transcoding
new configuration option: BuiltinDecoderTranscoderOrder
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 15 May 2020 09:22:31 +0200 |
parents | b99acc213937 |
children | 54dbebbcc032 |
line wrap: on
line diff
--- a/OrthancServer/ServerContext.cpp Thu May 14 19:20:40 2020 +0200 +++ b/OrthancServer/ServerContext.cpp Fri May 15 09:22:31 2020 +0200 @@ -268,8 +268,9 @@ // New configuration option in Orthanc 1.6.0 storageCommitmentReports_.reset(new StorageCommitmentReports(lock.GetConfiguration().GetUnsignedIntegerParameter("StorageCommitmentReportsSize", 100))); - // New option in Orthanc 1.7.0 + // New options in Orthanc 1.7.0 transcodeDicomProtocol_ = lock.GetConfiguration().GetBooleanParameter("TranscodeDicomProtocol", true); + builtinDecoderTranscoderOrder_ = StringToBuiltinDecoderTranscoderOrder(lock.GetConfiguration().GetStringParameter("BuiltinDecoderTranscoderOrder", "After")); } jobsEngine_.SetThreadSleep(unitTesting ? 20 : 200); @@ -1175,7 +1176,18 @@ ImageAccessor* ServerContext::DecodeDicomFrame(const std::string& publicId, unsigned int frameIndex) { - // TODO => Reorder given the global parameter + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_Before) + { + // Use Orthanc's built-in decoder, using the cache to speed-up + // things on multi-frame images + ServerContext::DicomCacheLocker locker(*this, publicId); + std::unique_ptr<ImageAccessor> decoded( + DicomImageDecoder::Decode(locker.GetDicom(), frameIndex)); + if (decoded.get() != NULL) + { + return decoded.release(); + } + } #if ORTHANC_ENABLE_PLUGINS == 1 if (HasPlugins() && @@ -1184,14 +1196,13 @@ // 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 + else if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) { LOG(INFO) << "The installed image decoding plugins cannot handle an image, " << "fallback to the built-in DCMTK decoder"; @@ -1199,19 +1210,30 @@ } #endif + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) { - // 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); } + else + { + return NULL; // Built-in decoder is disabled + } } ImageAccessor* ServerContext::DecodeDicomFrame(const DicomInstanceToStore& dicom, unsigned int frameIndex) { - // TODO => Reorder given the global parameter + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_Before) + { + std::unique_ptr<ImageAccessor> decoded( + DicomImageDecoder::Decode(dicom.GetParsedDicomFile(), frameIndex)); + if (decoded.get() != NULL) + { + return decoded.release(); + } + } #if ORTHANC_ENABLE_PLUGINS == 1 if (HasPlugins() && @@ -1223,7 +1245,7 @@ { return decoded.release(); } - else + else if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) { LOG(INFO) << "The installed image decoding plugins cannot handle an image, " << "fallback to the built-in DCMTK decoder"; @@ -1231,7 +1253,14 @@ } #endif - return DicomImageDecoder::Decode(dicom.GetParsedDicomFile(), frameIndex); + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) + { + return DicomImageDecoder::Decode(dicom.GetParsedDicomFile(), frameIndex); + } + else + { + return NULL; + } } @@ -1265,24 +1294,41 @@ DicomTransferSyntax targetSyntax, bool allowNewSopInstanceUid) { + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_Before) + { + if (dcmtkTranscoder_->TranscodeParsedToBuffer(target, hasSopInstanceUidChanged, dicom, + targetSyntax, allowNewSopInstanceUid)) + { + return true; + } + } + #if ORTHANC_ENABLE_PLUGINS == 1 - if (HasPlugins()) + if (HasPlugins() && + GetPlugins().HasCustomTranscoder()) { if (GetPlugins().TranscodeParsedToBuffer(target, hasSopInstanceUidChanged, dicom, targetSyntax, allowNewSopInstanceUid)) { return true; } - else + else if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) { LOG(INFO) << "The installed transcoding plugins cannot handle an image, " << "fallback to the built-in DCMTK transcoder"; } } #endif - - return dcmtkTranscoder_->TranscodeParsedToBuffer(target, hasSopInstanceUidChanged, dicom, - targetSyntax, allowNewSopInstanceUid); + + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) + { + return dcmtkTranscoder_->TranscodeParsedToBuffer(target, hasSopInstanceUidChanged, dicom, + targetSyntax, allowNewSopInstanceUid); + } + else + { + return false; + } } @@ -1293,8 +1339,20 @@ const std::set<DicomTransferSyntax>& allowedSyntaxes, bool allowNewSopInstanceUid) { + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_Before) + { + std::unique_ptr<IDicomTranscoder::TranscodedDicom> transcoded( + dcmtkTranscoder_->TranscodeToParsed(dicom, buffer, size, allowedSyntaxes, + allowNewSopInstanceUid)); + if (transcoded.get() != NULL) + { + return transcoded.release(); + } + } + #if ORTHANC_ENABLE_PLUGINS == 1 - if (HasPlugins()) + if (HasPlugins() && + GetPlugins().HasCustomTranscoder()) { std::unique_ptr<IDicomTranscoder::TranscodedDicom> transcoded( GetPlugins().TranscodeToParsed(dicom, buffer, size, allowedSyntaxes, allowNewSopInstanceUid)); @@ -1303,7 +1361,7 @@ { return transcoded.release(); } - else + else if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) { LOG(INFO) << "The installed transcoding plugins cannot handle an image, " << "fallback to the built-in DCMTK transcoder"; @@ -1311,7 +1369,14 @@ } #endif - return dcmtkTranscoder_->TranscodeToParsed( - dicom, buffer, size, allowedSyntaxes, allowNewSopInstanceUid); + if (builtinDecoderTranscoderOrder_ == BuiltinDecoderTranscoderOrder_After) + { + return dcmtkTranscoder_->TranscodeToParsed( + dicom, buffer, size, allowedSyntaxes, allowNewSopInstanceUid); + } + else + { + return NULL; + } } }