annotate ViewerPlugin/RawTile.cpp @ 312:0683312e21ba

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