2023-11-25 15:56:36 +02:00
|
|
|
/*
|
|
|
|
* 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"
|
|
|
|
|
|
|
|
/**
|
2024-01-15 21:30:20 +02:00
|
|
|
* @defgroup lavu_iamf_params Parameter Definition
|
2023-11-25 15:56:36 +02:00
|
|
|
* @{
|
|
|
|
* Parameters as defined in section 3.6.1 and 3.8 of IAMF.
|
|
|
|
* @}
|
2024-01-15 21:30:20 +02:00
|
|
|
* @defgroup lavu_iamf_audio Audio Element
|
2023-11-25 15:56:36 +02:00
|
|
|
* @{
|
|
|
|
* Audio Elements as defined in section 3.6 of IAMF.
|
|
|
|
* @}
|
2024-01-15 21:30:20 +02:00
|
|
|
* @defgroup lavu_iamf_mix Mix Presentation
|
2023-11-25 15:56:36 +02:00
|
|
|
* @{
|
|
|
|
* Mix Presentations as defined in section 3.7 of IAMF.
|
|
|
|
* @}
|
|
|
|
*
|
|
|
|
* @}
|
2024-01-15 21:30:20 +02:00
|
|
|
* @addtogroup lavu_iamf_params
|
2023-11-25 15:56:36 +02:00
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
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.
|
2024-01-15 23:15:10 +02:00
|
|
|
*
|
|
|
|
* @note This struct's size is not a part of the public ABI.
|
2023-11-25 15:56:36 +02:00
|
|
|
*/
|
|
|
|
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.
|
2024-01-15 23:15:10 +02:00
|
|
|
*
|
|
|
|
* @note This struct's size is not a part of the public ABI.
|
2023-11-25 15:56:36 +02:00
|
|
|
*/
|
|
|
|
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.
|
2024-01-15 23:15:10 +02:00
|
|
|
*
|
|
|
|
* @note This struct's size is not a part of the public ABI.
|
2023-11-25 15:56:36 +02:00
|
|
|
*/
|
|
|
|
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.
|
2024-01-15 23:15:10 +02:00
|
|
|
*
|
|
|
|
* @note This struct's size is not a part of the public ABI.
|
2023-11-25 15:56:36 +02:00
|
|
|
*/
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @}
|
2024-01-15 21:30:20 +02:00
|
|
|
* @addtogroup lavu_iamf_audio
|
2023-11-25 15:56:36 +02:00
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
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.
|
2024-01-15 23:15:10 +02:00
|
|
|
*
|
|
|
|
* @note The struct should be allocated with av_iamf_audio_element_add_layer()
|
|
|
|
* and its size is not a part of the public ABI.
|
2023-11-25 15:56:36 +02:00
|
|
|
*/
|
|
|
|
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,
|
|
|
|
};
|
|
|
|
|
2024-01-15 23:15:10 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2023-11-25 15:56:36 +02:00
|
|
|
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);
|
|
|
|
|
2023-12-19 16:15:18 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2023-11-25 15:56:36 +02:00
|
|
|
void av_iamf_audio_element_free(AVIAMFAudioElement **audio_element);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @}
|
2024-01-15 21:30:20 +02:00
|
|
|
* @addtogroup lavu_iamf_mix
|
2023-11-25 15:56:36 +02:00
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
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,
|
|
|
|
};
|
|
|
|
|
2024-01-15 23:15:10 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2023-11-25 15:56:36 +02:00
|
|
|
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,
|
|
|
|
};
|
|
|
|
|
2024-01-15 23:15:10 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2023-11-25 15:56:36 +02:00
|
|
|
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;
|
|
|
|
|
2024-01-15 23:15:10 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2023-11-25 15:56:36 +02:00
|
|
|
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;
|
|
|
|
|
2024-01-15 23:15:10 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2023-11-25 15:56:36 +02:00
|
|
|
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);
|
|
|
|
|
2023-12-19 16:15:18 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2023-11-25 15:56:36 +02:00
|
|
|
void av_iamf_mix_presentation_free(AVIAMFMixPresentation **mix_presentation);
|
|
|
|
/**
|
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
|
|
|
#endif /* AVUTIL_IAMF_H */
|