/src/libheif/libheif/plugins/encoder_mask.cc
Line | Count | Source |
1 | | /* |
2 | | * HEIF codec. |
3 | | * Copyright (c) 2017 Dirk Farin <dirk.farin@gmail.com> |
4 | | * |
5 | | * This file is part of libheif. |
6 | | * |
7 | | * libheif is free software: you can redistribute it and/or modify |
8 | | * it under the terms of the GNU Lesser General Public License as |
9 | | * published by the Free Software Foundation, either version 3 of |
10 | | * the License, or (at your option) any later version. |
11 | | * |
12 | | * libheif is distributed in the hope that it will be useful, |
13 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | | * GNU Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public License |
18 | | * along with libheif. If not, see <http://www.gnu.org/licenses/>. |
19 | | */ |
20 | | |
21 | | #include "encoder_mask.h" |
22 | | #include "libheif/heif.h" |
23 | | #include "libheif/heif_plugin.h" |
24 | | #include <algorithm> |
25 | | #include <cstring> |
26 | | #include <cassert> |
27 | | #include <vector> |
28 | | #include <string> |
29 | | #include <memory> |
30 | | |
31 | | #include <mutex> |
32 | | |
33 | | |
34 | | static const char* kParam_interleave = "interleave"; |
35 | | |
36 | | static const int PLUGIN_PRIORITY = 60; |
37 | | |
38 | | static const char* plugin_name = "mask"; |
39 | | |
40 | | |
41 | | static void mask_set_default_parameters(void* encoder); |
42 | | |
43 | | |
44 | | static const char* mask_plugin_name() |
45 | 0 | { |
46 | 0 | return plugin_name; |
47 | 0 | } |
48 | | |
49 | | |
50 | | #define MAX_NPARAMETERS 14 |
51 | | |
52 | | static heif_encoder_parameter mask_encoder_params[MAX_NPARAMETERS]; |
53 | | static const heif_encoder_parameter* mask_encoder_parameter_ptrs[MAX_NPARAMETERS + 1]; |
54 | | |
55 | | static void mask_init_parameters() |
56 | 296 | { |
57 | 296 | heif_encoder_parameter* p = mask_encoder_params; |
58 | 296 | const heif_encoder_parameter** d = mask_encoder_parameter_ptrs; |
59 | 296 | int i = 0; |
60 | | |
61 | 296 | assert(i < MAX_NPARAMETERS); |
62 | 296 | p->version = 2; |
63 | 296 | p->name = kParam_interleave; |
64 | 296 | p->type = heif_encoder_parameter_type_string; |
65 | 296 | p->string.default_value = "planar"; |
66 | 296 | p->has_default = true; |
67 | 296 | d[i++] = p++; |
68 | | |
69 | 296 | assert(i < MAX_NPARAMETERS + 1); |
70 | 296 | d[i++] = nullptr; |
71 | 296 | } |
72 | | |
73 | | |
74 | | const heif_encoder_parameter** mask_list_parameters(void* encoder) |
75 | 0 | { |
76 | 0 | return mask_encoder_parameter_ptrs; |
77 | 0 | } |
78 | | |
79 | | static void mask_init_plugin() |
80 | 296 | { |
81 | 296 | mask_init_parameters(); |
82 | 296 | } |
83 | | |
84 | | |
85 | | static void mask_cleanup_plugin() |
86 | 0 | { |
87 | 0 | } |
88 | | |
89 | | heif_error mask_new_encoder(void** enc) |
90 | 0 | { |
91 | 0 | encoder_struct_mask* encoder = new encoder_struct_mask(); |
92 | 0 | heif_error err = heif_error_ok; |
93 | |
|
94 | 0 | *enc = encoder; |
95 | | |
96 | | // set default parameters |
97 | |
|
98 | 0 | mask_set_default_parameters(encoder); |
99 | |
|
100 | 0 | return err; |
101 | 0 | } |
102 | | |
103 | | void mask_free_encoder(void* encoder_raw) |
104 | 0 | { |
105 | 0 | encoder_struct_mask* encoder = (encoder_struct_mask*) encoder_raw; |
106 | |
|
107 | 0 | delete encoder; |
108 | 0 | } |
109 | | |
110 | | |
111 | | heif_error mask_set_parameter_quality(void* encoder_raw, int quality) |
112 | 0 | { |
113 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
114 | |
|
115 | 0 | return heif_error_ok; |
116 | 0 | } |
117 | | |
118 | | heif_error mask_get_parameter_quality(void* encoder_raw, int* quality) |
119 | 0 | { |
120 | 0 | *quality = 100; |
121 | |
|
122 | 0 | return heif_error_ok; |
123 | 0 | } |
124 | | |
125 | | heif_error mask_set_parameter_lossless(void* encoder_raw, int enable) |
126 | 0 | { |
127 | 0 | return heif_error_ok; |
128 | 0 | } |
129 | | |
130 | | heif_error mask_get_parameter_lossless(void* encoder_raw, int* enable) |
131 | 0 | { |
132 | 0 | *enable = true; |
133 | |
|
134 | 0 | return heif_error_ok; |
135 | 0 | } |
136 | | |
137 | | heif_error mask_set_parameter_logging_level(void* encoder_raw, int logging) |
138 | 0 | { |
139 | 0 | return heif_error_ok; |
140 | 0 | } |
141 | | |
142 | | heif_error mask_get_parameter_logging_level(void* encoder_raw, int* loglevel) |
143 | 0 | { |
144 | 0 | *loglevel = 0; |
145 | |
|
146 | 0 | return heif_error_ok; |
147 | 0 | } |
148 | | |
149 | | #define set_value(paramname, paramvar) if (strcmp(name, paramname)==0) { encoder->paramvar = value; return heif_error_ok; } |
150 | | #define get_value(paramname, paramvar) if (strcmp(name, paramname)==0) { *value = encoder->paramvar; return heif_error_ok; } |
151 | | |
152 | | |
153 | | heif_error mask_set_parameter_integer(void* encoder_raw, const char* name, int value) |
154 | 0 | { |
155 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
156 | |
|
157 | 0 | return heif_error_unsupported_parameter; |
158 | 0 | } |
159 | | |
160 | | heif_error mask_get_parameter_integer(void* encoder_raw, const char* name, int* value) |
161 | 0 | { |
162 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
163 | |
|
164 | 0 | return heif_error_unsupported_parameter; |
165 | 0 | } |
166 | | |
167 | | |
168 | | heif_error mask_set_parameter_boolean(void* encoder_raw, const char* name, int value) |
169 | 0 | { |
170 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
171 | |
|
172 | 0 | return heif_error_unsupported_parameter; |
173 | 0 | } |
174 | | |
175 | | heif_error mask_get_parameter_boolean(void* encoder_raw, const char* name, int* value) |
176 | 0 | { |
177 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
178 | |
|
179 | 0 | return heif_error_unsupported_parameter; |
180 | 0 | } |
181 | | |
182 | | |
183 | | heif_error mask_set_parameter_string(void* encoder_raw, const char* name, const char* value) |
184 | 0 | { |
185 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
186 | |
|
187 | 0 | return heif_error_unsupported_parameter; |
188 | 0 | } |
189 | | |
190 | | |
191 | | heif_error mask_get_parameter_string(void* encoder_raw, const char* name, |
192 | | char* value, int value_size) |
193 | 0 | { |
194 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
195 | |
|
196 | 0 | return heif_error_unsupported_parameter; |
197 | 0 | } |
198 | | |
199 | | |
200 | | static void mask_set_default_parameters(void* encoder) |
201 | 0 | { |
202 | 0 | for (const heif_encoder_parameter** p = mask_encoder_parameter_ptrs; *p; p++) { |
203 | 0 | const heif_encoder_parameter* param = *p; |
204 | |
|
205 | 0 | if (param->has_default) { |
206 | 0 | switch (param->type) { |
207 | 0 | case heif_encoder_parameter_type_integer: |
208 | 0 | mask_set_parameter_integer(encoder, param->name, param->integer.default_value); |
209 | 0 | break; |
210 | 0 | case heif_encoder_parameter_type_boolean: |
211 | 0 | mask_set_parameter_boolean(encoder, param->name, param->boolean.default_value); |
212 | 0 | break; |
213 | 0 | case heif_encoder_parameter_type_string: |
214 | 0 | mask_set_parameter_string(encoder, param->name, param->string.default_value); |
215 | 0 | break; |
216 | 0 | } |
217 | 0 | } |
218 | 0 | } |
219 | 0 | } |
220 | | |
221 | | |
222 | | void mask_query_input_colorspace(heif_colorspace* colorspace, heif_chroma* chroma) |
223 | 0 | { |
224 | 0 | } |
225 | | |
226 | | |
227 | | void mask_query_input_colorspace2(void* encoder_raw, heif_colorspace* colorspace, heif_chroma* chroma) |
228 | 0 | { |
229 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
230 | |
|
231 | 0 | if (*colorspace == heif_colorspace_monochrome) { |
232 | | // keep the monochrome colorspace |
233 | 0 | } |
234 | 0 | else { |
235 | | //*colorspace = heif_colorspace_YCbCr; |
236 | | //*chroma = encoder->chroma; |
237 | 0 | } |
238 | 0 | } |
239 | | |
240 | | |
241 | | heif_error mask_encode_image(void* encoder_raw, const heif_image* image, |
242 | | heif_image_input_class input_class) |
243 | 0 | { |
244 | | //struct encoder_struct_mask* encoder = (struct encoder_struct_mask*) encoder_raw; |
245 | | |
246 | | // Note: this is not used. It is a dummy plugin. |
247 | |
|
248 | 0 | return heif_error_ok; |
249 | 0 | } |
250 | | |
251 | | |
252 | | heif_error mask_get_compressed_data(void* encoder_raw, uint8_t** data, int* size, |
253 | | heif_encoded_data_type* type) |
254 | 0 | { |
255 | 0 | return heif_error_ok; |
256 | 0 | } |
257 | | |
258 | | |
259 | | static const heif_encoder_plugin encoder_plugin_mask |
260 | | { |
261 | | /* plugin_api_version */ 3, |
262 | | /* compression_format */ heif_compression_mask, |
263 | | /* id_name */ "mask", |
264 | | /* priority */ PLUGIN_PRIORITY, |
265 | | /* supports_lossy_compression */ true, |
266 | | /* supports_lossless_compression */ true, |
267 | | /* get_plugin_name */ mask_plugin_name, |
268 | | /* init_plugin */ mask_init_plugin, |
269 | | /* cleanup_plugin */ mask_cleanup_plugin, |
270 | | /* new_encoder */ mask_new_encoder, |
271 | | /* free_encoder */ mask_free_encoder, |
272 | | /* set_parameter_quality */ mask_set_parameter_quality, |
273 | | /* get_parameter_quality */ mask_get_parameter_quality, |
274 | | /* set_parameter_lossless */ mask_set_parameter_lossless, |
275 | | /* get_parameter_lossless */ mask_get_parameter_lossless, |
276 | | /* set_parameter_logging_level */ mask_set_parameter_logging_level, |
277 | | /* get_parameter_logging_level */ mask_get_parameter_logging_level, |
278 | | /* list_parameters */ mask_list_parameters, |
279 | | /* set_parameter_integer */ mask_set_parameter_integer, |
280 | | /* get_parameter_integer */ mask_get_parameter_integer, |
281 | | /* set_parameter_boolean */ mask_set_parameter_boolean, |
282 | | /* get_parameter_boolean */ mask_get_parameter_boolean, |
283 | | /* set_parameter_string */ mask_set_parameter_string, |
284 | | /* get_parameter_string */ mask_get_parameter_string, |
285 | | /* query_input_colorspace */ mask_query_input_colorspace, |
286 | | /* encode_image */ mask_encode_image, |
287 | | /* get_compressed_data */ mask_get_compressed_data, |
288 | | /* query_input_colorspace (v2) */ mask_query_input_colorspace2, |
289 | | /* query_encoded_size (v3) */ nullptr |
290 | | }; |
291 | | |
292 | | const heif_encoder_plugin* get_encoder_plugin_mask() |
293 | 296 | { |
294 | 296 | return &encoder_plugin_mask; |
295 | 296 | } |
296 | | |
297 | | |
298 | | #if 0 // PLUGIN_mask_ENCODER |
299 | | heif_plugin_info plugin_info { |
300 | | 1, |
301 | | heif_plugin_type_encoder, |
302 | | &encoder_plugin_mask |
303 | | }; |
304 | | #endif |