annotate ViewerPlugin/RawTile.cpp @ 305:ec2c2ea026c0

cont
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 26 Jan 2024 17:59:53 +0100
parents ac1508b438b1
children 7020852a8fa9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
1 /**
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
2 * Orthanc - A Lightweight, RESTful DICOM Store
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
4 * Department, University Hospital of Liege, Belgium
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
6 * Copyright (C) 2021-2023 Sebastien Jodogne, ICTEAM UCLouvain, Belgium
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
7 *
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
8 * This program is free software: you can redistribute it and/or
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
9 * modify it under the terms of the GNU Affero General Public License
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
10 * as published by the Free Software Foundation, either version 3 of
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
11 * the License, or (at your option) any later version.
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
12 *
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful, but
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
16 * Affero General Public License for more details.
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
17 *
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
18 * You should have received a copy of the GNU Affero General Public License
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
20 **/
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
21
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
22
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
23 #include "../Framework/PrecompiledHeadersWSI.h"
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
24 #include "RawTile.h"
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
25
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
26 #include "../Framework/ImageToolbox.h"
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
27 #include "../Framework/Jpeg2000Reader.h"
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
28 #include "../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h"
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
29
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
30 #include <Compatibility.h> // For std::unique_ptr
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
31 #include <Images/JpegReader.h>
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
32 #include <Images/JpegWriter.h>
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 #include <Images/PngWriter.h>
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
34 #include <MultiThreading/Semaphore.h>
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
35 #include <OrthancException.h>
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
36
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
37
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
38 static std::unique_ptr<Orthanc::Semaphore> transcoderSemaphore_;
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
39
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
40 namespace OrthancWSI
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
41 {
277
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
42 static ImageCompression Convert(Orthanc::MimeType type)
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
43 {
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
44 switch (type)
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
45 {
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
46 case Orthanc::MimeType_Png:
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
47 return ImageCompression_Png;
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
48
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
49 case Orthanc::MimeType_Jpeg:
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
50 return ImageCompression_Jpeg;
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
51
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
52 case Orthanc::MimeType_Jpeg2000:
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
53 return ImageCompression_Jpeg2000;
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
54
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
55 default:
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
56 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange);
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
57 }
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
58 }
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
59
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
60
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
61 Orthanc::ImageAccessor* RawTile::DecodeInternal()
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
62 {
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
63 switch (compression_)
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
64 {
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
65 case ImageCompression_Jpeg:
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
66 {
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
67 std::unique_ptr<Orthanc::JpegReader> decoded(new Orthanc::JpegReader);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
68 decoded->ReadFromMemory(tile_);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
69 return decoded.release();
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
70 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
71
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
72 case ImageCompression_Jpeg2000:
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
73 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
74 std::unique_ptr<Jpeg2000Reader> decoded(new Jpeg2000Reader);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
75 decoded->ReadFromMemory(tile_);
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
76
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
77 if (photometric_ == Orthanc::PhotometricInterpretation_YBR_ICT)
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
78 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
79 ImageToolbox::ConvertJpegYCbCrToRgb(*decoded);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
80 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
81
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
82 return decoded.release();
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
83 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
84
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
85 case ImageCompression_None:
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
86 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
87 unsigned int bpp = Orthanc::GetBytesPerPixel(format_);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
88 if (bpp * tileWidth_ * tileHeight_ != tile_.size())
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
89 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
90 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadFileFormat);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
91 }
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
92
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
93 std::unique_ptr<Orthanc::ImageAccessor> decoded(new Orthanc::ImageAccessor);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
94 decoded->AssignReadOnly(format_, tileWidth_, tileHeight_, bpp * tileWidth_, tile_.c_str());
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
95
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
96 return decoded.release();
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
97 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
98
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
99 default:
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
100 throw Orthanc::OrthancException(Orthanc::ErrorCode_NotImplemented);
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
101 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
102 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
103
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
104 void RawTile::EncodeInternal(std::string& encoded,
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
105 const Orthanc::ImageAccessor& decoded,
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
106 Orthanc::MimeType encoding)
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
107 {
277
ac1508b438b1 support of "Accept" header in /wsi/tiles/{id}/{z}/{x}/{y}
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 276
diff changeset
108 ImageToolbox::EncodeTile(encoded, decoded, Convert(encoding), 90 /* only used for JPEG */);
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
109 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
110
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
111
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
112 RawTile::RawTile(ITiledPyramid& pyramid,
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
113 unsigned int level,
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
114 unsigned int tileX,
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
115 unsigned int tileY) :
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
116 format_(pyramid.GetPixelFormat()),
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
117 tileWidth_(pyramid.GetTileWidth(level)),
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
118 tileHeight_(pyramid.GetTileHeight(level)),
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
119 photometric_(pyramid.GetPhotometricInterpretation())
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
120 {
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
121 if (!pyramid.ReadRawTile(tile_, compression_, level, tileX, tileY))
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
122 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
123 // Handling of missing tile (for sparse tiling): TODO parameter?
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
124 // AnswerSparseTile(output, tileWidth, tileHeight); return;
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
125 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
126 }
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
127 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
128
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
129
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
130 void RawTile::Answer(OrthancPluginRestOutput* output,
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
131 Orthanc::MimeType encoding)
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
132 {
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
133 if ((compression_ == ImageCompression_Jpeg && encoding == Orthanc::MimeType_Jpeg) ||
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
134 (compression_ == ImageCompression_Jpeg2000 && encoding == Orthanc::MimeType_Jpeg2000))
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
135 {
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
136 // No transcoding is needed, the tile can be served as such
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
137 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, tile_.c_str(),
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
138 tile_.size(), Orthanc::EnumerationToString(encoding));
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
139 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
140 else
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 {
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
142 std::string transcoded;
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
143
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
144 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
145 // The semaphore is used to throttle the number of simultaneous computations
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
146 Orthanc::Semaphore::Locker locker(*transcoderSemaphore_);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
147
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
148 std::unique_ptr<Orthanc::ImageAccessor> decoded(DecodeInternal());
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
149 EncodeInternal(transcoded, *decoded, encoding);
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
150 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
151
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
152 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, transcoded.c_str(),
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
153 transcoded.size(), Orthanc::EnumerationToString(encoding));
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
154 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
155 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
156
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
157
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
158 Orthanc::ImageAccessor* RawTile::Decode()
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
159 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
160 Orthanc::Semaphore::Locker locker(*transcoderSemaphore_);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
161 return DecodeInternal();
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
162 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
163
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
164
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
165 void RawTile::Encode(std::string& encoded,
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
166 const Orthanc::ImageAccessor& decoded,
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
167 Orthanc::MimeType encoding)
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
168 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
169 Orthanc::Semaphore::Locker locker(*transcoderSemaphore_);
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
170 EncodeInternal(encoded, decoded, encoding);
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
171 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
172
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
173
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
174 void RawTile::InitializeTranscoderSemaphore(unsigned int maxThreads)
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
175 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
176 transcoderSemaphore_.reset(new Orthanc::Semaphore(maxThreads));
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
177 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
178
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
179
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
180 void RawTile::FinalizeTranscoderSemaphore()
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
181 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
182 transcoderSemaphore_.reset(NULL);
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
184 }