libheif/plugins/encoder_mask.cc (196 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_mask.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 = "mask"; static void mask_set_default_parameters(void* encoder); static const char* mask_plugin_name() { return plugin_name; } #define MAX_NPARAMETERS 14 static struct heif_encoder_parameter mask_encoder_params[MAX_NPARAMETERS]; static const struct heif_encoder_parameter* mask_encoder_parameter_ptrs[MAX_NPARAMETERS + 1]; static void mask_init_parameters() { struct heif_encoder_parameter* p = mask_encoder_params; const struct heif_encoder_parameter** d = mask_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** mask_list_parameters(void* encoder) { return mask_encoder_parameter_ptrs; } static void mask_init_plugin() { mask_init_parameters(); } static void mask_cleanup_plugin() { } struct heif_error mask_new_encoder(void** enc) { struct encoder_struct_mask* encoder = new encoder_struct_mask(); struct heif_error err = heif_error_ok; *enc = encoder; // set default parameters mask_set_default_parameters(encoder); return err; } void mask_free_encoder(void* encoder_raw) { struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; delete encoder; } struct heif_error mask_set_parameter_quality(void* encoder_raw, int quality) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; return heif_error_ok; } struct heif_error mask_get_parameter_quality(void* encoder_raw, int* quality) { *quality = 100; return heif_error_ok; } struct heif_error mask_set_parameter_lossless(void* encoder_raw, int enable) { return heif_error_ok; } struct heif_error mask_get_parameter_lossless(void* encoder_raw, int* enable) { *enable = true; return heif_error_ok; } struct heif_error mask_set_parameter_logging_level(void* encoder_raw, int logging) { return heif_error_ok; } struct heif_error mask_get_parameter_logging_level(void* encoder_raw, int* loglevel) { *loglevel = 0; 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 mask_set_parameter_integer(void* encoder_raw, const char* name, int value) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error mask_get_parameter_integer(void* encoder_raw, const char* name, int* value) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error mask_set_parameter_boolean(void* encoder_raw, const char* name, int value) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error mask_get_parameter_boolean(void* encoder_raw, const char* name, int* value) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error mask_set_parameter_string(void* encoder_raw, const char* name, const char* value) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; return heif_error_unsupported_parameter; } struct heif_error mask_get_parameter_string(void* encoder_raw, const char* name, char* value, int value_size) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; return heif_error_unsupported_parameter; } static void mask_set_default_parameters(void* encoder) { for (const struct heif_encoder_parameter** p = mask_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: mask_set_parameter_integer(encoder, param->name, param->integer.default_value); break; case heif_encoder_parameter_type_boolean: mask_set_parameter_boolean(encoder, param->name, param->boolean.default_value); break; case heif_encoder_parameter_type_string: mask_set_parameter_string(encoder, param->name, param->string.default_value); break; } } } } void mask_query_input_colorspace(heif_colorspace* colorspace, heif_chroma* chroma) { } void mask_query_input_colorspace2(void* encoder_raw, heif_colorspace* colorspace, heif_chroma* chroma) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; if (*colorspace == heif_colorspace_monochrome) { // keep the monochrome colorspace } else { //*colorspace = heif_colorspace_YCbCr; //*chroma = encoder->chroma; } } struct heif_error mask_encode_image(void* encoder_raw, const struct heif_image* image, heif_image_input_class input_class) { //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; // Note: this is not used. It is a dummy plugin. return heif_error_ok; } struct heif_error mask_get_compressed_data(void* encoder_raw, uint8_t** data, int* size, enum heif_encoded_data_type* type) { return heif_error_ok; } static const struct heif_encoder_plugin encoder_plugin_mask { /* plugin_api_version */ 3, /* compression_format */ heif_compression_mask, /* id_name */ "mask", /* priority */ PLUGIN_PRIORITY, /* supports_lossy_compression */ true, /* supports_lossless_compression */ true, /* get_plugin_name */ mask_plugin_name, /* init_plugin */ mask_init_plugin, /* cleanup_plugin */ mask_cleanup_plugin, /* new_encoder */ mask_new_encoder, /* free_encoder */ mask_free_encoder, /* set_parameter_quality */ mask_set_parameter_quality, /* get_parameter_quality */ mask_get_parameter_quality, /* set_parameter_lossless */ mask_set_parameter_lossless, /* get_parameter_lossless */ mask_get_parameter_lossless, /* set_parameter_logging_level */ mask_set_parameter_logging_level, /* get_parameter_logging_level */ mask_get_parameter_logging_level, /* list_parameters */ mask_list_parameters, /* set_parameter_integer */ mask_set_parameter_integer, /* get_parameter_integer */ mask_get_parameter_integer, /* set_parameter_boolean */ mask_set_parameter_boolean, /* get_parameter_boolean */ mask_get_parameter_boolean, /* set_parameter_string */ mask_set_parameter_string, /* get_parameter_string */ mask_get_parameter_string, /* query_input_colorspace */ mask_query_input_colorspace, /* encode_image */ mask_encode_image, /* get_compressed_data */ mask_get_compressed_data, /* query_input_colorspace (v2) */ mask_query_input_colorspace2, /* query_encoded_size (v3) */ nullptr }; const struct heif_encoder_plugin* get_encoder_plugin_mask() { return &encoder_plugin_mask; } #if 0 // PLUGIN_mask_ENCODER heif_plugin_info plugin_info { 1, heif_plugin_type_encoder, &encoder_plugin_mask }; #endif