FFmpeg
iamf_reader.c
Go to the documentation of this file.
1 /*
2  * Immersive Audio Model and Formats demuxing utils
3  * Copyright (c) 2024 James Almer <jamrial@gmail.com>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #include "libavutil/avassert.h"
23 #include "libavutil/intreadwrite.h"
24 #include "libavutil/log.h"
25 #include "libavcodec/mathops.h"
26 #include "libavcodec/packet.h"
27 #include "avformat.h"
28 #include "avio_internal.h"
29 #include "iamf.h"
30 #include "iamf_parse.h"
31 #include "iamf_reader.h"
32 
34 {
35  for (int i = 0; i < s->nb_streams; i++)
36  if (s->streams[i]->id == id)
37  return s->streams[i];
38 
39  av_log(s, AV_LOG_ERROR, "Invalid stream id %d\n", id);
40  return NULL;
41 }
42 
44  AVIOContext *pb, AVPacket *pkt,
45  int len, enum IAMF_OBU_Type type,
46  unsigned skip_samples, unsigned discard_padding,
47  int id_in_bitstream)
48 {
49  AVStream *st;
50  int ret, audio_substream_id;
51 
52  if (id_in_bitstream) {
53  unsigned explicit_audio_substream_id;
54  int64_t pos = avio_tell(pb);
55  explicit_audio_substream_id = ffio_read_leb(pb);
56  len -= avio_tell(pb) - pos;
57  audio_substream_id = explicit_audio_substream_id;
58  } else
59  audio_substream_id = type - IAMF_OBU_IA_AUDIO_FRAME_ID0;
60 
61  st = find_stream_by_id(s, audio_substream_id);
62  if (!st)
63  return AVERROR_INVALIDDATA;
64 
65  ret = av_get_packet(pb, pkt, len);
66  if (ret < 0)
67  return ret;
68  if (ret != len)
69  return AVERROR_INVALIDDATA;
70 
71  if (skip_samples || discard_padding) {
72  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
73  if (!side_data)
74  return AVERROR(ENOMEM);
75  AV_WL32(side_data, skip_samples);
76  AV_WL32(side_data + 4, discard_padding);
77  }
78  if (c->mix) {
79  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_IAMF_MIX_GAIN_PARAM, c->mix_size);
80  if (!side_data)
81  return AVERROR(ENOMEM);
82  memcpy(side_data, c->mix, c->mix_size);
83  }
84  if (c->demix) {
85  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM, c->demix_size);
86  if (!side_data)
87  return AVERROR(ENOMEM);
88  memcpy(side_data, c->demix, c->demix_size);
89  }
90  if (c->recon) {
91  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM, c->recon_size);
92  if (!side_data)
93  return AVERROR(ENOMEM);
94  memcpy(side_data, c->recon, c->recon_size);
95  }
96 
97  pkt->stream_index = st->index;
98  return 0;
99 }
100 
102  AVIOContext *pbc, int len)
103 {
105  const AVIAMFParamDefinition *param;
106  AVIAMFParamDefinition *out_param = NULL;
107  FFIOContext b;
108  AVIOContext *pb;
109  uint8_t *buf;
110  unsigned int duration, constant_subblock_duration;
111  unsigned int nb_subblocks;
112  unsigned int parameter_id;
113  size_t out_param_size;
114  int ret;
115 
116  buf = av_malloc(len);
117  if (!buf)
118  return AVERROR(ENOMEM);
119 
120  ret = avio_read(pbc, buf, len);
121  if (ret != len) {
122  if (ret >= 0)
124  goto fail;
125  }
126 
127  ffio_init_context(&b, buf, len, 0, NULL, NULL, NULL, NULL);
128  pb = &b.pub;
129 
130  parameter_id = ffio_read_leb(pb);
131  param_definition = ff_iamf_get_param_definition(&c->iamf, parameter_id);
132  if (!param_definition) {
133  av_log(s, AV_LOG_VERBOSE, "Non existant parameter_id %d referenced in a parameter block. Ignoring\n",
134  parameter_id);
135  ret = 0;
136  goto fail;
137  }
138 
139  param = param_definition->param;
140  if (!param_definition->mode) {
141  duration = ffio_read_leb(pb);
142  if (!duration) {
144  goto fail;
145  }
146  constant_subblock_duration = ffio_read_leb(pb);
147  if (constant_subblock_duration == 0)
148  nb_subblocks = ffio_read_leb(pb);
149  else
150  nb_subblocks = duration / constant_subblock_duration;
151  } else {
152  duration = param->duration;
153  constant_subblock_duration = param->constant_subblock_duration;
154  nb_subblocks = param->nb_subblocks;
155  }
156 
157  out_param = av_iamf_param_definition_alloc(param->type, nb_subblocks, &out_param_size);
158  if (!out_param) {
159  ret = AVERROR(ENOMEM);
160  goto fail;
161  }
162 
163  out_param->parameter_id = param->parameter_id;
164  out_param->type = param->type;
165  out_param->parameter_rate = param->parameter_rate;
166  out_param->duration = duration;
167  out_param->constant_subblock_duration = constant_subblock_duration;
168  out_param->nb_subblocks = nb_subblocks;
169 
170  for (int i = 0; i < nb_subblocks; i++) {
171  void *subblock = av_iamf_param_definition_get_subblock(out_param, i);
172  unsigned int subblock_duration = constant_subblock_duration;
173 
174  if (!param_definition->mode && !constant_subblock_duration)
175  subblock_duration = ffio_read_leb(pb);
176 
177  switch (param->type) {
179  AVIAMFMixGain *mix = subblock;
180 
181  mix->animation_type = ffio_read_leb(pb);
182  if (mix->animation_type > AV_IAMF_ANIMATION_TYPE_BEZIER) {
183  ret = 0;
184  av_free(out_param);
185  goto fail;
186  }
187 
188  mix->start_point_value = av_make_q(sign_extend(avio_rb16(pb), 16), 1 << 8);
189  if (mix->animation_type >= AV_IAMF_ANIMATION_TYPE_LINEAR)
190  mix->end_point_value = av_make_q(sign_extend(avio_rb16(pb), 16), 1 << 8);
191  if (mix->animation_type == AV_IAMF_ANIMATION_TYPE_BEZIER) {
192  mix->control_point_value = av_make_q(sign_extend(avio_rb16(pb), 16), 1 << 8);
193  mix->control_point_relative_time = av_make_q(avio_r8(pb), 1 << 8);
194  }
195  mix->subblock_duration = subblock_duration;
196  break;
197  }
199  AVIAMFDemixingInfo *demix = subblock;
200 
201  demix->dmixp_mode = avio_r8(pb) >> 5;
202  demix->subblock_duration = subblock_duration;
203  break;
204  }
206  AVIAMFReconGain *recon = subblock;
207  const IAMFAudioElement *audio_element = param_definition->audio_element;
208  const AVIAMFAudioElement *element = audio_element->celement;
209 
210  av_assert0(audio_element && element);
211  for (int i = 0; i < element->nb_layers; i++) {
212  const AVIAMFLayer *layer = element->layers[i];
213  if (layer->flags & AV_IAMF_LAYER_FLAG_RECON_GAIN) {
214  unsigned int recon_gain_flags = ffio_read_leb(pb);
215  unsigned int bitcount = 7 + 5 * !!(recon_gain_flags & 0x80);
216  recon_gain_flags = (recon_gain_flags & 0x7F) | ((recon_gain_flags & 0xFF00) >> 1);
217  for (int j = 0; j < bitcount; j++) {
218  if (recon_gain_flags & (1 << j))
219  recon->recon_gain[i][j] = avio_r8(pb);
220  }
221  }
222  }
223  recon->subblock_duration = subblock_duration;
224  break;
225  }
226  default:
227  av_assert0(0);
228  }
229  }
230 
231  len -= avio_tell(pb);
232  if (len) {
233  int level = (s->error_recognition & AV_EF_EXPLODE) ? AV_LOG_ERROR : AV_LOG_WARNING;
234  av_log(s, level, "Underread in parameter_block_obu. %d bytes left at the end\n", len);
235  }
236 
237  switch (param->type) {
239  av_free(c->mix);
240  c->mix = out_param;
241  c->mix_size = out_param_size;
242  break;
244  av_free(c->demix);
245  c->demix = out_param;
246  c->demix_size = out_param_size;
247  break;
249  av_free(c->recon);
250  c->recon = out_param;
251  c->recon_size = out_param_size;
252  break;
253  default:
254  av_assert0(0);
255  }
256 
257  ret = 0;
258 fail:
259  if (ret < 0)
260  av_free(out_param);
261  av_free(buf);
262 
263  return ret;
264 }
265 
267  AVIOContext *pb, int max_size, AVPacket *pkt)
268 {
269  int read = 0;
270 
271  while (1) {
273  enum IAMF_OBU_Type type;
274  unsigned obu_size;
275  unsigned skip_samples, discard_padding;
276  int ret, len, size, start_pos;
277 
278  if ((ret = ffio_ensure_seekback(pb, FFMIN(MAX_IAMF_OBU_HEADER_SIZE, max_size))) < 0)
279  return ret;
281  if (size < 0)
282  return size;
283 
284  len = ff_iamf_parse_obu_header(header, size, &obu_size, &start_pos, &type,
285  &skip_samples, &discard_padding);
286  if (len < 0 || obu_size > max_size || len > INT_MAX - read) {
287  av_log(s, AV_LOG_ERROR, "Failed to read obu\n");
288  return len < 0 ? len : AVERROR_INVALIDDATA;
289  }
290  avio_seek(pb, -(size - start_pos), SEEK_CUR);
291 
292  read += len;
294  ret = audio_frame_obu(s, c, pb, pkt, obu_size, type,
295  skip_samples, discard_padding,
297  if (ret < 0)
298  return ret;
299  return read;
300  } else if (type == IAMF_OBU_IA_PARAMETER_BLOCK) {
301  ret = parameter_block_obu(s, c, pb, obu_size);
302  if (ret < 0)
303  return ret;
304  } else if (type == IAMF_OBU_IA_TEMPORAL_DELIMITER) {
305  av_freep(&c->mix);
306  c->mix_size = 0;
307  av_freep(&c->demix);
308  c->demix_size = 0;
309  av_freep(&c->recon);
310  c->recon_size = 0;
311  } else {
312  int64_t offset = avio_skip(pb, obu_size);
313  if (offset < 0)
314  return offset;
315  }
316  max_size -= len;
317  if (max_size < 0)
318  return AVERROR_INVALIDDATA;
319  if (!max_size)
320  break;
321  }
322 
323  return read;
324 }
325 
327 {
328  IAMFContext *const iamf = &c->iamf;
329 
331 
332  av_freep(&c->mix);
333  c->mix_size = 0;
334  av_freep(&c->demix);
335  c->demix_size = 0;
336  av_freep(&c->recon);
337  c->recon_size = 0;
338 }
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVIAMFAudioElement::nb_layers
unsigned int nb_layers
Number of layers, or channel groups, in the Audio Element.
Definition: iamf.h:368
level
uint8_t level
Definition: svq3.c:204
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
ffio_init_context
void ffio_init_context(FFIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, const uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Definition: aviobuf.c:49
mix
static int mix(int c0, int c1)
Definition: 4xm.c:715
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AV_WL32
#define AV_WL32(p, v)
Definition: intreadwrite.h:424
av_iamf_param_definition_alloc
AVIAMFParamDefinition * av_iamf_param_definition_alloc(enum AVIAMFParamDefinitionType type, unsigned int nb_subblocks, size_t *out_size)
Allocates memory for AVIAMFParamDefinition, plus an array of.
Definition: iamf.c:159
AVIAMFAudioElement::layers
AVIAMFLayer ** layers
Definition: iamf.h:359
int64_t
long long int64_t
Definition: coverity.c:34
AVIAMFParamDefinition::type
enum AVIAMFParamDefinitionType type
Parameters type.
Definition: iamf.h:213
b
#define b
Definition: input.c:41
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
AVIAMFParamDefinition
Parameters as defined in section 3.6.1 of IAMF.
Definition: iamf.h:193
iamf_parse.h
ff_iamf_get_param_definition
static IAMFParamDefinition * ff_iamf_get_param_definition(const IAMFContext *iamf, unsigned int parameter_id)
Definition: iamf.h:183
FFIOContext
Definition: avio_internal.h:28
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:30
ff_iamf_read_packet
int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c, AVIOContext *pb, int max_size, AVPacket *pkt)
Definition: iamf_reader.c:266
AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM
@ AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM
IAMF Recon Gain Info Parameter Data associated with the audio frame.
Definition: packet.h:324
IAMFParamDefinition
Definition: iamf.h:121
fail
#define fail()
Definition: checkasm.h:179
avio_tell
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
Definition: avio.h:494
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
IAMF_OBU_IA_PARAMETER_BLOCK
@ IAMF_OBU_IA_PARAMETER_BLOCK
Definition: iamf.h:41
AVIAMFReconGain
Recon Gain Info Parameter Data as defined in section 3.8.3 of IAMF.
Definition: iamf.h:148
audio_frame_obu
static int audio_frame_obu(AVFormatContext *s, const IAMFDemuxContext *c, AVIOContext *pb, AVPacket *pkt, int len, enum IAMF_OBU_Type type, unsigned skip_samples, unsigned discard_padding, int id_in_bitstream)
Definition: iamf_reader.c:43
AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
Subblocks are of struct type AVIAMFReconGain.
Definition: iamf.h:181
avassert.h
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
duration
int64_t duration
Definition: movenc.c:64
AV_IAMF_ANIMATION_TYPE_BEZIER
@ AV_IAMF_ANIMATION_TYPE_BEZIER
Definition: iamf.h:69
intreadwrite.h
s
#define s(width, name)
Definition: cbs_vp9.c:198
find_stream_by_id
static AVStream * find_stream_by_id(AVFormatContext *s, int id)
Definition: iamf_reader.c:33
av_iamf_param_definition_get_subblock
static av_always_inline void * av_iamf_param_definition_get_subblock(const AVIAMFParamDefinition *par, unsigned int idx)
Get the subblock at the specified.
Definition: iamf.h:260
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
ffio_read_leb
unsigned int ffio_read_leb(AVIOContext *s)
Read a unsigned integer coded as a variable number of up to eight little-endian bytes,...
Definition: aviobuf.c:926
AVFormatContext
Format I/O context.
Definition: avformat.h:1255
AVIAMFDemixingInfo
Demixing Info Parameter Data as defined in section 3.8.2 of IAMF.
Definition: iamf.h:128
NULL
#define NULL
Definition: coverity.c:32
AVIAMFParamDefinition::duration
unsigned int duration
The accumulated duration of all blocks in this parameter definition, in units of 1 / parameter_rate.
Definition: iamf.h:231
AVIAMFLayer
A layer defining a Channel Layout in the Audio Element.
Definition: iamf.h:294
mathops.h
AV_IAMF_ANIMATION_TYPE_LINEAR
@ AV_IAMF_ANIMATION_TYPE_LINEAR
Definition: iamf.h:68
IAMFAudioElement::celement
const AVIAMFAudioElement * celement
Definition: iamf.h:90
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ff_iamf_parse_obu_header
int ff_iamf_parse_obu_header(const uint8_t *buf, int buf_size, unsigned *obu_size, int *start_pos, enum IAMF_OBU_Type *type, unsigned *skip_samples, unsigned *discard_padding)
Definition: iamf_parse.c:1010
IAMFAudioElement
Definition: iamf.h:89
AVIAMFReconGain::subblock_duration
unsigned int subblock_duration
Duration for the given subblock, in units of 1 / parameter_rate.
Definition: iamf.h:156
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVIAMFDemixingInfo::subblock_duration
unsigned int subblock_duration
Duration for the given subblock, in units of 1 / parameter_rate.
Definition: iamf.h:136
ff_iamf_uninit_context
void ff_iamf_uninit_context(IAMFContext *c)
Definition: iamf.c:99
size
int size
Definition: twinvq_data.h:10344
av_make_q
static AVRational av_make_q(int num, int den)
Create an AVRational.
Definition: rational.h:71
IAMFContext
Definition: iamf.h:128
header
static const uint8_t header[24]
Definition: sdr2.c:68
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:602
AVIAMFParamDefinition::constant_subblock_duration
unsigned int constant_subblock_duration
The duration of every subblock in the case where all subblocks, with the optional exception of the la...
Definition: iamf.h:238
AVIAMFAudioElement
Information on how to combine one or more audio streams, as defined in section 3.6 of IAMF.
Definition: iamf.h:356
ffio_ensure_seekback
int ffio_ensure_seekback(AVIOContext *s, int64_t buf_size)
Ensures that the requested seekback buffer size will be available.
Definition: aviobuf.c:1022
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
AVIAMFMixGain
Mix Gain Parameter Data as defined in section 3.8.1 of IAMF.
Definition: iamf.h:77
log.h
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
AVIAMFParamDefinition::parameter_id
unsigned int parameter_id
Identifier for the paremeter substream.
Definition: iamf.h:218
avio_internal.h
packet.h
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
param_definition
static int param_definition(const IAMFContext *iamf, const IAMFParamDefinition *param_def, AVIOContext *dyn_bc, void *log_ctx)
Definition: iamf_writer.c:586
len
int len
Definition: vorbis_enc_data.h:426
IAMF_OBU_IA_AUDIO_FRAME
@ IAMF_OBU_IA_AUDIO_FRAME
Definition: iamf.h:43
AVIAMFParamDefinition::nb_subblocks
unsigned int nb_subblocks
Number of subblocks in the array.
Definition: iamf.h:208
av_get_packet
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition: utils.c:103
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:743
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:230
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:745
pos
unsigned int pos
Definition: spdifenc.c:413
avformat.h
IAMF_OBU_IA_AUDIO_FRAME_ID0
@ IAMF_OBU_IA_AUDIO_FRAME_ID0
Definition: iamf.h:44
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: defs.h:40
IAMF_OBU_Type
IAMF_OBU_Type
Definition: iamf.h:37
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:749
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: avpacket.c:231
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:611
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:133
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
Definition: packet.h:157
AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
Subblocks are of struct type AVIAMFMixGain.
Definition: iamf.h:173
AVPacket::stream_index
int stream_index
Definition: packet.h:524
MAX_IAMF_OBU_HEADER_SIZE
#define MAX_IAMF_OBU_HEADER_SIZE
Definition: iamf.h:34
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:317
AVIAMFDemixingInfo::dmixp_mode
unsigned int dmixp_mode
Pre-defined combination of demixing parameters.
Definition: iamf.h:140
AVIAMFLayer::flags
unsigned int flags
A bitmask which may contain a combination of AV_IAMF_LAYER_FLAG_* flags.
Definition: iamf.h:302
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
AVPacket
This structure stores compressed data.
Definition: packet.h:499
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
iamf.h
AVIAMFParamDefinition::parameter_rate
unsigned int parameter_rate
Sample rate for the paremeter substream.
Definition: iamf.h:222
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
IAMF_OBU_IA_TEMPORAL_DELIMITER
@ IAMF_OBU_IA_TEMPORAL_DELIMITER
Definition: iamf.h:42
IAMFDemuxContext
Definition: iamf_reader.h:32
parameter_block_obu
static int parameter_block_obu(AVFormatContext *s, IAMFDemuxContext *c, AVIOContext *pbc, int len)
Definition: iamf_reader.c:101
AVIAMFReconGain::recon_gain
uint8_t recon_gain[6][12]
Array of gain values to be applied to each channel for each layer defined in the Audio Element refere...
Definition: iamf.h:166
AV_PKT_DATA_IAMF_MIX_GAIN_PARAM
@ AV_PKT_DATA_IAMF_MIX_GAIN_PARAM
IAMF Mix Gain Parameter Data associated with the audio frame.
Definition: packet.h:308
read
static uint32_t BS_FUNC() read(BSCTX *bc, unsigned int n)
Return n bits from the buffer, n has to be in the 0-32 range.
Definition: bitstream_template.h:231
iamf_reader.h
ff_iamf_read_deinit
void ff_iamf_read_deinit(IAMFDemuxContext *c)
Definition: iamf_reader.c:326
AV_IAMF_PARAMETER_DEFINITION_DEMIXING
@ AV_IAMF_PARAMETER_DEFINITION_DEMIXING
Subblocks are of struct type AVIAMFDemixingInfo.
Definition: iamf.h:177
IAMF_OBU_IA_AUDIO_FRAME_ID17
@ IAMF_OBU_IA_AUDIO_FRAME_ID17
Definition: iamf.h:61
AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM
@ AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM
IAMF Demixing Info Parameter Data associated with the audio frame.
Definition: packet.h:316