libheif/plugins/encoder_uncompressed.cc (220 lines of code) (raw):

/* * HEIF codec. * Copyright (c) 2017 Dirk Farin <dirk.farin@gmail.com> * * This file is part of libheif. * * libheif is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * libheif is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libheif. If not, see <http://www.gnu.org/licenses/>. */ #include "encoder_uncompressed.h" #include "libheif/heif.h" #include "libheif/heif_plugin.h" #include <algorithm> #include <cstring> #include <cassert> #include <vector> #include <string> #include <memory> #include <mutex> static const char* kParam_interleave = "interleave"; static const int PLUGIN_PRIORITY = 60; static const char* plugin_name = "uncompressed"; static void uncompressed_set_default_parameters(void* encoder); static const char* uncompressed_plugin_name() { return plugin_name; } #define MAX_NPARAMETERS 14 static struct heif_encoder_parameter uncompressed_encoder_params[MAX_NPARAMETERS]; static const struct heif_encoder_parameter* uncompressed_encoder_parameter_ptrs[MAX_NPARAMETERS + 1]; static void uncompressed_init_parameters() { struct heif_encoder_parameter* p = uncompressed_encoder_params; const struct heif_encoder_parameter** d = uncompressed_encoder_parameter_ptrs; int i = 0; assert(i < MAX_NPARAMETERS); p->version = 2; p->name = kParam_interleave; p->type = heif_encoder_parameter_type_string; p->string.default_value = "planar"; p->has_default = true; d[i++] = p++; assert(i < MAX_NPARAMETERS + 1); d[i++] = nullptr; } const struct heif_encoder_parameter** uncompressed_list_parameters(void* encoder) { return uncompressed_encoder_parameter_ptrs; } static void uncompressed_init_plugin() { uncompressed_init_parameters(); } static void uncompressed_cleanup_plugin() { } struct heif_error uncompressed_new_encoder(void** enc) { struct encoder_struct_uncompressed* encoder = new encoder_struct_uncompressed(); struct heif_error err = heif_error_ok; *enc = encoder; // set default parameters uncompressed_set_default_parameters(encoder); return err; } void uncompressed_free_encoder(void* encoder_raw) { struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; delete encoder; } struct heif_error uncompressed_set_parameter_quality(void* encoder_raw, int quality) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; return heif_error_ok; } struct heif_error uncompressed_get_parameter_quality(void* encoder_raw, int* quality) { *quality = 100; return heif_error_ok; } struct heif_error uncompressed_set_parameter_lossless(void* encoder_raw, int enable) { return heif_error_ok; } struct heif_error uncompressed_get_parameter_lossless(void* encoder_raw, int* enable) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; *enable = true; return heif_error_ok; } struct heif_error uncompressed_set_parameter_logging_level(void* encoder_raw, int logging) { #if 0 struct encoder_struct_x265* encoder = (struct encoder_struct_x265*)encoder_raw; if (logging<0 || logging>4) { return heif_error_invalid_parameter_value; } encoder->logLevel = logging; #endif return heif_error_ok; } struct heif_error uncompressed_get_parameter_logging_level(void* encoder_raw, int* loglevel) { #if 0 struct encoder_struct_x265* encoder = (struct encoder_struct_x265*)encoder_raw; *loglevel = encoder->logLevel; #else *loglevel = 0; #endif return heif_error_ok; } #define set_value(paramname, paramvar) if (strcmp(name, paramname)==0) { encoder->paramvar = value; return heif_error_ok; } #define get_value(paramname, paramvar) if (strcmp(name, paramname)==0) { *value = encoder->paramvar; return heif_error_ok; } struct heif_error uncompressed_set_parameter_integer(void* encoder_raw, const char* name, int value) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error uncompressed_get_parameter_integer(void* encoder_raw, const char* name, int* value) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error uncompressed_set_parameter_boolean(void* encoder_raw, const char* name, int value) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error uncompressed_get_parameter_boolean(void* encoder_raw, const char* name, int* value) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error uncompressed_set_parameter_string(void* encoder_raw, const char* name, const char* value) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error uncompressed_get_parameter_string(void* encoder_raw, const char* name, char* value, int value_size) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; return heif_error_unsupported_parameter; } static void uncompressed_set_default_parameters(void* encoder) { for (const struct heif_encoder_parameter** p = uncompressed_encoder_parameter_ptrs; *p; p++) { const struct heif_encoder_parameter* param = *p; if (param->has_default) { switch (param->type) { case heif_encoder_parameter_type_integer: uncompressed_set_parameter_integer(encoder, param->name, param->integer.default_value); break; case heif_encoder_parameter_type_boolean: uncompressed_set_parameter_boolean(encoder, param->name, param->boolean.default_value); break; case heif_encoder_parameter_type_string: uncompressed_set_parameter_string(encoder, param->name, param->string.default_value); break; } } } } void uncompressed_query_input_colorspace(heif_colorspace* colorspace, heif_chroma* chroma) { //*colorspace = heif_colorspace_YCbCr; //*chroma = heif_chroma_420; } void uncompressed_query_input_colorspace2(void* encoder_raw, heif_colorspace* colorspace, heif_chroma* chroma) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; if (*colorspace == heif_colorspace_monochrome) { // keep the monochrome colorspace } else { //*colorspace = heif_colorspace_YCbCr; //*chroma = encoder->chroma; } } struct heif_error uncompressed_encode_image(void* encoder_raw, const struct heif_image* image, heif_image_input_class input_class) { //struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; // Note: this is not used. It is a dummy plugin. return heif_error_ok; } struct heif_error uncompressed_get_compressed_data(void* encoder_raw, uint8_t** data, int* size, enum heif_encoded_data_type* type) { #if 0 struct encoder_struct_uncompressed* encoder = (struct encoder_struct_uncompressed*) encoder_raw; if (encoder->data_read) { *size = 0; *data = nullptr; } else { *size = (int) encoder->compressedData.size(); *data = encoder->compressedData.data(); encoder->data_read = true; } #endif return heif_error_ok; } static const struct heif_encoder_plugin encoder_plugin_uncompressed { /* plugin_api_version */ 3, /* compression_format */ heif_compression_uncompressed, /* id_name */ "uncompressed", /* priority */ PLUGIN_PRIORITY, /* supports_lossy_compression */ true, /* supports_lossless_compression */ true, /* get_plugin_name */ uncompressed_plugin_name, /* init_plugin */ uncompressed_init_plugin, /* cleanup_plugin */ uncompressed_cleanup_plugin, /* new_encoder */ uncompressed_new_encoder, /* free_encoder */ uncompressed_free_encoder, /* set_parameter_quality */ uncompressed_set_parameter_quality, /* get_parameter_quality */ uncompressed_get_parameter_quality, /* set_parameter_lossless */ uncompressed_set_parameter_lossless, /* get_parameter_lossless */ uncompressed_get_parameter_lossless, /* set_parameter_logging_level */ uncompressed_set_parameter_logging_level, /* get_parameter_logging_level */ uncompressed_get_parameter_logging_level, /* list_parameters */ uncompressed_list_parameters, /* set_parameter_integer */ uncompressed_set_parameter_integer, /* get_parameter_integer */ uncompressed_get_parameter_integer, /* set_parameter_boolean */ uncompressed_set_parameter_boolean, /* get_parameter_boolean */ uncompressed_get_parameter_boolean, /* set_parameter_string */ uncompressed_set_parameter_string, /* get_parameter_string */ uncompressed_get_parameter_string, /* query_input_colorspace */ uncompressed_query_input_colorspace, /* encode_image */ uncompressed_encode_image, /* get_compressed_data */ uncompressed_get_compressed_data, /* query_input_colorspace (v2) */ uncompressed_query_input_colorspace2, /* query_encoded_size (v3) */ nullptr }; const struct heif_encoder_plugin* get_encoder_plugin_uncompressed() { return &encoder_plugin_uncompressed; } #if 0 // PLUGIN_uncompressed_ENCODER heif_plugin_info plugin_info { 1, heif_plugin_type_encoder, &encoder_plugin_uncompressed }; #endif