FFmpeg
iamf_writer.c
Go to the documentation of this file.
1 /*
2  * Immersive Audio Model and Formats muxing helpers and structs
3  * Copyright (c) 2023 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 
23 #include "libavutil/intreadwrite.h"
24 #include "libavutil/iamf.h"
25 #include "libavutil/mem.h"
26 #include "libavcodec/get_bits.h"
27 #include "libavcodec/put_bits.h"
28 #include "avformat.h"
29 #include "avio_internal.h"
30 #include "iamf.h"
31 #include "iamf_writer.h"
32 
33 
34 static int update_extradata(IAMFCodecConfig *codec_config)
35 {
36  GetBitContext gb;
37  PutBitContext pb;
38  int ret;
39 
40  switch(codec_config->codec_id) {
41  case AV_CODEC_ID_OPUS:
42  if (codec_config->extradata_size != 19)
43  return AVERROR_INVALIDDATA;
44  codec_config->extradata_size -= 8;
45  AV_WB8(codec_config->extradata + 0, AV_RL8(codec_config->extradata + 8)); // version
46  AV_WB8(codec_config->extradata + 1, 2); // set channels to stereo
47  AV_WB16A(codec_config->extradata + 2, AV_RL16A(codec_config->extradata + 10)); // Byte swap pre-skip
48  AV_WB32A(codec_config->extradata + 4, AV_RL32A(codec_config->extradata + 12)); // Byte swap sample rate
49  AV_WB16A(codec_config->extradata + 8, 0); // set Output Gain to 0
50  AV_WB8(codec_config->extradata + 10, AV_RL8(codec_config->extradata + 18)); // Mapping family
51  break;
52  case AV_CODEC_ID_FLAC: {
53  uint8_t buf[13];
54 
55  init_put_bits(&pb, buf, sizeof(buf));
56  ret = init_get_bits8(&gb, codec_config->extradata, codec_config->extradata_size);
57  if (ret < 0)
58  return ret;
59 
60  put_bits32(&pb, get_bits_long(&gb, 32)); // min/max blocksize
61  put_bits64(&pb, 48, get_bits64(&gb, 48)); // min/max framesize
62  put_bits(&pb, 20, get_bits(&gb, 20)); // samplerate
63  skip_bits(&gb, 3);
64  put_bits(&pb, 3, 1); // set channels to stereo
65  ret = put_bits_left(&pb);
66  put_bits(&pb, ret, get_bits(&gb, ret));
67  flush_put_bits(&pb);
68 
69  memcpy(codec_config->extradata, buf, sizeof(buf));
70  break;
71  }
72  default:
73  break;
74  }
75 
76  return 0;
77 }
78 
80 {
81  switch (codec_config->codec_id) {
82  case AV_CODEC_ID_OPUS:
83  if (!codec_config->nb_samples)
84  return AVERROR(EINVAL);
85  // ceil(3840 / nb_samples)
86  codec_config->audio_roll_distance = -(1 + ((3840 - 1) / codec_config->nb_samples));
87  break;
88  case AV_CODEC_ID_AAC:
89  codec_config->audio_roll_distance = -1;
90  break;
91  case AV_CODEC_ID_FLAC:
98  codec_config->audio_roll_distance = 0;
99  break;
100  default:
101  return AVERROR(EINVAL);
102  }
103 
104  return 0;
105 }
106 
107 static int fill_codec_config(IAMFContext *iamf, const AVStreamGroup *stg,
108  IAMFCodecConfig *codec_config)
109 {
110  const AVStream *st = stg->streams[0];
112  int j, ret = 0;
113 
114  codec_config->codec_id = st->codecpar->codec_id;
115  codec_config->sample_rate = st->codecpar->sample_rate;
116  codec_config->codec_tag = st->codecpar->codec_tag;
117  codec_config->nb_samples = st->codecpar->frame_size;
118  populate_audio_roll_distance(codec_config);
119  if (st->codecpar->extradata_size) {
120  codec_config->extradata = av_memdup(st->codecpar->extradata, st->codecpar->extradata_size);
121  if (!codec_config->extradata)
122  return AVERROR(ENOMEM);
123  codec_config->extradata_size = st->codecpar->extradata_size;
124  ret = update_extradata(codec_config);
125  if (ret < 0)
126  goto fail;
127  }
128 
129  for (j = 0; j < iamf->nb_codec_configs; j++) {
130  if (!memcmp(iamf->codec_configs[j], codec_config, offsetof(IAMFCodecConfig, extradata)) &&
131  (!codec_config->extradata_size || !memcmp(iamf->codec_configs[j]->extradata,
132  codec_config->extradata, codec_config->extradata_size)))
133  break;
134  }
135 
136  if (j < iamf->nb_codec_configs) {
137  av_free(iamf->codec_configs[j]->extradata);
138  av_free(iamf->codec_configs[j]);
139  iamf->codec_configs[j] = codec_config;
140  return j;
141  }
142 
143  tmp = av_realloc_array(iamf->codec_configs, iamf->nb_codec_configs + 1, sizeof(*iamf->codec_configs));
144  if (!tmp) {
145  ret = AVERROR(ENOMEM);
146  goto fail;
147  }
148 
149  iamf->codec_configs = tmp;
150  iamf->codec_configs[iamf->nb_codec_configs] = codec_config;
151  codec_config->codec_config_id = iamf->nb_codec_configs;
152 
153  return iamf->nb_codec_configs++;
154 
155 fail:
156  av_freep(&codec_config->extradata);
157  return ret;
158 }
159 
161  const IAMFAudioElement *audio_element, void *log_ctx)
162 {
164  IAMFCodecConfig *codec_config = NULL;
165 
167  sizeof(*iamf->param_definitions));
168  if (!tmp)
169  return AVERROR(ENOMEM);
170 
171  iamf->param_definitions = tmp;
172 
173  if (audio_element)
174  codec_config = iamf->codec_configs[audio_element->codec_config_id];
175 
176  if (!param->parameter_rate) {
177  if (!codec_config) {
178  av_log(log_ctx, AV_LOG_ERROR, "parameter_rate needed but not set for parameter_id %u\n",
179  param->parameter_id);
180  return AVERROR(EINVAL);
181  }
182  param->parameter_rate = codec_config->sample_rate;
183  }
184  if (codec_config) {
185  if (!param->duration)
186  param->duration = codec_config->nb_samples;
187  if (!param->constant_subblock_duration)
188  param->constant_subblock_duration = codec_config->nb_samples;
189  }
190 
192  if (!param_definition)
193  return AVERROR(ENOMEM);
194 
195  param_definition->mode = !!param->duration;
196  param_definition->param = param;
197  param_definition->audio_element = audio_element;
199 
200  return 0;
201 }
202 
203 int ff_iamf_add_audio_element(IAMFContext *iamf, const AVStreamGroup *stg, void *log_ctx)
204 {
205  const AVIAMFAudioElement *iamf_audio_element;
206  IAMFAudioElement **tmp, *audio_element;
207  IAMFCodecConfig *codec_config;
208  int ret;
209 
211  return AVERROR(EINVAL);
212 
213  iamf_audio_element = stg->params.iamf_audio_element;
214  if (iamf_audio_element->audio_element_type == AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE) {
215  const AVIAMFLayer *layer = iamf_audio_element->layers[0];
216  if (iamf_audio_element->nb_layers != 1) {
217  av_log(log_ctx, AV_LOG_ERROR, "Invalid amount of layers for SCENE_BASED audio element. Must be 1\n");
218  return AVERROR(EINVAL);
219  }
220  if (layer->ch_layout.order != AV_CHANNEL_ORDER_CUSTOM &&
222  av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout for SCENE_BASED audio element\n");
223  return AVERROR(EINVAL);
224  }
226  av_log(log_ctx, AV_LOG_ERROR, "Unsuported ambisonics mode %d\n", layer->ambisonics_mode);
227  return AVERROR_PATCHWELCOME;
228  }
229  for (int i = 0; i < stg->nb_streams; i++) {
230  if (stg->streams[i]->codecpar->ch_layout.nb_channels > 1) {
231  av_log(log_ctx, AV_LOG_ERROR, "Invalid amount of channels in a stream for MONO mode ambisonics\n");
232  return AVERROR(EINVAL);
233  }
234  }
235  } else
236  for (int j, i = 0; i < iamf_audio_element->nb_layers; i++) {
237  const AVIAMFLayer *layer = iamf_audio_element->layers[i];
238  for (j = 0; j < FF_ARRAY_ELEMS(ff_iamf_scalable_ch_layouts); j++)
240  break;
241 
243  av_log(log_ctx, AV_LOG_ERROR, "Unsupported channel layout in stream group #%d\n", i);
244  return AVERROR(EINVAL);
245  }
246  }
247 
248  for (int i = 0; i < iamf->nb_audio_elements; i++) {
249  if (stg->id == iamf->audio_elements[i]->audio_element_id) {
250  av_log(log_ctx, AV_LOG_ERROR, "Duplicated Audio Element id %"PRId64"\n", stg->id);
251  return AVERROR(EINVAL);
252  }
253  }
254 
255  codec_config = av_mallocz(sizeof(*codec_config));
256  if (!codec_config)
257  return AVERROR(ENOMEM);
258 
259  ret = fill_codec_config(iamf, stg, codec_config);
260  if (ret < 0) {
261  av_free(codec_config);
262  return ret;
263  }
264 
265  audio_element = av_mallocz(sizeof(*audio_element));
266  if (!audio_element)
267  return AVERROR(ENOMEM);
268 
269  audio_element->celement = stg->params.iamf_audio_element;
270  audio_element->audio_element_id = stg->id;
271  audio_element->codec_config_id = ret;
272 
273  audio_element->substreams = av_calloc(stg->nb_streams, sizeof(*audio_element->substreams));
274  if (!audio_element->substreams) {
275  ret = AVERROR(ENOMEM);
276  goto fail;
277  }
278  audio_element->nb_substreams = stg->nb_streams;
279 
280  audio_element->layers = av_calloc(iamf_audio_element->nb_layers, sizeof(*audio_element->layers));
281  if (!audio_element->layers) {
282  ret = AVERROR(ENOMEM);
283  goto fail;
284  }
285 
286  for (int i = 0, j = 0; i < iamf_audio_element->nb_layers; i++) {
287  int nb_channels = iamf_audio_element->layers[i]->ch_layout.nb_channels;
288 
289  IAMFLayer *layer = &audio_element->layers[i];
290 
291  if (i)
292  nb_channels -= iamf_audio_element->layers[i - 1]->ch_layout.nb_channels;
293  for (; nb_channels > 0 && j < stg->nb_streams; j++) {
294  const AVStream *st = stg->streams[j];
295  IAMFSubStream *substream = &audio_element->substreams[j];
296 
297  substream->audio_substream_id = st->id;
298  layer->substream_count++;
300  nb_channels -= st->codecpar->ch_layout.nb_channels;
301  }
302  if (nb_channels) {
303  av_log(log_ctx, AV_LOG_ERROR, "Invalid channel count across substreams in layer %u from stream group %u\n",
304  i, stg->index);
305  ret = AVERROR(EINVAL);
306  goto fail;
307  }
308  }
309 
310  for (int i = 0; i < audio_element->nb_substreams; i++) {
311  for (int j = i + 1; j < audio_element->nb_substreams; j++)
312  if (audio_element->substreams[i].audio_substream_id ==
313  audio_element->substreams[j].audio_substream_id) {
314  av_log(log_ctx, AV_LOG_ERROR, "Duplicate id %u in streams %u and %u from stream group %u\n",
315  audio_element->substreams[i].audio_substream_id, i, j, stg->index);
316  ret = AVERROR(EINVAL);
317  goto fail;
318  }
319  }
320 
321  if (iamf_audio_element->demixing_info) {
322  AVIAMFParamDefinition *param = iamf_audio_element->demixing_info;
324 
325  if (param->nb_subblocks != 1) {
326  av_log(log_ctx, AV_LOG_ERROR, "nb_subblocks in demixing_info for stream group %u is not 1\n", stg->index);
327  ret = AVERROR(EINVAL);
328  goto fail;
329  }
330 
331  if (!param_definition) {
332  ret = add_param_definition(iamf, param, audio_element, log_ctx);
333  if (ret < 0)
334  goto fail;
335  }
336  }
337  if (iamf_audio_element->recon_gain_info) {
338  AVIAMFParamDefinition *param = iamf_audio_element->recon_gain_info;
340 
341  if (param->nb_subblocks != 1) {
342  av_log(log_ctx, AV_LOG_ERROR, "nb_subblocks in recon_gain_info for stream group %u is not 1\n", stg->index);
343  ret = AVERROR(EINVAL);
344  goto fail;
345  }
346 
347  if (!param_definition) {
348  ret = add_param_definition(iamf, param, audio_element, log_ctx);
349  if (ret < 0)
350  goto fail;
351  }
352  }
353 
354  tmp = av_realloc_array(iamf->audio_elements, iamf->nb_audio_elements + 1, sizeof(*iamf->audio_elements));
355  if (!tmp) {
356  ret = AVERROR(ENOMEM);
357  goto fail;
358  }
359 
360  iamf->audio_elements = tmp;
361  iamf->audio_elements[iamf->nb_audio_elements++] = audio_element;
362 
363  return 0;
364 fail:
365  ff_iamf_free_audio_element(&audio_element);
366  return ret;
367 }
368 
369 int ff_iamf_add_mix_presentation(IAMFContext *iamf, const AVStreamGroup *stg, void *log_ctx)
370 {
371  IAMFMixPresentation **tmp, *mix_presentation;
372  int ret;
373 
375  return AVERROR(EINVAL);
376 
377  for (int i = 0; i < iamf->nb_mix_presentations; i++) {
378  if (stg->id == iamf->mix_presentations[i]->mix_presentation_id) {
379  av_log(log_ctx, AV_LOG_ERROR, "Duplicate Mix Presentation id %"PRId64"\n", stg->id);
380  return AVERROR(EINVAL);
381  }
382  }
383 
384  mix_presentation = av_mallocz(sizeof(*mix_presentation));
385  if (!mix_presentation)
386  return AVERROR(ENOMEM);
387 
388  mix_presentation->cmix = stg->params.iamf_mix_presentation;
389  mix_presentation->mix_presentation_id = stg->id;
390 
391  for (int i = 0; i < mix_presentation->cmix->nb_submixes; i++) {
392  const AVIAMFSubmix *submix = mix_presentation->cmix->submixes[i];
393  AVIAMFParamDefinition *param = submix->output_mix_config;
395 
396  if (!param) {
397  av_log(log_ctx, AV_LOG_ERROR, "output_mix_config is not present in submix %u from "
398  "Mix Presentation ID %"PRId64"\n", i, stg->id);
399  ret = AVERROR(EINVAL);
400  goto fail;
401  }
402 
404  if (!param_definition) {
405  ret = add_param_definition(iamf, param, NULL, log_ctx);
406  if (ret < 0)
407  goto fail;
408  }
409 
410  for (int j = 0; j < submix->nb_elements; j++) {
411  const AVIAMFSubmixElement *element = submix->elements[j];
412  param = element->element_mix_config;
413 
414  if (!param) {
415  av_log(log_ctx, AV_LOG_ERROR, "element_mix_config is not present for element %u in submix %u from "
416  "Mix Presentation ID %"PRId64"\n", j, i, stg->id);
417  ret = AVERROR(EINVAL);
418  goto fail;
419  }
421  if (!param_definition) {
422  ret = add_param_definition(iamf, param, NULL, log_ctx);
423  if (ret < 0)
424  goto fail;
425  }
426  }
427  }
428 
430  if (!tmp) {
431  ret = AVERROR(ENOMEM);
432  goto fail;
433  }
434 
435  iamf->mix_presentations = tmp;
436  iamf->mix_presentations[iamf->nb_mix_presentations++] = mix_presentation;
437 
438  return 0;
439 fail:
440  ff_iamf_free_mix_presentation(&mix_presentation);
441  return ret;
442 }
443 
444 static int iamf_write_codec_config(const IAMFContext *iamf,
445  const IAMFCodecConfig *codec_config,
446  AVIOContext *pb)
447 {
449  AVIOContext *dyn_bc;
450  uint8_t *dyn_buf = NULL;
451  PutBitContext pbc;
452  int dyn_size;
453 
454  int ret = avio_open_dyn_buf(&dyn_bc);
455  if (ret < 0)
456  return ret;
457 
458  ffio_write_leb(dyn_bc, codec_config->codec_config_id);
459  avio_wl32(dyn_bc, codec_config->codec_tag);
460 
461  ffio_write_leb(dyn_bc, codec_config->nb_samples);
462  avio_wb16(dyn_bc, codec_config->audio_roll_distance);
463 
464  switch(codec_config->codec_id) {
465  case AV_CODEC_ID_OPUS:
466  avio_write(dyn_bc, codec_config->extradata, codec_config->extradata_size);
467  break;
468  case AV_CODEC_ID_AAC:
469  return AVERROR_PATCHWELCOME;
470  case AV_CODEC_ID_FLAC:
471  avio_w8(dyn_bc, 0x80);
472  avio_wb24(dyn_bc, codec_config->extradata_size);
473  avio_write(dyn_bc, codec_config->extradata, codec_config->extradata_size);
474  break;
476  avio_w8(dyn_bc, 1);
477  avio_w8(dyn_bc, 16);
478  avio_wb32(dyn_bc, codec_config->sample_rate);
479  break;
481  avio_w8(dyn_bc, 1);
482  avio_w8(dyn_bc, 24);
483  avio_wb32(dyn_bc, codec_config->sample_rate);
484  break;
486  avio_w8(dyn_bc, 1);
487  avio_w8(dyn_bc, 32);
488  avio_wb32(dyn_bc, codec_config->sample_rate);
489  break;
491  avio_w8(dyn_bc, 0);
492  avio_w8(dyn_bc, 16);
493  avio_wb32(dyn_bc, codec_config->sample_rate);
494  break;
496  avio_w8(dyn_bc, 0);
497  avio_w8(dyn_bc, 24);
498  avio_wb32(dyn_bc, codec_config->sample_rate);
499  break;
501  avio_w8(dyn_bc, 0);
502  avio_w8(dyn_bc, 32);
503  avio_wb32(dyn_bc, codec_config->sample_rate);
504  break;
505  default:
506  break;
507  }
508 
509  init_put_bits(&pbc, header, sizeof(header));
511  put_bits(&pbc, 3, 0);
512  flush_put_bits(&pbc);
513 
514  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
515  avio_write(pb, header, put_bytes_count(&pbc, 1));
516  ffio_write_leb(pb, dyn_size);
517  avio_write(pb, dyn_buf, dyn_size);
518  ffio_free_dyn_buf(&dyn_bc);
519 
520  return 0;
521 }
522 
523 static inline int rescale_rational(AVRational q, int b)
524 {
525  return av_clip_int16(av_rescale(q.num, b, q.den));
526 }
527 
528 static int scalable_channel_layout_config(const IAMFAudioElement *audio_element,
529  AVIOContext *dyn_bc)
530 {
531  const AVIAMFAudioElement *element = audio_element->celement;
533  PutBitContext pb;
534 
535  init_put_bits(&pb, header, sizeof(header));
536  put_bits(&pb, 3, element->nb_layers);
537  put_bits(&pb, 5, 0);
538  flush_put_bits(&pb);
539  avio_write(dyn_bc, header, put_bytes_count(&pb, 1));
540  for (int i = 0; i < element->nb_layers; i++) {
541  const AVIAMFLayer *layer = element->layers[i];
542  int layout;
545  break;
546  }
547  init_put_bits(&pb, header, sizeof(header));
548  put_bits(&pb, 4, layout);
549  put_bits(&pb, 1, !!layer->output_gain_flags);
550  put_bits(&pb, 1, !!(layer->flags & AV_IAMF_LAYER_FLAG_RECON_GAIN));
551  put_bits(&pb, 2, 0); // reserved
552  put_bits(&pb, 8, audio_element->layers[i].substream_count);
553  put_bits(&pb, 8, audio_element->layers[i].coupled_substream_count);
554  if (layer->output_gain_flags) {
555  put_bits(&pb, 6, layer->output_gain_flags);
556  put_bits(&pb, 2, 0);
557  put_bits(&pb, 16, rescale_rational(layer->output_gain, 1 << 8));
558  }
559  flush_put_bits(&pb);
560  avio_write(dyn_bc, header, put_bytes_count(&pb, 1));
561  }
562 
563  return 0;
564 }
565 
566 static int ambisonics_config(const IAMFAudioElement *audio_element,
567  AVIOContext *dyn_bc)
568 {
569  const AVIAMFAudioElement *element = audio_element->celement;
570  const AVIAMFLayer *layer = element->layers[0];
571 
572  ffio_write_leb(dyn_bc, 0); // ambisonics_mode
573  ffio_write_leb(dyn_bc, layer->ch_layout.nb_channels); // output_channel_count
574  ffio_write_leb(dyn_bc, audio_element->nb_substreams); // substream_count
575 
577  for (int i = 0; i < layer->ch_layout.nb_channels; i++)
578  avio_w8(dyn_bc, i);
579  else
580  for (int i = 0; i < layer->ch_layout.nb_channels; i++)
581  avio_w8(dyn_bc, layer->ch_layout.u.map[i].id);
582 
583  return 0;
584 }
585 
586 static int param_definition(const IAMFContext *iamf,
587  const IAMFParamDefinition *param_def,
588  AVIOContext *dyn_bc, void *log_ctx)
589 {
590  const AVIAMFParamDefinition *param = param_def->param;
591 
592  ffio_write_leb(dyn_bc, param->parameter_id);
593  ffio_write_leb(dyn_bc, param->parameter_rate);
594  avio_w8(dyn_bc, param->duration ? 0 : 1 << 7);
595  if (param->duration) {
596  ffio_write_leb(dyn_bc, param->duration);
598  if (param->constant_subblock_duration == 0) {
599  ffio_write_leb(dyn_bc, param->nb_subblocks);
600  for (int i = 0; i < param->nb_subblocks; i++) {
601  const void *subblock = av_iamf_param_definition_get_subblock(param, i);
602 
603  switch (param->type) {
605  const AVIAMFMixGain *mix = subblock;
606  ffio_write_leb(dyn_bc, mix->subblock_duration);
607  break;
608  }
610  const AVIAMFDemixingInfo *demix = subblock;
611  ffio_write_leb(dyn_bc, demix->subblock_duration);
612  break;
613  }
615  const AVIAMFReconGain *recon = subblock;
616  ffio_write_leb(dyn_bc, recon->subblock_duration);
617  break;
618  }
619  }
620  }
621  }
622  }
623 
624  return 0;
625 }
626 
627 static int iamf_write_audio_element(const IAMFContext *iamf,
628  const IAMFAudioElement *audio_element,
629  AVIOContext *pb, void *log_ctx)
630 {
631  const AVIAMFAudioElement *element = audio_element->celement;
632  const IAMFCodecConfig *codec_config = iamf->codec_configs[audio_element->codec_config_id];
634  AVIOContext *dyn_bc;
635  uint8_t *dyn_buf = NULL;
636  PutBitContext pbc;
637  int param_definition_types = AV_IAMF_PARAMETER_DEFINITION_DEMIXING, dyn_size;
638 
639  int ret = avio_open_dyn_buf(&dyn_bc);
640  if (ret < 0)
641  return ret;
642 
643  ffio_write_leb(dyn_bc, audio_element->audio_element_id);
644 
645  init_put_bits(&pbc, header, sizeof(header));
646  put_bits(&pbc, 3, element->audio_element_type);
647  put_bits(&pbc, 5, 0);
648  flush_put_bits(&pbc);
649  avio_write(dyn_bc, header, put_bytes_count(&pbc, 1));
650 
651  ffio_write_leb(dyn_bc, audio_element->codec_config_id);
652  ffio_write_leb(dyn_bc, audio_element->nb_substreams);
653 
654  for (int i = 0; i < audio_element->nb_substreams; i++)
655  ffio_write_leb(dyn_bc, audio_element->substreams[i].audio_substream_id);
656 
657  if (element->nb_layers == 1)
658  param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_DEMIXING;
659  if (element->nb_layers > 1)
660  param_definition_types |= AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN;
661  if (codec_config->codec_tag == MKTAG('f','L','a','C') ||
662  codec_config->codec_tag == MKTAG('i','p','c','m'))
663  param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN;
664 
665  ffio_write_leb(dyn_bc, av_popcount(param_definition_types)); // num_parameters
666 
667  if (param_definition_types & 1) {
668  const AVIAMFParamDefinition *param = element->demixing_info;
669  const IAMFParamDefinition *param_def;
670  const AVIAMFDemixingInfo *demix;
671 
672  if (!param) {
673  av_log(log_ctx, AV_LOG_ERROR, "demixing_info needed but not set in Stream Group #%u\n",
674  audio_element->audio_element_id);
675  return AVERROR(EINVAL);
676  }
677 
678  demix = av_iamf_param_definition_get_subblock(param, 0);
680 
681  param_def = ff_iamf_get_param_definition(iamf, param->parameter_id);
682  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
683  if (ret < 0)
684  return ret;
685 
686  avio_w8(dyn_bc, demix->dmixp_mode << 5); // dmixp_mode
687  avio_w8(dyn_bc, element->default_w << 4); // default_w
688  }
689  if (param_definition_types & 2) {
690  const AVIAMFParamDefinition *param = element->recon_gain_info;
691  const IAMFParamDefinition *param_def;
692 
693  if (!param) {
694  av_log(log_ctx, AV_LOG_ERROR, "recon_gain_info needed but not set in Stream Group #%u\n",
695  audio_element->audio_element_id);
696  return AVERROR(EINVAL);
697  }
699 
700  param_def = ff_iamf_get_param_definition(iamf, param->parameter_id);
701  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
702  if (ret < 0)
703  return ret;
704  }
705 
707  ret = scalable_channel_layout_config(audio_element, dyn_bc);
708  if (ret < 0)
709  return ret;
710  } else {
711  ret = ambisonics_config(audio_element, dyn_bc);
712  if (ret < 0)
713  return ret;
714  }
715 
716  init_put_bits(&pbc, header, sizeof(header));
718  put_bits(&pbc, 3, 0);
719  flush_put_bits(&pbc);
720 
721  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
722  avio_write(pb, header, put_bytes_count(&pbc, 1));
723  ffio_write_leb(pb, dyn_size);
724  avio_write(pb, dyn_buf, dyn_size);
725  ffio_free_dyn_buf(&dyn_bc);
726 
727  return 0;
728 }
729 
731  const IAMFMixPresentation *mix_presentation,
732  AVIOContext *pb, void *log_ctx)
733 {
735  const AVIAMFMixPresentation *mix = mix_presentation->cmix;
736  const AVDictionaryEntry *tag = NULL;
737  PutBitContext pbc;
738  AVIOContext *dyn_bc;
739  uint8_t *dyn_buf = NULL;
740  int dyn_size;
741 
742  int ret = avio_open_dyn_buf(&dyn_bc);
743  if (ret < 0)
744  return ret;
745 
746  ffio_write_leb(dyn_bc, mix_presentation->mix_presentation_id); // mix_presentation_id
747  ffio_write_leb(dyn_bc, av_dict_count(mix->annotations)); // count_label
748 
749  while ((tag = av_dict_iterate(mix->annotations, tag)))
750  avio_put_str(dyn_bc, tag->key);
751  while ((tag = av_dict_iterate(mix->annotations, tag)))
752  avio_put_str(dyn_bc, tag->value);
753 
754  ffio_write_leb(dyn_bc, mix->nb_submixes);
755  for (int i = 0; i < mix->nb_submixes; i++) {
756  const AVIAMFSubmix *sub_mix = mix->submixes[i];
757  const IAMFParamDefinition *param_def;
758 
759  ffio_write_leb(dyn_bc, sub_mix->nb_elements);
760  for (int j = 0; j < sub_mix->nb_elements; j++) {
761  const IAMFAudioElement *audio_element = NULL;
762  const AVIAMFSubmixElement *submix_element = sub_mix->elements[j];
763 
764  for (int k = 0; k < iamf->nb_audio_elements; k++)
765  if (iamf->audio_elements[k]->audio_element_id == submix_element->audio_element_id) {
766  audio_element = iamf->audio_elements[k];
767  break;
768  }
769 
770  av_assert0(audio_element);
771  ffio_write_leb(dyn_bc, submix_element->audio_element_id);
772 
773  if (av_dict_count(submix_element->annotations) != av_dict_count(mix->annotations)) {
774  av_log(log_ctx, AV_LOG_ERROR, "Inconsistent amount of labels in submix %d from Mix Presentation id #%u\n",
775  j, audio_element->audio_element_id);
776  return AVERROR(EINVAL);
777  }
778  while ((tag = av_dict_iterate(submix_element->annotations, tag)))
779  avio_put_str(dyn_bc, tag->value);
780 
781  init_put_bits(&pbc, header, sizeof(header));
782  put_bits(&pbc, 2, submix_element->headphones_rendering_mode);
783  put_bits(&pbc, 6, 0); // reserved
784  flush_put_bits(&pbc);
785  avio_write(dyn_bc, header, put_bytes_count(&pbc, 1));
786  ffio_write_leb(dyn_bc, 0); // rendering_config_extension_size
787 
788  param_def = ff_iamf_get_param_definition(iamf, submix_element->element_mix_config->parameter_id);
789  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
790  if (ret < 0)
791  return ret;
792 
793  avio_wb16(dyn_bc, rescale_rational(submix_element->default_mix_gain, 1 << 8));
794  }
795 
796  param_def = ff_iamf_get_param_definition(iamf, sub_mix->output_mix_config->parameter_id);
797  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
798  if (ret < 0)
799  return ret;
800  avio_wb16(dyn_bc, rescale_rational(sub_mix->default_mix_gain, 1 << 8));
801 
802  ffio_write_leb(dyn_bc, sub_mix->nb_layouts); // nb_layouts
803  for (int i = 0; i < sub_mix->nb_layouts; i++) {
804  const AVIAMFSubmixLayout *submix_layout = sub_mix->layouts[i];
805  int layout, info_type;
806  int dialogue = submix_layout->dialogue_anchored_loudness.num &&
807  submix_layout->dialogue_anchored_loudness.den;
808  int album = submix_layout->album_anchored_loudness.num &&
809  submix_layout->album_anchored_loudness.den;
810 
814  break;
815  }
817  av_log(log_ctx, AV_LOG_ERROR, "Invalid Sound System value in a submix\n");
818  return AVERROR(EINVAL);
819  }
820  } else if (submix_layout->layout_type != AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL) {
821  av_log(log_ctx, AV_LOG_ERROR, "Unsupported Layout Type value in a submix\n");
822  return AVERROR(EINVAL);
823  }
824  init_put_bits(&pbc, header, sizeof(header));
825  put_bits(&pbc, 2, submix_layout->layout_type); // layout_type
827  put_bits(&pbc, 4, ff_iamf_sound_system_map[layout].id); // sound_system
828  put_bits(&pbc, 2, 0); // reserved
829  } else
830  put_bits(&pbc, 6, 0); // reserved
831  flush_put_bits(&pbc);
832  avio_write(dyn_bc, header, put_bytes_count(&pbc, 1));
833 
834  info_type = (submix_layout->true_peak.num && submix_layout->true_peak.den);
835  info_type |= (dialogue || album) << 1;
836  avio_w8(dyn_bc, info_type);
837  avio_wb16(dyn_bc, rescale_rational(submix_layout->integrated_loudness, 1 << 8));
838  avio_wb16(dyn_bc, rescale_rational(submix_layout->digital_peak, 1 << 8));
839  if (info_type & 1)
840  avio_wb16(dyn_bc, rescale_rational(submix_layout->true_peak, 1 << 8));
841  if (info_type & 2) {
842  avio_w8(dyn_bc, dialogue + album); // num_anchored_loudness
843  if (dialogue) {
845  avio_wb16(dyn_bc, rescale_rational(submix_layout->dialogue_anchored_loudness, 1 << 8));
846  }
847  if (album) {
849  avio_wb16(dyn_bc, rescale_rational(submix_layout->album_anchored_loudness, 1 << 8));
850  }
851  }
852  }
853  }
854 
855  init_put_bits(&pbc, header, sizeof(header));
857  put_bits(&pbc, 3, 0);
858  flush_put_bits(&pbc);
859 
860  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
861  avio_write(pb, header, put_bytes_count(&pbc, 1));
862  ffio_write_leb(pb, dyn_size);
863  avio_write(pb, dyn_buf, dyn_size);
864  ffio_free_dyn_buf(&dyn_bc);
865 
866  return 0;
867 }
868 
869 int ff_iamf_write_descriptors(const IAMFContext *iamf, AVIOContext *pb, void *log_ctx)
870 {
871  int ret;
872 
873  // Sequence Header
875 
876  ffio_write_leb(pb, 6);
877  avio_wb32(pb, MKBETAG('i','a','m','f'));
878  avio_w8(pb, iamf->nb_audio_elements > 1); // primary_profile
879  avio_w8(pb, iamf->nb_audio_elements > 1); // additional_profile
880 
881  for (int i = 0; i < iamf->nb_codec_configs; i++) {
882  ret = iamf_write_codec_config(iamf, iamf->codec_configs[i], pb);
883  if (ret < 0)
884  return ret;
885  }
886 
887  for (int i = 0; i < iamf->nb_audio_elements; i++) {
888  ret = iamf_write_audio_element(iamf, iamf->audio_elements[i], pb, log_ctx);
889  if (ret < 0)
890  return ret;
891  }
892 
893  for (int i = 0; i < iamf->nb_mix_presentations; i++) {
894  ret = iamf_write_mixing_presentation(iamf, iamf->mix_presentations[i], pb, log_ctx);
895  if (ret < 0)
896  return ret;
897  }
898 
899  return 0;
900 }
901 
902 static int write_parameter_block(const IAMFContext *iamf, AVIOContext *pb,
903  const AVIAMFParamDefinition *param, void *log_ctx)
904 {
907  PutBitContext pbc;
908  AVIOContext *dyn_bc;
909  uint8_t *dyn_buf = NULL;
910  int dyn_size, ret;
911 
913  av_log(log_ctx, AV_LOG_DEBUG, "Ignoring side data with unknown type %u\n",
914  param->type);
915  return 0;
916  }
917 
918  if (!param_definition) {
919  av_log(log_ctx, AV_LOG_ERROR, "Non-existent Parameter Definition with ID %u referenced by a packet\n",
920  param->parameter_id);
921  return AVERROR(EINVAL);
922  }
923 
924  if (param->type != param_definition->param->type) {
925  av_log(log_ctx, AV_LOG_ERROR, "Inconsistent values for Parameter Definition "
926  "with ID %u in a packet\n",
927  param->parameter_id);
928  return AVERROR(EINVAL);
929  }
930 
931  ret = avio_open_dyn_buf(&dyn_bc);
932  if (ret < 0)
933  return ret;
934 
935  // Sequence Header
936  init_put_bits(&pbc, header, sizeof(header));
938  put_bits(&pbc, 3, 0);
939  flush_put_bits(&pbc);
940  avio_write(pb, header, put_bytes_count(&pbc, 1));
941 
942  ffio_write_leb(dyn_bc, param->parameter_id);
943  if (!param_definition->mode) {
944  ffio_write_leb(dyn_bc, param->duration);
946  if (param->constant_subblock_duration == 0)
947  ffio_write_leb(dyn_bc, param->nb_subblocks);
948  }
949 
950  for (int i = 0; i < param->nb_subblocks; i++) {
951  const void *subblock = av_iamf_param_definition_get_subblock(param, i);
952 
953  switch (param->type) {
955  const AVIAMFMixGain *mix = subblock;
956  if (!param_definition->mode && param->constant_subblock_duration == 0)
957  ffio_write_leb(dyn_bc, mix->subblock_duration);
958 
959  ffio_write_leb(dyn_bc, mix->animation_type);
960 
961  avio_wb16(dyn_bc, rescale_rational(mix->start_point_value, 1 << 8));
962  if (mix->animation_type >= AV_IAMF_ANIMATION_TYPE_LINEAR)
963  avio_wb16(dyn_bc, rescale_rational(mix->end_point_value, 1 << 8));
964  if (mix->animation_type == AV_IAMF_ANIMATION_TYPE_BEZIER) {
965  avio_wb16(dyn_bc, rescale_rational(mix->control_point_value, 1 << 8));
966  avio_w8(dyn_bc, av_clip_uint8(av_rescale(mix->control_point_relative_time.num, 1 << 8,
967  mix->control_point_relative_time.den)));
968  }
969  break;
970  }
972  const AVIAMFDemixingInfo *demix = subblock;
973  if (!param_definition->mode && param->constant_subblock_duration == 0)
974  ffio_write_leb(dyn_bc, demix->subblock_duration);
975 
976  avio_w8(dyn_bc, demix->dmixp_mode << 5);
977  break;
978  }
980  const AVIAMFReconGain *recon = subblock;
981  const AVIAMFAudioElement *audio_element = param_definition->audio_element->celement;
982 
983  if (!param_definition->mode && param->constant_subblock_duration == 0)
984  ffio_write_leb(dyn_bc, recon->subblock_duration);
985 
986  if (!audio_element) {
987  av_log(log_ctx, AV_LOG_ERROR, "Invalid Parameter Definition with ID %u referenced by a packet\n", param->parameter_id);
988  return AVERROR(EINVAL);
989  }
990 
991  for (int j = 0; j < audio_element->nb_layers; j++) {
992  const AVIAMFLayer *layer = audio_element->layers[j];
993 
994  if (layer->flags & AV_IAMF_LAYER_FLAG_RECON_GAIN) {
995  unsigned int recon_gain_flags = 0;
996  int k = 0;
997 
998  for (; k < 7; k++)
999  recon_gain_flags |= (1 << k) * !!recon->recon_gain[j][k];
1000  for (; k < 12; k++)
1001  recon_gain_flags |= (2 << k) * !!recon->recon_gain[j][k];
1002  if (recon_gain_flags >> 8)
1003  recon_gain_flags |= (1 << k);
1004 
1005  ffio_write_leb(dyn_bc, recon_gain_flags);
1006  for (k = 0; k < 12; k++) {
1007  if (recon->recon_gain[j][k])
1008  avio_w8(dyn_bc, recon->recon_gain[j][k]);
1009  }
1010  }
1011  }
1012  break;
1013  }
1014  default:
1015  av_assert0(0);
1016  }
1017  }
1018 
1019  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
1020  ffio_write_leb(pb, dyn_size);
1021  avio_write(pb, dyn_buf, dyn_size);
1022  ffio_free_dyn_buf(&dyn_bc);
1023 
1024  return 0;
1025 }
1026 
1028  const AVPacket *pkt, void *log_ctx)
1029 {
1033  NULL);
1034  AVIAMFParamDefinition *demix =
1037  NULL);
1038  AVIAMFParamDefinition *recon =
1041  NULL);
1042 
1043  if (mix) {
1044  int ret = write_parameter_block(iamf, pb, mix, log_ctx);
1045  if (ret < 0)
1046  return ret;
1047  }
1048  if (demix) {
1049  int ret = write_parameter_block(iamf, pb, demix, log_ctx);
1050  if (ret < 0)
1051  return ret;
1052  }
1053  if (recon) {
1054  int ret = write_parameter_block(iamf, pb, recon, log_ctx);
1055  if (ret < 0)
1056  return ret;
1057  }
1058 
1059  return 0;
1060 }
1061 
1063  unsigned int audio_substream_id)
1064 {
1065  for (int i = 0; i < c->nb_audio_elements; i++) {
1066  IAMFAudioElement *audio_element = c->audio_elements[i];
1067  for (int j = 0; j < audio_element->nb_substreams; j++) {
1068  IAMFSubStream *substream = &audio_element->substreams[j];
1069  if (substream->audio_substream_id == audio_substream_id)
1070  return audio_element;
1071  }
1072  }
1073 
1074  return NULL;
1075 }
1076 
1078  unsigned audio_substream_id, const AVPacket *pkt)
1079 {
1081  PutBitContext pbc;
1082  AVIOContext *dyn_bc;
1083  const uint8_t *side_data;
1084  uint8_t *dyn_buf = NULL;
1085  unsigned int skip_samples = 0, discard_padding = 0;
1086  size_t side_data_size;
1087  int dyn_size, type = audio_substream_id <= 17 ?
1089  int ret;
1090 
1091  if (!pkt->size) {
1092  const IAMFAudioElement *audio_element;
1093  IAMFCodecConfig *codec_config;
1094  size_t new_extradata_size;
1095  const uint8_t *new_extradata = av_packet_get_side_data(pkt,
1097  &new_extradata_size);
1098 
1099  if (!new_extradata)
1100  return AVERROR_INVALIDDATA;
1101  audio_element = get_audio_element(iamf, audio_substream_id);
1102  if (!audio_element)
1103  return AVERROR(EINVAL);
1104  codec_config = ff_iamf_get_codec_config(iamf, audio_element->codec_config_id);
1105  if (!codec_config)
1106  return AVERROR(EINVAL);
1107 
1108  av_free(codec_config->extradata);
1109  codec_config->extradata = av_memdup(new_extradata, new_extradata_size);
1110  if (!codec_config->extradata) {
1111  codec_config->extradata_size = 0;
1112  return AVERROR(ENOMEM);
1113  }
1114  codec_config->extradata_size = new_extradata_size;
1115 
1116  return update_extradata(codec_config);
1117  }
1118 
1120  &side_data_size);
1121 
1122  if (side_data && side_data_size >= 10) {
1123  skip_samples = AV_RL32(side_data);
1124  discard_padding = AV_RL32(side_data + 4);
1125  }
1126 
1127  ret = avio_open_dyn_buf(&dyn_bc);
1128  if (ret < 0)
1129  return ret;
1130 
1131  init_put_bits(&pbc, header, sizeof(header));
1132  put_bits(&pbc, 5, type);
1133  put_bits(&pbc, 1, 0); // obu_redundant_copy
1134  put_bits(&pbc, 1, skip_samples || discard_padding);
1135  put_bits(&pbc, 1, 0); // obu_extension_flag
1136  flush_put_bits(&pbc);
1137  avio_write(pb, header, put_bytes_count(&pbc, 1));
1138 
1139  if (skip_samples || discard_padding) {
1140  ffio_write_leb(dyn_bc, discard_padding);
1141  ffio_write_leb(dyn_bc, skip_samples);
1142  }
1143 
1144  if (audio_substream_id > 17)
1145  ffio_write_leb(dyn_bc, audio_substream_id);
1146 
1147  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
1148  ffio_write_leb(pb, dyn_size + pkt->size);
1149  avio_write(pb, dyn_buf, dyn_size);
1150  ffio_free_dyn_buf(&dyn_bc);
1151  avio_write(pb, pkt->data, pkt->size);
1152 
1153  return 0;
1154 }
AVStreamGroup::params
union AVStreamGroup::@366 params
Group type-specific parameters.
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:334
iamf.h
ff_iamf_free_mix_presentation
void ff_iamf_free_mix_presentation(IAMFMixPresentation **pmix_presentation)
Definition: iamf.c:85
AVIAMFSubmix::elements
AVIAMFSubmixElement ** elements
Array of submix elements.
Definition: iamf.h:565
AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS
@ AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS
The layout follows the loudspeaker sound system convention of ITU-2051-3.
Definition: iamf.h:498
AVIAMFAudioElement::nb_layers
unsigned int nb_layers
Number of layers, or channel groups, in the Audio Element.
Definition: iamf.h:368
AVCodecParameters::extradata
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition: codec_par.h:69
AVStreamGroup::id
int64_t id
Group type-specific group ID.
Definition: avformat.h:1153
AVIAMFSubmix::layouts
AVIAMFSubmixLayout ** layouts
Array of submix layouts.
Definition: iamf.h:580
mix
static int mix(int c0, int c1)
Definition: 4xm.c:716
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
put_bits32
static void av_unused put_bits32(PutBitContext *s, uint32_t value)
Write exactly 32 bits into a bitstream.
Definition: put_bits.h:291
IAMF_OBU_IA_SEQUENCE_HEADER
@ IAMF_OBU_IA_SEQUENCE_HEADER
Definition: iamf.h:63
AVIAMFAudioElement::default_w
unsigned int default_w
Default weight value as defined in section 3.6 of IAMF.
Definition: iamf.h:393
AV_PKT_DATA_NEW_EXTRADATA
@ AV_PKT_DATA_NEW_EXTRADATA
The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format that the extradata buffer was...
Definition: packet.h:56
IAMFAudioElement::nb_substreams
unsigned int nb_substreams
Definition: iamf.h:99
AVIAMFAudioElement::layers
AVIAMFLayer ** layers
Definition: iamf.h:359
av_dict_count
int av_dict_count(const AVDictionary *m)
Get number of entries in dictionary.
Definition: dict.c:39
get_bits_long
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:421
init_put_bits
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:62
AVChannelLayout::map
AVChannelCustom * map
This member must be used when the channel order is AV_CHANNEL_ORDER_CUSTOM.
Definition: channel_layout.h:368
AVIAMFMixPresentation::nb_submixes
unsigned int nb_submixes
Number of submixes in the presentation.
Definition: iamf.h:629
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:223
ff_iamf_sound_system_map
const struct IAMFSoundSystemMap ff_iamf_sound_system_map[13]
Definition: iamf.c:48
AVIAMFParamDefinition::type
enum AVIAMFParamDefinitionType type
Parameters type.
Definition: iamf.h:213
AVPacket::data
uint8_t * data
Definition: packet.h:539
put_bits64
static void put_bits64(PutBitContext *s, int n, uint64_t value)
Write up to 64 bits into a bitstream.
Definition: put_bits.h:334
b
#define b
Definition: input.c:41
put_bytes_count
static int put_bytes_count(const PutBitContext *s, int round_up)
Definition: put_bits.h:100
AVIAMFSubmixLayout::layout_type
enum AVIAMFSubmixLayoutType layout_type
Definition: iamf.h:517
IAMFParamDefinition::param
AVIAMFParamDefinition * param
Definition: iamf.h:123
AVIAMFParamDefinition
Parameters as defined in section 3.6.1 of IAMF.
Definition: iamf.h:193
AVCodecParameters::codec_tag
uint32_t codec_tag
Additional information about the codec (corresponds to the AVI FOURCC).
Definition: codec_par.h:59
AVIAMFSubmixElement::default_mix_gain
AVRational default_mix_gain
Default mix gain value to apply when there are no AVIAMFParamDefinition with element_mix_config's par...
Definition: iamf.h:469
add_param_definition
static int add_param_definition(IAMFContext *iamf, AVIAMFParamDefinition *param, const IAMFAudioElement *audio_element, void *log_ctx)
Definition: iamf_writer.c:160
AV_CODEC_ID_FLAC
@ AV_CODEC_ID_FLAC
Definition: codec_id.h:458
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:322
av_popcount
#define av_popcount
Definition: common.h:154
ff_iamf_get_param_definition
static IAMFParamDefinition * ff_iamf_get_param_definition(const IAMFContext *iamf, unsigned int parameter_id)
Definition: iamf.h:183
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:327
AV_RL8
#define AV_RL8(x)
Definition: intreadwrite.h:394
avio_get_dyn_buf
int avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:1374
IAMFMixPresentation::cmix
const AVIAMFMixPresentation * cmix
Definition: iamf.h:108
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
write_parameter_block
static int write_parameter_block(const IAMFContext *iamf, AVIOContext *pb, const AVIAMFParamDefinition *param, void *log_ctx)
Definition: iamf_writer.c:902
AVIAMFSubmixLayout::digital_peak
AVRational digital_peak
The digital (sampled) peak value of the audio signal, as defined in ITU-1770-4.
Definition: iamf.h:535
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:381
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:335
fill_codec_config
static int fill_codec_config(IAMFContext *iamf, const AVStreamGroup *stg, IAMFCodecConfig *codec_config)
Definition: iamf_writer.c:107
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
AVIAMFSubmixLayout::integrated_loudness
AVRational integrated_loudness
The program integrated loudness information, as defined in ITU-1770-4.
Definition: iamf.h:530
IAMFCodecConfig::extradata
uint8_t * extradata
Definition: iamf.h:74
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:335
IAMFParamDefinition
Definition: iamf.h:121
fail
#define fail()
Definition: checkasm.h:193
IAMFCodecConfig::codec_tag
uint32_t codec_tag
Definition: iamf.h:69
GetBitContext
Definition: get_bits.h:108
AVIAMFSubmixLayout
Submix layout as defined in section 3.7.6 of IAMF.
Definition: iamf.h:514
IAMF_ANCHOR_ELEMENT_ALBUM
@ IAMF_ANCHOR_ELEMENT_ALBUM
Definition: iamf.h:142
put_bits_left
static int put_bits_left(PutBitContext *s)
Definition: put_bits.h:125
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
AVIAMFAudioElement::audio_element_type
enum AVIAMFAudioElementType audio_element_type
Audio element type as defined in section 3.6 of IAMF.
Definition: iamf.h:388
AVIAMFReconGain
Recon Gain Info Parameter Data as defined in section 3.8.3 of IAMF.
Definition: iamf.h:148
AVRational::num
int num
Numerator.
Definition: rational.h:59
AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN
Subblocks are of struct type AVIAMFReconGain.
Definition: iamf.h:181
rescale_rational
static int rescale_rational(AVRational q, int b)
Definition: iamf_writer.c:523
IAMFContext::audio_elements
IAMFAudioElement ** audio_elements
Definition: iamf.h:131
AVIAMFSubmixElement::annotations
AVDictionary * annotations
A dictionary of strings describing the submix in different languages.
Definition: iamf.h:490
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:545
IAMFCodecConfig::sample_rate
int sample_rate
Definition: iamf.h:72
IAMF_OBU_IA_MIX_PRESENTATION
@ IAMF_OBU_IA_MIX_PRESENTATION
Definition: iamf.h:40
AVCodecParameters::frame_size
int frame_size
Audio only.
Definition: codec_par.h:195
avio_open_dyn_buf
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:1362
AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
@ AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION
Definition: avformat.h:1126
AV_IAMF_ANIMATION_TYPE_BEZIER
@ AV_IAMF_ANIMATION_TYPE_BEZIER
Definition: iamf.h:69
update_extradata
static int update_extradata(IAMFCodecConfig *codec_config)
Definition: iamf_writer.c:34
ff_iamf_add_audio_element
int ff_iamf_add_audio_element(IAMFContext *iamf, const AVStreamGroup *stg, void *log_ctx)
Definition: iamf_writer.c:203
intreadwrite.h
IAMFSubStream::audio_substream_id
unsigned int audio_substream_id
Definition: iamf.h:83
IAMFLayer::substream_count
unsigned int substream_count
Definition: iamf.h:78
AVIAMFSubmixLayout::dialogue_anchored_loudness
AVRational dialogue_anchored_loudness
The Dialogue loudness information, as defined in ITU-1770-4.
Definition: iamf.h:543
av_realloc_array
void * av_realloc_array(void *ptr, size_t nmemb, size_t size)
Definition: mem.c:217
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
AVChannelLayout::u
union AVChannelLayout::@428 u
Details about which channels are present in this layout.
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
AVIAMFSubmixElement::headphones_rendering_mode
enum AVIAMFHeadphonesMode headphones_rendering_mode
A value that indicates whether the referenced channel-based Audio Element shall be rendered to stereo...
Definition: iamf.h:478
AVStreamGroup::index
unsigned int index
Group index in AVFormatContext.
Definition: avformat.h:1145
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
get_bits.h
AVIAMFLayer::ch_layout
AVChannelLayout ch_layout
Definition: iamf.h:297
ffio_write_leb
void ffio_write_leb(AVIOContext *s, unsigned val)
Definition: aviobuf.c:944
IAMFContext::nb_mix_presentations
int nb_mix_presentations
Definition: iamf.h:134
PutBitContext
Definition: put_bits.h:50
IAMFAudioElement::audio_element_id
unsigned int audio_element_id
Definition: iamf.h:96
AVIAMFDemixingInfo
Demixing Info Parameter Data as defined in section 3.8.2 of IAMF.
Definition: iamf.h:128
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:771
IAMFSoundSystemMap::layout
AVChannelLayout layout
Definition: iamf.h:163
AV_CHANNEL_ORDER_AMBISONIC
@ AV_CHANNEL_ORDER_AMBISONIC
The audio is represented as the decomposition of the sound field into spherical harmonics.
Definition: channel_layout.h:155
av_clip_int16
#define av_clip_int16
Definition: common.h:115
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
IAMF_OBU_IA_AUDIO_ELEMENT
@ IAMF_OBU_IA_AUDIO_ELEMENT
Definition: iamf.h:39
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
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
get_audio_element
static IAMFAudioElement * get_audio_element(const IAMFContext *c, unsigned int audio_substream_id)
Definition: iamf_writer.c:1062
ff_iamf_get_codec_config
static IAMFCodecConfig * ff_iamf_get_codec_config(const IAMFContext *c, unsigned int codec_config_id)
Definition: iamf.h:170
AVIAMFLayer
A layer defining a Channel Layout in the Audio Element.
Definition: iamf.h:294
IAMFContext::nb_codec_configs
int nb_codec_configs
Definition: iamf.h:130
IAMF_OBU_IA_CODEC_CONFIG
@ IAMF_OBU_IA_CODEC_CONFIG
Definition: iamf.h:38
IAMFSubStream
Definition: iamf.h:82
IAMFAudioElement::layers
IAMFLayer * layers
Definition: iamf.h:103
ff_iamf_add_mix_presentation
int ff_iamf_add_mix_presentation(IAMFContext *iamf, const AVStreamGroup *stg, void *log_ctx)
Definition: iamf_writer.c:369
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:179
AV_IAMF_ANIMATION_TYPE_LINEAR
@ AV_IAMF_ANIMATION_TYPE_LINEAR
Definition: iamf.h:68
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
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
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
AVIAMFLayer::output_gain_flags
unsigned int output_gain_flags
Output gain channel flags as defined in section 3.6.2 of IAMF.
Definition: iamf.h:310
populate_audio_roll_distance
static int populate_audio_roll_distance(IAMFCodecConfig *codec_config)
Definition: iamf_writer.c:79
AVIAMFSubmixElement::audio_element_id
unsigned int audio_element_id
The id of the Audio Element this submix element references.
Definition: iamf.h:452
AVCodecParameters::extradata_size
int extradata_size
Size of the extradata content in bytes.
Definition: codec_par.h:73
AVIAMFSubmix
Submix layout as defined in section 3.7 of IAMF.
Definition: iamf.h:556
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:448
IAMFLayer
Definition: iamf.h:77
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
AV_CODEC_ID_PCM_S24LE
@ AV_CODEC_ID_PCM_S24LE
Definition: codec_id.h:346
IAMFContext::nb_param_definitions
int nb_param_definitions
Definition: iamf.h:136
AVIAMFDemixingInfo::subblock_duration
unsigned int subblock_duration
Duration for the given subblock, in units of 1 / parameter_rate.
Definition: iamf.h:136
AVPacket::size
int size
Definition: packet.h:540
IAMFCodecConfig
Definition: iamf.h:66
IAMFCodecConfig::extradata_size
int extradata_size
Definition: iamf.h:73
IAMFLayer::coupled_substream_count
unsigned int coupled_substream_count
Definition: iamf.h:79
MKBETAG
#define MKBETAG(a, b, c, d)
Definition: macros.h:56
ff_iamf_write_parameter_blocks
int ff_iamf_write_parameter_blocks(const IAMFContext *iamf, AVIOContext *pb, const AVPacket *pkt, void *log_ctx)
Definition: iamf_writer.c:1027
AVStreamGroup::iamf_audio_element
struct AVIAMFAudioElement * iamf_audio_element
Definition: avformat.h:1167
iamf_write_mixing_presentation
static int iamf_write_mixing_presentation(const IAMFContext *iamf, const IAMFMixPresentation *mix_presentation, AVIOContext *pb, void *log_ctx)
Definition: iamf_writer.c:730
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:506
AV_RL16A
#define AV_RL16A(p)
Definition: intreadwrite.h:554
IAMFContext
Definition: iamf.h:128
header
static const uint8_t header[24]
Definition: sdr2.c:68
scalable_channel_layout_config
static int scalable_channel_layout_config(const IAMFAudioElement *audio_element, AVIOContext *dyn_bc)
Definition: iamf_writer.c:528
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:201
avio_wb32
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:365
IAMFAudioElement::substreams
IAMFSubStream * substreams
Definition: iamf.h:98
iamf_write_codec_config
static int iamf_write_codec_config(const IAMFContext *iamf, const IAMFCodecConfig *codec_config, AVIOContext *pb)
Definition: iamf_writer.c:444
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
avio_wl32
void avio_wl32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:357
AVIAMFMixGain
Mix Gain Parameter Data as defined in section 3.8.1 of IAMF.
Definition: iamf.h:77
AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
@ AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT
Definition: avformat.h:1125
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1201
AVStreamGroup::iamf_mix_presentation
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition: avformat.h:1168
av_channel_layout_compare
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
Definition: channel_layout.c:807
layout
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 layout
Definition: filter_design.txt:18
get_bits64
static uint64_t get_bits64(GetBitContext *s, int n)
Read 0-64 bits.
Definition: get_bits.h:453
IAMFContext::param_definitions
IAMFParamDefinition ** param_definitions
Definition: iamf.h:135
IAMFContext::nb_audio_elements
int nb_audio_elements
Definition: iamf.h:132
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVIAMFParamDefinition::parameter_id
unsigned int parameter_id
Identifier for the paremeter substream.
Definition: iamf.h:218
avio_internal.h
av_packet_get_side_data
uint8_t * av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type, size_t *size)
Get side information from packet.
Definition: packet.c:252
AVIAMFMixPresentation
Information on how to render and mix one or more AVIAMFAudioElement to generate the final audio outpu...
Definition: iamf.h:613
param_definition
static int param_definition(const IAMFContext *iamf, const IAMFParamDefinition *param_def, AVIOContext *dyn_bc, void *log_ctx)
Definition: iamf_writer.c:586
AV_WB16A
#define AV_WB16A(p, v)
Definition: intreadwrite.h:564
IAMFContext::codec_configs
IAMFCodecConfig ** codec_configs
Definition: iamf.h:129
AV_CODEC_ID_PCM_S32BE
@ AV_CODEC_ID_PCM_S32BE
Definition: codec_id.h:343
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
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
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
AVIAMFParamDefinition::nb_subblocks
unsigned int nb_subblocks
Number of subblocks in the array.
Definition: iamf.h:208
AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE
@ AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE
Definition: iamf.h:346
AV_WB32A
#define AV_WB32A(p, v)
Definition: intreadwrite.h:578
AV_WB8
#define AV_WB8(p, d)
Definition: intreadwrite.h:392
ff_iamf_write_audio_frame
int ff_iamf_write_audio_frame(const IAMFContext *iamf, AVIOContext *pb, unsigned audio_substream_id, const AVPacket *pkt)
Definition: iamf_writer.c:1077
ff_iamf_write_descriptors
int ff_iamf_write_descriptors(const IAMFContext *iamf, AVIOContext *pb, void *log_ctx)
Definition: iamf_writer.c:869
AVIAMFSubmix::nb_layouts
unsigned int nb_layouts
Number of layouts in the submix.
Definition: iamf.h:587
ambisonics_config
static int ambisonics_config(const IAMFAudioElement *audio_element, AVIOContext *dyn_bc)
Definition: iamf_writer.c:566
tag
uint32_t tag
Definition: movenc.c:1879
ffio_free_dyn_buf
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
Definition: aviobuf.c:1435
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:760
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:748
ff_iamf_free_audio_element
void ff_iamf_free_audio_element(IAMFAudioElement **paudio_element)
Definition: iamf.c:70
avformat.h
IAMF_OBU_IA_AUDIO_FRAME_ID0
@ IAMF_OBU_IA_AUDIO_FRAME_ID0
Definition: iamf.h:44
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
AVStreamGroup
Definition: avformat.h:1134
IAMFMixPresentation
Definition: iamf.h:107
AV_CHANNEL_ORDER_CUSTOM
@ AV_CHANNEL_ORDER_CUSTOM
The channel order does not correspond to any other predefined order and is stored as an explicit map.
Definition: channel_layout.h:132
AVStreamGroup::nb_streams
unsigned int nb_streams
Number of elements in AVStreamGroup.streams.
Definition: avformat.h:1188
channel_layout.h
AVIAMFSubmix::default_mix_gain
AVRational default_mix_gain
Default mix gain value to apply when there are no AVIAMFParamDefinition with output_mix_config's para...
Definition: iamf.h:603
AVIAMFSubmixLayout::album_anchored_loudness
AVRational album_anchored_loudness
The Album loudness information, as defined in ITU-1770-4.
Definition: iamf.h:547
AVIAMFSubmixLayout::true_peak
AVRational true_peak
The true peak of the audio signal, as defined in ITU-1770-4.
Definition: iamf.h:539
AVRational::den
int den
Denominator.
Definition: rational.h:60
AVIAMFSubmixLayout::sound_system
AVChannelLayout sound_system
Channel layout matching one of Sound Systems A to J of ITU-2051-3, plus 7.1.2ch, 3....
Definition: iamf.h:525
IAMFCodecConfig::codec_id
enum AVCodecID codec_id
Definition: iamf.h:68
IAMFCodecConfig::codec_config_id
unsigned codec_config_id
Definition: iamf.h:67
AV_PKT_DATA_SKIP_SAMPLES
@ AV_PKT_DATA_SKIP_SAMPLES
Recommmends skipping the specified number of samples.
Definition: packet.h:153
IAMF_ANCHOR_ELEMENT_DIALOGUE
@ IAMF_ANCHOR_ELEMENT_DIALOGUE
Definition: iamf.h:141
AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
@ AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN
Subblocks are of struct type AVIAMFMixGain.
Definition: iamf.h:173
AV_RL32A
#define AV_RL32A(p)
Definition: intreadwrite.h:568
MAX_IAMF_OBU_HEADER_SIZE
#define MAX_IAMF_OBU_HEADER_SIZE
Definition: iamf.h:34
av_clip_uint8
#define av_clip_uint8
Definition: common.h:106
AVIAMFSubmix::nb_elements
unsigned int nb_elements
Number of elements in the submix.
Definition: iamf.h:572
AV_CODEC_ID_PCM_S32LE
@ AV_CODEC_ID_PCM_S32LE
Definition: codec_id.h:342
AVIAMFAudioElement::demixing_info
AVIAMFParamDefinition * demixing_info
Demixing information used to reconstruct a scalable channel audio representation.
Definition: iamf.h:376
AVIAMFDemixingInfo::dmixp_mode
unsigned int dmixp_mode
Pre-defined combination of demixing parameters.
Definition: iamf.h:140
mem.h
AVIAMFSubmix::output_mix_config
AVIAMFParamDefinition * output_mix_config
Information required for post-processing the mixed audio signal to generate the audio signal for play...
Definition: iamf.h:595
AVStreamGroup::type
enum AVStreamGroupParamsType type
Group type.
Definition: avformat.h:1161
IAMFContext::mix_presentations
IAMFMixPresentation ** mix_presentations
Definition: iamf.h:133
AVIAMFLayer::ambisonics_mode
enum AVIAMFAmbisonicsMode ambisonics_mode
Ambisonics mode as defined in section 3.6.3 of IAMF.
Definition: iamf.h:328
flush_put_bits
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:143
avio_wb24
void avio_wb24(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:455
AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL
@ AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL
The layout is binaural.
Definition: iamf.h:505
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
AVDictionaryEntry
Definition: dict.h:89
AVIAMFLayer::output_gain
AVRational output_gain
Output gain as defined in section 3.6.2 of IAMF.
Definition: iamf.h:316
AV_IAMF_AMBISONICS_MODE_PROJECTION
@ AV_IAMF_AMBISONICS_MODE_PROJECTION
Definition: iamf.h:274
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:516
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
iamf.h
AVIAMFSubmixElement::element_mix_config
AVIAMFParamDefinition * element_mix_config
Information required required for applying any processing to the referenced and rendered Audio Elemen...
Definition: iamf.h:461
AVIAMFParamDefinition::parameter_rate
unsigned int parameter_rate
Sample rate for the paremeter substream.
Definition: iamf.h:222
ff_iamf_scalable_ch_layouts
const AVChannelLayout ff_iamf_scalable_ch_layouts[10]
Definition: iamf.c:27
AVIAMFSubmixElement
Submix element as defined in section 3.7 of IAMF.
Definition: iamf.h:446
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:443
AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL
@ AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL
Definition: iamf.h:345
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
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
AVIAMFAudioElement::recon_gain_info
AVIAMFParamDefinition * recon_gain_info
Recon gain information used to reconstruct a scalable channel audio representation.
Definition: iamf.h:383
avio_put_str
int avio_put_str(AVIOContext *s, const char *str)
Write a NULL-terminated string.
Definition: aviobuf.c:373
put_bits.h
IAMFCodecConfig::audio_roll_distance
int audio_roll_distance
Definition: iamf.h:71
AVIAMFMixPresentation::submixes
AVIAMFSubmix ** submixes
Array of submixes.
Definition: iamf.h:622
IAMFMixPresentation::mix_presentation_id
unsigned int mix_presentation_id
Definition: iamf.h:114
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_CODEC_ID_PCM_S24BE
@ AV_CODEC_ID_PCM_S24BE
Definition: codec_id.h:347
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
AVChannelCustom::id
enum AVChannel id
Definition: channel_layout.h:282
av_dict_iterate
const AVDictionaryEntry * av_dict_iterate(const AVDictionary *m, const AVDictionaryEntry *prev)
Iterate over a dictionary.
Definition: dict.c:44
AV_IAMF_PARAMETER_DEFINITION_DEMIXING
@ AV_IAMF_PARAMETER_DEFINITION_DEMIXING
Subblocks are of struct type AVIAMFDemixingInfo.
Definition: iamf.h:177
iamf_write_audio_element
static int iamf_write_audio_element(const IAMFContext *iamf, const IAMFAudioElement *audio_element, AVIOContext *pb, void *log_ctx)
Definition: iamf_writer.c:627
iamf_writer.h
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