annotate ViewerPlugin/RawTile.cpp @ 324:a92bb720f90b

renamed option --tiff-alignment as --padding
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 16 Oct 2024 21:08:58 +0200
parents 8ad12abde290
children
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
318
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
32 #include <Images/ImageProcessing.h>
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
33 #include <Images/JpegReader.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 {
318
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
122 isEmpty_ = !pyramid.ReadRawTile(tile_, compression_, level, tileX, tileY);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
123 }
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
124
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
125
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
126 ImageCompression RawTile::GetCompression() const
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
127 {
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
128 if (isEmpty_)
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
129 {
318
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
130 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
131 }
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
132 else
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
133 {
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
134 return compression_;
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
135 }
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
136 }
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
137
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
138
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
139 void RawTile::Answer(OrthancPluginRestOutput* output,
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
140 Orthanc::MimeType encoding)
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
141 {
318
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
142 if (isEmpty_)
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
143 {
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
144 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
145 }
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
146
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
147 if ((compression_ == ImageCompression_Jpeg && encoding == Orthanc::MimeType_Jpeg) ||
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
148 (compression_ == ImageCompression_Jpeg2000 && encoding == Orthanc::MimeType_Jpeg2000))
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
149 {
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
150 // No transcoding is needed, the tile can be served as such
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
151 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, tile_.c_str(),
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
152 tile_.size(), Orthanc::EnumerationToString(encoding));
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
153 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
154 else
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
155 {
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
156 std::string transcoded;
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
157
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
158 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
159 // The semaphore is used to throttle the number of simultaneous computations
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
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
162 std::unique_ptr<Orthanc::ImageAccessor> decoded(DecodeInternal());
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
163 EncodeInternal(transcoded, *decoded, encoding);
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
164 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
165
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
166 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, transcoded.c_str(),
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
167 transcoded.size(), Orthanc::EnumerationToString(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 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
170
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
171
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
172 Orthanc::ImageAccessor* RawTile::Decode()
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
173 {
318
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
174 if (isEmpty_)
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
175 {
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
176 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
177 }
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
178
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
179 Orthanc::Semaphore::Locker locker(*transcoderSemaphore_);
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
180 return DecodeInternal();
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
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
183
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
184 void RawTile::Encode(std::string& encoded,
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
185 const Orthanc::ImageAccessor& decoded,
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
186 Orthanc::MimeType encoding)
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
187 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
188 Orthanc::Semaphore::Locker locker(*transcoderSemaphore_);
276
ef8a673b5fb9 clarification of RawTile::Answer()
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 261
diff changeset
189 EncodeInternal(encoded, decoded, encoding);
261
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
190 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
191
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
192
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
193 void RawTile::InitializeTranscoderSemaphore(unsigned int maxThreads)
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
194 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
195 transcoderSemaphore_.reset(new Orthanc::Semaphore(maxThreads));
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
196 }
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
197
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
198
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
199 void RawTile::FinalizeTranscoderSemaphore()
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
200 {
c72fbdecdc38 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 260
diff changeset
201 transcoderSemaphore_.reset(NULL);
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
202 }
318
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
203
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
204
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
205 void RawTile::AnswerBackgroundTile(OrthancPluginRestOutput* output,
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
206 unsigned int tileWidth,
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
207 unsigned int tileHeight)
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
208 {
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
209 std::string answer;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
210
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
211 {
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
212 static boost::mutex mutex;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
213 static std::string cachedTile;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
214 static unsigned int cachedWidth = 0;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
215 static unsigned int cachedHeight = 0;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
216
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
217 boost::mutex::scoped_lock lock(mutex);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
218
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
219 if (cachedTile.empty() ||
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
220 cachedWidth != tileWidth ||
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
221 cachedHeight != tileHeight)
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
222 {
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
223 Orthanc::Image tile(Orthanc::PixelFormat_RGBA32, tileWidth, tileHeight, false);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
224
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
225 Orthanc::ImageProcessing::Set(tile, 255 /* red */, 255 /* green */,
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
226 255 /* blue */, 0 /* alpha - fully transparent */);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
227
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
228 Orthanc::PngWriter writer;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
229 Orthanc::IImageWriter::WriteToMemory(writer, cachedTile, tile);
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
230 cachedWidth = tileWidth;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
231 cachedHeight = tileHeight;
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
232 }
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
233
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
234 answer = cachedTile; // Make a private copy to avoid mutex on "OrthancPluginAnswerBuffer()"
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
235 }
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
236
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
237 OrthancPluginAnswerBuffer(OrthancPlugins::GetGlobalContext(), output, answer.c_str(),
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
238 answer.size(), Orthanc::EnumerationToString(Orthanc::MimeType_Png));
8ad12abde290 sparse re-encoding with OpenSlide (notably for MIRAX format)
Sebastien Jodogne <s.jodogne@gmail.com>
parents: 312
diff changeset
239 }
260
35c241231af2 reorganization
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
diff changeset
240 }