FFmpeg
iamf.c
Go to the documentation of this file.
1 /*
2  * Immersive Audio Model and Formats helper functions and defines
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include <limits.h>
22 #include <stddef.h>
23 #include <stdint.h>
24 
25 #include "avassert.h"
26 #include "error.h"
27 #include "iamf.h"
28 #include "log.h"
29 #include "mem.h"
30 #include "opt.h"
31 
32 #define IAMF_ADD_FUNC_TEMPLATE(parent_type, parent_name, child_type, child_name, suffix) \
33 child_type *av_iamf_ ## parent_name ## _add_ ## child_name(parent_type *parent_name) \
34 { \
35  child_type **child_name ## suffix, *child_name; \
36  \
37  if (parent_name->nb_## child_name ## suffix == UINT_MAX) \
38  return NULL; \
39  \
40  child_name ## suffix = av_realloc_array(parent_name->child_name ## suffix, \
41  parent_name->nb_## child_name ## suffix + 1, \
42  sizeof(*parent_name->child_name ## suffix)); \
43  if (!child_name ## suffix) \
44  return NULL; \
45  \
46  parent_name->child_name ## suffix = child_name ## suffix; \
47  \
48  child_name = parent_name->child_name ## suffix[parent_name->nb_## child_name ## suffix] \
49  = av_mallocz(sizeof(*child_name)); \
50  if (!child_name) \
51  return NULL; \
52  \
53  child_name->av_class = &child_name ## _class; \
54  av_opt_set_defaults(child_name); \
55  parent_name->nb_## child_name ## suffix++; \
56  \
57  return child_name; \
58 }
59 
60 #define FLAGS AV_OPT_FLAG_ENCODING_PARAM
61 
62 //
63 // Param Definition
64 //
65 #define OFFSET(x) offsetof(AVIAMFMixGain, x)
66 static const AVOption mix_gain_options[] = {
67  { "subblock_duration", "set subblock_duration", OFFSET(subblock_duration), AV_OPT_TYPE_UINT, {.i64 = 1 }, 1, UINT_MAX, FLAGS },
68  { "animation_type", "set animation_type", OFFSET(animation_type), AV_OPT_TYPE_UINT, {.i64 = 0 }, 0, 2, FLAGS },
69  { "start_point_value", "set start_point_value", OFFSET(start_point_value), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, -128.0, 128.0, FLAGS },
70  { "end_point_value", "set end_point_value", OFFSET(end_point_value), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, -128.0, 128.0, FLAGS },
71  { "control_point_value", "set control_point_value", OFFSET(control_point_value), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, -128.0, 128.0, FLAGS },
72  { "control_point_relative_time", "set control_point_relative_time", OFFSET(control_point_relative_time), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0.0, 1.0, FLAGS },
73  { NULL },
74 };
75 
76 static const AVClass mix_gain_class = {
77  .class_name = "AVIAMFMixGain",
78  .item_name = av_default_item_name,
79  .version = LIBAVUTIL_VERSION_INT,
80  .option = mix_gain_options,
81 };
82 
83 #undef OFFSET
84 #define OFFSET(x) offsetof(AVIAMFDemixingInfo, x)
85 static const AVOption demixing_info_options[] = {
86  { "subblock_duration", "set subblock_duration", OFFSET(subblock_duration), AV_OPT_TYPE_UINT, {.i64 = 1 }, 1, UINT_MAX, FLAGS },
87  { "dmixp_mode", "set dmixp_mode", OFFSET(dmixp_mode), AV_OPT_TYPE_UINT, {.i64 = 0 }, 0, 6, FLAGS },
88  { NULL },
89 };
90 
91 static const AVClass demixing_info_class = {
92  .class_name = "AVIAMFDemixingInfo",
93  .item_name = av_default_item_name,
94  .version = LIBAVUTIL_VERSION_INT,
95  .option = demixing_info_options,
96 };
97 
98 #undef OFFSET
99 #define OFFSET(x) offsetof(AVIAMFReconGain, x)
100 static const AVOption recon_gain_options[] = {
101  { "subblock_duration", "set subblock_duration", OFFSET(subblock_duration), AV_OPT_TYPE_UINT, {.i64 = 1 }, 1, UINT_MAX, FLAGS },
102  { NULL },
103 };
104 
105 static const AVClass recon_gain_class = {
106  .class_name = "AVIAMFReconGain",
107  .item_name = av_default_item_name,
108  .version = LIBAVUTIL_VERSION_INT,
109  .option = recon_gain_options,
110 };
111 
112 #undef OFFSET
113 #define OFFSET(x) offsetof(AVIAMFParamDefinition, x)
115  { "parameter_id", "set parameter_id", OFFSET(parameter_id), AV_OPT_TYPE_UINT, {.i64 = 0 }, 0, UINT_MAX, FLAGS },
116  { "parameter_rate", "set parameter_rate", OFFSET(parameter_rate), AV_OPT_TYPE_UINT, {.i64 = 0 }, 0, UINT_MAX, FLAGS },
117  { "duration", "set duration", OFFSET(duration), AV_OPT_TYPE_UINT, {.i64 = 0 }, 0, UINT_MAX, FLAGS },
118  { "constant_subblock_duration", "set constant_subblock_duration", OFFSET(constant_subblock_duration), AV_OPT_TYPE_UINT, {.i64 = 0 }, 0, UINT_MAX, FLAGS },
119  { NULL },
120 };
121 
122 static const AVClass *param_definition_child_iterate(void **opaque)
123 {
124  uintptr_t i = (uintptr_t)*opaque;
125  const AVClass *ret = NULL;
126 
127  switch(i) {
129  ret = &mix_gain_class;
130  break;
133  break;
136  break;
137  default:
138  break;
139  }
140 
141  if (ret)
142  *opaque = (void*)(i + 1);
143  return ret;
144 }
145 
147  .class_name = "AVIAMFParamDefinition",
148  .item_name = av_default_item_name,
149  .version = LIBAVUTIL_VERSION_INT,
150  .option = param_definition_options,
151  .child_class_iterate = param_definition_child_iterate,
152 };
153 
155 {
156  return &param_definition_class;
157 }
158 
160  unsigned int nb_subblocks, size_t *out_size)
161 {
162 
163  struct MixGainStruct {
165  AVIAMFMixGain m;
166  };
167  struct DemixStruct {
170  };
171  struct ReconGainStruct {
174  };
175  size_t subblocks_offset, subblock_size;
176  size_t size;
178 
179  switch (type) {
181  subblocks_offset = offsetof(struct MixGainStruct, m);
182  subblock_size = sizeof(AVIAMFMixGain);
183  break;
185  subblocks_offset = offsetof(struct DemixStruct, d);
186  subblock_size = sizeof(AVIAMFDemixingInfo);
187  break;
189  subblocks_offset = offsetof(struct ReconGainStruct, r);
190  subblock_size = sizeof(AVIAMFReconGain);
191  break;
192  default:
193  return NULL;
194  }
195 
196  size = subblocks_offset;
197  if (nb_subblocks > (SIZE_MAX - size) / subblock_size)
198  return NULL;
199  size += subblock_size * nb_subblocks;
200 
201  par = av_mallocz(size);
202  if (!par)
203  return NULL;
204 
206  av_opt_set_defaults(par);
207 
208  par->type = type;
209  par->nb_subblocks = nb_subblocks;
210  par->subblock_size = subblock_size;
211  par->subblocks_offset = subblocks_offset;
212 
213  for (int i = 0; i < nb_subblocks; i++) {
214  void *subblock = av_iamf_param_definition_get_subblock(par, i);
215 
216  switch (type) {
218  ((AVIAMFMixGain *)subblock)->av_class = &mix_gain_class;
219  break;
221  ((AVIAMFDemixingInfo *)subblock)->av_class = &demixing_info_class;
222  break;
224  ((AVIAMFReconGain *)subblock)->av_class = &recon_gain_class;
225  break;
226  default:
227  av_assert0(0);
228  }
229 
230  av_opt_set_defaults(subblock);
231  }
232 
233  if (out_size)
234  *out_size = size;
235 
236  return par;
237 }
238 
239 //
240 // Audio Element
241 //
242 static const AVOptionArrayDef demixing_matrix_def = { .size_max = (255 + 255) * 255, .sep = '|' };
243 
244 #undef OFFSET
245 #define OFFSET(x) offsetof(AVIAMFLayer, x)
246 static const AVOption layer_options[] = {
247  { "ch_layout", "set ch_layout", OFFSET(ch_layout), AV_OPT_TYPE_CHLAYOUT, {.str = NULL }, 0, 0, FLAGS },
248  { "flags", "set flags", OFFSET(flags), AV_OPT_TYPE_FLAGS,
249  {.i64 = 0 }, 0, AV_IAMF_LAYER_FLAG_RECON_GAIN, FLAGS, .unit = "flags" },
250  {"recon_gain", "Recon gain is present", 0, AV_OPT_TYPE_CONST,
251  {.i64 = AV_IAMF_LAYER_FLAG_RECON_GAIN }, INT_MIN, INT_MAX, FLAGS, .unit = "flags"},
252  { "output_gain_flags", "set output_gain_flags", OFFSET(output_gain_flags), AV_OPT_TYPE_FLAGS,
253  {.i64 = 0 }, 0, (1 << 6) - 1, FLAGS, .unit = "output_gain_flags" },
254  {"FL", "Left channel", 0, AV_OPT_TYPE_CONST,
255  {.i64 = 1 << 5 }, INT_MIN, INT_MAX, FLAGS, .unit = "output_gain_flags"},
256  {"FR", "Right channel", 0, AV_OPT_TYPE_CONST,
257  {.i64 = 1 << 4 }, INT_MIN, INT_MAX, FLAGS, .unit = "output_gain_flags"},
258  {"BL", "Left surround channel", 0, AV_OPT_TYPE_CONST,
259  {.i64 = 1 << 3 }, INT_MIN, INT_MAX, FLAGS, .unit = "output_gain_flags"},
260  {"BR", "Right surround channel", 0, AV_OPT_TYPE_CONST,
261  {.i64 = 1 << 2 }, INT_MIN, INT_MAX, FLAGS, .unit = "output_gain_flags"},
262  {"TFL", "Left top front channel", 0, AV_OPT_TYPE_CONST,
263  {.i64 = 1 << 1 }, INT_MIN, INT_MAX, FLAGS, .unit = "output_gain_flags"},
264  {"TFR", "Right top front channel", 0, AV_OPT_TYPE_CONST,
265  {.i64 = 1 << 0 }, INT_MIN, INT_MAX, FLAGS, .unit = "output_gain_flags"},
266  { "output_gain", "set output_gain", OFFSET(output_gain), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
267  { "ambisonics_mode", "set ambisonics_mode", OFFSET(ambisonics_mode), AV_OPT_TYPE_INT,
268  { .i64 = AV_IAMF_AMBISONICS_MODE_MONO },
270  { "mono", NULL, 0, AV_OPT_TYPE_CONST,
271  { .i64 = AV_IAMF_AMBISONICS_MODE_MONO }, .unit = "ambisonics_mode" },
272  { "projection", NULL, 0, AV_OPT_TYPE_CONST,
273  { .i64 = AV_IAMF_AMBISONICS_MODE_PROJECTION }, .unit = "ambisonics_mode" },
274  { "demixing_matrix", "set demixing_matrix", OFFSET(demixing_matrix), AV_OPT_TYPE_RATIONAL | AV_OPT_TYPE_FLAG_ARRAY,
275  { .arr = &demixing_matrix_def }, -1.0, 1.0, FLAGS },
276  { NULL },
277 };
278 
279 static const AVClass layer_class = {
280  .class_name = "AVIAMFLayer",
281  .item_name = av_default_item_name,
282  .version = LIBAVUTIL_VERSION_INT,
283  .option = layer_options,
284 };
285 
286 #undef OFFSET
287 #define OFFSET(x) offsetof(AVIAMFAudioElement, x)
288 static const AVOption audio_element_options[] = {
289  { "audio_element_type", "set audio_element_type", OFFSET(audio_element_type), AV_OPT_TYPE_INT,
292  { "channel", NULL, 0, AV_OPT_TYPE_CONST,
293  { .i64 = AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL }, .unit = "audio_element_type" },
294  { "scene", NULL, 0, AV_OPT_TYPE_CONST,
295  { .i64 = AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE }, .unit = "audio_element_type" },
296  { "default_w", "set default_w", OFFSET(default_w), AV_OPT_TYPE_UINT, {.i64 = 0 }, 0, 10, FLAGS },
297  { NULL },
298 };
299 
300 static const AVClass *audio_element_child_iterate(void **opaque)
301 {
302  uintptr_t i = (uintptr_t)*opaque;
303  const AVClass *ret = NULL;
304 
305  if (i)
306  ret = &layer_class;
307 
308  if (ret)
309  *opaque = (void*)(i + 1);
310  return ret;
311 }
312 
313 static const AVClass audio_element_class = {
314  .class_name = "AVIAMFAudioElement",
315  .item_name = av_default_item_name,
316  .version = LIBAVUTIL_VERSION_INT,
317  .option = audio_element_options,
318  .child_class_iterate = audio_element_child_iterate,
319 };
320 
322 {
323  return &audio_element_class;
324 }
325 
327 {
328  AVIAMFAudioElement *audio_element = av_mallocz(sizeof(*audio_element));
329 
330  if (audio_element) {
331  audio_element->av_class = &audio_element_class;
332  av_opt_set_defaults(audio_element);
333  }
334 
335  return audio_element;
336 }
337 
339 
341 {
342  AVIAMFAudioElement *audio_element = *paudio_element;
343 
344  if (!audio_element)
345  return;
346 
347  for (int i = 0; i < audio_element->nb_layers; i++) {
348  AVIAMFLayer *layer = audio_element->layers[i];
349  av_opt_free(layer);
350  av_free(layer->demixing_matrix);
351  av_free(layer);
352  }
353  av_free(audio_element->layers);
354 
355  av_free(audio_element->demixing_info);
356  av_free(audio_element->recon_gain_info);
357  av_freep(paudio_element);
358 }
359 
360 //
361 // Mix Presentation
362 //
363 #undef OFFSET
364 #define OFFSET(x) offsetof(AVIAMFSubmixElement, x)
366  { "headphones_rendering_mode", "Headphones rendering mode", OFFSET(headphones_rendering_mode), AV_OPT_TYPE_INT,
368  AV_IAMF_HEADPHONES_MODE_STEREO, AV_IAMF_HEADPHONES_MODE_BINAURAL, FLAGS, .unit = "headphones_rendering_mode" },
369  { "stereo", NULL, 0, AV_OPT_TYPE_CONST,
370  { .i64 = AV_IAMF_HEADPHONES_MODE_STEREO }, .unit = "headphones_rendering_mode" },
371  { "binaural", NULL, 0, AV_OPT_TYPE_CONST,
372  { .i64 = AV_IAMF_HEADPHONES_MODE_BINAURAL }, .unit = "headphones_rendering_mode" },
373  { "default_mix_gain", "Default mix gain", OFFSET(default_mix_gain), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
374  { "annotations", "Annotations", OFFSET(annotations), AV_OPT_TYPE_DICT, { .str = NULL }, 0, 0, FLAGS },
375  { NULL },
376 };
377 
378 static void *submix_element_child_next(void *obj, void *prev)
379 {
380  AVIAMFSubmixElement *submix_element = obj;
381  if (!prev)
382  return submix_element->element_mix_config;
383 
384  return NULL;
385 }
386 
387 static const AVClass *submix_element_child_iterate(void **opaque)
388 {
389  uintptr_t i = (uintptr_t)*opaque;
390  const AVClass *ret = NULL;
391 
392  if (i)
394 
395  if (ret)
396  *opaque = (void*)(i + 1);
397  return ret;
398 }
399 
400 static const AVClass element_class = {
401  .class_name = "AVIAMFSubmixElement",
402  .item_name = av_default_item_name,
403  .version = LIBAVUTIL_VERSION_INT,
404  .option = submix_element_options,
405  .child_next = submix_element_child_next,
406  .child_class_iterate = submix_element_child_iterate,
407 };
408 
410 
411 #undef OFFSET
412 #define OFFSET(x) offsetof(AVIAMFSubmixLayout, x)
413 static const AVOption submix_layout_options[] = {
414  { "layout_type", "Layout type", OFFSET(layout_type), AV_OPT_TYPE_INT,
417  { "loudspeakers", NULL, 0, AV_OPT_TYPE_CONST,
418  { .i64 = AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS }, .unit = "layout_type" },
419  { "binaural", NULL, 0, AV_OPT_TYPE_CONST,
420  { .i64 = AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL }, .unit = "layout_type" },
421  { "sound_system", "Sound System", OFFSET(sound_system), AV_OPT_TYPE_CHLAYOUT, { .str = NULL }, 0, 0, FLAGS },
422  { "integrated_loudness", "Integrated loudness", OFFSET(integrated_loudness), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
423  { "digital_peak", "Digital peak", OFFSET(digital_peak), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
424  { "true_peak", "True peak", OFFSET(true_peak), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
425  { "dialog_anchored_loudness", "Anchored loudness (Dialog)", OFFSET(dialogue_anchored_loudness), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
426  { "album_anchored_loudness", "Anchored loudness (Album)", OFFSET(album_anchored_loudness), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
427  { NULL },
428 };
429 
430 static const AVClass layout_class = {
431  .class_name = "AVIAMFSubmixLayout",
432  .item_name = av_default_item_name,
433  .version = LIBAVUTIL_VERSION_INT,
434  .option = submix_layout_options,
435 };
436 
438 
439 #undef OFFSET
440 #define OFFSET(x) offsetof(AVIAMFSubmix, x)
442  { "default_mix_gain", "Default mix gain", OFFSET(default_mix_gain), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, -128.0, 128.0, FLAGS },
443  { NULL },
444 };
445 
446 static void *submix_presentation_child_next(void *obj, void *prev)
447 {
448  AVIAMFSubmix *sub_mix = obj;
449  if (!prev)
450  return sub_mix->output_mix_config;
451 
452  return NULL;
453 }
454 
455 static const AVClass *submix_presentation_child_iterate(void **opaque)
456 {
457  uintptr_t i = (uintptr_t)*opaque;
458  const AVClass *ret = NULL;
459 
460  switch(i) {
461  case 0:
462  ret = &element_class;
463  break;
464  case 1:
465  ret = &layout_class;
466  break;
467  case 2:
469  break;
470  default:
471  break;
472  }
473 
474  if (ret)
475  *opaque = (void*)(i + 1);
476  return ret;
477 }
478 
479 static const AVClass submix_class = {
480  .class_name = "AVIAMFSubmix",
481  .item_name = av_default_item_name,
482  .version = LIBAVUTIL_VERSION_INT,
483  .option = submix_presentation_options,
484  .child_next = submix_presentation_child_next,
485  .child_class_iterate = submix_presentation_child_iterate,
486 };
487 
488 #undef OFFSET
489 #define OFFSET(x) offsetof(AVIAMFMixPresentation, x)
491  { "annotations", "set annotations", OFFSET(annotations), AV_OPT_TYPE_DICT, {.str = NULL }, 0, 0, FLAGS },
492  { NULL },
493 };
494 
495 #undef OFFSET
496 #undef FLAGS
497 
498 static const AVClass *mix_presentation_child_iterate(void **opaque)
499 {
500  uintptr_t i = (uintptr_t)*opaque;
501  const AVClass *ret = NULL;
502 
503  if (i)
504  ret = &submix_class;
505 
506  if (ret)
507  *opaque = (void*)(i + 1);
508  return ret;
509 }
510 
512  .class_name = "AVIAMFMixPresentation",
513  .item_name = av_default_item_name,
514  .version = LIBAVUTIL_VERSION_INT,
515  .option = mix_presentation_options,
516  .child_class_iterate = mix_presentation_child_iterate,
517 };
518 
520 {
521  return &mix_presentation_class;
522 }
523 
525 {
526  AVIAMFMixPresentation *mix_presentation = av_mallocz(sizeof(*mix_presentation));
527 
528  if (mix_presentation) {
529  mix_presentation->av_class = &mix_presentation_class;
530  av_opt_set_defaults(mix_presentation);
531  }
532 
533  return mix_presentation;
534 }
535 
536 IAMF_ADD_FUNC_TEMPLATE(AVIAMFMixPresentation, mix_presentation, AVIAMFSubmix, submix, es)
537 
539 {
540  AVIAMFMixPresentation *mix_presentation = *pmix_presentation;
541 
542  if (!mix_presentation)
543  return;
544 
545  for (int i = 0; i < mix_presentation->nb_submixes; i++) {
546  AVIAMFSubmix *sub_mix = mix_presentation->submixes[i];
547  for (int j = 0; j < sub_mix->nb_elements; j++) {
548  AVIAMFSubmixElement *submix_element = sub_mix->elements[j];
549  av_opt_free(submix_element);
550  av_free(submix_element->element_mix_config);
551  av_free(submix_element);
552  }
553  av_free(sub_mix->elements);
554  for (int j = 0; j < sub_mix->nb_layouts; j++) {
555  AVIAMFSubmixLayout *submix_layout = sub_mix->layouts[j];
556  av_opt_free(submix_layout);
557  av_free(submix_layout);
558  }
559  av_free(sub_mix->layouts);
560  av_free(sub_mix->output_mix_config);
561  av_free(sub_mix);
562  }
563  av_opt_free(mix_presentation);
564  av_free(mix_presentation->submixes);
565 
566  av_freep(pmix_presentation);
567 }
flags
const SwsFlags flags[]
Definition: swscale.c:61
audio_element_options
static const AVOption audio_element_options[]
Definition: iamf.c:288
iamf.h
AVIAMFSubmix::elements
AVIAMFSubmixElement ** elements
Array of submix elements.
Definition: iamf.h:568
AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS
@ AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS
The layout follows the loudspeaker sound system convention of ITU-2051-3.
Definition: iamf.h:501
AVIAMFAudioElement::nb_layers
unsigned int nb_layers
Number of layers, or channel groups, in the Audio Element.
Definition: iamf.h:371
av_opt_set_defaults
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition: opt.c:1678
AVIAMFSubmix::layouts
AVIAMFSubmixLayout ** layouts
Array of submix layouts.
Definition: iamf.h:583
r
const char * r
Definition: vf_curves.c:127
opt.h
element_class
static const AVClass element_class
Definition: iamf.c:400
submix_presentation_child_next
static void * submix_presentation_child_next(void *obj, void *prev)
Definition: iamf.c:446
AVOptionArrayDef
May be set as default_val for AV_OPT_TYPE_FLAG_ARRAY options.
Definition: opt.h:395
mix_gain_options
static const AVOption mix_gain_options[]
Definition: iamf.c:66
av_iamf_param_definition_alloc
AVIAMFParamDefinition * av_iamf_param_definition_alloc(enum AVIAMFParamDefinitionType type, unsigned int nb_subblocks, size_t *out_size)
Allocates memory for AVIAMFParamDefinition, plus an array of.
Definition: iamf.c:159
AVIAMFAudioElement::layers
AVIAMFLayer ** layers
Definition: iamf.h:362
AVIAMFMixPresentation::nb_submixes
unsigned int nb_submixes
Number of submixes in the presentation.
Definition: iamf.h:632
out_size
int out_size
Definition: movenc.c:56
submix_class
static const AVClass submix_class
Definition: iamf.c:479
AVIAMFParamDefinition::type
enum AVIAMFParamDefinitionType type
Parameters type.
Definition: iamf.h:213
AVOption
AVOption.
Definition: opt.h:429
AV_IAMF_HEADPHONES_MODE_STEREO
@ AV_IAMF_HEADPHONES_MODE_STEREO
The referenced Audio Element shall be rendered to stereo loudspeakers.
Definition: iamf.h:436
av_iamf_mix_presentation_free
void av_iamf_mix_presentation_free(AVIAMFMixPresentation **pmix_presentation)
Free an AVIAMFMixPresentation and all its contents.
Definition: iamf.c:538
demixing_info_class
static const AVClass demixing_info_class
Definition: iamf.c:91
submix_element_child_next
static void * submix_element_child_next(void *obj, void *prev)
Definition: iamf.c:378
AVIAMFParamDefinition
Parameters as defined in section 3.6.1 of IAMF.
Definition: iamf.h:193
AV_OPT_TYPE_RATIONAL
@ AV_OPT_TYPE_RATIONAL
Underlying C type is AVRational.
Definition: opt.h:280
recon_gain_options
static const AVOption recon_gain_options[]
Definition: iamf.c:100
AVIAMFSubmixLayout
Submix layout as defined in section 3.7.6 of IAMF.
Definition: iamf.h:517
av_iamf_audio_element_free
void av_iamf_audio_element_free(AVIAMFAudioElement **paudio_element)
Free an AVIAMFAudioElement and all its contents.
Definition: iamf.c:340
av_opt_free
void av_opt_free(void *obj)
Free all allocated objects in obj.
Definition: opt.c:1949
av_iamf_audio_element_alloc
AVIAMFAudioElement * av_iamf_audio_element_alloc(void)
Allocates a AVIAMFAudioElement, and initializes its fields with default values.
Definition: iamf.c:326
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
submix_presentation_options
static const AVOption submix_presentation_options[]
Definition: iamf.c:441
AVIAMFReconGain
Recon Gain Info Parameter Data as defined in section 3.8.3 of IAMF.
Definition: iamf.h:148
AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
Subblocks are of struct type AVIAMFReconGain.
Definition: iamf.h:181
FLAGS
#define FLAGS
Definition: iamf.c:60
avassert.h
duration
int64_t duration
Definition: movenc.c:65
s
#define s(width, name)
Definition: cbs_vp9.c:198
mix_presentation_class
static const AVClass mix_presentation_class
Definition: iamf.c:511
av_iamf_param_definition_get_subblock
static av_always_inline void * av_iamf_param_definition_get_subblock(const AVIAMFParamDefinition *par, unsigned int idx)
Get the subblock at the specified.
Definition: iamf.h:260
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:41
av_iamf_param_definition_get_class
const AVClass * av_iamf_param_definition_get_class(void)
Definition: iamf.c:154
limits.h
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
AV_IAMF_HEADPHONES_MODE_BINAURAL
@ AV_IAMF_HEADPHONES_MODE_BINAURAL
The referenced Audio Element shall be rendered with a binaural renderer.
Definition: iamf.h:440
AVOptionArrayDef::size_max
unsigned size_max
Maximum number of elements in the array, 0 when unlimited.
Definition: opt.h:412
AVIAMFDemixingInfo
Demixing Info Parameter Data as defined in section 3.8.2 of IAMF.
Definition: iamf.h:128
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
output_gain
static double output_gain(double lin_slope, double ratio, double thres, double knee, double knee_start, double knee_stop, double range, int mode)
Definition: af_agate.c:120
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:76
NULL
#define NULL
Definition: coverity.c:32
submix_element_options
static const AVOption submix_element_options[]
Definition: iamf.c:365
AV_OPT_TYPE_DICT
@ AV_OPT_TYPE_DICT
Underlying C type is AVDictionary*.
Definition: opt.h:290
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:242
AVIAMFLayer
A layer defining a Channel Layout in the Audio Element.
Definition: iamf.h:294
submix_presentation_child_iterate
static const AVClass * submix_presentation_child_iterate(void **opaque)
Definition: iamf.c:455
demixing_info_options
static const AVOption demixing_info_options[]
Definition: iamf.c:85
param_definition_options
static const AVOption param_definition_options[]
Definition: iamf.c:114
AVIAMFParamDefinition::subblocks_offset
size_t subblocks_offset
Offset in bytes from the start of this struct, at which the subblocks array is located.
Definition: iamf.h:200
AV_IAMF_AMBISONICS_MODE_MONO
@ AV_IAMF_AMBISONICS_MODE_MONO
Definition: iamf.h:273
AV_OPT_TYPE_UINT
@ AV_OPT_TYPE_UINT
Underlying C type is unsigned int.
Definition: opt.h:335
AV_OPT_TYPE_CHLAYOUT
@ AV_OPT_TYPE_CHLAYOUT
Underlying C type is AVChannelLayout.
Definition: opt.h:331
error.h
AVIAMFSubmix
Submix layout as defined in section 3.7 of IAMF.
Definition: iamf.h:559
AV_OPT_TYPE_FLAG_ARRAY
@ AV_OPT_TYPE_FLAG_ARRAY
May be combined with another regular option type to declare an array option.
Definition: opt.h:346
size
int size
Definition: twinvq_data.h:10344
layout_class
static const AVClass layout_class
Definition: iamf.c:430
av_iamf_mix_presentation_alloc
AVIAMFMixPresentation * av_iamf_mix_presentation_alloc(void)
Allocates a AVIAMFMixPresentation, and initializes its fields with default values.
Definition: iamf.c:524
AVIAMFAudioElement
Information on how to combine one or more audio streams, as defined in section 3.6 of IAMF.
Definition: iamf.h:359
AVIAMFMixGain
Mix Gain Parameter Data as defined in section 3.8.1 of IAMF.
Definition: iamf.h:77
av_iamf_audio_element_get_class
const AVClass * av_iamf_audio_element_get_class(void)
Definition: iamf.c:321
AVIAMFParamDefinition::av_class
const AVClass * av_class
Definition: iamf.h:194
layout
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout
Definition: filter_design.txt:18
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVIAMFLayer::demixing_matrix
AVRational * demixing_matrix
Demixing matrix as defined in section 3.6.3 of IAMF.
Definition: iamf.h:336
param_definition_child_iterate
static const AVClass * param_definition_child_iterate(void **opaque)
Definition: iamf.c:122
AVIAMFAudioElement::av_class
const AVClass * av_class
Definition: iamf.h:360
AVIAMFMixPresentation
Information on how to render and mix one or more AVIAMFAudioElement to generate the final audio outpu...
Definition: iamf.h:616
OFFSET
#define OFFSET(x)
Definition: iamf.c:489
AVIAMFParamDefinition::nb_subblocks
unsigned int nb_subblocks
Number of subblocks in the array.
Definition: iamf.h:208
AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE
@ AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE
Definition: iamf.h:349
AVIAMFSubmix::nb_layouts
unsigned int nb_layouts
Number of layouts in the submix.
Definition: iamf.h:590
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:81
submix_layout_options
static const AVOption submix_layout_options[]
Definition: iamf.c:413
submix_element_child_iterate
static const AVClass * submix_element_child_iterate(void **opaque)
Definition: iamf.c:387
IAMF_ADD_FUNC_TEMPLATE
#define IAMF_ADD_FUNC_TEMPLATE(parent_type, parent_name, child_type, child_name, suffix)
Definition: iamf.c:32
mix_presentation_child_iterate
static const AVClass * mix_presentation_child_iterate(void **opaque)
Definition: iamf.c:498
av_iamf_mix_presentation_get_class
const AVClass * av_iamf_mix_presentation_get_class(void)
Definition: iamf.c:519
mix_gain_class
static const AVClass mix_gain_class
Definition: iamf.c:76
layer_class
static const AVClass layer_class
Definition: iamf.c:279
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
Subblocks are of struct type AVIAMFMixGain.
Definition: iamf.h:173
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
audio_element_class
static const AVClass audio_element_class
Definition: iamf.c:313
demixing_matrix_def
static const AVOptionArrayDef demixing_matrix_def
Definition: iamf.c:242
AVIAMFSubmix::nb_elements
unsigned int nb_elements
Number of elements in the submix.
Definition: iamf.h:575
AVIAMFAudioElement::demixing_info
AVIAMFParamDefinition * demixing_info
Demixing information used to reconstruct a scalable channel audio representation.
Definition: iamf.h:379
mem.h
AVIAMFSubmix::output_mix_config
AVIAMFParamDefinition * output_mix_config
Information required for post-processing the mixed audio signal to generate the audio signal for play...
Definition: iamf.h:598
AVIAMFParamDefinitionType
AVIAMFParamDefinitionType
Definition: iamf.h:169
AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL
@ AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL
The layout is binaural.
Definition: iamf.h:508
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AV_IAMF_AMBISONICS_MODE_PROJECTION
@ AV_IAMF_AMBISONICS_MODE_PROJECTION
Definition: iamf.h:274
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AVIAMFSubmixElement::element_mix_config
AVIAMFParamDefinition * element_mix_config
Information required required for applying any processing to the referenced and rendered Audio Elemen...
Definition: iamf.h:464
AV_OPT_TYPE_FLAGS
@ AV_OPT_TYPE_FLAGS
Underlying C type is unsigned int.
Definition: opt.h:255
AVIAMFSubmixElement
Submix element as defined in section 3.7 of IAMF.
Definition: iamf.h:449
AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL
@ AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL
Definition: iamf.h:348
AVIAMFParamDefinition::subblock_size
size_t subblock_size
Size in bytes of each element in the subblocks array.
Definition: iamf.h:204
recon_gain_class
static const AVClass recon_gain_class
Definition: iamf.c:105
AVIAMFAudioElement::recon_gain_info
AVIAMFParamDefinition * recon_gain_info
Recon gain information used to reconstruct a scalable channel audio representation.
Definition: iamf.h:386
audio_element_child_iterate
static const AVClass * audio_element_child_iterate(void **opaque)
Definition: iamf.c:300
AVIAMFMixPresentation::submixes
AVIAMFSubmix ** submixes
Array of submixes.
Definition: iamf.h:625
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
mix_presentation_options
static const AVOption mix_presentation_options[]
Definition: iamf.c:490
param_definition_class
static const AVClass param_definition_class
Definition: iamf.c:146
AVIAMFMixPresentation::av_class
const AVClass * av_class
Definition: iamf.h:617
AV_IAMF_PARAMETER_DEFINITION_DEMIXING
@ AV_IAMF_PARAMETER_DEFINITION_DEMIXING
Subblocks are of struct type AVIAMFDemixingInfo.
Definition: iamf.h:177
layer_options
static const AVOption layer_options[]
Definition: iamf.c:246