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 "libavutil/mem.h"
26 #include "libavcodec/mathops.h"
27 #include "libavcodec/packet.h"
28 #include "avformat.h"
29 #include "avio_internal.h"
30 #include "iamf.h"
31 #include "iamf_parse.h"
32 #include "iamf_reader.h"
33 
34 static AVStream *find_stream_by_id(AVFormatContext *s, int id, int stream_id_offset)
35 {
36  for (int i = 0; i < s->nb_streams; i++)
37  if (s->streams[i]->id == id + stream_id_offset)
38  return s->streams[i];
39 
40  av_log(s, AV_LOG_ERROR, "Invalid stream id %d\n", id);
41  return NULL;
42 }
43 
45  AVIOContext *pb, AVPacket *pkt,
46  int len, enum IAMF_OBU_Type type,
47  unsigned skip_samples, unsigned discard_padding,
48  int stream_id_offset, int id_in_bitstream)
49 {
50  AVStream *st;
51  int ret, audio_substream_id;
52 
53  if (id_in_bitstream) {
54  unsigned explicit_audio_substream_id;
55  int64_t pos = avio_tell(pb);
56  explicit_audio_substream_id = ffio_read_leb(pb);
57  len -= avio_tell(pb) - pos;
58  audio_substream_id = explicit_audio_substream_id;
59  } else
60  audio_substream_id = type - IAMF_OBU_IA_AUDIO_FRAME_ID0;
61 
62  st = find_stream_by_id(s, audio_substream_id, stream_id_offset);
63  if (!st)
64  return AVERROR_INVALIDDATA;
65 
66  ret = av_get_packet(pb, pkt, len);
67  if (ret < 0)
68  return ret;
69  if (ret != len)
70  return AVERROR_INVALIDDATA;
71 
72  if (skip_samples || discard_padding) {
73  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, 10);
74  if (!side_data)
75  return AVERROR(ENOMEM);
76  AV_WL32A(side_data, skip_samples);
77  AV_WL32A(side_data + 4, discard_padding);
78  }
79  if (c->mix) {
80  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_IAMF_MIX_GAIN_PARAM, c->mix_size);
81  if (!side_data)
82  return AVERROR(ENOMEM);
83  memcpy(side_data, c->mix, c->mix_size);
84  }
85  if (c->demix) {
86  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM, c->demix_size);
87  if (!side_data)
88  return AVERROR(ENOMEM);
89  memcpy(side_data, c->demix, c->demix_size);
90  }
91  if (c->recon) {
92  uint8_t *side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM, c->recon_size);
93  if (!side_data)
94  return AVERROR(ENOMEM);
95  memcpy(side_data, c->recon, c->recon_size);
96  }
97 
98  pkt->stream_index = st->index;
99  return 0;
100 }
101 
103  AVIOContext *pbc, int len)
104 {
105  const IAMFAudioElement *audio_element;
107  const AVIAMFParamDefinition *param;
108  AVIAMFParamDefinition *out_param = NULL;
109  FFIOContext b;
110  AVIOContext *pb;
111  uint8_t *buf;
112  unsigned int duration, constant_subblock_duration;
113  unsigned int total_duration = 0;
114  unsigned int nb_subblocks;
115  unsigned int parameter_id;
116  size_t out_param_size;
117  int ret;
118 
119  buf = av_malloc(len);
120  if (!buf)
121  return AVERROR(ENOMEM);
122 
123  ret = avio_read(pbc, buf, len);
124  if (ret != len) {
125  if (ret >= 0)
127  goto fail;
128  }
129 
130  ffio_init_context(&b, buf, len, 0, NULL, NULL, NULL, NULL);
131  pb = &b.pub;
132 
133  parameter_id = ffio_read_leb(pb);
134  param_definition = ff_iamf_get_param_definition(&c->iamf, parameter_id);
135  if (!param_definition) {
136  av_log(s, AV_LOG_VERBOSE, "Non existent parameter_id %d referenced in a parameter block. Ignoring\n",
137  parameter_id);
138  ret = 0;
139  goto fail;
140  }
141 
142  audio_element = param_definition->audio_element;
143  param = param_definition->param;
144  if (!param_definition->mode) {
145  duration = ffio_read_leb(pb);
146  if (!duration) {
148  goto fail;
149  }
150  if (audio_element) {
151  const IAMFCodecConfig *codec_config = ff_iamf_get_codec_config(&c->iamf, audio_element->codec_config_id);
152  if (duration > av_rescale(codec_config->nb_samples, codec_config->sample_rate, param->parameter_rate)) {
153  av_log(s, AV_LOG_ERROR, "Invalid block duration in parameter_id %u\n", parameter_id);
155  goto fail;
156  }
157  }
158  constant_subblock_duration = ffio_read_leb(pb);
159  if (constant_subblock_duration == 0)
160  nb_subblocks = ffio_read_leb(pb);
161  else {
162  if (constant_subblock_duration > duration) {
163  av_log(s, AV_LOG_ERROR, "Invalid block duration in parameter_id %u\n", parameter_id);
165  goto fail;
166  }
167  nb_subblocks = duration / constant_subblock_duration;
168  total_duration = duration;
169  }
170  } else {
171  duration = param->duration;
172  constant_subblock_duration = param->constant_subblock_duration;
173  nb_subblocks = param->nb_subblocks;
174  }
175 
176  if (nb_subblocks > duration) {
177  av_log(s, AV_LOG_ERROR, "Invalid duration or subblock count in parameter_id %u\n", parameter_id);
179  goto fail;
180  }
181 
182  out_param = av_iamf_param_definition_alloc(param->type, nb_subblocks, &out_param_size);
183  if (!out_param) {
184  ret = AVERROR(ENOMEM);
185  goto fail;
186  }
187 
188  out_param->parameter_id = param->parameter_id;
189  out_param->type = param->type;
190  out_param->parameter_rate = param->parameter_rate;
191  out_param->duration = duration;
192  out_param->constant_subblock_duration = constant_subblock_duration;
193  out_param->nb_subblocks = nb_subblocks;
194 
195  for (int i = 0; i < nb_subblocks; i++) {
196  void *subblock = av_iamf_param_definition_get_subblock(out_param, i);
197  unsigned int subblock_duration = constant_subblock_duration;
198 
199  if (!param_definition->mode && !constant_subblock_duration) {
200  subblock_duration = ffio_read_leb(pb);
201  if (duration - total_duration > subblock_duration) {
202  av_log(s, AV_LOG_ERROR, "Invalid subblock durations in parameter_id %u\n", parameter_id);
204  goto fail;
205  }
206  total_duration += subblock_duration;
207  } else if (i == nb_subblocks - 1)
208  subblock_duration = duration - i * constant_subblock_duration;
209 
210  switch (param->type) {
212  AVIAMFMixGain *mix = subblock;
213 
214  mix->animation_type = ffio_read_leb(pb);
215  if (mix->animation_type > AV_IAMF_ANIMATION_TYPE_BEZIER) {
216  ret = 0;
217  av_free(out_param);
218  goto fail;
219  }
220 
221  mix->start_point_value = av_make_q(sign_extend(avio_rb16(pb), 16), 1 << 8);
222  if (mix->animation_type >= AV_IAMF_ANIMATION_TYPE_LINEAR)
223  mix->end_point_value = av_make_q(sign_extend(avio_rb16(pb), 16), 1 << 8);
224  if (mix->animation_type == AV_IAMF_ANIMATION_TYPE_BEZIER) {
225  mix->control_point_value = av_make_q(sign_extend(avio_rb16(pb), 16), 1 << 8);
226  mix->control_point_relative_time = av_make_q(avio_r8(pb), 1 << 8);
227  }
228  mix->subblock_duration = subblock_duration;
229  break;
230  }
232  AVIAMFDemixingInfo *demix = subblock;
233 
234  demix->dmixp_mode = avio_r8(pb) >> 5;
235  demix->subblock_duration = subblock_duration;
236  break;
237  }
239  AVIAMFReconGain *recon = subblock;
240  const AVIAMFAudioElement *element;
241 
242  av_assert0(audio_element && audio_element->celement);
243  element = audio_element->celement;
244  for (int i = 0; i < element->nb_layers; i++) {
245  const AVIAMFLayer *layer = element->layers[i];
246  if (layer->flags & AV_IAMF_LAYER_FLAG_RECON_GAIN) {
247  unsigned int recon_gain_flags = ffio_read_leb(pb);
248  unsigned int bitcount = 7 + 5 * !!(recon_gain_flags & 0x80);
249  recon_gain_flags = (recon_gain_flags & 0x7F) | ((recon_gain_flags & 0xFF00) >> 1);
250  for (int j = 0; j < bitcount; j++) {
251  if (recon_gain_flags & (1 << j))
252  recon->recon_gain[i][j] = avio_r8(pb);
253  }
254  }
255  }
256  recon->subblock_duration = subblock_duration;
257  break;
258  }
259  default:
260  av_unreachable("param_definition_type should have been checked in descriptor");
261  }
262  }
263 
264  len -= avio_tell(pb);
265  if (len) {
266  int level = (s->error_recognition & AV_EF_EXPLODE) ? AV_LOG_ERROR : AV_LOG_WARNING;
267  av_log(s, level, "Underread in parameter_block_obu. %d bytes left at the end\n", len);
268  }
269 
270  if (!param_definition->mode && !constant_subblock_duration && total_duration != duration) {
271  av_log(s, AV_LOG_ERROR, "Invalid duration in parameter block\n");
273  goto fail;
274  }
275 
276  switch (param->type) {
278  av_free(c->mix);
279  c->mix = out_param;
280  c->mix_size = out_param_size;
281  break;
283  av_free(c->demix);
284  c->demix = out_param;
285  c->demix_size = out_param_size;
286  break;
288  av_free(c->recon);
289  c->recon = out_param;
290  c->recon_size = out_param_size;
291  break;
292  default:
293  av_unreachable("param_definition_type should have been checked in descriptor");
294  }
295 
296  ret = 0;
297 fail:
298  if (ret < 0)
299  av_free(out_param);
300  av_free(buf);
301 
302  return ret;
303 }
304 
306  AVIOContext *pb, int max_size, int stream_id_offset, AVPacket *pkt)
307 {
308  int read = 0;
309 
310  while (1) {
312  enum IAMF_OBU_Type type;
313  unsigned obu_size;
314  unsigned skip_samples, discard_padding;
315  int ret, len, size, start_pos;
316 
318  if (ret < 0)
319  return ret;
321  if (size < 0)
322  return size;
323  if (size != FFMIN(MAX_IAMF_OBU_HEADER_SIZE, max_size))
324  return AVERROR_INVALIDDATA;
325 
326  len = ff_iamf_parse_obu_header(header, size, &obu_size, &start_pos, &type,
327  &skip_samples, &discard_padding);
328  if (len < 0 || obu_size > max_size || len > INT_MAX - read) {
329  av_log(s, AV_LOG_ERROR, "Failed to read obu\n");
330  return len < 0 ? len : AVERROR_INVALIDDATA;
331  }
332  avio_seek(pb, -(size - start_pos), SEEK_CUR);
333 
334  read += len;
336  ret = audio_frame_obu(s, c, pb, pkt, obu_size, type,
337  skip_samples, discard_padding, stream_id_offset,
339  if (ret < 0)
340  return ret;
341  return read;
342  } else if (type == IAMF_OBU_IA_PARAMETER_BLOCK) {
343  ret = parameter_block_obu(s, c, pb, obu_size);
344  if (ret < 0)
345  return ret;
346  } else if (type == IAMF_OBU_IA_TEMPORAL_DELIMITER) {
347  av_freep(&c->mix);
348  c->mix_size = 0;
349  av_freep(&c->demix);
350  c->demix_size = 0;
351  av_freep(&c->recon);
352  c->recon_size = 0;
353  } else {
354  int64_t offset = avio_skip(pb, obu_size);
355  if (offset < 0)
356  return offset;
357  }
358  max_size -= len;
359  if (max_size < 0)
360  return AVERROR_INVALIDDATA;
361  if (!max_size)
362  break;
363  }
364 
365  return read;
366 }
367 
369 {
370  IAMFContext *const iamf = &c->iamf;
371 
373 
374  av_freep(&c->mix);
375  c->mix_size = 0;
376  av_freep(&c->demix);
377  c->demix_size = 0;
378  av_freep(&c->recon);
379  c->recon_size = 0;
380 }
find_stream_by_id
static AVStream * find_stream_by_id(AVFormatContext *s, int id, int stream_id_offset)
Definition: iamf_reader.c:34
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
AVIAMFAudioElement::nb_layers
unsigned int nb_layers
Number of layers, or channel groups, in the Audio Element.
Definition: iamf.h:371
level
uint8_t level
Definition: svq3.c:208
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:50
mix
static int mix(int c0, int c1)
Definition: 4xm.c:717
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_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:362
int64_t
long long int64_t
Definition: coverity.c:34
ff_iamf_read_packet
int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c, AVIOContext *pb, int max_size, int stream_id_offset, AVPacket *pkt)
Definition: iamf_reader.c:305
AVIAMFParamDefinition::type
enum AVIAMFParamDefinitionType type
Parameters type.
Definition: iamf.h:213
b
#define b
Definition: input.c:42
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
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:185
FFIOContext
Definition: avio_internal.h:28
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:320
IAMFParamDefinition
Definition: iamf.h:121
fail
#define fail()
Definition: checkasm.h:218
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
AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
Subblocks are of struct type AVIAMFReconGain.
Definition: iamf.h:181
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
IAMFCodecConfig::sample_rate
int sample_rate
Definition: iamf.h:72
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
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:42
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:930
AVFormatContext
Format I/O context.
Definition: avformat.h:1264
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
av_unreachable
#define av_unreachable(msg)
Asserts that are used as compiler optimization hints depending upon ASSERT_LEVEL and NBDEBUG.
Definition: avassert.h:116
ff_iamf_get_codec_config
static IAMFCodecConfig * ff_iamf_get_codec_config(const IAMFContext *c, unsigned int codec_config_id)
Definition: iamf.h:172
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:1170
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
IAMFCodecConfig::nb_samples
unsigned nb_samples
Definition: iamf.h:70
AVIAMFDemixingInfo::subblock_duration
unsigned int subblock_duration
Duration for the given subblock, in units of 1 / parameter_rate.
Definition: iamf.h:136
IAMFCodecConfig
Definition: iamf.h:66
ff_iamf_uninit_context
void ff_iamf_uninit_context(IAMFContext *c)
Definition: iamf.c:172
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
AV_WL32A
#define AV_WL32A(p, v)
Definition: intreadwrite.h:571
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 stream_id_offset, int id_in_bitstream)
Definition: iamf_reader.c:44
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:606
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:359
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:1026
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:256
AVIAMFParamDefinition::parameter_id
unsigned int parameter_id
Identifier for the parameter 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:691
len
int len
Definition: vorbis_enc_data.h:426
av_rescale
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:129
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:98
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:744
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:236
av_malloc
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:98
avio_rb16
unsigned int avio_rb16(AVIOContext *s)
Definition: aviobuf.c:749
pos
unsigned int pos
Definition: spdifenc.c:414
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:750
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: packet.c:231
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:135
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommends skipping the specified number of samples.
Definition: packet.h:153
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:590
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:321
AVIAMFDemixingInfo::dmixp_mode
unsigned int dmixp_mode
Pre-defined combination of demixing parameters.
Definition: iamf.h:140
mem.h
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:34
AVPacket
This structure stores compressed data.
Definition: packet.h:565
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
iamf.h
AVIAMFParamDefinition::parameter_rate
unsigned int parameter_rate
Sample rate for the parameter substream.
Definition: iamf.h:222
IAMFAudioElement::codec_config_id
unsigned int codec_config_id
Definition: iamf.h:101
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
pkt
static AVPacket * pkt
Definition: demux_decode.c:55
parameter_block_obu
static int parameter_block_obu(AVFormatContext *s, IAMFDemuxContext *c, AVIOContext *pbc, int len)
Definition: iamf_reader.c:102
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:304
duration
static int64_t duration
Definition: ffplay.c:329
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:239
iamf_reader.h
ff_iamf_read_deinit
void ff_iamf_read_deinit(IAMFDemuxContext *c)
Definition: iamf_reader.c:368
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:312