Mercurial > hg > orthanc
diff OrthancServer/OrthancRestApi/OrthancRestResources.cpp @ 1902:8b0ee8d5e6d0
Refactoring leading to speedups with custom image decoders
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 05 Jan 2016 13:26:51 +0100 |
parents | b1291df2f780 |
children | d7c1cb559431 |
line wrap: on
line diff
--- a/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Mon Jan 04 14:20:41 2016 +0100 +++ b/OrthancServer/OrthancRestApi/OrthancRestResources.cpp Tue Jan 05 13:26:51 2016 +0100 @@ -266,58 +266,34 @@ class ImageToEncode { private: - IDicomImageDecoder& decoder_; - std::string format_; - std::string encoded_; - ParsedDicomFile& dicom_; - unsigned int frame_; - ImageExtractionMode mode_; + std::auto_ptr<ImageAccessor>& image_; + ImageExtractionMode mode_; + std::string format_; + std::string answer_; public: - ImageToEncode(IDicomImageDecoder& decoder, - ParsedDicomFile& dicom, - unsigned int frame, + ImageToEncode(std::auto_ptr<ImageAccessor>& image, ImageExtractionMode mode) : - decoder_(decoder), - dicom_(dicom), - frame_(frame), + image_(image), mode_(mode) { } - ParsedDicomFile& GetDicom() const - { - return dicom_; - } - - unsigned int GetFrame() const + void Answer(RestApiOutput& output) { - return frame_; - } - - ImageExtractionMode GetMode() const - { - return mode_; + output.AnswerBuffer(answer_, format_); } - void SetFormat(const std::string& format) + void EncodeUsingPng() { - format_ = format; + format_ = "image/png"; + DicomImageDecoder::ExtractPngImage(answer_, image_, mode_); } - std::string& GetTarget() - { - return encoded_; - } - - void Answer(RestApiOutput& output) + void EncodeUsingJpeg(uint8_t quality) { - output.AnswerBuffer(encoded_, format_); - } - - IDicomImageDecoder& GetDecoder() const - { - return decoder_; + format_ = "image/jpeg"; + DicomImageDecoder::ExtractJpegImage(answer_, image_, mode_, quality); } }; @@ -336,9 +312,7 @@ { assert(type == "image"); assert(subtype == "png"); - image_.GetDicom().ExtractPngImage(image_.GetTarget(), image_.GetDecoder(), - image_.GetFrame(), image_.GetMode()); - image_.SetFormat("image/png"); + image_.EncodeUsingPng(); } }; @@ -377,9 +351,7 @@ { assert(type == "image"); assert(subtype == "jpeg"); - image_.GetDicom().ExtractJpegImage(image_.GetTarget(), image_.GetDecoder(), - image_.GetFrame(), image_.GetMode(), quality_); - image_.SetFormat("image/jpeg"); + image_.EncodeUsingJpeg(quality_); } }; } @@ -406,17 +378,17 @@ std::string dicomContent; context.ReadFile(dicomContent, publicId, FileContentType_Dicom); - ParsedDicomFile dicom(dicomContent); - try { #if ORTHANC_PLUGINS_ENABLED == 1 IDicomImageDecoder& decoder = context.GetPlugins(); #else - DicomImageDecoder decoder; // This is Orthanc's built-in decoder + DefaultDicomImageDecoder decoder; // This is Orthanc's built-in decoder #endif - ImageToEncode image(decoder, dicom, frame, mode); + std::auto_ptr<ImageAccessor> decoded(decoder.Decode(dicomContent.c_str(), dicomContent.size(), frame)); + + ImageToEncode image(decoded, mode); HttpContentNegociation negociation; EncodePng png(image); negociation.Register("image/png", png); @@ -471,11 +443,10 @@ #if ORTHANC_PLUGINS_ENABLED == 1 IDicomImageDecoder& decoder = context.GetPlugins(); #else - DicomImageDecoder decoder; // This is Orthanc's built-in decoder + DefaultDicomImageDecoder decoder; // This is Orthanc's built-in decoder #endif - ParsedDicomFile dicom(dicomContent); - std::auto_ptr<ImageAccessor> decoded(dicom.ExtractImage(decoder, frame)); + std::auto_ptr<ImageAccessor> decoded(decoder.Decode(dicomContent.c_str(), dicomContent.size(), frame)); std::string result; decoded->ToMatlabString(result);