11/*
2- * Copyright (c) 2011-2024 , CESNET
2+ * Copyright (c) 2011-2025 , CESNET
33 * Copyright (c) 2011, Silicon Genome, LLC.
44 *
55 * All rights reserved.
3333 * computational kernels. It also does color space transformations.
3434 */
3535
36- #include " gpujpeg_colorspace.h "
36+ #define PREPROCESSOR_INTERNAL_API
3737#include " gpujpeg_preprocessor_common.cuh"
38+
39+ #include " gpujpeg_colorspace.h"
3840#include " gpujpeg_preprocessor.h"
3941#include " gpujpeg_util.h"
4042
@@ -325,30 +327,39 @@ gpujpeg_preprocessor_encode_no_transform(struct gpujpeg_coder *coder)
325327int
326328gpujpeg_preprocessor_encoder_init (struct gpujpeg_coder * coder)
327329{
328- coder->preprocessor = NULL ;
330+ coder->preprocessor .kernel = nullptr ;
331+ struct gpujpeg_preprocessor_data *data = &coder->preprocessor .data ;
332+ for ( int comp = 0 ; comp < coder->param .comp_count ; comp++ ) {
333+ assert (coder->sampling_factor .horizontal % coder->component [comp].sampling_factor .horizontal == 0 );
334+ assert (coder->sampling_factor .vertical % coder->component [comp].sampling_factor .vertical == 0 );
335+ data->comp [comp].d_data = coder->component [comp].d_data ;
336+ data->comp [comp].sampling_factor .horizontal = coder->sampling_factor .horizontal / coder->component [comp].sampling_factor .horizontal ;
337+ data->comp [comp].sampling_factor .vertical = coder->sampling_factor .vertical / coder->component [comp].sampling_factor .vertical ;
338+ data->comp [comp].data_width = coder->component [comp].data_width ;
339+ }
329340
330341 if ( gpujpeg_preprocessor_encode_no_transform (coder) ) {
331342 DEBUG_MSG (coder->param .verbose , " Matching format detected - not using preprocessor, using memcpy instead.\n " );
332343 return 0 ;
333344 }
334345
335346 if (coder->param .color_space_internal == GPUJPEG_NONE) {
336- coder->preprocessor = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_NONE>(coder);
347+ coder->preprocessor . kernel = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_NONE>(coder);
337348 }
338349 else if (coder->param .color_space_internal == GPUJPEG_RGB) {
339- coder->preprocessor = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_RGB>(coder);
350+ coder->preprocessor . kernel = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_RGB>(coder);
340351 }
341352 else if (coder->param .color_space_internal == GPUJPEG_YCBCR_BT601) {
342- coder->preprocessor = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_YCBCR_BT601>(coder);
353+ coder->preprocessor . kernel = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_YCBCR_BT601>(coder);
343354 }
344355 else if (coder->param .color_space_internal == GPUJPEG_YCBCR_BT601_256LVLS) {
345- coder->preprocessor = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_YCBCR_BT601_256LVLS>(coder);
356+ coder->preprocessor . kernel = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_YCBCR_BT601_256LVLS>(coder);
346357 }
347358 else if (coder->param .color_space_internal == GPUJPEG_YCBCR_BT709) {
348- coder->preprocessor = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_YCBCR_BT709>(coder);
359+ coder->preprocessor . kernel = (void *)gpujpeg_preprocessor_select_encode_kernel<GPUJPEG_YCBCR_BT709>(coder);
349360 }
350361
351- if ( coder->preprocessor == NULL ) {
362+ if ( coder->preprocessor . kernel == NULL ) {
352363 return -1 ;
353364 }
354365
@@ -361,7 +372,7 @@ gpujpeg_preprocessor_encode_interlaced(struct gpujpeg_encoder * encoder)
361372 struct gpujpeg_coder * coder = &encoder->coder ;
362373
363374 // Select kernel
364- gpujpeg_preprocessor_encode_kernel kernel = (gpujpeg_preprocessor_encode_kernel) coder->preprocessor ;
375+ gpujpeg_preprocessor_encode_kernel kernel = (gpujpeg_preprocessor_encode_kernel) coder->preprocessor . kernel ;
365376 assert (kernel != NULL );
366377
367378 int image_width = coder->param_image .width ;
@@ -395,17 +406,8 @@ gpujpeg_preprocessor_encode_interlaced(struct gpujpeg_encoder * encoder)
395406 gpujpeg_const_div_prepare (image_width, width_div_mul, width_div_shift);
396407
397408 // Run kernel
398- struct gpujpeg_preprocessor_data data;
399- for ( int comp = 0 ; comp < coder->param .comp_count ; comp++ ) {
400- assert (coder->sampling_factor .horizontal % coder->component [comp].sampling_factor .horizontal == 0 );
401- assert (coder->sampling_factor .vertical % coder->component [comp].sampling_factor .vertical == 0 );
402- data.comp [comp].d_data = coder->component [comp].d_data ;
403- data.comp [comp].sampling_factor .horizontal = coder->sampling_factor .horizontal / coder->component [comp].sampling_factor .horizontal ;
404- data.comp [comp].sampling_factor .vertical = coder->sampling_factor .vertical / coder->component [comp].sampling_factor .vertical ;
405- data.comp [comp].data_width = coder->component [comp].data_width ;
406- }
407409 kernel<<<grid, threads, 0 , encoder->stream>>> (
408- data,
410+ coder-> preprocessor . data ,
409411 coder->d_data_raw ,
410412 coder->param_image .width_padding ,
411413 image_width,
@@ -465,8 +467,10 @@ gpujpeg_preprocessor_encode(struct gpujpeg_encoder * encoder)
465467{
466468 struct gpujpeg_coder * coder = &encoder->coder ;
467469 // / @todo support padding for other formats
468- assert (!coder->param_image .width_padding || (coder->param_image .pixel_format == GPUJPEG_444_U8_P012 && coder->preprocessor ));
469- if (coder->preprocessor ) {
470+ assert (!coder->param_image .width_padding ||
471+ (coder->param_image .pixel_format == GPUJPEG_444_U8_P012 && coder->preprocessor .kernel != nullptr ));
472+
473+ if (coder->preprocessor .kernel != nullptr ) {
470474 return gpujpeg_preprocessor_encode_interlaced (encoder);
471475 } else {
472476 return gpujpeg_preprocessor_encoder_copy_planar_data (encoder);
0 commit comments