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  }
821  init_put_bits(&pbc, header, sizeof(header));
822  put_bits(&pbc, 2, submix_layout->layout_type); // layout_type
824  put_bits(&pbc, 4, ff_iamf_sound_system_map[layout].id); // sound_system
825  put_bits(&pbc, 2, 0); // reserved
826  } else
827  put_bits(&pbc, 6, 0); // reserved
828  flush_put_bits(&pbc);
829  avio_write(dyn_bc, header, put_bytes_count(&pbc, 1));
830 
831  info_type = (submix_layout->true_peak.num && submix_layout->true_peak.den);
832  info_type |= (dialogue || album) << 1;
833  avio_w8(dyn_bc, info_type);
834  avio_wb16(dyn_bc, rescale_rational(submix_layout->integrated_loudness, 1 << 8));
835  avio_wb16(dyn_bc, rescale_rational(submix_layout->digital_peak, 1 << 8));
836  if (info_type & 1)
837  avio_wb16(dyn_bc, rescale_rational(submix_layout->true_peak, 1 << 8));
838  if (info_type & 2) {
839  avio_w8(dyn_bc, dialogue + album); // num_anchored_loudness
840  if (dialogue) {
842  avio_wb16(dyn_bc, rescale_rational(submix_layout->dialogue_anchored_loudness, 1 << 8));
843  }
844  if (album) {
846  avio_wb16(dyn_bc, rescale_rational(submix_layout->album_anchored_loudness, 1 << 8));
847  }
848  }
849  }
850  }
851 
852  init_put_bits(&pbc, header, sizeof(header));
854  put_bits(&pbc, 3, 0);
855  flush_put_bits(&pbc);
856 
857  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
858  avio_write(pb, header, put_bytes_count(&pbc, 1));
859  ffio_write_leb(pb, dyn_size);
860  avio_write(pb, dyn_buf, dyn_size);
861  ffio_free_dyn_buf(&dyn_bc);
862 
863  return 0;
864 }
865 
866 int ff_iamf_write_descriptors(const IAMFContext *iamf, AVIOContext *pb, void *log_ctx)
867 {
868  int ret;
869 
870  // Sequence Header
872 
873  ffio_write_leb(pb, 6);
874  avio_wb32(pb, MKBETAG('i','a','m','f'));
875  avio_w8(pb, iamf->nb_audio_elements > 1); // primary_profile
876  avio_w8(pb, iamf->nb_audio_elements > 1); // additional_profile
877 
878  for (int i = 0; i < iamf->nb_codec_configs; i++) {
879  ret = iamf_write_codec_config(iamf, iamf->codec_configs[i], pb);
880  if (ret < 0)
881  return ret;
882  }
883 
884  for (int i = 0; i < iamf->nb_audio_elements; i++) {
885  ret = iamf_write_audio_element(iamf, iamf->audio_elements[i], pb, log_ctx);
886  if (ret < 0)
887  return ret;
888  }
889 
890  for (int i = 0; i < iamf->nb_mix_presentations; i++) {
891  ret = iamf_write_mixing_presentation(iamf, iamf->mix_presentations[i], pb, log_ctx);
892  if (ret < 0)
893  return ret;
894  }
895 
896  return 0;
897 }
898 
899 static int write_parameter_block(const IAMFContext *iamf, AVIOContext *pb,
900  const AVIAMFParamDefinition *param, void *log_ctx)
901 {
904  PutBitContext pbc;
905  AVIOContext *dyn_bc;
906  uint8_t *dyn_buf = NULL;
907  int dyn_size, ret;
908 
910  av_log(log_ctx, AV_LOG_DEBUG, "Ignoring side data with unknown type %u\n",
911  param->type);
912  return 0;
913  }
914 
915  if (!param_definition) {
916  av_log(log_ctx, AV_LOG_ERROR, "Non-existent Parameter Definition with ID %u referenced by a packet\n",
917  param->parameter_id);
918  return AVERROR(EINVAL);
919  }
920 
921  if (param->type != param_definition->param->type) {
922  av_log(log_ctx, AV_LOG_ERROR, "Inconsistent values for Parameter Definition "
923  "with ID %u in a packet\n",
924  param->parameter_id);
925  return AVERROR(EINVAL);
926  }
927 
928  ret = avio_open_dyn_buf(&dyn_bc);
929  if (ret < 0)
930  return ret;
931 
932  // Sequence Header
933  init_put_bits(&pbc, header, sizeof(header));
935  put_bits(&pbc, 3, 0);
936  flush_put_bits(&pbc);
937  avio_write(pb, header, put_bytes_count(&pbc, 1));
938 
939  ffio_write_leb(dyn_bc, param->parameter_id);
940  if (!param_definition->mode) {
941  ffio_write_leb(dyn_bc, param->duration);
943  if (param->constant_subblock_duration == 0)
944  ffio_write_leb(dyn_bc, param->nb_subblocks);
945  }
946 
947  for (int i = 0; i < param->nb_subblocks; i++) {
948  const void *subblock = av_iamf_param_definition_get_subblock(param, i);
949 
950  switch (param->type) {
952  const AVIAMFMixGain *mix = subblock;
953  if (!param_definition->mode && param->constant_subblock_duration == 0)
954  ffio_write_leb(dyn_bc, mix->subblock_duration);
955 
956  ffio_write_leb(dyn_bc, mix->animation_type);
957 
958  avio_wb16(dyn_bc, rescale_rational(mix->start_point_value, 1 << 8));
959  if (mix->animation_type >= AV_IAMF_ANIMATION_TYPE_LINEAR)
960  avio_wb16(dyn_bc, rescale_rational(mix->end_point_value, 1 << 8));
961  if (mix->animation_type == AV_IAMF_ANIMATION_TYPE_BEZIER) {
962  avio_wb16(dyn_bc, rescale_rational(mix->control_point_value, 1 << 8));
963  avio_w8(dyn_bc, av_clip_uint8(av_rescale(mix->control_point_relative_time.num, 1 << 8,
964  mix->control_point_relative_time.den)));
965  }
966  break;
967  }
969  const AVIAMFDemixingInfo *demix = subblock;
970  if (!param_definition->mode && param->constant_subblock_duration == 0)
971  ffio_write_leb(dyn_bc, demix->subblock_duration);
972 
973  avio_w8(dyn_bc, demix->dmixp_mode << 5);
974  break;
975  }
977  const AVIAMFReconGain *recon = subblock;
978  const AVIAMFAudioElement *audio_element = param_definition->audio_element->celement;
979 
980  if (!param_definition->mode && param->constant_subblock_duration == 0)
981  ffio_write_leb(dyn_bc, recon->subblock_duration);
982 
983  if (!audio_element) {
984  av_log(log_ctx, AV_LOG_ERROR, "Invalid Parameter Definition with ID %u referenced by a packet\n", param->parameter_id);
985  return AVERROR(EINVAL);
986  }
987 
988  for (int j = 0; j < audio_element->nb_layers; j++) {
989  const AVIAMFLayer *layer = audio_element->layers[j];
990 
991  if (layer->flags & AV_IAMF_LAYER_FLAG_RECON_GAIN) {
992  unsigned int recon_gain_flags = 0;
993  int k = 0;
994 
995  for (; k < 7; k++)
996  recon_gain_flags |= (1 << k) * !!recon->recon_gain[j][k];
997  for (; k < 12; k++)
998  recon_gain_flags |= (2 << k) * !!recon->recon_gain[j][k];
999  if (recon_gain_flags >> 8)
1000  recon_gain_flags |= (1 << k);
1001 
1002  ffio_write_leb(dyn_bc, recon_gain_flags);
1003  for (k = 0; k < 12; k++) {
1004  if (recon->recon_gain[j][k])
1005  avio_w8(dyn_bc, recon->recon_gain[j][k]);
1006  }
1007  }
1008  }
1009  break;
1010  }
1011  default:
1012  av_assert0(0);
1013  }
1014  }
1015 
1016  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
1017  ffio_write_leb(pb, dyn_size);
1018  avio_write(pb, dyn_buf, dyn_size);
1019  ffio_free_dyn_buf(&dyn_bc);
1020 
1021  return 0;
1022 }
1023 
1025  const AVPacket *pkt, void *log_ctx)
1026 {
1030  NULL);
1031  AVIAMFParamDefinition *demix =
1034  NULL);
1035  AVIAMFParamDefinition *recon =
1038  NULL);
1039 
1040  if (mix) {
1041  int ret = write_parameter_block(iamf, pb, mix, log_ctx);
1042  if (ret < 0)
1043  return ret;
1044  }
1045  if (demix) {
1046  int ret = write_parameter_block(iamf, pb, demix, log_ctx);
1047  if (ret < 0)
1048  return ret;
1049  }
1050  if (recon) {
1051  int ret = write_parameter_block(iamf, pb, recon, log_ctx);
1052  if (ret < 0)
1053  return ret;
1054  }
1055 
1056  return 0;
1057 }
1058 
1060  unsigned int audio_substream_id)
1061 {
1062  for (int i = 0; i < c->nb_audio_elements; i++) {
1063  IAMFAudioElement *audio_element = c->audio_elements[i];
1064  for (int j = 0; j < audio_element->nb_substreams; j++) {
1065  IAMFSubStream *substream = &audio_element->substreams[j];
1066  if (substream->audio_substream_id == audio_substream_id)
1067  return audio_element;
1068  }
1069  }
1070 
1071  return NULL;
1072 }
1073 
1075  unsigned audio_substream_id, const AVPacket *pkt)
1076 {
1078  PutBitContext pbc;
1079  AVIOContext *dyn_bc;
1080  const uint8_t *side_data;
1081  uint8_t *dyn_buf = NULL;
1082  unsigned int skip_samples = 0, discard_padding = 0;
1083  size_t side_data_size;
1084  int dyn_size, type = audio_substream_id <= 17 ?
1086  int ret;
1087 
1088  if (!pkt->size) {
1089  const IAMFAudioElement *audio_element;
1090  IAMFCodecConfig *codec_config;
1091  size_t new_extradata_size;
1092  const uint8_t *new_extradata = av_packet_get_side_data(pkt,
1094  &new_extradata_size);
1095 
1096  if (!new_extradata)
1097  return AVERROR_INVALIDDATA;
1098  audio_element = get_audio_element(iamf, audio_substream_id);
1099  if (!audio_element)
1100  return AVERROR(EINVAL);
1101  codec_config = ff_iamf_get_codec_config(iamf, audio_element->codec_config_id);
1102  if (!codec_config)
1103  return AVERROR(EINVAL);
1104 
1105  av_free(codec_config->extradata);
1106  codec_config->extradata = av_memdup(new_extradata, new_extradata_size);
1107  if (!codec_config->extradata) {
1108  codec_config->extradata_size = 0;
1109  return AVERROR(ENOMEM);
1110  }
1111  codec_config->extradata_size = new_extradata_size;
1112 
1113  return update_extradata(codec_config);
1114  }
1115 
1117  &side_data_size);
1118 
1119  if (side_data && side_data_size >= 10) {
1120  skip_samples = AV_RL32(side_data);
1121  discard_padding = AV_RL32(side_data + 4);
1122  }
1123 
1124  ret = avio_open_dyn_buf(&dyn_bc);
1125  if (ret < 0)
1126  return ret;
1127 
1128  init_put_bits(&pbc, header, sizeof(header));
1129  put_bits(&pbc, 5, type);
1130  put_bits(&pbc, 1, 0); // obu_redundant_copy
1131  put_bits(&pbc, 1, skip_samples || discard_padding);
1132  put_bits(&pbc, 1, 0); // obu_extension_flag
1133  flush_put_bits(&pbc);
1134  avio_write(pb, header, put_bytes_count(&pbc, 1));
1135 
1136  if (skip_samples || discard_padding) {
1137  ffio_write_leb(dyn_bc, discard_padding);
1138  ffio_write_leb(dyn_bc, skip_samples);
1139  }
1140 
1141  if (audio_substream_id > 17)
1142  ffio_write_leb(dyn_bc, audio_substream_id);
1143 
1144  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
1145  ffio_write_leb(pb, dyn_size + pkt->size);
1146  avio_write(pb, dyn_buf, dyn_size);
1147  ffio_free_dyn_buf(&dyn_bc);
1148  avio_write(pb, pkt->data, pkt->size);
1149 
1150  return 0;
1151 }
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:334
AVChannelLayout::u
union AVChannelLayout::@427 u
Details about which channels are present in this layout.
iamf.h
AVStreamGroup::params
union AVStreamGroup::@365 params
Group type-specific parameters.
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:561
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:497
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:576
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:362
AVIAMFMixPresentation::nb_submixes
unsigned int nb_submixes
Number of submixes in the presentation.
Definition: iamf.h:625
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:513
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:316
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:321
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:899
AVIAMFSubmixLayout::digital_peak
AVRational digital_peak
The digital (sampled) peak value of the audio signal, as defined in ITU-1770-4.
Definition: iamf.h:531
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:526
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:188
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:510
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:539
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
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:152
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:1059
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:552
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:1024
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:804
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:609
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:1074
ff_iamf_write_descriptors
int ff_iamf_write_descriptors(const IAMFContext *iamf, AVIOContext *pb, void *log_ctx)
Definition: iamf_writer.c:866
AVIAMFSubmix::nb_layouts
unsigned int nb_layouts
Number of layouts in the submix.
Definition: iamf.h:583
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:1876
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:129
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:599
AVIAMFSubmixLayout::album_anchored_loudness
AVRational album_anchored_loudness
The Album loudness information, as defined in ITU-1770-4.
Definition: iamf.h:543
AVIAMFSubmixLayout::true_peak
AVRational true_peak
The true peak of the audio signal, as defined in ITU-1770-4.
Definition: iamf.h:535
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 and 3....
Definition: iamf.h:521
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:568
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:591
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
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:618
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:276
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