/** Documented at declaration */ void gpujpeg_image_convert(const char* input, const char* output, struct gpujpeg_image_parameters param_image_from, struct gpujpeg_image_parameters param_image_to) { assert(param_image_from.width == param_image_to.width); assert(param_image_from.height == param_image_to.height); assert(param_image_from.comp_count == param_image_to.comp_count); // Load image int image_size = gpujpeg_image_calculate_size(¶m_image_from); uint8_t* image = NULL; if ( gpujpeg_image_load_from_file(input, &image, &image_size) != 0 ) { fprintf(stderr, "[GPUJPEG] [Error] Failed to load image [%s]!\n", input); return; } struct gpujpeg_coder coder; gpujpeg_set_default_parameters(&coder.param); coder.param.color_space_internal = GPUJPEG_RGB; // Initialize coder and preprocessor coder.param_image = param_image_from; assert(gpujpeg_coder_init(&coder) == 0); assert(gpujpeg_preprocessor_encoder_init(&coder) == 0); // Perform preprocessor assert(cudaMemcpy(coder.d_data_raw, image, coder.data_raw_size * sizeof(uint8_t), cudaMemcpyHostToDevice) == cudaSuccess); assert(gpujpeg_preprocessor_encode(&coder) == 0); // Save preprocessor result uint8_t* buffer = NULL; assert(cudaMallocHost((void**)&buffer, coder.data_size * sizeof(uint8_t)) == cudaSuccess); assert(buffer != NULL); assert(cudaMemcpy(buffer, coder.d_data, coder.data_size * sizeof(uint8_t), cudaMemcpyDeviceToHost) == cudaSuccess); // Deinitialize decoder gpujpeg_coder_deinit(&coder); // Initialize coder and postprocessor coder.param_image = param_image_to; assert(gpujpeg_coder_init(&coder) == 0); assert(gpujpeg_preprocessor_decoder_init(&coder) == 0); // Perform postprocessor assert(cudaMemcpy(coder.d_data, buffer, coder.data_size * sizeof(uint8_t), cudaMemcpyHostToDevice) == cudaSuccess); assert(gpujpeg_preprocessor_decode(&coder) == 0); // Save preprocessor result assert(cudaMemcpy(coder.data_raw, coder.d_data_raw, coder.data_raw_size * sizeof(uint8_t), cudaMemcpyDeviceToHost) == cudaSuccess); if ( gpujpeg_image_save_to_file(output, coder.data_raw, coder.data_raw_size) != 0 ) { fprintf(stderr, "[GPUJPEG] [Error] Failed to save image [%s]!\n", output); return; } // Deinitialize decoder gpujpeg_coder_deinit(&coder); }
/** Documented at declaration */ int gpujpeg_encoder_destroy(struct gpujpeg_encoder* encoder) { assert(encoder != NULL); GPUJPEG_CUSTOM_TIMER_DESTROY(encoder->def); GPUJPEG_CUSTOM_TIMER_DESTROY(encoder->in_gpu); if ( gpujpeg_coder_deinit(&encoder->coder) != 0 ) return -1; for ( int comp_type = 0; comp_type < GPUJPEG_COMPONENT_TYPE_COUNT; comp_type++ ) { if ( encoder->table_quantization[comp_type].d_table != NULL ) cudaFree(encoder->table_quantization[comp_type].d_table); } if ( encoder->writer != NULL ) gpujpeg_writer_destroy(encoder->writer); free(encoder); return 0; }