Particularly, state that their size is not part of the ABI. Signed-off-by: James Almer <jamrial@gmail.com>
		
			
				
	
	
		
			681 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			681 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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 */
 |