37 void deinterleave_v(int32_t *a, int32_t *b, uint32_t d_n, uint32_t s_n,
38 uint32_t stride, int32_t parity);
44 void deinterleave_h(int32_t *a, int32_t *b, uint32_t d_n, uint32_t s_n,
53 uint32_t stride, int32_t parity) {
56 int32_t *src = a + parity;
64 dest = b + s_n * stride;
81 int32_t *src = a + parity;
83 for (uint32_t i = 0; i < s_n; ++i) {
91 for (uint32_t i = 0; i < d_n; ++i) {
110 GRK_ERROR(
"WaveletFwdImpl compress: overflow");
117 uint32_t rw,rh,rw_next,rh_next;
118 uint8_t cas_row,cas_col;
123 auto next_res = cur_res - 1;
127 bj_array[i] =
nullptr;
137 for (uint32_t decompno = 0; decompno < num_decomps; ++decompno) {
140 rw = cur_res->x1 - cur_res->x0;
142 rh = cur_res->y1 - cur_res->y0;
144 rw_next = next_res->x1 - next_res->x0;
146 rh_next = next_res->y1 - next_res->y0;
149 cas_row = cur_res->x0 & 1;
151 cas_col = cur_res->y0 & 1;
155 const uint32_t linesPerThreadV =
static_cast<uint32_t
>(std::ceil((
float)rw / (
float)
ThreadPool::get()->num_threads()));
156 const uint32_t s_n = rh_next;
157 const uint32_t d_n = rh - rh_next;
160 for (
auto m = 0U;m < std::min<uint32_t>(linesPerThreadV, rw); ++m) {
161 auto bj = bj_array[0];
163 for (uint32_t k = 0; k < rh; ++k)
164 bj[k] = aj[k * stride];
165 wavelet.compress_line(bj, (int32_t)d_n, (int32_t)s_n, cas_col);
166 deinterleave_v(bj, aj, d_n, s_n, stride, cas_col);
169 std::vector< std::future<int> > results;
172 results.emplace_back(
178 for (uint32_t m = index * linesPerThreadV;
179 m < std::min<uint32_t>((index+1)*linesPerThreadV, rw); ++m) {
180 auto bj = bj_array[index];
182 for (uint32_t k = 0; k < rh; ++k)
183 bj[k] = aj[k * stride];
184 wavelet.compress_line(bj, (int32_t)d_n, (int32_t)s_n, cas_col);
185 deinterleave_v(bj, aj, d_n, s_n, stride, cas_col);
191 for(
auto &result: results)
198 const uint32_t s_n = rw_next;
199 const uint32_t d_n = rw - rw_next;
200 const uint32_t linesPerThreadH =
static_cast<uint32_t
>(std::ceil((
float)rh / (
float)
ThreadPool::get()->num_threads()));
203 for (
auto m = 0U;m < std::min<uint32_t>(linesPerThreadH, rh); ++m) {
204 auto bj = bj_array[0];
205 auto aj = a + m * stride;
206 memcpy(bj,aj,rw << 2);
207 wavelet.compress_line(bj, (int32_t)d_n, (int32_t)s_n, cas_row);
208 deinterleave_h(bj, aj, d_n, s_n, cas_row);
212 std::vector< std::future<int> > results;
215 results.emplace_back(
221 for (
auto m = index * linesPerThreadH;
222 m < std::min<uint32_t>((index+1)*linesPerThreadH, rh); ++m) {
223 int32_t *bj = bj_array[index];
224 int32_t *aj = a + m * stride;
225 memcpy(bj,aj,rw << 2);
226 wavelet.compress_line(bj, (int32_t)d_n, (int32_t)s_n, cas_row);
227 deinterleave_h(bj, aj, d_n, s_n, cas_row);
233 for(
auto &result: results)
#define SIZE_MAX
Definition: MemManager.cpp:33
auto enqueue(F &&f, Args &&... args) -> std::future< typename std::invoke_result< F, Args... >::type >
Definition: ThreadPool.hpp:151
size_t num_threads()
Definition: ThreadPool.hpp:49
static ThreadPool * get()
Definition: ThreadPool.hpp:51
Definition: WaveletFwd.h:25
void deinterleave_h(int32_t *a, int32_t *b, uint32_t d_n, uint32_t s_n, int32_t parity)
Definition: WaveletFwd.h:78
void deinterleave_v(int32_t *a, int32_t *b, uint32_t d_n, uint32_t s_n, uint32_t stride, int32_t parity)
Definition: WaveletFwd.h:52
bool run(TileComponent *tilec)
Forward wavelet transform in 2-D.
Definition: WaveletFwd.h:102
Copyright (C) 2016-2021 Grok Image Compression Inc.
Definition: BitIO.cpp:23
void GRK_ERROR(const char *fmt,...)
Definition: logger.cpp:57
void * grk_aligned_malloc(size_t size)
Allocate memory aligned to a 16 byte boundary.
Definition: MemManager.cpp:119
uint32_t max_resolution(Resolution *GRK_RESTRICT r, uint32_t i)
Definition: WaveletReverse.cpp:33
void grk_aligned_free(void *ptr)
Definition: MemManager.cpp:123
Definition: TileComponent.h:30
uint8_t numresolutions
Definition: TileComponent.h:57
TileComponentWindowBuffer< int32_t > * getBuffer() const
Definition: TileComponent.cpp:312
Resolution * resolutions
Definition: TileComponent.h:56
const grk_buffer_2d< T > * getWindow(uint8_t resno, eBandOrientation orientation) const
Get non-LL band window.
Definition: TileComponentWindowBuffer.h:333