Mercurial > hg > orthanc
diff OrthancServer/ServerContext.cpp @ 3939:c205f670098e transcoding
new configuration options: BuiltinDecoderTranscoderOrder and IngestTranscoding
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 18 May 2020 17:15:16 +0200 |
parents | 54dbebbcc032 |
children | 771dbd9eb3bd |
line wrap: on
line diff
--- a/OrthancServer/ServerContext.cpp Mon May 18 15:59:50 2020 +0200 +++ b/OrthancServer/ServerContext.cpp Mon May 18 17:15:16 2020 +0200 @@ -246,37 +246,72 @@ isHttpServerSecure_(true), isExecuteLuaEnabled_(false), overwriteInstances_(false), - dcmtkTranscoder_(new DcmtkTranscoder) + dcmtkTranscoder_(new DcmtkTranscoder), + isIngestTranscoding_(false) { + try { - OrthancConfiguration::ReaderLock lock; + unsigned int lossyQuality; + + { + OrthancConfiguration::ReaderLock lock; - queryRetrieveArchive_.reset( - new SharedArchive(lock.GetConfiguration().GetUnsignedIntegerParameter("QueryRetrieveSize", 100))); - mediaArchive_.reset( - new SharedArchive(lock.GetConfiguration().GetUnsignedIntegerParameter("MediaArchiveSize", 1))); - defaultLocalAet_ = lock.GetConfiguration().GetStringParameter("DicomAet", "ORTHANC"); - jobsEngine_.SetWorkersCount(lock.GetConfiguration().GetUnsignedIntegerParameter("ConcurrentJobs", 2)); - saveJobs_ = lock.GetConfiguration().GetBooleanParameter("SaveJobs", true); - metricsRegistry_->SetEnabled(lock.GetConfiguration().GetBooleanParameter("MetricsEnabled", true)); + queryRetrieveArchive_.reset( + new SharedArchive(lock.GetConfiguration().GetUnsignedIntegerParameter("QueryRetrieveSize", 100))); + mediaArchive_.reset( + new SharedArchive(lock.GetConfiguration().GetUnsignedIntegerParameter("MediaArchiveSize", 1))); + defaultLocalAet_ = lock.GetConfiguration().GetStringParameter("DicomAet", "ORTHANC"); + jobsEngine_.SetWorkersCount(lock.GetConfiguration().GetUnsignedIntegerParameter("ConcurrentJobs", 2)); + saveJobs_ = lock.GetConfiguration().GetBooleanParameter("SaveJobs", true); + metricsRegistry_->SetEnabled(lock.GetConfiguration().GetBooleanParameter("MetricsEnabled", true)); + + // New configuration options in Orthanc 1.5.1 + findStorageAccessMode_ = StringToFindStorageAccessMode(lock.GetConfiguration().GetStringParameter("StorageAccessOnFind", "Always")); + limitFindInstances_ = lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindInstances", 0); + limitFindResults_ = lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindResults", 0); + + // New configuration option in Orthanc 1.6.0 + storageCommitmentReports_.reset(new StorageCommitmentReports(lock.GetConfiguration().GetUnsignedIntegerParameter("StorageCommitmentReportsSize", 100))); + + // New options in Orthanc 1.7.0 + transcodeDicomProtocol_ = lock.GetConfiguration().GetBooleanParameter("TranscodeDicomProtocol", true); + builtinDecoderTranscoderOrder_ = StringToBuiltinDecoderTranscoderOrder(lock.GetConfiguration().GetStringParameter("BuiltinDecoderTranscoderOrder", "After")); + lossyQuality = lock.GetConfiguration().GetUnsignedIntegerParameter("DicomLossyTranscodingQuality", 90); - // New configuration options in Orthanc 1.5.1 - findStorageAccessMode_ = StringToFindStorageAccessMode(lock.GetConfiguration().GetStringParameter("StorageAccessOnFind", "Always")); - limitFindInstances_ = lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindInstances", 0); - limitFindResults_ = lock.GetConfiguration().GetUnsignedIntegerParameter("LimitFindResults", 0); - - // New configuration option in Orthanc 1.6.0 - storageCommitmentReports_.reset(new StorageCommitmentReports(lock.GetConfiguration().GetUnsignedIntegerParameter("StorageCommitmentReportsSize", 100))); + std::string s; + if (lock.GetConfiguration().LookupStringParameter(s, "IngestTranscoding")) + { + if (LookupTransferSyntax(ingestTransferSyntax_, s)) + { + isIngestTranscoding_ = true; + LOG(WARNING) << "Incoming DICOM instances will automatically be transcoded to " + << "transfer syntax: " << GetTransferSyntaxUid(ingestTransferSyntax_); + } + else + { + throw OrthancException(ErrorCode_ParameterOutOfRange, + "Unknown transfer syntax for ingest transcoding: " + s); + } + } + else + { + isIngestTranscoding_ = true; + LOG(INFO) << "Automated transcoding of incoming DICOM instances is disabled"; + } + } - // 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); - jobsEngine_.SetThreadSleep(unitTesting ? 20 : 200); - - listeners_.push_back(ServerListener(luaListener_, "Lua")); - changeThread_ = boost::thread(ChangeThread, this, (unitTesting ? 20 : 100)); + listeners_.push_back(ServerListener(luaListener_, "Lua")); + changeThread_ = boost::thread(ChangeThread, this, (unitTesting ? 20 : 100)); + + dynamic_cast<DcmtkTranscoder&>(*dcmtkTranscoder_).SetLossyQuality(lossyQuality); + } + catch (OrthancException&) + { + Stop(); + throw; + } } @@ -508,22 +543,19 @@ DicomInstanceToStore& dicom, StoreInstanceMode mode) { - const DicomTransferSyntax option = DicomTransferSyntax_JPEGProcess1; - //const DicomTransferSyntax option = DicomTransferSyntax_JPEGProcess14SV1; - //const DicomTransferSyntax option = DicomTransferSyntax_LittleEndianExplicit; - - if (1) + if (!isIngestTranscoding_) { + // No automated transcoding return StoreAfterTranscoding(resultPublicId, dicom, mode); } else { - // TODO => Automated transcoding of incoming DICOM files + // Automated transcoding of incoming DICOM files DicomTransferSyntax sourceSyntax; if (!FromDcmtkBridge::LookupOrthancTransferSyntax( sourceSyntax, dicom.GetParsedDicomFile().GetDcmtkObject()) || - sourceSyntax == option) + sourceSyntax == ingestTransferSyntax_) { // No transcoding return StoreAfterTranscoding(resultPublicId, dicom, mode); @@ -531,7 +563,7 @@ else { std::set<DicomTransferSyntax> syntaxes; - syntaxes.insert(option); + syntaxes.insert(ingestTransferSyntax_); std::unique_ptr<IDicomTranscoder::TranscodedDicom> transcoded( TranscodeToParsed(dicom.GetParsedDicomFile().GetDcmtkObject(),