22#include <condition_variable>
52 std::optional<Rect16> tileSubRegion = std::nullopt)
57 uint32_t imageWidth = imageBounds.
x1 - imageBounds.
x0;
58 uint32_t imageHeight = imageBounds.
y1 - imageBounds.
y0;
60 if(imageWidth == 0 || imageHeight == 0 || tileWidth == 0 || tileHeight == 0)
61 throw std::invalid_argument(
"Dimensions must be positive");
63 numTileCols_ =
static_cast<uint16_t
>(((uint64_t)imageWidth + tileWidth - 1) / tileWidth);
64 numTileRows_ =
static_cast<uint16_t
>(((uint64_t)imageHeight + tileHeight - 1) / tileHeight);
67 if(tileSubRegion.has_value())
69 tileX0_ = tileSubRegion->x0;
70 tileX1_ = tileSubRegion->x1;
71 tileY0_ = tileSubRegion->y0;
72 tileY1_ = tileSubRegion->y1;
77 tileX1_ = numTileCols_;
79 tileY1_ = numTileRows_;
84 throw std::invalid_argument(
"Invalid tile range");
98 grklog.debug(
"Image bounds: x0=%u, y0=%u, x1=%u, y1=%u, tileWidth=%u, tileHeight=%u",
109 if(tileX < tileX0_ || tileX >=
tileX1_ || tileY < tileY0_ || tileY >=
tileY1_)
113 uint16_t localX =
static_cast<uint16_t
>(tileX -
tileX0_);
114 uint16_t localY =
static_cast<uint16_t
>(tileY -
tileY0_);
115 uint16_t localIndex =
static_cast<uint16_t
>(localY *
subregionWidth_ + localX);
117 bool shouldCallback =
false;
118 uint16_t cbBegin = 0, cbEnd = 0;
121 std::lock_guard<std::mutex> lock(
mutex_);
126 grklog.debug(
"Tile %d (local %d, tileX=%u, tileY=%u) completed", tileIndex, localIndex,
132 shouldCallback =
true;
135 grklog.debug(
"Row %u completed, indices %u up to %u", tileY, cbBegin, cbEnd);
138 auto popped =
heap_.push_and_pop(localIndex);
139 if(popped.has_value())
151 grklog.debug(
"Tile %d (local %d, tileX=%u, tileY=%u) already completed", tileIndex,
152 localIndex, tileX, tileY);
164 uint32_t x0 = swath->
x0;
165 uint32_t y0 = swath->
y0;
166 uint32_t x1 = swath->
x1;
167 uint32_t y1 = swath->
y1;
169 bool shouldNotifyRelease =
false;
171 grklog.debug(
"Swath canvas: x0=%u, y0=%u, x1=%u, y1=%u", x0, y0, x1, y1);
181 grklog.debug(
"Invalid swath bounds: x0=%u, y0=%u, x1=%u, y1=%u", x0, y0, x1, y1);
197 if(x0Div > UINT16_MAX || y0Div > UINT16_MAX || x1Div > UINT16_MAX || y1Div > UINT16_MAX)
204 grklog.debug(
"Tile coordinate overflow: x0Div=%u, y0Div=%u, x1Div=%u, y1Div=%u", x0Div, y0Div,
210 uint16_t tileX0 = std::max(
tileX0_,
static_cast<uint16_t
>(x0Div));
211 uint16_t tileY0 = std::max(
tileY0_,
static_cast<uint16_t
>(y0Div));
212 uint16_t tileX1 = std::min(
tileX1_,
static_cast<uint16_t
>(x1Div + 1));
213 uint16_t tileY1 = std::min(
tileY1_,
static_cast<uint16_t
>(y1Div + 1));
215 grklog.debug(
"Computed tile coords: x0Div=%u, y0Div=%u, x1Div=%u, y1Div=%u", x0Div, y0Div,
217 grklog.debug(
"Constrained tile coords: tileX0=%u, tileY0=%u, tileX1=%u, tileY1=%u", tileX0,
218 tileY0, tileX1, tileY1);
228 neededTileY1_.store(
static_cast<int32_t
>(tileY1), std::memory_order_release);
232 std::lock_guard<std::mutex> lock(
mutex_);
236 for(uint16_t clearTileY =
static_cast<uint16_t
>(
238 clearTileY < tileY0; ++clearTileY)
242 uint32_t tileIndexCalc =
static_cast<uint32_t
>(clearTileY) *
numTileCols_ + tileX;
243 if(tileIndexCalc > UINT16_MAX)
245 uint16_t tileIndex =
static_cast<uint16_t
>(tileIndexCalc);
246 uint16_t localX = tileX -
tileX0_;
247 uint16_t localY = clearTileY -
tileY0_;
250 uint16_t localIndex =
static_cast<uint16_t
>(localY *
subregionWidth_ + localX);
254 "Clearing ITileProcessor at tile index %d (local %d, tileX=%u, tileY=%u)",
255 tileIndex, localIndex, tileX, clearTileY);
263 shouldNotifyRelease =
true;
271 if(shouldNotifyRelease)
279 std::vector<uint16_t> swathIndices;
280 for(uint16_t tileY = tileY0; tileY < tileY1; ++tileY)
282 for(uint16_t tileX = tileX0; tileX < tileX1; ++tileX)
284 uint16_t localX = tileX -
tileX0_;
285 uint16_t localY = tileY -
tileY0_;
286 uint16_t localIndex =
static_cast<uint16_t
>(localY *
subregionWidth_ + localX);
287 swathIndices.push_back(localIndex);
290 uint16_t localEnd = swathIndices.empty() ? 0 : swathIndices.back();
294 std::unique_lock<std::mutex> lock(
mutex_);
295 auto allCompleted = [&]() {
296 for(uint16_t idx : swathIndices)
306 "Waiting for swath ending at tile %d (local %d), tiles: x0=%d, y0=%d, x1=%d, y1=%d",
307 (tileY1 - 1) *
numTileCols_ + (tileX1 - 1), localEnd, tileX0, tileY0, tileX1, tileY1);
316 "No waiting for swath ending at tile %d (local %d), tiles: x0=%d, y0=%d, x1=%d, y1=%d",
317 (tileY1 - 1) *
numTileCols_ + (tileX1 - 1), localEnd, tileX0, tileY0, tileX1, tileY1);
323 grklog.debug(
"Swath completed: tileX0=%d, tileY0=%d, tileX1=%d, tileY1=%d", swath->
tile_x0,
330 std::lock_guard<std::mutex> lock(
mutex_);
336 std::lock_guard<std::mutex> lock(
mutex_);
static void releaseFreedPages()
Definition MemManager.h:63
A simple non-thread-safe min-heap for tracking contiguous sequences of size_t indices.
Definition MinHeap.h:34
Caches tile processors so that repeated decompress calls on the same codec can reuse SOT metadata,...
Definition TileCache.h:108
uint16_t subregionHeight_
Definition TileCompletion.h:363
RowsReleasedCallback rowsReleasedCallback_
Definition TileCompletion.h:368
TileCompletion(TileCache *tileCache, const Rect32 &imageBounds, uint32_t tileWidth, uint32_t tileHeight, RowCompletionCallback callback, RowsReleasedCallback rowsReleasedCallback=nullptr, std::optional< Rect16 > tileSubRegion=std::nullopt)
Definition TileCompletion.h:49
bool wait(grk_wait_swath *swath)
Definition TileCompletion.h:162
uint16_t numTileRows_
Definition TileCompletion.h:359
uint32_t tileWidth_
Definition TileCompletion.h:360
void setLastClearedTileY(int32_t val)
Definition TileCompletion.h:334
uint16_t currentTileY_
Definition TileCompletion.h:364
std::vector< uint16_t > completedTilesPerRow_
Definition TileCompletion.h:354
uint16_t subregionWidth_
Definition TileCompletion.h:363
int32_t getLastClearedTileY() const
Definition TileCompletion.h:328
RowCompletionCallback rowCallback_
Definition TileCompletion.h:367
int32_t localWaitEnd_
Definition TileCompletion.h:355
int32_t lastClearedTileY_
Definition TileCompletion.h:365
SimpleHeap< uint16_t > heap_
Definition TileCompletion.h:352
uint16_t tileX1_
Definition TileCompletion.h:362
uint16_t tileY0_
Definition TileCompletion.h:362
std::atomic< int32_t > neededTileY1_
Definition TileCompletion.h:366
std::condition_variable completionCV_
Definition TileCompletion.h:358
uint32_t tileHeight_
Definition TileCompletion.h:360
Rect32 imageBounds_
Definition TileCompletion.h:361
std::function< void(uint16_t tileIndexBegin, uint16_t tileIndexEnd)> RowCompletionCallback
Definition TileCompletion.h:44
std::mutex mutex_
Definition TileCompletion.h:357
int32_t getNeededTileY1() const
Definition TileCompletion.h:340
uint16_t tileY1_
Definition TileCompletion.h:362
int32_t localContiguousEnd_
Definition TileCompletion.h:356
TileCache * tileCache_
Definition TileCompletion.h:351
std::vector< bool > completedTiles_
Definition TileCompletion.h:353
uint16_t getNumTileCols() const
Definition TileCompletion.h:345
std::function< void()> RowsReleasedCallback
Definition TileCompletion.h:46
void complete(uint16_t tileIndex)
Definition TileCompletion.h:103
uint16_t numTileCols_
Definition TileCompletion.h:359
uint16_t tileX0_
Definition TileCompletion.h:362
ResWindow.
Definition CompressedChunkCache.h:36
ILogger & grklog
Definition Logger.cpp:24
Rect< uint32_t > Rect32
Definition geometry.h:64
T x1
Definition geometry.h:192
T x0
Definition geometry.h:192
T y0
Definition geometry.h:192
T y1
Definition geometry.h:192
Specify swath region to wait on during asynchronous decompression.
Definition grok.h:1004
uint32_t y0
Input: Pixel coordinate: top-left y.
Definition grok.h:1006
uint16_t num_tile_cols
Output: Total tile columns in the image tile grid.
Definition grok.h:1013
uint32_t x1
Input: Pixel coordinate: bottom-right x (exclusive).
Definition grok.h:1007
uint32_t y1
Input: Pixel coordinate: bottom-right y (exclusive).
Definition grok.h:1008
uint16_t tile_y0
Output: Global tile row start (inclusive).
Definition grok.h:1010
uint16_t tile_y1
Output: Global tile row end (exclusive).
Definition grok.h:1012
uint16_t tile_x0
Output: Global tile column start (inclusive).
Definition grok.h:1009
uint16_t tile_x1
Output: Global tile column end (exclusive).
Definition grok.h:1011
uint32_t x0
Input: Pixel coordinate: top-left x.
Definition grok.h:1005