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->codec_tag = st->codecpar->codec_tag;
116  switch (codec_config->codec_id) {
117  case AV_CODEC_ID_OPUS:
118  codec_config->sample_rate = 48000;
119  codec_config->nb_samples = av_rescale(st->codecpar->frame_size, 48000, st->codecpar->sample_rate);
120  break;
121  default:
122  codec_config->sample_rate = st->codecpar->sample_rate;
123  codec_config->nb_samples = st->codecpar->frame_size;
124  break;
125  }
126  populate_audio_roll_distance(codec_config);
127  if (st->codecpar->extradata_size) {
128  codec_config->extradata = av_memdup(st->codecpar->extradata, st->codecpar->extradata_size);
129  if (!codec_config->extradata)
130  return AVERROR(ENOMEM);
131  codec_config->extradata_size = st->codecpar->extradata_size;
132  ret = update_extradata(codec_config);
133  if (ret < 0)
134  goto fail;
135  }
136 
137  for (j = 0; j < iamf->nb_codec_configs; j++) {
138  if (!memcmp(iamf->codec_configs[j], codec_config, offsetof(IAMFCodecConfig, extradata)) &&
139  (!codec_config->extradata_size || !memcmp(iamf->codec_configs[j]->extradata,
140  codec_config->extradata, codec_config->extradata_size)))
141  break;
142  }
143 
144  if (j < iamf->nb_codec_configs) {
145  av_free(iamf->codec_configs[j]->extradata);
146  av_free(iamf->codec_configs[j]);
147  iamf->codec_configs[j] = codec_config;
148  return j;
149  }
150 
151  tmp = av_realloc_array(iamf->codec_configs, iamf->nb_codec_configs + 1, sizeof(*iamf->codec_configs));
152  if (!tmp) {
153  ret = AVERROR(ENOMEM);
154  goto fail;
155  }
156 
157  iamf->codec_configs = tmp;
158  iamf->codec_configs[iamf->nb_codec_configs] = codec_config;
159  codec_config->codec_config_id = iamf->nb_codec_configs;
160 
161  return iamf->nb_codec_configs++;
162 
163 fail:
164  av_freep(&codec_config->extradata);
165  return ret;
166 }
167 
169  const IAMFAudioElement *audio_element, void *log_ctx)
170 {
172  IAMFCodecConfig *codec_config = NULL;
173 
175  sizeof(*iamf->param_definitions));
176  if (!tmp)
177  return AVERROR(ENOMEM);
178 
179  iamf->param_definitions = tmp;
180 
181  if (audio_element)
182  codec_config = iamf->codec_configs[audio_element->codec_config_id];
183 
184  if (!param->parameter_rate) {
185  if (!codec_config) {
186  av_log(log_ctx, AV_LOG_ERROR, "parameter_rate needed but not set for parameter_id %u\n",
187  param->parameter_id);
188  return AVERROR(EINVAL);
189  }
190  param->parameter_rate = codec_config->sample_rate;
191  }
192  if (codec_config) {
193  if (!param->duration)
194  param->duration = av_rescale(codec_config->nb_samples, param->parameter_rate, codec_config->sample_rate);
195  if (!param->constant_subblock_duration)
196  param->constant_subblock_duration = av_rescale(codec_config->nb_samples, param->parameter_rate, codec_config->sample_rate);
197  }
198 
200  if (!param_definition)
201  return AVERROR(ENOMEM);
202 
203  param_definition->mode = !!param->duration;
204  param_definition->param = param;
205  param_definition->audio_element = audio_element;
207 
208  return 0;
209 }
210 
211 int ff_iamf_add_audio_element(IAMFContext *iamf, const AVStreamGroup *stg, void *log_ctx)
212 {
213  const AVIAMFAudioElement *iamf_audio_element;
214  IAMFAudioElement **tmp, *audio_element;
215  IAMFCodecConfig *codec_config;
216  int ret;
217 
219  return AVERROR(EINVAL);
220  if (!stg->nb_streams) {
221  av_log(log_ctx, AV_LOG_ERROR, "Audio Element id %"PRId64" has no streams\n", stg->id);
222  return AVERROR(EINVAL);
223  }
224 
225  iamf_audio_element = stg->params.iamf_audio_element;
226  if (iamf_audio_element->audio_element_type == AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE) {
227  const AVIAMFLayer *layer = iamf_audio_element->layers[0];
228  if (iamf_audio_element->nb_layers != 1) {
229  av_log(log_ctx, AV_LOG_ERROR, "Invalid amount of layers for SCENE_BASED audio element. Must be 1\n");
230  return AVERROR(EINVAL);
231  }
232  if (layer->ch_layout.order != AV_CHANNEL_ORDER_CUSTOM &&
234  av_log(log_ctx, AV_LOG_ERROR, "Invalid channel layout for SCENE_BASED audio element\n");
235  return AVERROR(EINVAL);
236  }
238  av_log(log_ctx, AV_LOG_ERROR, "Unsuported ambisonics mode %d\n", layer->ambisonics_mode);
239  return AVERROR_PATCHWELCOME;
240  }
241  for (int i = 0; i < stg->nb_streams; i++) {
242  if (stg->streams[i]->codecpar->ch_layout.nb_channels > 1) {
243  av_log(log_ctx, AV_LOG_ERROR, "Invalid amount of channels in a stream for MONO mode ambisonics\n");
244  return AVERROR(EINVAL);
245  }
246  }
247  } else
248  for (int j, i = 0; i < iamf_audio_element->nb_layers; i++) {
249  const AVIAMFLayer *layer = iamf_audio_element->layers[i];
250  for (j = 0; j < FF_ARRAY_ELEMS(ff_iamf_scalable_ch_layouts); j++)
252  break;
253 
255  av_log(log_ctx, AV_LOG_ERROR, "Unsupported channel layout in stream group #%d\n", i);
256  return AVERROR(EINVAL);
257  }
258  }
259 
260  for (int i = 0; i < iamf->nb_audio_elements; i++) {
261  if (stg->id == iamf->audio_elements[i]->audio_element_id) {
262  av_log(log_ctx, AV_LOG_ERROR, "Duplicated Audio Element id %"PRId64"\n", stg->id);
263  return AVERROR(EINVAL);
264  }
265  }
266 
267  codec_config = av_mallocz(sizeof(*codec_config));
268  if (!codec_config)
269  return AVERROR(ENOMEM);
270 
271  ret = fill_codec_config(iamf, stg, codec_config);
272  if (ret < 0) {
273  av_free(codec_config);
274  return ret;
275  }
276 
277  audio_element = av_mallocz(sizeof(*audio_element));
278  if (!audio_element)
279  return AVERROR(ENOMEM);
280 
281  audio_element->celement = stg->params.iamf_audio_element;
282  audio_element->audio_element_id = stg->id;
283  audio_element->codec_config_id = ret;
284 
285  audio_element->substreams = av_calloc(stg->nb_streams, sizeof(*audio_element->substreams));
286  if (!audio_element->substreams) {
287  ret = AVERROR(ENOMEM);
288  goto fail;
289  }
290  audio_element->nb_substreams = stg->nb_streams;
291 
292  audio_element->layers = av_calloc(iamf_audio_element->nb_layers, sizeof(*audio_element->layers));
293  if (!audio_element->layers) {
294  ret = AVERROR(ENOMEM);
295  goto fail;
296  }
297 
298  for (int i = 0, j = 0; i < iamf_audio_element->nb_layers; i++) {
299  int nb_channels = iamf_audio_element->layers[i]->ch_layout.nb_channels;
300 
301  IAMFLayer *layer = &audio_element->layers[i];
302 
303  if (i)
304  nb_channels -= iamf_audio_element->layers[i - 1]->ch_layout.nb_channels;
305  for (; nb_channels > 0 && j < stg->nb_streams; j++) {
306  const AVStream *st = stg->streams[j];
307  IAMFSubStream *substream = &audio_element->substreams[j];
308 
309  substream->audio_substream_id = st->id;
310  layer->substream_count++;
312  nb_channels -= st->codecpar->ch_layout.nb_channels;
313  }
314  if (nb_channels) {
315  av_log(log_ctx, AV_LOG_ERROR, "Invalid channel count across substreams in layer %u from stream group %u\n",
316  i, stg->index);
317  ret = AVERROR(EINVAL);
318  goto fail;
319  }
320  }
321 
322  for (int i = 0; i < audio_element->nb_substreams; i++) {
323  for (int j = i + 1; j < audio_element->nb_substreams; j++)
324  if (audio_element->substreams[i].audio_substream_id ==
325  audio_element->substreams[j].audio_substream_id) {
326  av_log(log_ctx, AV_LOG_ERROR, "Duplicate id %u in streams %u and %u from stream group %u\n",
327  audio_element->substreams[i].audio_substream_id, i, j, stg->index);
328  ret = AVERROR(EINVAL);
329  goto fail;
330  }
331  }
332 
333  if (iamf_audio_element->demixing_info) {
334  AVIAMFParamDefinition *param = iamf_audio_element->demixing_info;
336 
337  if (param->nb_subblocks != 1) {
338  av_log(log_ctx, AV_LOG_ERROR, "nb_subblocks in demixing_info for stream group %u is not 1\n", stg->index);
339  ret = AVERROR(EINVAL);
340  goto fail;
341  }
342 
343  if (!param_definition) {
344  ret = add_param_definition(iamf, param, audio_element, log_ctx);
345  if (ret < 0)
346  goto fail;
347  }
348  }
349  if (iamf_audio_element->recon_gain_info) {
350  AVIAMFParamDefinition *param = iamf_audio_element->recon_gain_info;
352 
353  if (param->nb_subblocks != 1) {
354  av_log(log_ctx, AV_LOG_ERROR, "nb_subblocks in recon_gain_info for stream group %u is not 1\n", stg->index);
355  ret = AVERROR(EINVAL);
356  goto fail;
357  }
358 
359  if (!param_definition) {
360  ret = add_param_definition(iamf, param, audio_element, log_ctx);
361  if (ret < 0)
362  goto fail;
363  }
364  }
365 
366  tmp = av_realloc_array(iamf->audio_elements, iamf->nb_audio_elements + 1, sizeof(*iamf->audio_elements));
367  if (!tmp) {
368  ret = AVERROR(ENOMEM);
369  goto fail;
370  }
371 
372  iamf->audio_elements = tmp;
373  iamf->audio_elements[iamf->nb_audio_elements++] = audio_element;
374 
375  return 0;
376 fail:
377  ff_iamf_free_audio_element(&audio_element);
378  return ret;
379 }
380 
381 int ff_iamf_add_mix_presentation(IAMFContext *iamf, const AVStreamGroup *stg, void *log_ctx)
382 {
383  IAMFMixPresentation **tmp, *mix_presentation;
384  int ret;
385 
387  return AVERROR(EINVAL);
388  if (!stg->nb_streams) {
389  av_log(log_ctx, AV_LOG_ERROR, "Mix Presentation id %"PRId64" has no streams\n", stg->id);
390  return AVERROR(EINVAL);
391  }
392 
393  for (int i = 0; i < iamf->nb_mix_presentations; i++) {
394  if (stg->id == iamf->mix_presentations[i]->mix_presentation_id) {
395  av_log(log_ctx, AV_LOG_ERROR, "Duplicate Mix Presentation id %"PRId64"\n", stg->id);
396  return AVERROR(EINVAL);
397  }
398  }
399 
400  mix_presentation = av_mallocz(sizeof(*mix_presentation));
401  if (!mix_presentation)
402  return AVERROR(ENOMEM);
403 
404  mix_presentation->cmix = stg->params.iamf_mix_presentation;
405  mix_presentation->mix_presentation_id = stg->id;
406 
407  for (int i = 0; i < mix_presentation->cmix->nb_submixes; i++) {
408  const AVIAMFSubmix *submix = mix_presentation->cmix->submixes[i];
409  AVIAMFParamDefinition *param = submix->output_mix_config;
411 
412  if (!param) {
413  av_log(log_ctx, AV_LOG_ERROR, "output_mix_config is not present in submix %u from "
414  "Mix Presentation ID %"PRId64"\n", i, stg->id);
415  ret = AVERROR(EINVAL);
416  goto fail;
417  }
418 
420  if (!param_definition) {
421  ret = add_param_definition(iamf, param, NULL, log_ctx);
422  if (ret < 0)
423  goto fail;
424  }
425 
426  for (int j = 0; j < submix->nb_elements; j++) {
427  const AVIAMFSubmixElement *element = submix->elements[j];
428  param = element->element_mix_config;
429 
430  if (!param) {
431  av_log(log_ctx, AV_LOG_ERROR, "element_mix_config is not present for element %u in submix %u from "
432  "Mix Presentation ID %"PRId64"\n", j, i, stg->id);
433  ret = AVERROR(EINVAL);
434  goto fail;
435  }
437  if (!param_definition) {
438  ret = add_param_definition(iamf, param, NULL, log_ctx);
439  if (ret < 0)
440  goto fail;
441  }
442  }
443  }
444 
446  if (!tmp) {
447  ret = AVERROR(ENOMEM);
448  goto fail;
449  }
450 
451  iamf->mix_presentations = tmp;
452  iamf->mix_presentations[iamf->nb_mix_presentations++] = mix_presentation;
453 
454  return 0;
455 fail:
456  ff_iamf_free_mix_presentation(&mix_presentation);
457  return ret;
458 }
459 
460 static int iamf_write_codec_config(const IAMFContext *iamf,
461  const IAMFCodecConfig *codec_config,
462  AVIOContext *pb)
463 {
465  AVIOContext *dyn_bc;
466  uint8_t *dyn_buf = NULL;
467  PutBitContext pbc;
468  int dyn_size;
469 
470  int ret = avio_open_dyn_buf(&dyn_bc);
471  if (ret < 0)
472  return ret;
473 
474  ffio_write_leb(dyn_bc, codec_config->codec_config_id);
475  avio_wl32(dyn_bc, codec_config->codec_tag);
476 
477  ffio_write_leb(dyn_bc, codec_config->nb_samples);
478  avio_wb16(dyn_bc, codec_config->audio_roll_distance);
479 
480  switch(codec_config->codec_id) {
481  case AV_CODEC_ID_OPUS:
482  avio_write(dyn_bc, codec_config->extradata, codec_config->extradata_size);
483  break;
484  case AV_CODEC_ID_AAC:
485  return AVERROR_PATCHWELCOME;
486  case AV_CODEC_ID_FLAC:
487  avio_w8(dyn_bc, 0x80);
488  avio_wb24(dyn_bc, codec_config->extradata_size);
489  avio_write(dyn_bc, codec_config->extradata, codec_config->extradata_size);
490  break;
492  avio_w8(dyn_bc, 1);
493  avio_w8(dyn_bc, 16);
494  avio_wb32(dyn_bc, codec_config->sample_rate);
495  break;
497  avio_w8(dyn_bc, 1);
498  avio_w8(dyn_bc, 24);
499  avio_wb32(dyn_bc, codec_config->sample_rate);
500  break;
502  avio_w8(dyn_bc, 1);
503  avio_w8(dyn_bc, 32);
504  avio_wb32(dyn_bc, codec_config->sample_rate);
505  break;
507  avio_w8(dyn_bc, 0);
508  avio_w8(dyn_bc, 16);
509  avio_wb32(dyn_bc, codec_config->sample_rate);
510  break;
512  avio_w8(dyn_bc, 0);
513  avio_w8(dyn_bc, 24);
514  avio_wb32(dyn_bc, codec_config->sample_rate);
515  break;
517  avio_w8(dyn_bc, 0);
518  avio_w8(dyn_bc, 32);
519  avio_wb32(dyn_bc, codec_config->sample_rate);
520  break;
521  default:
522  break;
523  }
524 
525  init_put_bits(&pbc, header, sizeof(header));
527  put_bits(&pbc, 3, 0);
528  flush_put_bits(&pbc);
529 
530  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
531  avio_write(pb, header, put_bytes_count(&pbc, 1));
532  ffio_write_leb(pb, dyn_size);
533  avio_write(pb, dyn_buf, dyn_size);
534  ffio_free_dyn_buf(&dyn_bc);
535 
536  return 0;
537 }
538 
539 static inline int rescale_rational(AVRational q, int b)
540 {
541  return av_clip_int16(av_rescale(q.num, b, q.den));
542 }
543 
544 static int scalable_channel_layout_config(const IAMFAudioElement *audio_element,
545  AVIOContext *dyn_bc)
546 {
547  const AVIAMFAudioElement *element = audio_element->celement;
549  PutBitContext pb;
550 
551  init_put_bits(&pb, header, sizeof(header));
552  put_bits(&pb, 3, element->nb_layers);
553  put_bits(&pb, 5, 0);
554  flush_put_bits(&pb);
555  avio_write(dyn_bc, header, put_bytes_count(&pb, 1));
556  for (int i = 0; i < element->nb_layers; i++) {
557  const AVIAMFLayer *layer = element->layers[i];
558  int layout;
561  break;
562  }
563  init_put_bits(&pb, header, sizeof(header));
564  put_bits(&pb, 4, layout);
565  put_bits(&pb, 1, !!layer->output_gain_flags);
566  put_bits(&pb, 1, !!(layer->flags & AV_IAMF_LAYER_FLAG_RECON_GAIN));
567  put_bits(&pb, 2, 0); // reserved
568  put_bits(&pb, 8, audio_element->layers[i].substream_count);
569  put_bits(&pb, 8, audio_element->layers[i].coupled_substream_count);
570  if (layer->output_gain_flags) {
571  put_bits(&pb, 6, layer->output_gain_flags);
572  put_bits(&pb, 2, 0);
573  put_bits(&pb, 16, rescale_rational(layer->output_gain, 1 << 8));
574  }
575  flush_put_bits(&pb);
576  avio_write(dyn_bc, header, put_bytes_count(&pb, 1));
577  }
578 
579  return 0;
580 }
581 
582 static int ambisonics_config(const IAMFAudioElement *audio_element,
583  AVIOContext *dyn_bc)
584 {
585  const AVIAMFAudioElement *element = audio_element->celement;
586  const AVIAMFLayer *layer = element->layers[0];
587 
588  ffio_write_leb(dyn_bc, 0); // ambisonics_mode
589  ffio_write_leb(dyn_bc, layer->ch_layout.nb_channels); // output_channel_count
590  ffio_write_leb(dyn_bc, audio_element->nb_substreams); // substream_count
591 
593  for (int i = 0; i < layer->ch_layout.nb_channels; i++)
594  avio_w8(dyn_bc, i);
595  else
596  for (int i = 0; i < layer->ch_layout.nb_channels; i++)
597  avio_w8(dyn_bc, layer->ch_layout.u.map[i].id);
598 
599  return 0;
600 }
601 
602 static int param_definition(const IAMFContext *iamf,
603  const IAMFParamDefinition *param_def,
604  AVIOContext *dyn_bc, void *log_ctx)
605 {
606  const AVIAMFParamDefinition *param = param_def->param;
607 
608  ffio_write_leb(dyn_bc, param->parameter_id);
609  ffio_write_leb(dyn_bc, param->parameter_rate);
610  avio_w8(dyn_bc, param->duration ? 0 : 1 << 7);
611  if (param->duration) {
612  ffio_write_leb(dyn_bc, param->duration);
614  if (param->constant_subblock_duration == 0) {
615  ffio_write_leb(dyn_bc, param->nb_subblocks);
616  for (int i = 0; i < param->nb_subblocks; i++) {
617  const void *subblock = av_iamf_param_definition_get_subblock(param, i);
618 
619  switch (param->type) {
621  const AVIAMFMixGain *mix = subblock;
622  ffio_write_leb(dyn_bc, mix->subblock_duration);
623  break;
624  }
626  const AVIAMFDemixingInfo *demix = subblock;
627  ffio_write_leb(dyn_bc, demix->subblock_duration);
628  break;
629  }
631  const AVIAMFReconGain *recon = subblock;
632  ffio_write_leb(dyn_bc, recon->subblock_duration);
633  break;
634  }
635  }
636  }
637  }
638  }
639 
640  return 0;
641 }
642 
643 static int iamf_write_audio_element(const IAMFContext *iamf,
644  const IAMFAudioElement *audio_element,
645  AVIOContext *pb, void *log_ctx)
646 {
647  const AVIAMFAudioElement *element = audio_element->celement;
648  const IAMFCodecConfig *codec_config = iamf->codec_configs[audio_element->codec_config_id];
650  AVIOContext *dyn_bc;
651  uint8_t *dyn_buf = NULL;
652  PutBitContext pbc;
653  int param_definition_types = AV_IAMF_PARAMETER_DEFINITION_DEMIXING, dyn_size;
654 
655  int ret = avio_open_dyn_buf(&dyn_bc);
656  if (ret < 0)
657  return ret;
658 
659  ffio_write_leb(dyn_bc, audio_element->audio_element_id);
660 
661  init_put_bits(&pbc, header, sizeof(header));
662  put_bits(&pbc, 3, element->audio_element_type);
663  put_bits(&pbc, 5, 0);
664  flush_put_bits(&pbc);
665  avio_write(dyn_bc, header, put_bytes_count(&pbc, 1));
666 
667  ffio_write_leb(dyn_bc, audio_element->codec_config_id);
668  ffio_write_leb(dyn_bc, audio_element->nb_substreams);
669 
670  for (int i = 0; i < audio_element->nb_substreams; i++)
671  ffio_write_leb(dyn_bc, audio_element->substreams[i].audio_substream_id);
672 
673  if (element->nb_layers == 1)
674  param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_DEMIXING;
675  if (element->nb_layers > 1)
676  param_definition_types |= AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN;
677  if (codec_config->codec_tag == MKTAG('f','L','a','C') ||
678  codec_config->codec_tag == MKTAG('i','p','c','m'))
679  param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN;
680 
681  ffio_write_leb(dyn_bc, av_popcount(param_definition_types)); // num_parameters
682 
683  if (param_definition_types & 1) {
684  const AVIAMFParamDefinition *param = element->demixing_info;
685  const IAMFParamDefinition *param_def;
686  const AVIAMFDemixingInfo *demix;
687 
688  if (!param) {
689  av_log(log_ctx, AV_LOG_ERROR, "demixing_info needed but not set in Stream Group #%u\n",
690  audio_element->audio_element_id);
691  return AVERROR(EINVAL);
692  }
693 
694  demix = av_iamf_param_definition_get_subblock(param, 0);
696 
697  param_def = ff_iamf_get_param_definition(iamf, param->parameter_id);
698  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
699  if (ret < 0)
700  return ret;
701 
702  avio_w8(dyn_bc, demix->dmixp_mode << 5); // dmixp_mode
703  avio_w8(dyn_bc, element->default_w << 4); // default_w
704  }
705  if (param_definition_types & 2) {
706  const AVIAMFParamDefinition *param = element->recon_gain_info;
707  const IAMFParamDefinition *param_def;
708 
709  if (!param) {
710  av_log(log_ctx, AV_LOG_ERROR, "recon_gain_info needed but not set in Stream Group #%u\n",
711  audio_element->audio_element_id);
712  return AVERROR(EINVAL);
713  }
715 
716  param_def = ff_iamf_get_param_definition(iamf, param->parameter_id);
717  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
718  if (ret < 0)
719  return ret;
720  }
721 
723  ret = scalable_channel_layout_config(audio_element, dyn_bc);
724  if (ret < 0)
725  return ret;
726  } else {
727  ret = ambisonics_config(audio_element, dyn_bc);
728  if (ret < 0)
729  return ret;
730  }
731 
732  init_put_bits(&pbc, header, sizeof(header));
734  put_bits(&pbc, 3, 0);
735  flush_put_bits(&pbc);
736 
737  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
738  avio_write(pb, header, put_bytes_count(&pbc, 1));
739  ffio_write_leb(pb, dyn_size);
740  avio_write(pb, dyn_buf, dyn_size);
741  ffio_free_dyn_buf(&dyn_bc);
742 
743  return 0;
744 }
745 
747  const IAMFMixPresentation *mix_presentation,
748  AVIOContext *pb, void *log_ctx)
749 {
751  const AVIAMFMixPresentation *mix = mix_presentation->cmix;
752  const AVDictionaryEntry *tag = NULL;
753  PutBitContext pbc;
754  AVIOContext *dyn_bc;
755  uint8_t *dyn_buf = NULL;
756  int dyn_size;
757 
758  int ret = avio_open_dyn_buf(&dyn_bc);
759  if (ret < 0)
760  return ret;
761 
762  ffio_write_leb(dyn_bc, mix_presentation->mix_presentation_id); // mix_presentation_id
763  ffio_write_leb(dyn_bc, av_dict_count(mix->annotations)); // count_label
764 
765  while ((tag = av_dict_iterate(mix->annotations, tag)))
766  avio_put_str(dyn_bc, tag->key);
767  while ((tag = av_dict_iterate(mix->annotations, tag)))
768  avio_put_str(dyn_bc, tag->value);
769 
770  ffio_write_leb(dyn_bc, mix->nb_submixes);
771  for (int i = 0; i < mix->nb_submixes; i++) {
772  const AVIAMFSubmix *sub_mix = mix->submixes[i];
773  const IAMFParamDefinition *param_def;
774 
775  ffio_write_leb(dyn_bc, sub_mix->nb_elements);
776  for (int j = 0; j < sub_mix->nb_elements; j++) {
777  const IAMFAudioElement *audio_element = NULL;
778  const AVIAMFSubmixElement *submix_element = sub_mix->elements[j];
779 
780  for (int k = 0; k < iamf->nb_audio_elements; k++)
781  if (iamf->audio_elements[k]->audio_element_id == submix_element->audio_element_id) {
782  audio_element = iamf->audio_elements[k];
783  break;
784  }
785 
786  av_assert0(audio_element);
787  ffio_write_leb(dyn_bc, submix_element->audio_element_id);
788 
789  if (av_dict_count(submix_element->annotations) != av_dict_count(mix->annotations)) {
790  av_log(log_ctx, AV_LOG_ERROR, "Inconsistent amount of labels in submix %d from Mix Presentation id #%u\n",
791  j, audio_element->audio_element_id);
792  return AVERROR(EINVAL);
793  }
794  while ((tag = av_dict_iterate(submix_element->annotations, tag)))
795  avio_put_str(dyn_bc, tag->value);
796 
797  init_put_bits(&pbc, header, sizeof(header));
798  put_bits(&pbc, 2, submix_element->headphones_rendering_mode);
799  put_bits(&pbc, 6, 0); // reserved
800  flush_put_bits(&pbc);
801  avio_write(dyn_bc, header, put_bytes_count(&pbc, 1));
802  ffio_write_leb(dyn_bc, 0); // rendering_config_extension_size
803 
804  param_def = ff_iamf_get_param_definition(iamf, submix_element->element_mix_config->parameter_id);
805  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
806  if (ret < 0)
807  return ret;
808 
809  avio_wb16(dyn_bc, rescale_rational(submix_element->default_mix_gain, 1 << 8));
810  }
811 
812  param_def = ff_iamf_get_param_definition(iamf, sub_mix->output_mix_config->parameter_id);
813  ret = param_definition(iamf, param_def, dyn_bc, log_ctx);
814  if (ret < 0)
815  return ret;
816  avio_wb16(dyn_bc, rescale_rational(sub_mix->default_mix_gain, 1 << 8));
817 
818  ffio_write_leb(dyn_bc, sub_mix->nb_layouts); // nb_layouts
819  for (int i = 0; i < sub_mix->nb_layouts; i++) {
820  const AVIAMFSubmixLayout *submix_layout = sub_mix->layouts[i];
821  int layout, info_type;
822  int dialogue = submix_layout->dialogue_anchored_loudness.num &&
823  submix_layout->dialogue_anchored_loudness.den;
824  int album = submix_layout->album_anchored_loudness.num &&
825  submix_layout->album_anchored_loudness.den;
826 
830  break;
831  }
833  av_log(log_ctx, AV_LOG_ERROR, "Invalid Sound System value in a submix\n");
834  return AVERROR(EINVAL);
835  }
836  }
837  init_put_bits(&pbc, header, sizeof(header));
838  put_bits(&pbc, 2, submix_layout->layout_type); // layout_type
840  put_bits(&pbc, 4, ff_iamf_sound_system_map[layout].id); // sound_system
841  put_bits(&pbc, 2, 0); // reserved
842  } else
843  put_bits(&pbc, 6, 0); // reserved
844  flush_put_bits(&pbc);
845  avio_write(dyn_bc, header, put_bytes_count(&pbc, 1));
846 
847  info_type = (submix_layout->true_peak.num && submix_layout->true_peak.den);
848  info_type |= (dialogue || album) << 1;
849  avio_w8(dyn_bc, info_type);
850  avio_wb16(dyn_bc, rescale_rational(submix_layout->integrated_loudness, 1 << 8));
851  avio_wb16(dyn_bc, rescale_rational(submix_layout->digital_peak, 1 << 8));
852  if (info_type & 1)
853  avio_wb16(dyn_bc, rescale_rational(submix_layout->true_peak, 1 << 8));
854  if (info_type & 2) {
855  avio_w8(dyn_bc, dialogue + album); // num_anchored_loudness
856  if (dialogue) {
858  avio_wb16(dyn_bc, rescale_rational(submix_layout->dialogue_anchored_loudness, 1 << 8));
859  }
860  if (album) {
862  avio_wb16(dyn_bc, rescale_rational(submix_layout->album_anchored_loudness, 1 << 8));
863  }
864  }
865  }
866  }
867 
868  init_put_bits(&pbc, header, sizeof(header));
870  put_bits(&pbc, 3, 0);
871  flush_put_bits(&pbc);
872 
873  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
874  avio_write(pb, header, put_bytes_count(&pbc, 1));
875  ffio_write_leb(pb, dyn_size);
876  avio_write(pb, dyn_buf, dyn_size);
877  ffio_free_dyn_buf(&dyn_bc);
878 
879  return 0;
880 }
881 
882 int ff_iamf_write_descriptors(const IAMFContext *iamf, AVIOContext *pb, void *log_ctx)
883 {
884  int ret;
885 
886  // Sequence Header
888 
889  ffio_write_leb(pb, 6);
890  avio_wb32(pb, MKBETAG('i','a','m','f'));
891  avio_w8(pb, iamf->nb_audio_elements > 1); // primary_profile
892  avio_w8(pb, iamf->nb_audio_elements > 1); // additional_profile
893 
894  for (int i = 0; i < iamf->nb_codec_configs; i++) {
895  ret = iamf_write_codec_config(iamf, iamf->codec_configs[i], pb);
896  if (ret < 0)
897  return ret;
898  }
899 
900  for (int i = 0; i < iamf->nb_audio_elements; i++) {
901  ret = iamf_write_audio_element(iamf, iamf->audio_elements[i], pb, log_ctx);
902  if (ret < 0)
903  return ret;
904  }
905 
906  for (int i = 0; i < iamf->nb_mix_presentations; i++) {
907  ret = iamf_write_mixing_presentation(iamf, iamf->mix_presentations[i], pb, log_ctx);
908  if (ret < 0)
909  return ret;
910  }
911 
912  return 0;
913 }
914 
915 static int write_parameter_block(const IAMFContext *iamf, AVIOContext *pb,
916  const AVIAMFParamDefinition *param, void *log_ctx)
917 {
920  PutBitContext pbc;
921  AVIOContext *dyn_bc;
922  uint8_t *dyn_buf = NULL;
923  int dyn_size, ret;
924 
926  av_log(log_ctx, AV_LOG_DEBUG, "Ignoring side data with unknown type %u\n",
927  param->type);
928  return 0;
929  }
930 
931  if (!param_definition) {
932  av_log(log_ctx, AV_LOG_ERROR, "Non-existent Parameter Definition with ID %u referenced by a packet\n",
933  param->parameter_id);
934  return AVERROR(EINVAL);
935  }
936 
937  if (param->type != param_definition->param->type) {
938  av_log(log_ctx, AV_LOG_ERROR, "Inconsistent values for Parameter Definition "
939  "with ID %u in a packet\n",
940  param->parameter_id);
941  return AVERROR(EINVAL);
942  }
943 
944  ret = avio_open_dyn_buf(&dyn_bc);
945  if (ret < 0)
946  return ret;
947 
948  // Sequence Header
949  init_put_bits(&pbc, header, sizeof(header));
951  put_bits(&pbc, 3, 0);
952  flush_put_bits(&pbc);
953  avio_write(pb, header, put_bytes_count(&pbc, 1));
954 
955  ffio_write_leb(dyn_bc, param->parameter_id);
956  if (!param_definition->mode) {
957  ffio_write_leb(dyn_bc, param->duration);
959  if (param->constant_subblock_duration == 0)
960  ffio_write_leb(dyn_bc, param->nb_subblocks);
961  }
962 
963  for (int i = 0; i < param->nb_subblocks; i++) {
964  const void *subblock = av_iamf_param_definition_get_subblock(param, i);
965 
966  switch (param->type) {
968  const AVIAMFMixGain *mix = subblock;
969  if (!param_definition->mode && param->constant_subblock_duration == 0)
970  ffio_write_leb(dyn_bc, mix->subblock_duration);
971 
972  ffio_write_leb(dyn_bc, mix->animation_type);
973 
974  avio_wb16(dyn_bc, rescale_rational(mix->start_point_value, 1 << 8));
975  if (mix->animation_type >= AV_IAMF_ANIMATION_TYPE_LINEAR)
976  avio_wb16(dyn_bc, rescale_rational(mix->end_point_value, 1 << 8));
977  if (mix->animation_type == AV_IAMF_ANIMATION_TYPE_BEZIER) {
978  avio_wb16(dyn_bc, rescale_rational(mix->control_point_value, 1 << 8));
979  avio_w8(dyn_bc, av_clip_uint8(av_rescale(mix->control_point_relative_time.num, 1 << 8,
980  mix->control_point_relative_time.den)));
981  }
982  break;
983  }
985  const AVIAMFDemixingInfo *demix = subblock;
986  if (!param_definition->mode && param->constant_subblock_duration == 0)
987  ffio_write_leb(dyn_bc, demix->subblock_duration);
988 
989  avio_w8(dyn_bc, demix->dmixp_mode << 5);
990  break;
991  }
993  const AVIAMFReconGain *recon = subblock;
994  const AVIAMFAudioElement *audio_element = param_definition->audio_element->celement;
995 
996  if (!param_definition->mode && param->constant_subblock_duration == 0)
997  ffio_write_leb(dyn_bc, recon->subblock_duration);
998 
999  if (!audio_element) {
1000  av_log(log_ctx, AV_LOG_ERROR, "Invalid Parameter Definition with ID %u referenced by a packet\n", param->parameter_id);
1001  return AVERROR(EINVAL);
1002  }
1003 
1004  for (int j = 0; j < audio_element->nb_layers; j++) {
1005  const AVIAMFLayer *layer = audio_element->layers[j];
1006 
1007  if (layer->flags & AV_IAMF_LAYER_FLAG_RECON_GAIN) {
1008  unsigned int recon_gain_flags = 0;
1009  int k = 0;
1010 
1011  for (; k < 7; k++)
1012  recon_gain_flags |= (1 << k) * !!recon->recon_gain[j][k];
1013  for (; k < 12; k++)
1014  recon_gain_flags |= (2 << k) * !!recon->recon_gain[j][k];
1015  if (recon_gain_flags >> 8)
1016  recon_gain_flags |= (1 << k);
1017 
1018  ffio_write_leb(dyn_bc, recon_gain_flags);
1019  for (k = 0; k < 12; k++) {
1020  if (recon->recon_gain[j][k])
1021  avio_w8(dyn_bc, recon->recon_gain[j][k]);
1022  }
1023  }
1024  }
1025  break;
1026  }
1027  default:
1028  av_assert0(0);
1029  }
1030  }
1031 
1032  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
1033  ffio_write_leb(pb, dyn_size);
1034  avio_write(pb, dyn_buf, dyn_size);
1035  ffio_free_dyn_buf(&dyn_bc);
1036 
1037  return 0;
1038 }
1039 
1041  const AVPacket *pkt, void *log_ctx)
1042 {
1046  NULL);
1047  AVIAMFParamDefinition *demix =
1050  NULL);
1051  AVIAMFParamDefinition *recon =
1054  NULL);
1055 
1056  if (mix) {
1057  int ret = write_parameter_block(iamf, pb, mix, log_ctx);
1058  if (ret < 0)
1059  return ret;
1060  }
1061  if (demix) {
1062  int ret = write_parameter_block(iamf, pb, demix, log_ctx);
1063  if (ret < 0)
1064  return ret;
1065  }
1066  if (recon) {
1067  int ret = write_parameter_block(iamf, pb, recon, log_ctx);
1068  if (ret < 0)
1069  return ret;
1070  }
1071 
1072  return 0;
1073 }
1074 
1076  unsigned int audio_substream_id)
1077 {
1078  for (int i = 0; i < c->nb_audio_elements; i++) {
1079  IAMFAudioElement *audio_element = c->audio_elements[i];
1080  for (int j = 0; j < audio_element->nb_substreams; j++) {
1081  IAMFSubStream *substream = &audio_element->substreams[j];
1082  if (substream->audio_substream_id == audio_substream_id)
1083  return audio_element;
1084  }
1085  }
1086 
1087  return NULL;
1088 }
1089 
1091  unsigned audio_substream_id, const AVPacket *pkt)
1092 {
1094  PutBitContext pbc;
1095  AVIOContext *dyn_bc;
1096  const uint8_t *side_data;
1097  uint8_t *dyn_buf = NULL;
1098  unsigned int skip_samples = 0, discard_padding = 0;
1099  size_t side_data_size;
1100  int dyn_size, type = audio_substream_id <= 17 ?
1102  int ret;
1103 
1104  if (!pkt->size) {
1105  const IAMFAudioElement *audio_element;
1106  IAMFCodecConfig *codec_config;
1107  size_t new_extradata_size;
1108  const uint8_t *new_extradata = av_packet_get_side_data(pkt,
1110  &new_extradata_size);
1111 
1112  if (!new_extradata)
1113  return AVERROR_INVALIDDATA;
1114  audio_element = get_audio_element(iamf, audio_substream_id);
1115  if (!audio_element)
1116  return AVERROR(EINVAL);
1117  codec_config = ff_iamf_get_codec_config(iamf, audio_element->codec_config_id);
1118  if (!codec_config)
1119  return AVERROR(EINVAL);
1120 
1121  av_free(codec_config->extradata);
1122  codec_config->extradata = av_memdup(new_extradata, new_extradata_size);
1123  if (!codec_config->extradata) {
1124  codec_config->extradata_size = 0;
1125  return AVERROR(ENOMEM);
1126  }
1127  codec_config->extradata_size = new_extradata_size;
1128 
1129  return update_extradata(codec_config);
1130  }
1131 
1133  &side_data_size);
1134 
1135  if (side_data && side_data_size >= 10) {
1136  skip_samples = AV_RL32(side_data);
1137  discard_padding = AV_RL32(side_data + 4);
1138  }
1139 
1140  ret = avio_open_dyn_buf(&dyn_bc);
1141  if (ret < 0)
1142  return ret;
1143 
1144  init_put_bits(&pbc, header, sizeof(header));
1145  put_bits(&pbc, 5, type);
1146  put_bits(&pbc, 1, 0); // obu_redundant_copy
1147  put_bits(&pbc, 1, skip_samples || discard_padding);
1148  put_bits(&pbc, 1, 0); // obu_extension_flag
1149  flush_put_bits(&pbc);
1150  avio_write(pb, header, put_bytes_count(&pbc, 1));
1151 
1152  if (skip_samples || discard_padding) {
1153  ffio_write_leb(dyn_bc, discard_padding);
1154  ffio_write_leb(dyn_bc, skip_samples);
1155  }
1156 
1157  if (audio_substream_id > 17)
1158  ffio_write_leb(dyn_bc, audio_substream_id);
1159 
1160  dyn_size = avio_get_dyn_buf(dyn_bc, &dyn_buf);
1161  ffio_write_leb(pb, dyn_size + pkt->size);
1162  avio_write(pb, dyn_buf, dyn_size);
1163  ffio_free_dyn_buf(&dyn_bc);
1164  avio_write(pb, pkt->data, pkt->size);
1165 
1166  return 0;
1167 }
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:328
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:561
AVStreamGroup::params
union AVStreamGroup::@363 params
Group type-specific parameters.
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:1140
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:168
AV_CODEC_ID_FLAC
@ AV_CODEC_ID_FLAC
Definition: codec_id.h:452
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:915
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:329
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:539
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:180
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:1113
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:211
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:1132
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
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:1075
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:381
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:442
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:340
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:1040
AVStreamGroup::iamf_audio_element
struct AVIAMFAudioElement * iamf_audio_element
Definition: avformat.h:1154
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:746
AV_CODEC_ID_OPUS
@ AV_CODEC_ID_OPUS
Definition: codec_id.h:500
AVChannelLayout::u
union AVChannelLayout::@419 u
Details about which channels are present in this layout.
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:544
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:460
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:1112
AVStreamGroup::streams
AVStream ** streams
A list of streams in the group.
Definition: avformat.h:1188
AVStreamGroup::iamf_mix_presentation
struct AVIAMFMixPresentation * iamf_mix_presentation
Definition: avformat.h:1155
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:602
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:337
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:1090
ff_iamf_write_descriptors
int ff_iamf_write_descriptors(const IAMFContext *iamf, AVIOContext *pb, void *log_ctx)
Definition: iamf_writer.c:882
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:582
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:1121
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:1175
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:336
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:1148
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:341
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:643
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