123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680 |
- /*
- * Immersive Audio Model and Formats helper functions and defines
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg 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 2.1 of the License, or (at your option) any later version.
- *
- * FFmpeg 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 FFmpeg; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- #ifndef AVUTIL_IAMF_H
- #define AVUTIL_IAMF_H
- /**
- * @file
- * Immersive Audio Model and Formats API header
- * @see <a href="https://aomediacodec.github.io/iamf/">Immersive Audio Model and Formats</a>
- */
- #include <stdint.h>
- #include <stddef.h>
- #include "attributes.h"
- #include "avassert.h"
- #include "channel_layout.h"
- #include "dict.h"
- #include "rational.h"
- /**
- * @defgroup lavu_iamf_params Parameter Definition
- * @{
- * Parameters as defined in section 3.6.1 and 3.8 of IAMF.
- * @}
- * @defgroup lavu_iamf_audio Audio Element
- * @{
- * Audio Elements as defined in section 3.6 of IAMF.
- * @}
- * @defgroup lavu_iamf_mix Mix Presentation
- * @{
- * Mix Presentations as defined in section 3.7 of IAMF.
- * @}
- *
- * @}
- * @addtogroup lavu_iamf_params
- * @{
- */
- enum AVIAMFAnimationType {
- AV_IAMF_ANIMATION_TYPE_STEP,
- AV_IAMF_ANIMATION_TYPE_LINEAR,
- AV_IAMF_ANIMATION_TYPE_BEZIER,
- };
- /**
- * Mix Gain Parameter Data as defined in section 3.8.1 of IAMF.
- *
- * @note This struct's size is not a part of the public ABI.
- */
- typedef struct AVIAMFMixGain {
- const AVClass *av_class;
- /**
- * Duration for the given subblock, in units of
- * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate".
- * It must not be 0.
- */
- unsigned int subblock_duration;
- /**
- * The type of animation applied to the parameter values.
- */
- enum AVIAMFAnimationType animation_type;
- /**
- * Parameter value that is applied at the start of the subblock.
- * Applies to all defined Animation Types.
- *
- * Valid range of values is -128.0 to 128.0
- */
- AVRational start_point_value;
- /**
- * Parameter value that is applied at the end of the subblock.
- * Applies only to AV_IAMF_ANIMATION_TYPE_LINEAR and
- * AV_IAMF_ANIMATION_TYPE_BEZIER Animation Types.
- *
- * Valid range of values is -128.0 to 128.0
- */
- AVRational end_point_value;
- /**
- * Parameter value of the middle control point of a quadratic Bezier
- * curve, i.e., its y-axis value.
- * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type.
- *
- * Valid range of values is -128.0 to 128.0
- */
- AVRational control_point_value;
- /**
- * Parameter value of the time of the middle control point of a
- * quadratic Bezier curve, i.e., its x-axis value.
- * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type.
- *
- * Valid range of values is 0.0 to 1.0
- */
- AVRational control_point_relative_time;
- } AVIAMFMixGain;
- /**
- * Demixing Info Parameter Data as defined in section 3.8.2 of IAMF.
- *
- * @note This struct's size is not a part of the public ABI.
- */
- typedef struct AVIAMFDemixingInfo {
- const AVClass *av_class;
- /**
- * Duration for the given subblock, in units of
- * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate".
- * It must not be 0.
- */
- unsigned int subblock_duration;
- /**
- * Pre-defined combination of demixing parameters.
- */
- unsigned int dmixp_mode;
- } AVIAMFDemixingInfo;
- /**
- * Recon Gain Info Parameter Data as defined in section 3.8.3 of IAMF.
- *
- * @note This struct's size is not a part of the public ABI.
- */
- typedef struct AVIAMFReconGain {
- const AVClass *av_class;
- /**
- * Duration for the given subblock, in units of
- * 1 / @ref AVIAMFParamDefinition.parameter_rate "parameter_rate".
- * It must not be 0.
- */
- unsigned int subblock_duration;
- /**
- * Array of gain values to be applied to each channel for each layer
- * defined in the Audio Element referencing the parent Parameter Definition.
- * Values for layers where the AV_IAMF_LAYER_FLAG_RECON_GAIN flag is not set
- * are undefined.
- *
- * Channel order is: FL, C, FR, SL, SR, TFL, TFR, BL, BR, TBL, TBR, LFE
- */
- uint8_t recon_gain[6][12];
- } AVIAMFReconGain;
- enum AVIAMFParamDefinitionType {
- /**
- * Subblocks are of struct type AVIAMFMixGain
- */
- AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN,
- /**
- * Subblocks are of struct type AVIAMFDemixingInfo
- */
- AV_IAMF_PARAMETER_DEFINITION_DEMIXING,
- /**
- * Subblocks are of struct type AVIAMFReconGain
- */
- AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN,
- };
- /**
- * Parameters as defined in section 3.6.1 of IAMF.
- *
- * The struct is allocated by av_iamf_param_definition_alloc() along with an
- * array of subblocks, its type depending on the value of type.
- * This array is placed subblocks_offset bytes after the start of this struct.
- *
- * @note This struct's size is not a part of the public ABI.
- */
- typedef struct AVIAMFParamDefinition {
- const AVClass *av_class;
- /**
- * Offset in bytes from the start of this struct, at which the subblocks
- * array is located.
- */
- size_t subblocks_offset;
- /**
- * Size in bytes of each element in the subblocks array.
- */
- size_t subblock_size;
- /**
- * Number of subblocks in the array.
- */
- unsigned int nb_subblocks;
- /**
- * Parameters type. Determines the type of the subblock elements.
- */
- enum AVIAMFParamDefinitionType type;
- /**
- * Identifier for the paremeter substream.
- */
- unsigned int parameter_id;
- /**
- * Sample rate for the paremeter substream. It must not be 0.
- */
- unsigned int parameter_rate;
- /**
- * The accumulated duration of all blocks in this parameter definition,
- * in units of 1 / @ref parameter_rate.
- *
- * May be 0, in which case all duration values should be specified in
- * another parameter definition referencing the same parameter_id.
- */
- unsigned int duration;
- /**
- * The duration of every subblock in the case where all subblocks, with
- * the optional exception of the last subblock, have equal durations.
- *
- * Must be 0 if subblocks have different durations.
- */
- unsigned int constant_subblock_duration;
- } AVIAMFParamDefinition;
- const AVClass *av_iamf_param_definition_get_class(void);
- /**
- * Allocates memory for AVIAMFParamDefinition, plus an array of {@code nb_subblocks}
- * amount of subblocks of the given type and initializes the variables. Can be
- * freed with a normal av_free() call.
- *
- * @param size if non-NULL, the size in bytes of the resulting data array is written here.
- */
- AVIAMFParamDefinition *av_iamf_param_definition_alloc(enum AVIAMFParamDefinitionType type,
- unsigned int nb_subblocks, size_t *size);
- /**
- * Get the subblock at the specified {@code idx}. Must be between 0 and nb_subblocks - 1.
- *
- * The @ref AVIAMFParamDefinition.type "param definition type" defines
- * the struct type of the returned pointer.
- */
- static av_always_inline void*
- av_iamf_param_definition_get_subblock(const AVIAMFParamDefinition *par, unsigned int idx)
- {
- av_assert0(idx < par->nb_subblocks);
- return (void *)((uint8_t *)par + par->subblocks_offset + idx * par->subblock_size);
- }
- /**
- * @}
- * @addtogroup lavu_iamf_audio
- * @{
- */
- enum AVIAMFAmbisonicsMode {
- AV_IAMF_AMBISONICS_MODE_MONO,
- AV_IAMF_AMBISONICS_MODE_PROJECTION,
- };
- /**
- * Recon gain information for the layer is present in AVIAMFReconGain
- */
- #define AV_IAMF_LAYER_FLAG_RECON_GAIN (1 << 0)
- /**
- * A layer defining a Channel Layout in the Audio Element.
- *
- * When @ref AVIAMFAudioElement.audio_element_type "the parent's Audio Element type"
- * is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, this corresponds to an Scalable Channel
- * Layout layer as defined in section 3.6.2 of IAMF.
- * For AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, it is an Ambisonics channel
- * layout as defined in section 3.6.3 of IAMF.
- *
- * @note The struct should be allocated with av_iamf_audio_element_add_layer()
- * and its size is not a part of the public ABI.
- */
- typedef struct AVIAMFLayer {
- const AVClass *av_class;
- AVChannelLayout ch_layout;
- /**
- * A bitmask which may contain a combination of AV_IAMF_LAYER_FLAG_* flags.
- */
- unsigned int flags;
- /**
- * Output gain channel flags as defined in section 3.6.2 of IAMF.
- *
- * This field is defined only if @ref AVIAMFAudioElement.audio_element_type
- * "the parent's Audio Element type" is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL,
- * must be 0 otherwise.
- */
- unsigned int output_gain_flags;
- /**
- * Output gain as defined in section 3.6.2 of IAMF.
- *
- * Must be 0 if @ref output_gain_flags is 0.
- */
- AVRational output_gain;
- /**
- * Ambisonics mode as defined in section 3.6.3 of IAMF.
- *
- * This field is defined only if @ref AVIAMFAudioElement.audio_element_type
- * "the parent's Audio Element type" is AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE.
- *
- * If AV_IAMF_AMBISONICS_MODE_MONO, channel_mapping is defined implicitly
- * (Ambisonic Order) or explicitly (Custom Order with ambi channels) in
- * @ref ch_layout.
- * If AV_IAMF_AMBISONICS_MODE_PROJECTION, @ref demixing_matrix must be set.
- */
- enum AVIAMFAmbisonicsMode ambisonics_mode;
- /**
- * Demixing matrix as defined in section 3.6.3 of IAMF.
- *
- * The length of the array is ch_layout.nb_channels multiplied by the sum of
- * the amount of streams in the group plus the amount of streams in the group
- * that are stereo.
- *
- * May be set only if @ref ambisonics_mode == AV_IAMF_AMBISONICS_MODE_PROJECTION,
- * must be NULL otherwise.
- */
- AVRational *demixing_matrix;
- } AVIAMFLayer;
- enum AVIAMFAudioElementType {
- AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL,
- AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE,
- };
- /**
- * Information on how to combine one or more audio streams, as defined in
- * section 3.6 of IAMF.
- *
- * @note The struct should be allocated with av_iamf_audio_element_alloc()
- * and its size is not a part of the public ABI.
- */
- typedef struct AVIAMFAudioElement {
- const AVClass *av_class;
- AVIAMFLayer **layers;
- /**
- * Number of layers, or channel groups, in the Audio Element.
- * There may be 6 layers at most, and for @ref audio_element_type
- * AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, there may be exactly 1.
- *
- * Set by av_iamf_audio_element_add_layer(), must not be
- * modified by any other code.
- */
- unsigned int nb_layers;
- /**
- * Demixing information used to reconstruct a scalable channel audio
- * representation.
- * The @ref AVIAMFParamDefinition.type "type" must be
- * AV_IAMF_PARAMETER_DEFINITION_DEMIXING.
- */
- AVIAMFParamDefinition *demixing_info;
- /**
- * Recon gain information used to reconstruct a scalable channel audio
- * representation.
- * The @ref AVIAMFParamDefinition.type "type" must be
- * AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN.
- */
- AVIAMFParamDefinition *recon_gain_info;
- /**
- * Audio element type as defined in section 3.6 of IAMF.
- */
- enum AVIAMFAudioElementType audio_element_type;
- /**
- * Default weight value as defined in section 3.6 of IAMF.
- */
- unsigned int default_w;
- } AVIAMFAudioElement;
- const AVClass *av_iamf_audio_element_get_class(void);
- /**
- * Allocates a AVIAMFAudioElement, and initializes its fields with default values.
- * No layers are allocated. Must be freed with av_iamf_audio_element_free().
- *
- * @see av_iamf_audio_element_add_layer()
- */
- AVIAMFAudioElement *av_iamf_audio_element_alloc(void);
- /**
- * Allocate a layer and add it to a given AVIAMFAudioElement.
- * It is freed by av_iamf_audio_element_free() alongside the rest of the parent
- * AVIAMFAudioElement.
- *
- * @return a pointer to the allocated layer.
- */
- AVIAMFLayer *av_iamf_audio_element_add_layer(AVIAMFAudioElement *audio_element);
- /**
- * Free an AVIAMFAudioElement and all its contents.
- *
- * @param audio_element pointer to pointer to an allocated AVIAMFAudioElement.
- * upon return, *audio_element will be set to NULL.
- */
- void av_iamf_audio_element_free(AVIAMFAudioElement **audio_element);
- /**
- * @}
- * @addtogroup lavu_iamf_mix
- * @{
- */
- enum AVIAMFHeadphonesMode {
- /**
- * The referenced Audio Element shall be rendered to stereo loudspeakers.
- */
- AV_IAMF_HEADPHONES_MODE_STEREO,
- /**
- * The referenced Audio Element shall be rendered with a binaural renderer.
- */
- AV_IAMF_HEADPHONES_MODE_BINAURAL,
- };
- /**
- * Submix element as defined in section 3.7 of IAMF.
- *
- * @note The struct should be allocated with av_iamf_submix_add_element()
- * and its size is not a part of the public ABI.
- */
- typedef struct AVIAMFSubmixElement {
- const AVClass *av_class;
- /**
- * The id of the Audio Element this submix element references.
- */
- unsigned int audio_element_id;
- /**
- * Information required required for applying any processing to the
- * referenced and rendered Audio Element before being summed with other
- * processed Audio Elements.
- * The @ref AVIAMFParamDefinition.type "type" must be
- * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN.
- */
- AVIAMFParamDefinition *element_mix_config;
- /**
- * Default mix gain value to apply when there are no AVIAMFParamDefinition
- * with @ref element_mix_config "element_mix_config's"
- * @ref AVIAMFParamDefinition.parameter_id "parameter_id" available for a
- * given audio frame.
- */
- AVRational default_mix_gain;
- /**
- * A value that indicates whether the referenced channel-based Audio Element
- * shall be rendered to stereo loudspeakers or spatialized with a binaural
- * renderer when played back on headphones.
- * If the Audio Element is not of @ref AVIAMFAudioElement.audio_element_type
- * "type" AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, then this field is undefined.
- */
- enum AVIAMFHeadphonesMode headphones_rendering_mode;
- /**
- * A dictionary of strings describing the submix in different languages.
- * Must have the same amount of entries as
- * @ref AVIAMFMixPresentation.annotations "the mix's annotations", stored
- * in the same order, and with the same key strings.
- *
- * @ref AVDictionaryEntry.key "key" is a string conforming to BCP-47 that
- * specifies the language for the string stored in
- * @ref AVDictionaryEntry.value "value".
- */
- AVDictionary *annotations;
- } AVIAMFSubmixElement;
- enum AVIAMFSubmixLayoutType {
- /**
- * The layout follows the loudspeaker sound system convention of ITU-2051-3.
- */
- AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS = 2,
- /**
- * The layout is binaural.
- */
- AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL = 3,
- };
- /**
- * Submix layout as defined in section 3.7.6 of IAMF.
- *
- * @note The struct should be allocated with av_iamf_submix_add_layout()
- * and its size is not a part of the public ABI.
- */
- typedef struct AVIAMFSubmixLayout {
- const AVClass *av_class;
- enum AVIAMFSubmixLayoutType layout_type;
- /**
- * Channel layout matching one of Sound Systems A to J of ITU-2051-3, plus
- * 7.1.2ch and 3.1.2ch
- * If layout_type is not AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS, this field
- * is undefined.
- */
- AVChannelLayout sound_system;
- /**
- * The program integrated loudness information, as defined in
- * ITU-1770-4.
- */
- AVRational integrated_loudness;
- /**
- * The digital (sampled) peak value of the audio signal, as defined
- * in ITU-1770-4.
- */
- AVRational digital_peak;
- /**
- * The true peak of the audio signal, as defined in ITU-1770-4.
- */
- AVRational true_peak;
- /**
- * The Dialogue loudness information, as defined in ITU-1770-4.
- */
- AVRational dialogue_anchored_loudness;
- /**
- * The Album loudness information, as defined in ITU-1770-4.
- */
- AVRational album_anchored_loudness;
- } AVIAMFSubmixLayout;
- /**
- * Submix layout as defined in section 3.7 of IAMF.
- *
- * @note The struct should be allocated with av_iamf_mix_presentation_add_submix()
- * and its size is not a part of the public ABI.
- */
- typedef struct AVIAMFSubmix {
- const AVClass *av_class;
- /**
- * Array of submix elements.
- *
- * Set by av_iamf_submix_add_element(), must not be modified by any
- * other code.
- */
- AVIAMFSubmixElement **elements;
- /**
- * Number of elements in the submix.
- *
- * Set by av_iamf_submix_add_element(), must not be modified by any
- * other code.
- */
- unsigned int nb_elements;
- /**
- * Array of submix layouts.
- *
- * Set by av_iamf_submix_add_layout(), must not be modified by any
- * other code.
- */
- AVIAMFSubmixLayout **layouts;
- /**
- * Number of layouts in the submix.
- *
- * Set by av_iamf_submix_add_layout(), must not be modified by any
- * other code.
- */
- unsigned int nb_layouts;
- /**
- * Information required for post-processing the mixed audio signal to
- * generate the audio signal for playback.
- * The @ref AVIAMFParamDefinition.type "type" must be
- * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN.
- */
- AVIAMFParamDefinition *output_mix_config;
- /**
- * Default mix gain value to apply when there are no AVIAMFParamDefinition
- * with @ref output_mix_config "output_mix_config's"
- * @ref AVIAMFParamDefinition.parameter_id "parameter_id" available for a
- * given audio frame.
- */
- AVRational default_mix_gain;
- } AVIAMFSubmix;
- /**
- * Information on how to render and mix one or more AVIAMFAudioElement to generate
- * the final audio output, as defined in section 3.7 of IAMF.
- *
- * @note The struct should be allocated with av_iamf_mix_presentation_alloc()
- * and its size is not a part of the public ABI.
- */
- typedef struct AVIAMFMixPresentation {
- const AVClass *av_class;
- /**
- * Array of submixes.
- *
- * Set by av_iamf_mix_presentation_add_submix(), must not be modified
- * by any other code.
- */
- AVIAMFSubmix **submixes;
- /**
- * Number of submixes in the presentation.
- *
- * Set by av_iamf_mix_presentation_add_submix(), must not be modified
- * by any other code.
- */
- unsigned int nb_submixes;
- /**
- * A dictionary of strings describing the mix in different languages.
- * Must have the same amount of entries as every
- * @ref AVIAMFSubmixElement.annotations "Submix element annotations",
- * stored in the same order, and with the same key strings.
- *
- * @ref AVDictionaryEntry.key "key" is a string conforming to BCP-47
- * that specifies the language for the string stored in
- * @ref AVDictionaryEntry.value "value".
- */
- AVDictionary *annotations;
- } AVIAMFMixPresentation;
- const AVClass *av_iamf_mix_presentation_get_class(void);
- /**
- * Allocates a AVIAMFMixPresentation, and initializes its fields with default
- * values. No submixes are allocated.
- * Must be freed with av_iamf_mix_presentation_free().
- *
- * @see av_iamf_mix_presentation_add_submix()
- */
- AVIAMFMixPresentation *av_iamf_mix_presentation_alloc(void);
- /**
- * Allocate a submix and add it to a given AVIAMFMixPresentation.
- * It is freed by av_iamf_mix_presentation_free() alongside the rest of the
- * parent AVIAMFMixPresentation.
- *
- * @return a pointer to the allocated submix.
- */
- AVIAMFSubmix *av_iamf_mix_presentation_add_submix(AVIAMFMixPresentation *mix_presentation);
- /**
- * Allocate a submix element and add it to a given AVIAMFSubmix.
- * It is freed by av_iamf_mix_presentation_free() alongside the rest of the
- * parent AVIAMFSubmix.
- *
- * @return a pointer to the allocated submix.
- */
- AVIAMFSubmixElement *av_iamf_submix_add_element(AVIAMFSubmix *submix);
- /**
- * Allocate a submix layout and add it to a given AVIAMFSubmix.
- * It is freed by av_iamf_mix_presentation_free() alongside the rest of the
- * parent AVIAMFSubmix.
- *
- * @return a pointer to the allocated submix.
- */
- AVIAMFSubmixLayout *av_iamf_submix_add_layout(AVIAMFSubmix *submix);
- /**
- * Free an AVIAMFMixPresentation and all its contents.
- *
- * @param mix_presentation pointer to pointer to an allocated AVIAMFMixPresentation.
- * upon return, *mix_presentation will be set to NULL.
- */
- void av_iamf_mix_presentation_free(AVIAMFMixPresentation **mix_presentation);
- /**
- * @}
- */
- #endif /* AVUTIL_IAMF_H */
|