5#include "slideio/converter/converter_def.hpp"
6#include "slideio/imagetools/tiffkeeper.hpp"
7#include "slideio/converter/converterparameters.hpp"
8#include "slideio/converter/tiffstructure.hpp"
9#include "slideio/core/tools/boundedqueue.hpp"
14#include "slideio/core/cvslide.hpp"
24 class ConverterParameters;
26 class SLIDEIO_CONVERTER_EXPORTS TiffConverter
29 TiffConverter() =
default;
30 TiffConverter(
const TiffConverter& other)
31 : m_pages(other.m_pages)
32 , m_file(other.m_file)
33 , m_scene(other.m_scene)
34 , m_parameters(other.m_parameters)
35 , m_cropRect(other.m_cropRect)
36 , m_filePath(other.m_filePath)
37 , m_totalTiles(other.m_totalTiles)
38 , m_currentTile(other.m_currentTile)
39 , m_lastProgress(other.m_lastProgress)
40 , m_readersIdleTimeNs(other.m_readersIdleTimeNs.load())
41 , m_encodersIdleTimeNs(other.m_encodersIdleTimeNs.load())
42 , m_writerIdleTimeNs(other.m_writerIdleTimeNs.load())
43 , m_numReaderThreads(other.m_numReaderThreads)
44 , m_numEncoderThreads(other.m_numEncoderThreads) {}
45 TiffConverter& operator=(
const TiffConverter& other) {
47 m_pages = other.m_pages;
48 m_file = other.m_file;
49 m_scene = other.m_scene;
50 m_parameters = other.m_parameters;
51 m_cropRect = other.m_cropRect;
52 m_filePath = other.m_filePath;
53 m_totalTiles = other.m_totalTiles;
54 m_currentTile = other.m_currentTile;
55 m_lastProgress = other.m_lastProgress;
56 m_readersIdleTimeNs.store(other.m_readersIdleTimeNs.load());
57 m_encodersIdleTimeNs.store(other.m_encodersIdleTimeNs.load());
58 m_writerIdleTimeNs.store(other.m_writerIdleTimeNs.load());
59 m_numReaderThreads = other.m_numReaderThreads;
60 m_numEncoderThreads = other.m_numEncoderThreads;
64 TiffConverter(TiffConverter&&) =
default;
65 TiffConverter& operator=(TiffConverter&&) =
default;
69 size_t firstTileSequenceId;
78 std::vector<uint8_t> encodedData;
82 void createFileLayout(
const std::shared_ptr<CVScene>& scene,
const ConverterParameters& parameters);
83 void createTiff(
const std::string& filePath,
const std::function<
void(
int)>& cb,
int tileBatchSize);
84 int getNumTiffPages()
const {
85 return static_cast<int>(m_pages.size());
88 const TiffPageStructure& getTiffPage(
int index)
const;
89 Rect getSceneRect()
const {
93 int getTotalTiles()
const {
97 const ConverterParameters& getParameters()
const {
100 std::chrono::nanoseconds getReadersIdleTime()
const {
101 return std::chrono::nanoseconds(m_readersIdleTimeNs.load());
103 std::chrono::nanoseconds getEncodersIdleTime()
const {
104 return std::chrono::nanoseconds(m_encodersIdleTimeNs.load());
106 std::chrono::nanoseconds getWriterIdleTime()
const {
107 return std::chrono::nanoseconds(m_writerIdleTimeNs.load());
109 int getNumReaderThreads()
const {
110 return m_numReaderThreads;
112 int getNumEncoderThreads()
const {
113 return m_numEncoderThreads;
115 int getNumWriterThreads()
const {
118 void createTileQueue(
const TiffDirectory& dir,
const TiffDirectoryStructure& page,
int tileBatchSize, std::queue<Block>& queue);
119 virtual std::pair<std::shared_ptr<Slide>, std::shared_ptr<Scene>> cloneScene()
const;
121 std::shared_ptr<CVScene> getScene()
const {
125 TiffPageStructure& appendPage() {
126 return m_pages.emplace_back();
128 DataType getChannelRangeDataType(
const Range& channelRange)
const;
129 int computeChannelChunk(
int firstChannel,
const std::shared_ptr<CVScene>& scene)
const;
130 std::string createSVSImageDescription()
const;
131 std::string createImageDescriptionTag()
const;
132 std::string createOMETiffDescription()
const;
133 TiffDirectory setUpDirectory(
const TiffDirectoryStructure& page);
134 void writeDirectoryData(TiffDirectory& dir,
const TiffDirectoryStructure& page,
135 const std::function<
void(
int)>& cb,
int param);
136 void writeDirectoryDataST(TiffDirectory& dir,
const TiffDirectoryStructure& page,
137 const std::function<
void(
int)>& cb,
int tileBatchSize);
138 void writeDirectoryDataMT(TiffDirectory& dir,
const TiffDirectoryStructure& page,
139 const std::function<
void(
int)>& cb,
int tileBatchSize);
140 void computeCropRect();
141 void makeSureValid()
const;
142 static std::string SVSDateString();
143 static std::string SVSTimeString();
144 void checkSVSRequirements()
const;
145 void checkJpegRequirements()
const;
146 void checkEncodingRequirements()
const;
147 void checkContainerRequirements()
const;
148 void updateNotDefinedParameters();
150 void readTiles(
const TiffDirectory& dir,
const TiffDirectoryStructure& page, BoundedQueue<Tile>& inputQueue,
151 std::queue<Block>& blockQueue, std::mutex& blockQueueMutex, std::atomic<size_t>& activeReaders,
152 std::exception_ptr& readerException, std::mutex& exceptionMutex);
153 void encodeTiles(BoundedQueue<Tile>& inputQueue, BoundedQueue<EncodedTile>& outputQueue,
154 std::atomic<size_t>& activeEncoders, std::exception_ptr& encoderException, std::mutex& exceptionMutex);
155 void writeTile(
const EncodedTile& tile);
156 void writeTiles(BoundedQueue<Tile>& inputQueue, BoundedQueue<EncodedTile>& outputQueue,
const std::function<
void(
int)>& cb,
157 std::exception_ptr& writerException, std::mutex& exceptionMutex);
158 std::vector<uint8_t> encodeTile(
const cv::Mat& tile);
160 std::vector<TiffPageStructure> m_pages;
161 TIFFKeeperPtr m_file;
162 std::shared_ptr<CVScene> m_scene;
163 ConverterParameters m_parameters;
165 std::string m_filePath;
166 int m_totalTiles = 0;
167 int m_currentTile = 0;
168 int m_lastProgress = 0;
169 std::atomic<int64_t> m_readersIdleTimeNs{0};
170 std::atomic<int64_t> m_encodersIdleTimeNs{0};
171 std::atomic<int64_t> m_writerIdleTimeNs{0};
172 int m_numReaderThreads = 0;
173 int m_numEncoderThreads = 0;
Definition: exceptions.hpp:15