FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavutil/iamf.h
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 3 3 100.0%
Functions: 1 1 100.0%
Branches: 1 2 50.0%

Line Branch Exec Source
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 #ifndef AVUTIL_IAMF_H
22 #define AVUTIL_IAMF_H
23
24 /**
25 * @file
26 * Immersive Audio Model and Formats API header
27 * @see <a href="https://aomediacodec.github.io/iamf/">Immersive Audio Model and Formats</a>
28 */
29
30 #include <stdint.h>
31 #include <stddef.h>
32
33 #include "attributes.h"
34 #include "avassert.h"
35 #include "channel_layout.h"
36 #include "dict.h"
37 #include "rational.h"
38
39 /**
40 * @defgroup lavu_iamf Immersive Audio Model and Formats
41 * @ingroup lavu_audio
42 *
43 * Immersive Audio Model and Formats related functions and defines
44 *
45 * @defgroup lavu_iamf_params Parameter Definition
46 * @ingroup lavu_iamf
47 * @{
48 * Parameters as defined in section 3.6.1 and 3.8 of IAMF.
49 * @}
50 *
51 * @defgroup lavu_iamf_audio Audio Element
52 * @ingroup lavu_iamf
53 * @{
54 * Audio Elements as defined in section 3.6 of IAMF.
55 * @}
56 *
57 * @defgroup lavu_iamf_mix Mix Presentation
58 * @ingroup lavu_iamf
59 * @{
60 * Mix Presentations as defined in section 3.7 of IAMF.
61 * @}
62 *
63 * @addtogroup lavu_iamf_params
64 * @{
65 */
66 enum AVIAMFAnimationType {
67 AV_IAMF_ANIMATION_TYPE_STEP,
68 AV_IAMF_ANIMATION_TYPE_LINEAR,
69 AV_IAMF_ANIMATION_TYPE_BEZIER,
70 };
71
72 /**
73 * Mix Gain Parameter Data as defined in section 3.8.1 of IAMF.
74 *
75 * @note This struct's size is not a part of the public ABI.
76 */
77 typedef struct AVIAMFMixGain {
78 const AVClass *av_class;
79
80 /**
81 * Duration for the given subblock, in units of
82 * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate".
83 * It must not be 0.
84 */
85 unsigned int subblock_duration;
86 /**
87 * The type of animation applied to the parameter values.
88 */
89 enum AVIAMFAnimationType animation_type;
90 /**
91 * Parameter value that is applied at the start of the subblock.
92 * Applies to all defined Animation Types.
93 *
94 * Valid range of values is -128.0 to 128.0
95 */
96 AVRational start_point_value;
97 /**
98 * Parameter value that is applied at the end of the subblock.
99 * Applies only to AV_IAMF_ANIMATION_TYPE_LINEAR and
100 * AV_IAMF_ANIMATION_TYPE_BEZIER Animation Types.
101 *
102 * Valid range of values is -128.0 to 128.0
103 */
104 AVRational end_point_value;
105 /**
106 * Parameter value of the middle control point of a quadratic Bezier
107 * curve, i.e., its y-axis value.
108 * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type.
109 *
110 * Valid range of values is -128.0 to 128.0
111 */
112 AVRational control_point_value;
113 /**
114 * Parameter value of the time of the middle control point of a
115 * quadratic Bezier curve, i.e., its x-axis value.
116 * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type.
117 *
118 * Valid range of values is 0.0 to 1.0
119 */
120 AVRational control_point_relative_time;
121 } AVIAMFMixGain;
122
123 /**
124 * Demixing Info Parameter Data as defined in section 3.8.2 of IAMF.
125 *
126 * @note This struct's size is not a part of the public ABI.
127 */
128 typedef struct AVIAMFDemixingInfo {
129 const AVClass *av_class;
130
131 /**
132 * Duration for the given subblock, in units of
133 * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate".
134 * It must not be 0.
135 */
136 unsigned int subblock_duration;
137 /**
138 * Pre-defined combination of demixing parameters.
139 */
140 unsigned int dmixp_mode;
141 } AVIAMFDemixingInfo;
142
143 /**
144 * Recon Gain Info Parameter Data as defined in section 3.8.3 of IAMF.
145 *
146 * @note This struct's size is not a part of the public ABI.
147 */
148 typedef struct AVIAMFReconGain {
149 const AVClass *av_class;
150
151 /**
152 * Duration for the given subblock, in units of
153 * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate".
154 * It must not be 0.
155 */
156 unsigned int subblock_duration;
157
158 /**
159 * Array of gain values to be applied to each channel for each layer
160 * defined in the Audio Element referencing the parent Parameter Definition.
161 * Values for layers where the AV_IAMF_LAYER_FLAG_RECON_GAIN flag is not set
162 * are undefined.
163 *
164 * Channel order is: FL, C, FR, SL, SR, TFL, TFR, BL, BR, TBL, TBR, LFE
165 */
166 uint8_t recon_gain[6][12];
167 } AVIAMFReconGain;
168
169 enum AVIAMFParamDefinitionType {
170 /**
171 * Subblocks are of struct type AVIAMFMixGain
172 */
173 AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN,
174 /**
175 * Subblocks are of struct type AVIAMFDemixingInfo
176 */
177 AV_IAMF_PARAMETER_DEFINITION_DEMIXING,
178 /**
179 * Subblocks are of struct type AVIAMFReconGain
180 */
181 AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN,
182 };
183
184 /**
185 * Parameters as defined in section 3.6.1 of IAMF.
186 *
187 * The struct is allocated by av_iamf_param_definition_alloc() along with an
188 * array of subblocks, its type depending on the value of type.
189 * This array is placed subblocks_offset bytes after the start of this struct.
190 *
191 * @note This struct's size is not a part of the public ABI.
192 */
193 typedef struct AVIAMFParamDefinition {
194 const AVClass *av_class;
195
196 /**
197 * Offset in bytes from the start of this struct, at which the subblocks
198 * array is located.
199 */
200 size_t subblocks_offset;
201 /**
202 * Size in bytes of each element in the subblocks array.
203 */
204 size_t subblock_size;
205 /**
206 * Number of subblocks in the array.
207 */
208 unsigned int nb_subblocks;
209
210 /**
211 * Parameters type. Determines the type of the subblock elements.
212 */
213 enum AVIAMFParamDefinitionType type;
214
215 /**
216 * Identifier for the paremeter substream.
217 */
218 unsigned int parameter_id;
219 /**
220 * Sample rate for the paremeter substream. It must not be 0.
221 */
222 unsigned int parameter_rate;
223
224 /**
225 * The accumulated duration of all blocks in this parameter definition,
226 * in units of 1 / @ref parameter_rate.
227 *
228 * May be 0, in which case all duration values should be specified in
229 * another parameter definition referencing the same parameter_id.
230 */
231 unsigned int duration;
232 /**
233 * The duration of every subblock in the case where all subblocks, with
234 * the optional exception of the last subblock, have equal durations.
235 *
236 * Must be 0 if subblocks have different durations.
237 */
238 unsigned int constant_subblock_duration;
239 } AVIAMFParamDefinition;
240
241 const AVClass *av_iamf_param_definition_get_class(void);
242
243 /**
244 * Allocates memory for AVIAMFParamDefinition, plus an array of {@code nb_subblocks}
245 * amount of subblocks of the given type and initializes the variables. Can be
246 * freed with a normal av_free() call.
247 *
248 * @param size if non-NULL, the size in bytes of the resulting data array is written here.
249 */
250 AVIAMFParamDefinition *av_iamf_param_definition_alloc(enum AVIAMFParamDefinitionType type,
251 unsigned int nb_subblocks, size_t *size);
252
253 /**
254 * Get the subblock at the specified {@code idx}. Must be between 0 and nb_subblocks - 1.
255 *
256 * The @ref AVIAMFParamDefinition.type "param definition type" defines
257 * the struct type of the returned pointer.
258 */
259 static av_always_inline void*
260 271 av_iamf_param_definition_get_subblock(const AVIAMFParamDefinition *par, unsigned int idx)
261 {
262
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 271 times.
271 av_assert0(idx < par->nb_subblocks);
263 271 return (void *)((uint8_t *)par + par->subblocks_offset + idx * par->subblock_size);
264 }
265
266 /**
267 * @}
268 * @addtogroup lavu_iamf_audio
269 * @{
270 */
271
272 enum AVIAMFAmbisonicsMode {
273 AV_IAMF_AMBISONICS_MODE_MONO,
274 AV_IAMF_AMBISONICS_MODE_PROJECTION,
275 };
276
277 /**
278 * Recon gain information for the layer is present in AVIAMFReconGain
279 */
280 #define AV_IAMF_LAYER_FLAG_RECON_GAIN (1 << 0)
281
282 /**
283 * A layer defining a Channel Layout in the Audio Element.
284 *
285 * When @ref AVIAMFAudioElement.audio_element_type "the parent's Audio Element type"
286 * is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, this corresponds to an Scalable Channel
287 * Layout layer as defined in section 3.6.2 of IAMF.
288 * For AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, it is an Ambisonics channel
289 * layout as defined in section 3.6.3 of IAMF.
290 *
291 * @note The struct should be allocated with av_iamf_audio_element_add_layer()
292 * and its size is not a part of the public ABI.
293 */
294 typedef struct AVIAMFLayer {
295 const AVClass *av_class;
296
297 AVChannelLayout ch_layout;
298
299 /**
300 * A bitmask which may contain a combination of AV_IAMF_LAYER_FLAG_* flags.
301 */
302 unsigned int flags;
303 /**
304 * Output gain channel flags as defined in section 3.6.2 of IAMF.
305 *
306 * This field is defined only if @ref AVIAMFAudioElement.audio_element_type
307 * "the parent's Audio Element type" is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL,
308 * must be 0 otherwise.
309 */
310 unsigned int output_gain_flags;
311 /**
312 * Output gain as defined in section 3.6.2 of IAMF.
313 *
314 * Must be 0 if @ref output_gain_flags is 0.
315 */
316 AVRational output_gain;
317 /**
318 * Ambisonics mode as defined in section 3.6.3 of IAMF.
319 *
320 * This field is defined only if @ref AVIAMFAudioElement.audio_element_type
321 * "the parent's Audio Element type" is AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE.
322 *
323 * If AV_IAMF_AMBISONICS_MODE_MONO, channel_mapping is defined implicitly
324 * (Ambisonic Order) or explicitly (Custom Order with ambi channels) in
325 * @ref ch_layout.
326 * If AV_IAMF_AMBISONICS_MODE_PROJECTION, @ref demixing_matrix must be set.
327 */
328 enum AVIAMFAmbisonicsMode ambisonics_mode;
329
330 /**
331 * Demixing matrix as defined in section 3.6.3 of IAMF.
332 *
333 * The length of the array is ch_layout.nb_channels multiplied by the sum of
334 * the amount of streams in the group plus the amount of streams in the group
335 * that are stereo.
336 *
337 * May be set only if @ref ambisonics_mode == AV_IAMF_AMBISONICS_MODE_PROJECTION,
338 * must be NULL otherwise.
339 */
340 AVRational *demixing_matrix;
341 } AVIAMFLayer;
342
343
344 enum AVIAMFAudioElementType {
345 AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL,
346 AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE,
347 };
348
349 /**
350 * Information on how to combine one or more audio streams, as defined in
351 * section 3.6 of IAMF.
352 *
353 * @note The struct should be allocated with av_iamf_audio_element_alloc()
354 * and its size is not a part of the public ABI.
355 */
356 typedef struct AVIAMFAudioElement {
357 const AVClass *av_class;
358
359 AVIAMFLayer **layers;
360 /**
361 * Number of layers, or channel groups, in the Audio Element.
362 * There may be 6 layers at most, and for @ref audio_element_type
363 * AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, there may be exactly 1.
364 *
365 * Set by av_iamf_audio_element_add_layer(), must not be
366 * modified by any other code.
367 */
368 unsigned int nb_layers;
369
370 /**
371 * Demixing information used to reconstruct a scalable channel audio
372 * representation.
373 * The @ref AVIAMFParamDefinition.type "type" must be
374 * AV_IAMF_PARAMETER_DEFINITION_DEMIXING.
375 */
376 AVIAMFParamDefinition *demixing_info;
377 /**
378 * Recon gain information used to reconstruct a scalable channel audio
379 * representation.
380 * The @ref AVIAMFParamDefinition.type "type" must be
381 * AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN.
382 */
383 AVIAMFParamDefinition *recon_gain_info;
384
385 /**
386 * Audio element type as defined in section 3.6 of IAMF.
387 */
388 enum AVIAMFAudioElementType audio_element_type;
389
390 /**
391 * Default weight value as defined in section 3.6 of IAMF.
392 */
393 unsigned int default_w;
394 } AVIAMFAudioElement;
395
396 const AVClass *av_iamf_audio_element_get_class(void);
397
398 /**
399 * Allocates a AVIAMFAudioElement, and initializes its fields with default values.
400 * No layers are allocated. Must be freed with av_iamf_audio_element_free().
401 *
402 * @see av_iamf_audio_element_add_layer()
403 */
404 AVIAMFAudioElement *av_iamf_audio_element_alloc(void);
405
406 /**
407 * Allocate a layer and add it to a given AVIAMFAudioElement.
408 * It is freed by av_iamf_audio_element_free() alongside the rest of the parent
409 * AVIAMFAudioElement.
410 *
411 * @return a pointer to the allocated layer.
412 */
413 AVIAMFLayer *av_iamf_audio_element_add_layer(AVIAMFAudioElement *audio_element);
414
415 /**
416 * Free an AVIAMFAudioElement and all its contents.
417 *
418 * @param audio_element pointer to pointer to an allocated AVIAMFAudioElement.
419 * upon return, *audio_element will be set to NULL.
420 */
421 void av_iamf_audio_element_free(AVIAMFAudioElement **audio_element);
422
423 /**
424 * @}
425 * @addtogroup lavu_iamf_mix
426 * @{
427 */
428
429 enum AVIAMFHeadphonesMode {
430 /**
431 * The referenced Audio Element shall be rendered to stereo loudspeakers.
432 */
433 AV_IAMF_HEADPHONES_MODE_STEREO,
434 /**
435 * The referenced Audio Element shall be rendered with a binaural renderer.
436 */
437 AV_IAMF_HEADPHONES_MODE_BINAURAL,
438 };
439
440 /**
441 * Submix element as defined in section 3.7 of IAMF.
442 *
443 * @note The struct should be allocated with av_iamf_submix_add_element()
444 * and its size is not a part of the public ABI.
445 */
446 typedef struct AVIAMFSubmixElement {
447 const AVClass *av_class;
448
449 /**
450 * The id of the Audio Element this submix element references.
451 */
452 unsigned int audio_element_id;
453
454 /**
455 * Information required required for applying any processing to the
456 * referenced and rendered Audio Element before being summed with other
457 * processed Audio Elements.
458 * The @ref AVIAMFParamDefinition.type "type" must be
459 * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN.
460 */
461 AVIAMFParamDefinition *element_mix_config;
462
463 /**
464 * Default mix gain value to apply when there are no AVIAMFParamDefinition
465 * with @ref element_mix_config "element_mix_config's"
466 * @ref AVIAMFParamDefinition.parameter_id "parameter_id" available for a
467 * given audio frame.
468 */
469 AVRational default_mix_gain;
470
471 /**
472 * A value that indicates whether the referenced channel-based Audio Element
473 * shall be rendered to stereo loudspeakers or spatialized with a binaural
474 * renderer when played back on headphones.
475 * If the Audio Element is not of @ref AVIAMFAudioElement.audio_element_type
476 * "type" AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, then this field is undefined.
477 */
478 enum AVIAMFHeadphonesMode headphones_rendering_mode;
479
480 /**
481 * A dictionary of strings describing the submix in different languages.
482 * Must have the same amount of entries as
483 * @ref AVIAMFMixPresentation.annotations "the mix's annotations", stored
484 * in the same order, and with the same key strings.
485 *
486 * @ref AVDictionaryEntry.key "key" is a string conforming to BCP-47 that
487 * specifies the language for the string stored in
488 * @ref AVDictionaryEntry.value "value".
489 */
490 AVDictionary *annotations;
491 } AVIAMFSubmixElement;
492
493 enum AVIAMFSubmixLayoutType {
494 /**
495 * The layout follows the loudspeaker sound system convention of ITU-2051-3.
496 * @ref AVIAMFSubmixLayout.sound_system must be set.
497 */
498 AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS = 2,
499 /**
500 * The layout is binaural.
501 *
502 * @note @ref AVIAMFSubmixLayout.sound_system may be set to
503 * AV_CHANNEL_LAYOUT_BINAURAL to simplify API usage, but it's not mandatory.
504 */
505 AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL = 3,
506 };
507
508 /**
509 * Submix layout as defined in section 3.7.6 of IAMF.
510 *
511 * @note The struct should be allocated with av_iamf_submix_add_layout()
512 * and its size is not a part of the public ABI.
513 */
514 typedef struct AVIAMFSubmixLayout {
515 const AVClass *av_class;
516
517 enum AVIAMFSubmixLayoutType layout_type;
518
519 /**
520 * Channel layout matching one of Sound Systems A to J of ITU-2051-3, plus
521 * 7.1.2ch, 3.1.2ch, and binaural.
522 * If layout_type is not AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS or
523 * AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL, this field is undefined.
524 */
525 AVChannelLayout sound_system;
526 /**
527 * The program integrated loudness information, as defined in
528 * ITU-1770-4.
529 */
530 AVRational integrated_loudness;
531 /**
532 * The digital (sampled) peak value of the audio signal, as defined
533 * in ITU-1770-4.
534 */
535 AVRational digital_peak;
536 /**
537 * The true peak of the audio signal, as defined in ITU-1770-4.
538 */
539 AVRational true_peak;
540 /**
541 * The Dialogue loudness information, as defined in ITU-1770-4.
542 */
543 AVRational dialogue_anchored_loudness;
544 /**
545 * The Album loudness information, as defined in ITU-1770-4.
546 */
547 AVRational album_anchored_loudness;
548 } AVIAMFSubmixLayout;
549
550 /**
551 * Submix layout as defined in section 3.7 of IAMF.
552 *
553 * @note The struct should be allocated with av_iamf_mix_presentation_add_submix()
554 * and its size is not a part of the public ABI.
555 */
556 typedef struct AVIAMFSubmix {
557 const AVClass *av_class;
558
559 /**
560 * Array of submix elements.
561 *
562 * Set by av_iamf_submix_add_element(), must not be modified by any
563 * other code.
564 */
565 AVIAMFSubmixElement **elements;
566 /**
567 * Number of elements in the submix.
568 *
569 * Set by av_iamf_submix_add_element(), must not be modified by any
570 * other code.
571 */
572 unsigned int nb_elements;
573
574 /**
575 * Array of submix layouts.
576 *
577 * Set by av_iamf_submix_add_layout(), must not be modified by any
578 * other code.
579 */
580 AVIAMFSubmixLayout **layouts;
581 /**
582 * Number of layouts in the submix.
583 *
584 * Set by av_iamf_submix_add_layout(), must not be modified by any
585 * other code.
586 */
587 unsigned int nb_layouts;
588
589 /**
590 * Information required for post-processing the mixed audio signal to
591 * generate the audio signal for playback.
592 * The @ref AVIAMFParamDefinition.type "type" must be
593 * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN.
594 */
595 AVIAMFParamDefinition *output_mix_config;
596
597 /**
598 * Default mix gain value to apply when there are no AVIAMFParamDefinition
599 * with @ref output_mix_config "output_mix_config's"
600 * @ref AVIAMFParamDefinition.parameter_id "parameter_id" available for a
601 * given audio frame.
602 */
603 AVRational default_mix_gain;
604 } AVIAMFSubmix;
605
606 /**
607 * Information on how to render and mix one or more AVIAMFAudioElement to generate
608 * the final audio output, as defined in section 3.7 of IAMF.
609 *
610 * @note The struct should be allocated with av_iamf_mix_presentation_alloc()
611 * and its size is not a part of the public ABI.
612 */
613 typedef struct AVIAMFMixPresentation {
614 const AVClass *av_class;
615
616 /**
617 * Array of submixes.
618 *
619 * Set by av_iamf_mix_presentation_add_submix(), must not be modified
620 * by any other code.
621 */
622 AVIAMFSubmix **submixes;
623 /**
624 * Number of submixes in the presentation.
625 *
626 * Set by av_iamf_mix_presentation_add_submix(), must not be modified
627 * by any other code.
628 */
629 unsigned int nb_submixes;
630
631 /**
632 * A dictionary of strings describing the mix in different languages.
633 * Must have the same amount of entries as every
634 * @ref AVIAMFSubmixElement.annotations "Submix element annotations",
635 * stored in the same order, and with the same key strings.
636 *
637 * @ref AVDictionaryEntry.key "key" is a string conforming to BCP-47
638 * that specifies the language for the string stored in
639 * @ref AVDictionaryEntry.value "value".
640 */
641 AVDictionary *annotations;
642 } AVIAMFMixPresentation;
643
644 const AVClass *av_iamf_mix_presentation_get_class(void);
645
646 /**
647 * Allocates a AVIAMFMixPresentation, and initializes its fields with default
648 * values. No submixes are allocated.
649 * Must be freed with av_iamf_mix_presentation_free().
650 *
651 * @see av_iamf_mix_presentation_add_submix()
652 */
653 AVIAMFMixPresentation *av_iamf_mix_presentation_alloc(void);
654
655 /**
656 * Allocate a submix and add it to a given AVIAMFMixPresentation.
657 * It is freed by av_iamf_mix_presentation_free() alongside the rest of the
658 * parent AVIAMFMixPresentation.
659 *
660 * @return a pointer to the allocated submix.
661 */
662 AVIAMFSubmix *av_iamf_mix_presentation_add_submix(AVIAMFMixPresentation *mix_presentation);
663
664 /**
665 * Allocate a submix element and add it to a given AVIAMFSubmix.
666 * It is freed by av_iamf_mix_presentation_free() alongside the rest of the
667 * parent AVIAMFSubmix.
668 *
669 * @return a pointer to the allocated submix.
670 */
671 AVIAMFSubmixElement *av_iamf_submix_add_element(AVIAMFSubmix *submix);
672
673 /**
674 * Allocate a submix layout and add it to a given AVIAMFSubmix.
675 * It is freed by av_iamf_mix_presentation_free() alongside the rest of the
676 * parent AVIAMFSubmix.
677 *
678 * @return a pointer to the allocated submix.
679 */
680 AVIAMFSubmixLayout *av_iamf_submix_add_layout(AVIAMFSubmix *submix);
681
682 /**
683 * Free an AVIAMFMixPresentation and all its contents.
684 *
685 * @param mix_presentation pointer to pointer to an allocated AVIAMFMixPresentation.
686 * upon return, *mix_presentation will be set to NULL.
687 */
688 void av_iamf_mix_presentation_free(AVIAMFMixPresentation **mix_presentation);
689
690 /**
691 * @}
692 */
693
694 #endif /* AVUTIL_IAMF_H */
695