Coverage Report

Created: 2026-02-14 07:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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