83 auto *in_t = (load_t *) in;
85 for (
unsigned i = 0; i <
sizeof src_u32 /
sizeof src_u32[0]; ++i) {
86 static_assert(
sizeof(load_t) == 2 ||
sizeof(load_t) == 4,
87 "Just uint{16,32} supported!");
88 if (
sizeof(load_t) == 4) {
91 src_u32[i] = in_t[2 * i] | in_t[2 * i + 1] << 16;
96 auto *dst = (uint8_t *) dst_u32;
97 auto *src = (uint8_t *) src_u32;
100 dst[0] = src[0] >> 4;
101 dst[0] |= src[1] << 4;
102 dst[1] = src[1] >> 4;
105 dst[1] |= src[0] & 0xF0;
109 dst[3] = src[0] >> 4;
110 dst[3] |= src[1] << 4;
111 dst[4 + 0] = src[1] >> 4;
115 dst[4 + 0] |= src[0] & 0xF0;
119 dst[4 + 2] = src[0] >> 4;
120 dst[4 + 2] |= src[1] << 4;
121 dst[4 + 3] = src[1] >> 4;
124 dst[4 + 3] |= src[0] & 0xF0;
129 dst[8 + 1] = src[0] >> 4;
130 dst[8 + 1] |= src[1] << 4;
131 dst[8 + 2] = src[1] >> 4;
134 dst[8 + 2] |= src[0] & 0xF0;
138 dst[12 + 0] = src[0] >> 4;
139 dst[12 + 0] |= src[1] << 4;
140 dst[12 + 1] = src[1] >> 4;
144 dst[12 + 1] |= src[0] & 0xF0;
145 dst[12 + 2] = src[1];
148 dst[12 + 3] = src[0] >> 4;
149 dst[12 + 3] |= src[1] << 4;
150 dst[16 + 0] = src[1] >> 4;
153 dst[16 + 0] |= src[0] & 0xF0;
154 dst[16 + 1] = src[1];
158 dst[16 + 2] = src[0] >> 4;
159 dst[16 + 2] |= src[1] << 4;
160 dst[16 + 3] = src[1] >> 4;
163 dst[16 + 3] |= src[0] & 0xF0;
164 dst[20 + 0] = src[1];
167 dst[20 + 1] = src[0] >> 4;
168 dst[20 + 1] |= src[1] << 4;
169 dst[20 + 2] = src[1] >> 4;
173 dst[20 + 2] |= src[0] & 0xF0;
174 dst[20 + 3] = src[1];
177 dst[24 + 0] = src[0] >> 4;
178 dst[24 + 0] |= src[1] << 4;
179 dst[24 + 1] = src[1] >> 4;
182 dst[24 + 1] |= src[0] & 0xF0;
183 dst[24 + 2] = src[1];
187 dst[24 + 3] = src[0] >> 4;
188 dst[24 + 3] |= src[1] << 4;
189 dst[28 + 0] = src[1] >> 4;
192 dst[28 + 0] |= src[0] & 0xF0;
193 dst[28 + 1] = src[1];
196 dst[28 + 2] = src[0] >> 4;
197 dst[28 + 2] |= src[1] << 4;
198 dst[28 + 3] = src[1] >> 4;
202 dst[28 + 3] |= src[0] & 0xF0;
203 dst[32 + 0] = src[1];
206 dst[32 + 1] = src[0] >> 4;
207 dst[32 + 1] |= src[1] << 4;
208 dst[32 + 2] = src[1] >> 4;
211 dst[32 + 2] |= src[0] & 0xF0;
212 dst[32 + 3] = src[1];
216 auto *out_u32 = (uint32_t *) out;
217 for (
unsigned i = 0; i <
sizeof dst_u32 /
sizeof dst_u32[0]; ++i) {
218 out_u32[i] = dst_u32[i];
240 unsigned position_x = threadIdx.x + blockIdx.x * blockDim.x;
241 unsigned position_y = threadIdx.y + blockIdx.y * blockDim.y;
242 if (position_x >= (size_x + 7) / 8) {
245 uint8_t *src = in + 2 * (position_y * 3 * size_x + position_x * 3 * 8);
247 out + (position_y * ((size_x + 7) / 8) + position_x) * 36;
250 if (position_x == size_x / 8) {
252 size_x - position_x * 8);
267 struct cmpto_j2k_dec_comp_format * ,
273 void * output_buffer,
277 cudaStream_t stream = (cudaStream_t) vstream;
278 dim3 threads_per_block(256);
279 dim3 blocks((((size_x + 7) / 8) + 255) / 256, size_y);
283 if (size_x % 2 == 0) {
285 <<<blocks, threads_per_block, 0, (cudaStream_t) stream>>>(
286 (uint8_t *) input_samples, (uint8_t *) output_buffer,
289 thread_local bool warn_print;
292 "%s: Odd width %d px will use slower kernel!\n",
297 <<<blocks, threads_per_block, 0, (cudaStream_t) stream>>>(
298 (uint8_t *) input_samples, (uint8_t *) output_buffer,
320 unsigned position_x = threadIdx.x + blockIdx.x * blockDim.x;
321 unsigned position_y = threadIdx.y + blockIdx.y * blockDim.y;
322 if (position_x >= (size_x + 7) / 8) {
325 uint8_t *dst = out + 2 * (position_y * 3 * size_x + position_x * 3 * 8);
327 in + (position_y * ((size_x + 7) / 8) + position_x) * 36;
329 if (position_x == size_x / 8) {
331 alignas(uint32_t) uint8_t tmp[48];
333 for (
unsigned i = 0; i < (size_x - position_x * 8) * 6; ++i) {
347 auto *in_u32 = (uint32_t *) in;
349 for (
unsigned i = 0; i <
sizeof src_u32 /
sizeof src_u32[0]; ++i) {
350 src_u32[i] = in_u32[i];
353 uint32_t dst_u32[12];
354 uint8_t *dst = (uint8_t *) dst_u32;
355 uint8_t *src = (uint8_t *) src_u32;
359 *dst++ = src[0] << 4;
360 *dst++ = (src[1] << 4) | (src[0] >> 4);
362 *dst++ = src[1] & 0xF0;
365 *dst++ = src[3] << 4;
366 *dst++ = (src[4 + 0] << 4) | (src[3] >> 4);
369 *dst++ = src[4 + 0] & 0xF0;
372 *dst++ = src[4 + 2] << 4;
373 *dst++ = (src[4 + 3] << 4) | (src[4 + 2] >> 4);
375 *dst++ = src[4 + 3] & 0xF0;
379 *dst++ = src[8 + 1] << 4;
380 *dst++ = (src[8 + 2] << 4) | (src[8 + 1] >> 4);
382 *dst++ = src[8 + 2] & 0xF0;
385 *dst++ = src[12 + 0] << 4;
386 *dst++ = (src[12 + 1] << 4) | (src[12 + 0] >> 4);
389 *dst++ = src[12 + 1] & 0xF0;
390 *dst++ = src[12 + 2];
392 *dst++ = src[12 + 3] << 4;
393 *dst++ = (src[16 + 0] << 4) | (src[12 + 3] >> 4);
395 *dst++ = src[16 + 0] & 0xF0;
396 *dst++ = src[16 + 1];
399 *dst++ = src[16 + 2] << 4;
400 *dst++ = (src[16 + 3] << 4) | (src[16 + 2] >> 4);
402 *dst++ = src[16 + 3] & 0xF0;
403 *dst++ = src[20 + 0];
405 *dst++ = src[20 + 1] << 4;
406 *dst++ = (src[20 + 2] << 4) | (src[20 + 1] >> 4);
409 *dst++ = src[20 + 2] & 0xF0;
410 *dst++ = src[20 + 3];
412 *dst++ = src[24 + 0] << 4;
413 *dst++ = (src[24 + 1] << 4) | (src[24 + 0] >> 4);
415 *dst++ = src[24 + 1] & 0xF0;
416 *dst++ = src[24 + 2];
419 *dst++ = src[24 + 3] << 4;
420 *dst++ = (src[28 + 0] << 4) | (src[24 + 3] >> 4);
422 *dst++ = src[28 + 0] & 0xF0;
423 *dst++ = src[28 + 1];
425 *dst++ = src[28 + 2] << 4;
426 *dst++ = (src[28 + 3] << 4) | (src[28 + 2] >> 4);
429 *dst++ = src[28 + 3] & 0xF0;
430 *dst++ = src[32 + 0];
432 *dst++ = src[32 + 1] << 4;
433 *dst++ = (src[32 + 2] << 4) | (src[32 + 1] >> 4);
435 *dst++ = src[32 + 2] & 0xF0;
436 *dst++ = src[32 + 3];
439 auto *out_t = (store_t *) out;
440 for (
unsigned i = 0; i <
sizeof dst_u32 /
sizeof dst_u32[0]; ++i) {
441 static_assert(
sizeof(store_t) == 2 ||
sizeof(store_t) == 4,
442 "Just uint{16,32} supported!");
443 if (
sizeof(store_t) == 4) {
444 out_t[i] = dst_u32[i];
446 out_t[2 * i] = dst_u32[i] & 0xFFFFU;
447 out_t[2 * i + 1] = dst_u32[i] >> 16;
454 size_t img_custom_data_size,
int size_x,
int size_y,
455 struct cmpto_j2k_enc_comp_format *comp_formats,
456 int comp_count,
void *input_samples,
457 size_t input_samples_size,
void *output_samples,
458 size_t output_samples_size,
void *vstream)
460 (void) preprocessor, (
void) img_custom_data,
461 (void) img_custom_data_size, (
void) comp_formats, (void) comp_count,
462 (
void) input_samples_size, (void) output_samples_size;
464 cudaStream_t stream = (cudaStream_t) vstream;
465 dim3 threads_per_block(256);
466 dim3 blocks((((size_x+ 7) / 8) + 255) / 256, size_y);
469 if (size_x % 2 == 0) {
471 <<<blocks, threads_per_block, 0, stream>>>(
472 (uint8_t *) input_samples, (uint8_t *) output_samples,
475 thread_local bool warn_print;
478 "%s: Odd width %d px will use slower kernel!\n",
483 <<<blocks, threads_per_block, 0, stream>>>(
484 (uint8_t *) input_samples, (uint8_t *) output_samples,
int preprocess_r12l_to_rg48(void *preprocessor, void *img_custom_data, size_t img_custom_data_size, int size_x, int size_y, struct cmpto_j2k_enc_comp_format *comp_formats, int comp_count, void *input_samples, size_t input_samples_size, void *output_samples, size_t output_samples_size, void *vstream)
int postprocess_rg48_to_r12l(void *, void *, size_t, int size_x, int size_y, struct cmpto_j2k_dec_comp_format *, int, void *input_samples, size_t, void *, size_t, void *output_buffer, size_t, void *vstream)