mbox series

[FFmpeg-devel,000/279,v2] New channel layout API

Message ID 20211216132151.8216-1-jamrial@gmail.com
Headers show
Series New channel layout API | expand

Message

James Almer Dec. 16, 2021, 1:21 p.m. UTC
Resending the first two patches only, since this is meant to
show the implementation of one of the several suggestions made
in the previous set that need to be discussed and hopefully
resolved in a call.

The proposals so far to extend the API to support either custom
labels for channels are, or some form of extra user information.

- Fixed array of bytes to hold a label. Simple solution, but
  the labels will have a hard limit that can only be extended
  with a major bump. This is what i implemented in this version.
- "char *name" per channel that the user may allocate and the
  API will manage, duplicate and free. Simple solution, and the
  name can be arbitrarily long, but inefficient (av_strdup() per
  channel with a custom label on layout copy).
- "const char *name" per channel for compile time constants, or
  that the user may allocate and free. Very efficient, but for
  non compile time strings ensuring they outlive the layout can
  be tricky.
- Refcounted AVChannelCustom with a dictionary. This can't be
  done with AVBufferRef, so it would require some other form
  of reference counting. And a dictionary may add quite a bit of
  complexity to the API, as you can set anything on them.
- Opaque id/s or pointer/s that the API will not touch beyond
  passing them around (So unlike the above, the helpers would not
  benefit from this). This can be combined with any of the above,
  too, and i did as much in this version.
- Leave API as it was in v1.

Anton Khirnov (136):
  Add a new channel layout API
  lavu: support AVChannelLayout AVOptions
  lavc: deprecate channel count/layout changing side data
  avframe: switch to the new channel layout API
  lavf: add a temporary compat layer for the channel layout API change
  lavf: convert the generic layer to the new channel layout
  3dostr: convert to new channel layout API
  aa: convert to new channel layout API
  acm: convert to new channel layout API
  act: convert to new channel layout API
  adp: convert to new channel layout API
  ads: convert to new channel layout API
  afc: convert to new channel layout API
  aixdec: convert to new channel layout API
  aptxdec: convert to new channel layout API
  argo: convert to new channel layout API
  ast: convert to new channel layout API
  avr: convert to new channel layout API
  bit: convert to new channel layout API
  boa: convert to new channel layout API
  brstm: convert to new channel layout API
  codec2: convert to new channel layout API
  dcstr: convert to new channel layout API
  dhav: convert to new channel layout API
  dtshddec: convert to new channel layout API
  dsfdec: convert to new channel layout API
  epafdec: convert to new channel layout API
  framehash: convert to new channel layout API
  fsb: convert to new channel layout API
  g726: convert to new channel layout API
  gdv: convert to new channel layout API
  genh: convert to new channel layout API
  hcom: convert to new channel layout API
  ifv: convert to new channel layout API
  ircam: convert to new channel layout API
  jack: port to new channel layout API
  libcdio: port to new channel layout API
  lvf: convert to new channel layout API
  mpeg: convert to new channel layout API
  mpegtsenc: convert to new channel layout API
  msf: convert to new channel layout API
  mtaf: convert to new channel layout API
  musx: convert to new channel layout API
  nistspheredec: convert to new channel layout API
  nspdec: convert to new channel layout API
  oss: port to new channel layout API
  pvf: convert to new channel layout API
  rawenc: convert to new channel layout API
  redspark: convert to new channel layout API
  rsd: convert to new channel layout API
  sbg: convert to new channel layout API
  sdr2: convert to new channel layout API
  sds: convert to new channel layout API
  sdx: convert to new channel layout API
  svag: convert to new channel layout API
  vag: convert to new channel layout API
  vividas: convert to new channel layout API
  vivo: convert to new channel layout API
  vpk: convert to new channel layout API
  lavf: drop the channel layout compat layer for old-style (de)muxers
  8svx: convert to new channel layout API
  aac: convert to new channel layout API
  adpcm: convert to new channel layout API
  alac: convert to new channel layout API
  amr: convert to new channel layout API
  aptx: convert to new channel layout API
  atrac9: convert to new channel layout API
  apedec: convert to new channel layout API
  audiotoolbox: convert to new channel layout API
  binkaudio: convert to new channel layout API
  bmvaudio: convert to new channel layout API
  cng: convert to new channel layout API
  cook: convert to new channel layout API
  dca: convert to new channel layout API
  dolby_e: convert to new channel layout API
  dsd: convert to new channel layout API
  dsicinav: convert to new channel layout API
  dst: convert to new channel layout API
  dvaudio: convert to new channel layout API
  evrc: convert to new channel layout API
  ffwavesynth: convert to new channel layout API
  flac: convert to new channel layout API
  g722: convert to new channel layout API
  g723_1: convert to new channel layout API
  g726: convert to new channel layout API
  g729: convert to new channel layout API
  gsmdec: convert to new channel layout API
  hcom: convert to new channel layout API
  ilbc: convert to new channel layout API
  imc: convert to new channel layout API
  interplayacm: convert to new channel layout API
  libcelt: convert to new channel layout API
  libcodec2: convert to new channel layout API
  libilbc: convert to new channel layout API
  libgsm: convert to new channel layout API
  libmp3lame: convert to new channel layout API
  libopencore-amr: convert to new channel layout API
  libopus: convert to new channel layout API
  libshine: convert to new channel layout API
  libspeexdec: convert to new channel layout API
  libtwolame: convert to new channel layout API
  libvo-amrwbenc: convert to new channel layout API
  libvorbis: convert to new channel layout API
  mace: convert to new channel layout API
  metasound: convert to new channel layout API
  mlp: convert to new channel layout API
  mpc7: convert to new channel layout API
  mpc8: convert to new channel layout API
  mpegaudio: convert to new channel layout API
  nellymoser: convert to new channel layout API
  on2avc: convert to new channel layout API
  opus: convert to new channel layout API
  pcm: convert to new channel layout API
  qcelpdec: convert to new channel layout API
  qdmc: convert to new channel layout API
  qdm2: convert to new channel layout API
  ra144: convert to new channel layout API
  ra288: convert to new channel layout API
  ralf: convert to new channel layout API
  roqaudioenc: convert to new channel layout API
  s302m: convert to new channel layout API
  sbc: convert to new channel layout API
  shorten: convert to new channel layout API
  sipr: convert to new channel layout API
  smacker: convert to new channel layout API
  sonic: convert to new channel layout API
  tak: convert to new channel layout API
  truespeech: convert to new channel layout API
  tta: convert to new channel layout API
  vmdaudio: convert to new channel layout API
  vorbis: convert to new channel layout API
  wavpack: convert to new channel layout API
  wma: convert to new channel layout API
  ws-snd1: convert to new channel layout API
  lavc: drop temporary compat wrappers for channel layout API change
  opus: export mapping family 2 (Ambisonic) as Ambisonic layout

James Almer (30):
  fate: add a channel_layout API test
  aax: convert to new channel layout API
  ace: convert to new channel layout API
  alsa: convert to new channel layout API
  alp: convert to new channel layout API
  amv: convert to new channel layout API
  apm: convert to new channel layout API
  derf: convert to new channel layout API
  dshow: convert to new channel layout API
  fwse: convert to new channel layout API
  hca: convert to new channel layout API
  hls_sample_encryption: convert to new channel layout API
  imx: convert to new channel layout API
  kvag: convert to new channel layout API
  avdevice/lavfi: convert to new channel layout API
  mca: convert to new channel layout API
  moflex: convert to new channel layout API
  pp_bnk: convert to new channel layout API
  scd: convert to new channel layout API
  sga: convert to new channel layout API
  svs: convert to new channel layout API
  fastaudio: convert to new channel layout API
  hca: convert to new channel layout API
  mf: convert to new channel layout API
  siren: convert to new channel layout API
  speex: convert to new channel layout API
  swresample: convert to new channel layout API
  avfilter: convert to new channel layout API
  ffmpeg: convert to new channel layout-API
  ffprobe: convert to new channel layout-API

Vittorio Giovara (113):
  avcodecpar: switch to the new channel layout API
  4xm: convert to new channel layout API
  adxdec: convert to new channel layout API
  aea: convert to new channel layout API
  aiff: convert to new channel layout API
  amr: convert to new channel layout API
  apc: convert to new channel layout API
  ape: convert to new channel layout API
  au: convert to new channel layout API
  bethsoftvid: convert to new channel layout API
  bfi: convert to new channel layout API
  bink: convert to new channel layout API
  bmv: convert to new channel layout API
  caf: convert to new channel layout API
  cdxl: convert to new channel layout API
  dash: convert to new channel layout API
  dsicin: convert to new channel layout API
  dss: convert to new channel layout API
  dv: convert to new channel layout API
  eac: convert to new channel layout API
  electronicarts: convert to new channel layout API
  flac: convert to new channel layout API
  flic: convert to new channel layout API
  flv: convert to new channel layout API
  g722: convert to new channel layout API
  g723_1: convert to new channel layout API
  g729: convert to new channel layout API
  gsm: convert to new channel layout API
  gxf: convert to new channel layout API
  idcin: convert to new channel layout API
  idroq: convert to new channel layout API
  iff: convert to new channel layout API
  ilbc: convert to new channel layout API
  ipmovie: convert to new channel layout API
  iss: convert to new channel layout API
  jvdec: convert to new channel layout API
  lxfdec: convert to new channel layout API
  matroska: convert to new channel layout API
  mm: convert to new channel layout API
  mmf: convert to new channel layout API
  mov: convert to new channel layout API
  movenc-test: convert to new channel layout API
  mp3: convert to new channel layout API
  mpc: convert to new channel layout API
  mpc8: convert to new channel layout API
  mpegenc: convert to new channel layout API
  mvdec: convert to new channel layout API
  mvi: convert to new channel layout API
  mxf: convert to new channel layout API
  mxg: convert to new channel layout API
  nsvdec: convert to new channel layout API
  nutdec: convert to new channel layout API
  nuv: convert to new channel layout API
  ogg: convert to new channel layout API
  oma: convert to new channel layout API
  paf: convert to new channel layout API
  pcm: convert to new channel layout API
  pmp: convert to new channel layout API
  psxstr: convert to new channel layout API
  qcp: convert to new channel layout API
  r3d: convert to new channel layout API
  riff: convert to new channel layout API
  rl2: convert to new channel layout API
  rm: convert to new channel layout API
  rpl: convert to new channel layout API
  rso: convert to new channel layout API
  rtp: convert to new channel layout API
  sdp: convert to new channel layout API
  segafilm: convert to new channel layout API
  sierravmd: convert to new channel layout API
  siff: convert to new channel layout API
  smacker: convert to new channel layout API
  smjpegenc: convert to new channel layout API
  smoothstreaming: convert to new channel layout API
  smush: convert to new channel layout API
  sol: convert to new channel layout API
  sox: convert to new channel layout API
  swf: convert to new channel layout API
  tak: convert to new channel layout API
  thp: convert to new channel layout API
  tiertexseq: convert to new channel layout API
  tmv: convert to new channel layout API
  tta: convert to new channel layout API
  voc: convert to new channel layout API
  vqf: convert to new channel layout API
  wav: convert to new channel layout API
  wc3movie: convert to new channel layout API
  westwood: convert to new channel layout API
  wtv: convert to new channel layout API
  wv: convert to new channel layout API
  xa: convert to new channel layout API
  xmv: convert to new channel layout API
  xwma: convert to new channel layout API
  yop: convert to new channel layout API
  wsd: convert to new channel layout API
  wve: convert to new channel layout API
  xvag: convert to new channel layout API
  lavc: switch to the new channel layout API
  ac3: convert to new channel layout API
  adx: convert to new channel layout API
  als: convert to new channel layout API
  atrac1: convert to new channel layout API
  atrac3: convert to new channel layout API
  atrac3plus: convert to new channel layout API
  dpcm: convert to new channel layout API
  dss_sp: convert to new channel layout API
  libfdk-aac: convert to new channel layout API
  pafaudio: convert to new channel layout API
  twinvq: convert to new channel layout API
  vima: convert to new channel layout API
  lavf: Add non diegetic stream disposition flag
  channel_layout: add support for Ambisonic
  mov: Implement spatial audio support

 fftools/cmdutils.c                            |  42 +-
 fftools/cmdutils.h                            |   8 -
 fftools/ffmpeg.c                              |  47 +-
 fftools/ffmpeg.h                              |   7 +-
 fftools/ffmpeg_filter.c                       |  43 +-
 fftools/ffmpeg_opt.c                          |  62 +-
 fftools/ffprobe.c                             |  19 +-
 libavcodec/8svx.c                             |  19 +-
 libavcodec/aac.h                              |  11 +-
 libavcodec/aac_ac3_parser.c                   |  13 +-
 libavcodec/aaccoder.c                         |  10 +-
 libavcodec/aaccoder_twoloop.h                 |   4 +-
 libavcodec/aacdec_template.c                  |  52 +-
 libavcodec/aacenc.c                           |  13 +-
 libavcodec/aacenc.h                           |  64 +-
 libavcodec/aacenctab.h                        |  16 +-
 libavcodec/aacpsy.c                           |   8 +-
 libavcodec/ac3dec.c                           |  57 +-
 libavcodec/ac3dec.h                           |   2 +
 libavcodec/ac3dec_fixed.c                     |   1 +
 libavcodec/ac3dec_float.c                     |   2 +
 libavcodec/ac3enc.c                           |  78 +-
 libavcodec/ac3enc.h                           |   4 +-
 libavcodec/ac3enc_fixed.c                     |   5 +
 libavcodec/ac3enc_float.c                     |   5 +
 libavcodec/adpcm.c                            | 151 ++--
 libavcodec/adpcmenc.c                         | 122 +--
 libavcodec/adx.c                              |  16 +-
 libavcodec/adxdec.c                           |   6 +-
 libavcodec/adxenc.c                           |  11 +-
 libavcodec/alac.c                             |  16 +-
 libavcodec/alac_data.c                        |  20 +-
 libavcodec/alac_data.h                        |   6 +
 libavcodec/alacenc.c                          |  37 +-
 libavcodec/alsdec.c                           |  90 +-
 libavcodec/amr_parser.c                       |  10 +-
 libavcodec/amrnbdec.c                         |  12 +-
 libavcodec/amrwbdec.c                         |  12 +-
 libavcodec/apedec.c                           |   9 +-
 libavcodec/aptx.c                             |   2 +-
 libavcodec/atrac1.c                           |  10 +-
 libavcodec/atrac3.c                           |  41 +-
 libavcodec/atrac3plusdec.c                    |  25 +-
 libavcodec/atrac9dec.c                        |   4 +-
 libavcodec/atrac9tab.h                        |  14 +-
 libavcodec/audiotoolboxdec.c                  |  27 +-
 libavcodec/audiotoolboxenc.c                  |  95 +--
 libavcodec/avcodec.c                          |  51 +-
 libavcodec/avcodec.h                          |  23 +-
 libavcodec/binkaudio.c                        |  19 +-
 libavcodec/bmvaudio.c                         |   4 +-
 libavcodec/cngdec.c                           |   3 +-
 libavcodec/cngenc.c                           |   6 +-
 libavcodec/codec.h                            |  11 +
 libavcodec/codec_par.c                        |  65 +-
 libavcodec/codec_par.h                        |  12 +
 libavcodec/cook.c                             |  25 +-
 libavcodec/cook_parser.c                      |   4 +-
 libavcodec/dca_core.c                         |   6 +-
 libavcodec/dca_lbr.c                          |  13 +-
 libavcodec/dca_xll.c                          |   2 +-
 libavcodec/dcadec.c                           |  63 +-
 libavcodec/dcadec.h                           |   7 +
 libavcodec/dcaenc.c                           |  39 +-
 libavcodec/decode.c                           |  73 +-
 libavcodec/dolby_e.c                          |  52 +-
 libavcodec/dolby_e.h                          |   2 +
 libavcodec/dolby_e_parser.c                   |  11 +-
 libavcodec/dpcm.c                             |  16 +-
 libavcodec/dsddec.c                           |  14 +-
 libavcodec/dsicinaudio.c                      |   4 +-
 libavcodec/dss_sp.c                           |   4 +-
 libavcodec/dstdec.c                           |   8 +-
 libavcodec/dvaudiodec.c                       |   8 +-
 libavcodec/eac3enc.c                          |   5 +
 libavcodec/encode.c                           |  43 +-
 libavcodec/evrcdec.c                          |   4 +-
 libavcodec/fastaudio.c                        |   6 +-
 libavcodec/ffwavesynth.c                      |   6 +-
 libavcodec/flac.c                             |  39 +-
 libavcodec/flac.h                             |   2 +-
 libavcodec/flac_parser.c                      |   7 +-
 libavcodec/flacdec.c                          |   9 +-
 libavcodec/flacenc.c                          |  26 +-
 libavcodec/g722dec.c                          |   4 +-
 libavcodec/g722enc.c                          |   5 +
 libavcodec/g723_1_parser.c                    |   2 +-
 libavcodec/g723_1dec.c                        |  19 +-
 libavcodec/g723_1enc.c                        |   8 +-
 libavcodec/g726.c                             |   8 +-
 libavcodec/g729_parser.c                      |   2 +-
 libavcodec/g729dec.c                          |  20 +-
 libavcodec/gsmdec.c                           |   4 +-
 libavcodec/hcadec.c                           |  16 +-
 libavcodec/hcom.c                             |   2 +-
 libavcodec/ilbcdec.c                          |   4 +-
 libavcodec/imc.c                              |  22 +-
 libavcodec/interplayacm.c                     |  10 +-
 libavcodec/libcelt_dec.c                      |  10 +-
 libavcodec/libcodec2.c                        |   4 +-
 libavcodec/libfdk-aacdec.c                    |  34 +-
 libavcodec/libfdk-aacenc.c                    |  37 +-
 libavcodec/libgsmdec.c                        |   4 +-
 libavcodec/libgsmenc.c                        |   4 +-
 libavcodec/libilbc.c                          |   6 +-
 libavcodec/libmp3lame.c                       |   9 +-
 libavcodec/libopencore-amr.c                  |   8 +-
 libavcodec/libopusdec.c                       |  39 +-
 libavcodec/libopusenc.c                       |  65 +-
 libavcodec/libshine.c                         |   6 +-
 libavcodec/libspeexdec.c                      |  19 +-
 libavcodec/libspeexenc.c                      |  17 +-
 libavcodec/libtwolame.c                       |   2 +-
 libavcodec/libvo-amrwbenc.c                   |   2 +-
 libavcodec/libvorbisdec.c                     |   4 +-
 libavcodec/libvorbisenc.c                     |  42 +-
 libavcodec/mace.c                             |  15 +-
 libavcodec/metasound.c                        |  31 +-
 libavcodec/mfenc.c                            |   8 +-
 libavcodec/mlp_parser.c                       |  12 +-
 libavcodec/mlpdec.c                           | 116 ++-
 libavcodec/mlpenc.c                           |  95 +--
 libavcodec/mp3_header_decompress_bsf.c        |   2 +-
 libavcodec/mpc7.c                             |   7 +-
 libavcodec/mpc8.c                             |   6 +-
 libavcodec/mpegaudio_parser.c                 |   4 +-
 libavcodec/mpegaudiodec_template.c            |  22 +-
 libavcodec/mpegaudioenc_template.c            |   2 +-
 libavcodec/nellymoserdec.c                    |   4 +-
 libavcodec/nellymoserenc.c                    |   6 +-
 libavcodec/on2avc.c                           |  20 +-
 libavcodec/options_table.h                    |   3 +
 libavcodec/opus.c                             |  73 +-
 libavcodec/opusdec.c                          |   4 +-
 libavcodec/opusenc.c                          |  11 +-
 libavcodec/opusenc_psy.c                      |  20 +-
 libavcodec/packet.h                           |   5 +
 libavcodec/pafaudio.c                         |   5 +-
 libavcodec/pcm-bluray.c                       |  36 +-
 libavcodec/pcm-dvd.c                          |  28 +-
 libavcodec/pcm-dvdenc.c                       |  20 +-
 libavcodec/pcm.c                              |  39 +-
 libavcodec/pcm_rechunk_bsf.c                  |   5 +-
 libavcodec/psymodel.c                         |   8 +-
 libavcodec/psymodel.h                         |   2 +-
 libavcodec/pthread_frame.c                    |  10 +-
 libavcodec/qcelpdec.c                         |   4 +-
 libavcodec/qdm2.c                             |   6 +-
 libavcodec/qdmc.c                             |   9 +-
 libavcodec/ra144dec.c                         |   4 +-
 libavcodec/ra144enc.c                         |   8 +-
 libavcodec/ra288.c                            |   4 +-
 libavcodec/ralf.c                             |  18 +-
 libavcodec/roqaudioenc.c                      |  20 +-
 libavcodec/s302m.c                            |  31 +-
 libavcodec/s302menc.c                         |  18 +-
 libavcodec/sbc_parser.c                       |   8 +-
 libavcodec/sbcdec.c                           |   4 +-
 libavcodec/sbcenc.c                           |  10 +-
 libavcodec/shorten.c                          |   6 +-
 libavcodec/sipr.c                             |   4 +-
 libavcodec/siren.c                            |   4 +-
 libavcodec/smacker.c                          |  12 +-
 libavcodec/sonic.c                            |  14 +-
 libavcodec/speexdec.c                         |   8 +-
 libavcodec/takdec.c                           |  41 +-
 libavcodec/truespeech.c                       |   7 +-
 libavcodec/tta.c                              |  18 +-
 libavcodec/ttaenc.c                           |  14 +-
 libavcodec/twinvq.c                           |  20 +-
 libavcodec/twinvqdec.c                        |  18 +-
 libavcodec/utils.c                            |  24 +-
 libavcodec/vima.c                             |   5 +-
 libavcodec/vmdaudio.c                         |  26 +-
 libavcodec/vorbisdec.c                        |  24 +-
 libavcodec/vorbisenc.c                        |   7 +-
 libavcodec/wavpack.c                          |  51 +-
 libavcodec/wavpackenc.c                       |  29 +-
 libavcodec/wma.c                              |  11 +-
 libavcodec/wmadec.c                           |  29 +-
 libavcodec/wmaenc.c                           |  27 +-
 libavcodec/wmalosslessdec.c                   |  13 +-
 libavcodec/wmaprodec.c                        |  28 +-
 libavcodec/wmavoice.c                         |   4 +-
 libavcodec/ws-snd1.c                          |   4 +-
 libavdevice/alsa.c                            |  19 +-
 libavdevice/alsa_dec.c                        |   3 +-
 libavdevice/alsa_enc.c                        |   2 +-
 libavdevice/dshow.c                           |   3 +-
 libavdevice/jack.c                            |   3 +-
 libavdevice/lavfi.c                           |   7 +-
 libavdevice/libcdio.c                         |   5 +-
 libavdevice/oss_dec.c                         |   3 +-
 libavdevice/oss_enc.c                         |   2 +-
 libavfilter/aeval.c                           |  19 +-
 libavfilter/af_afir.c                         |   9 +-
 libavfilter/af_aformat.c                      |  32 +-
 libavfilter/af_amerge.c                       |  38 +-
 libavfilter/af_amix.c                         |   2 +-
 libavfilter/af_apulsator.c                    |   2 +-
 libavfilter/af_aresample.c                    |  41 +-
 libavfilter/af_ashowinfo.c                    |  13 +-
 libavfilter/af_asr.c                          |   2 +-
 libavfilter/af_biquads.c                      |  42 +-
 libavfilter/af_bs2b.c                         |   2 +-
 libavfilter/af_channelmap.c                   |  86 +-
 libavfilter/af_channelsplit.c                 |  42 +-
 libavfilter/af_compand.c                      |   6 +
 libavfilter/af_compensationdelay.c            |   7 +
 libavfilter/af_crossfeed.c                    |   2 +-
 libavfilter/af_earwax.c                       |   2 +-
 libavfilter/af_extrastereo.c                  |   2 +-
 libavfilter/af_firequalizer.c                 |   5 +-
 libavfilter/af_haas.c                         |   2 +-
 libavfilter/af_hdcd.c                         |   4 +-
 libavfilter/af_headphone.c                    |  22 +-
 libavfilter/af_join.c                         | 268 ++++--
 libavfilter/af_ladspa.c                       |  16 +-
 libavfilter/af_lv2.c                          |  17 +-
 libavfilter/af_pan.c                          |  62 +-
 libavfilter/af_replaygain.c                   |   2 +-
 libavfilter/af_sofalizer.c                    |  86 +-
 libavfilter/af_speechnorm.c                   |  12 +-
 libavfilter/af_stereotools.c                  |   2 +-
 libavfilter/af_stereowiden.c                  |   2 +-
 libavfilter/af_surround.c                     |  72 +-
 libavfilter/asrc_afirsrc.c                    |   2 +-
 libavfilter/asrc_anoisesrc.c                  |   2 +-
 libavfilter/asrc_anullsrc.c                   |  13 +-
 libavfilter/asrc_flite.c                      |   6 +-
 libavfilter/asrc_hilbert.c                    |   2 +-
 libavfilter/asrc_sinc.c                       |   2 +-
 libavfilter/asrc_sine.c                       |   2 +-
 libavfilter/audio.c                           |  11 +-
 libavfilter/avf_aphasemeter.c                 |   2 +-
 libavfilter/avf_avectorscope.c                |   2 +-
 libavfilter/avf_showcqt.c                     |   3 +-
 libavfilter/avf_showspatial.c                 |   2 +-
 libavfilter/avf_showspectrum.c                |   3 +-
 libavfilter/avf_showvolume.c                  |   9 +-
 libavfilter/avfilter.c                        |  15 +-
 libavfilter/avfilter.h                        |  10 +-
 libavfilter/avfiltergraph.c                   |  84 +-
 libavfilter/buffersink.c                      |  29 +-
 libavfilter/buffersink.h                      |   7 +-
 libavfilter/buffersrc.c                       |  92 +-
 libavfilter/buffersrc.h                       |   9 +
 libavfilter/f_ebur128.c                       |  10 +-
 libavfilter/f_streamselect.c                  |   4 +
 libavfilter/formats.c                         | 131 ++-
 libavfilter/formats.h                         |  16 +-
 libavfilter/graphdump.c                       |   4 +-
 libavfilter/internal.h                        |   2 +-
 libavfilter/src_movie.c                       |  19 +-
 libavfilter/tests/filtfmts.c                  |   3 +-
 libavfilter/tests/formats.c                   |   4 +-
 libavfilter/vaf_spectrumsynth.c               |   2 +-
 libavformat/3dostr.c                          |  13 +-
 libavformat/4xm.c                             |   7 +-
 libavformat/aadec.c                           |   6 +-
 libavformat/aaxdec.c                          |   7 +-
 libavformat/acedec.c                          |   5 +-
 libavformat/acm.c                             |   7 +-
 libavformat/act.c                             |   3 +-
 libavformat/adp.c                             |   3 +-
 libavformat/ads.c                             |  11 +-
 libavformat/adxdec.c                          |  22 +-
 libavformat/aea.c                             |  11 +-
 libavformat/afc.c                             |   5 +-
 libavformat/aiffdec.c                         |  13 +-
 libavformat/aiffenc.c                         |   8 +-
 libavformat/aixdec.c                          |   3 +-
 libavformat/alp.c                             |  16 +-
 libavformat/amr.c                             |  20 +-
 libavformat/amvenc.c                          |   4 +-
 libavformat/apc.c                             |  12 +-
 libavformat/ape.c                             |   3 +-
 libavformat/apm.c                             |  22 +-
 libavformat/aptxdec.c                         |   3 +-
 libavformat/argo_asf.c                        |  18 +-
 libavformat/argo_cvg.c                        |   5 +-
 libavformat/astdec.c                          |  18 +-
 libavformat/astenc.c                          |   4 +-
 libavformat/au.c                              |   9 +-
 libavformat/avformat.h                        |   7 +
 libavformat/avr.c                             |   7 +-
 libavformat/bethsoftvid.c                     |   3 +-
 libavformat/bfi.c                             |   3 +-
 libavformat/bink.c                            |   8 +-
 libavformat/binka.c                           |   3 +-
 libavformat/bit.c                             |   7 +-
 libavformat/bmv.c                             |   3 +-
 libavformat/boadec.c                          |   8 +-
 libavformat/brstm.c                           |  44 +-
 libavformat/cafdec.c                          |   7 +-
 libavformat/cafenc.c                          |  12 +-
 libavformat/cdxl.c                            |   4 +-
 libavformat/codec2.c                          |   3 +-
 libavformat/dashenc.c                         |   2 +-
 libavformat/dauddec.c                         |   3 +-
 libavformat/daudenc.c                         |   2 +-
 libavformat/dcstr.c                           |  15 +-
 libavformat/demux.c                           |  18 +-
 libavformat/derf.c                            |  12 +-
 libavformat/dhav.c                            |   3 +-
 libavformat/dsfdec.c                          |  60 +-
 libavformat/dsicin.c                          |   7 +-
 libavformat/dss.c                             |   3 +-
 libavformat/dtshddec.c                        |   3 +-
 libavformat/dump.c                            |  11 +-
 libavformat/dv.c                              |   3 +-
 libavformat/dvenc.c                           |   2 +-
 libavformat/eacdata.c                         |  22 +-
 libavformat/electronicarts.c                  |   7 +-
 libavformat/epafdec.c                         |   6 +-
 libavformat/flacdec.c                         |   3 +-
 libavformat/flacenc.c                         |   7 +-
 libavformat/flic.c                            |   4 +-
 libavformat/flvdec.c                          |  15 +-
 libavformat/flvenc.c                          |  10 +-
 libavformat/framehash.c                       |   8 +-
 libavformat/fsb.c                             |  36 +-
 libavformat/fwse.c                            |  10 +-
 libavformat/g722.c                            |   2 +-
 libavformat/g723_1.c                          |   3 +-
 libavformat/g726.c                            |   3 +-
 libavformat/g729dec.c                         |   2 +-
 libavformat/gdv.c                             |   6 +-
 libavformat/genh.c                            |  38 +-
 libavformat/gsmdec.c                          |   3 +-
 libavformat/gxf.c                             |   9 +-
 libavformat/gxfenc.c                          |   2 +-
 libavformat/hca.c                             |   3 +-
 libavformat/hcom.c                            |   3 +-
 libavformat/hls_sample_encryption.c           |  12 +-
 libavformat/idcin.c                           |   4 +-
 libavformat/idroqdec.c                        |  12 +-
 libavformat/iff.c                             |  63 +-
 libavformat/ifv.c                             |   3 +-
 libavformat/ilbc.c                            |   2 +-
 libavformat/imx.c                             |   3 +-
 libavformat/ipmovie.c                         |   8 +-
 libavformat/ircamdec.c                        |   8 +-
 libavformat/ircamenc.c                        |   2 +-
 libavformat/isom.c                            |   5 +-
 libavformat/iss.c                             |  17 +-
 libavformat/jvdec.c                           |   3 +-
 libavformat/kvag.c                            |  19 +-
 libavformat/lvfdec.c                          |   3 +-
 libavformat/lxfdec.c                          |   3 +-
 libavformat/matroskadec.c                     |   8 +-
 libavformat/matroskaenc.c                     |  10 +-
 libavformat/mca.c                             |  25 +-
 libavformat/mm.c                              |   3 +-
 libavformat/mmf.c                             |   5 +-
 libavformat/moflex.c                          |   3 +-
 libavformat/mov.c                             | 172 +++-
 libavformat/mov_chan.c                        |  21 +-
 libavformat/mov_chan.h                        |   3 +-
 libavformat/movenc.c                          |  25 +-
 libavformat/mp3enc.c                          |   2 +-
 libavformat/mpc.c                             |   3 +-
 libavformat/mpc8.c                            |   5 +-
 libavformat/mpeg.c                            |   3 +-
 libavformat/mpegenc.c                         |  10 +-
 libavformat/mpegtsenc.c                       |  30 +-
 libavformat/msf.c                             |  16 +-
 libavformat/mtaf.c                            |   5 +-
 libavformat/musx.c                            |  49 +-
 libavformat/mux.c                             |  19 +-
 libavformat/mvdec.c                           |  10 +-
 libavformat/mvi.c                             |   3 +-
 libavformat/mxfdec.c                          |  23 +-
 libavformat/mxfenc.c                          |  20 +-
 libavformat/mxg.c                             |   3 +-
 libavformat/nistspheredec.c                   |   8 +-
 libavformat/nspdec.c                          |   3 +-
 libavformat/nsvdec.c                          |   2 +-
 libavformat/nutdec.c                          |   3 +-
 libavformat/nutenc.c                          |   4 +-
 libavformat/nuv.c                             |  11 +-
 libavformat/oggparsecelt.c                    |   3 +-
 libavformat/oggparseogm.c                     |   6 +-
 libavformat/oggparseopus.c                    |   3 +-
 libavformat/oggparsespeex.c                   |   8 +-
 libavformat/oggparsevorbis.c                  |   6 +-
 libavformat/oma.h                             |   2 +
 libavformat/omadec.c                          |  35 +-
 libavformat/omaenc.c                          |   4 +-
 libavformat/paf.c                             |   3 +-
 libavformat/pcm.c                             |   2 +-
 libavformat/pcmdec.c                          |   7 +-
 libavformat/pmpdec.c                          |   3 +-
 libavformat/pp_bnk.c                          |  12 +-
 libavformat/psxstr.c                          |  10 +-
 libavformat/pvfdec.c                          |   5 +-
 libavformat/qcp.c                             |   3 +-
 libavformat/r3d.c                             |   3 +-
 libavformat/rawenc.c                          |   2 +-
 libavformat/redspark.c                        |  15 +-
 libavformat/riffdec.c                         |  20 +-
 libavformat/riffenc.c                         |  18 +-
 libavformat/rl2.c                             |   7 +-
 libavformat/rmdec.c                           |   6 +-
 libavformat/rmenc.c                           |   2 +-
 libavformat/rpl.c                             |   7 +-
 libavformat/rsd.c                             |  27 +-
 libavformat/rsodec.c                          |   3 +-
 libavformat/rsoenc.c                          |   2 +-
 libavformat/rtp.c                             |  10 +-
 libavformat/rtpdec.c                          |   4 +-
 libavformat/rtpdec_amr.c                      |   3 +-
 libavformat/rtpenc.c                          |  14 +-
 libavformat/rtsp.c                            |   6 +-
 libavformat/rtsp.h                            |   1 -
 libavformat/sbgdec.c                          |   3 +-
 libavformat/scd.c                             |   9 +-
 libavformat/sdp.c                             |  36 +-
 libavformat/sdr2.c                            |   3 +-
 libavformat/sdsdec.c                          |   3 +-
 libavformat/sdxdec.c                          |   3 +-
 libavformat/segafilm.c                        |   9 +-
 libavformat/segafilmenc.c                     |   2 +-
 libavformat/sga.c                             |   3 +-
 libavformat/sierravmd.c                       |  15 +-
 libavformat/siff.c                            |   3 +-
 libavformat/smacker.c                         |  11 +-
 libavformat/smjpegdec.c                       |   3 +-
 libavformat/smjpegenc.c                       |   2 +-
 libavformat/smoothstreamingenc.c              |   4 +-
 libavformat/smush.c                           |   4 +-
 libavformat/sol.c                             |   4 +-
 libavformat/soxdec.c                          |  14 +-
 libavformat/soxenc.c                          |   4 +-
 libavformat/svag.c                            |  12 +-
 libavformat/svs.c                             |   3 +-
 libavformat/swfdec.c                          |   8 +-
 libavformat/swfenc.c                          |   2 +-
 libavformat/takdec.c                          |   7 +-
 libavformat/tests/movenc.c                    |   2 +-
 libavformat/thp.c                             |   3 +-
 libavformat/tiertexseq.c                      |   7 +-
 libavformat/tmv.c                             |  10 +-
 libavformat/tta.c                             |   3 +-
 libavformat/ttaenc.c                          |   2 +-
 libavformat/utils.c                           |  13 +-
 libavformat/vag.c                             |  11 +-
 libavformat/vividas.c                         |   8 +-
 libavformat/vivo.c                            |   3 +-
 libavformat/voc_packet.c                      |   9 +-
 libavformat/vocenc.c                          |   9 +-
 libavformat/vpk.c                             |  15 +-
 libavformat/vqf.c                             |  13 +-
 libavformat/wavdec.c                          |  32 +-
 libavformat/wavenc.c                          |  14 +-
 libavformat/wc3movie.c                        |   8 +-
 libavformat/westwood_aud.c                    |  10 +-
 libavformat/westwood_audenc.c                 |   2 +-
 libavformat/westwood_vqa.c                    |   2 +-
 libavformat/wsddec.c                          |  12 +-
 libavformat/wtvdec.c                          |   6 +-
 libavformat/wvdec.c                           |   3 +-
 libavformat/wvedec.c                          |   6 +-
 libavformat/xa.c                              |   9 +-
 libavformat/xmv.c                             |   3 +-
 libavformat/xvag.c                            |  10 +-
 libavformat/xwma.c                            |  10 +-
 libavformat/yop.c                             |   3 +-
 libavutil/Makefile                            |   1 +
 libavutil/channel_layout.c                    | 783 ++++++++++++++++--
 libavutil/channel_layout.h                    | 589 ++++++++++++-
 libavutil/frame.c                             | 112 ++-
 libavutil/frame.h                             |  12 +-
 libavutil/opt.c                               | 126 ++-
 libavutil/opt.h                               |  12 +
 libavutil/tests/channel_layout.c              | 253 ++++++
 libavutil/tests/opt.c                         |   8 +-
 libavutil/version.h                           |   1 +
 libswresample/options.c                       |  33 +-
 libswresample/rematrix.c                      | 227 +++--
 libswresample/rematrix_template.c             |   7 +-
 libswresample/swresample.c                    | 158 +++-
 libswresample/swresample.h                    |  63 ++
 libswresample/swresample_frame.c              |  65 +-
 libswresample/swresample_internal.h           |  10 +-
 tests/fate/aac.mak                            |   2 +-
 tests/fate/ac3.mak                            |  16 +-
 tests/fate/cover-art.mak                      |   2 +-
 tests/fate/lavf-container.mak                 |   2 +-
 tests/fate/libavutil.mak                      |   4 +
 tests/ref/fate/8bps                           |   1 -
 tests/ref/fate/aa-demux                       |   1 -
 tests/ref/fate/aac-autobsf-adtstoasc          |   1 -
 tests/ref/fate/adpcm-4xm                      |   1 -
 tests/ref/fate/adpcm-afc                      |   1 -
 tests/ref/fate/adpcm-dtk                      |   1 -
 tests/ref/fate/adpcm-ea-1                     |   1 -
 tests/ref/fate/adpcm-ea-2                     |   1 -
 tests/ref/fate/adpcm-ea-maxis-xa              |   1 -
 tests/ref/fate/adpcm-ea-r1                    |   1 -
 tests/ref/fate/adpcm-ima-amv                  |   1 -
 tests/ref/fate/adpcm-ima-ea-eacs              |   1 -
 tests/ref/fate/adpcm-ima-ea-sead              |   1 -
 tests/ref/fate/adpcm-ima-smjpeg               |   1 -
 tests/ref/fate/adpcm-ima-ws                   |   1 -
 tests/ref/fate/adpcm-ima-ws-vqa3              |   1 -
 tests/ref/fate/adpcm-ms-mono                  |   1 -
 tests/ref/fate/adpcm-thp                      |   1 -
 tests/ref/fate/adpcm-vima                     |   1 -
 tests/ref/fate/adpcm-xa                       |   1 -
 tests/ref/fate/adts-id3v1-demux               |   1 -
 tests/ref/fate/adts-id3v2-demux               |   1 -
 tests/ref/fate/adts-id3v2-two-tags-demux      |   1 -
 tests/ref/fate/adtstoasc_ticket3715           |   1 -
 tests/ref/fate/armovie-escape124              |   1 -
 tests/ref/fate/bethsoft-vid                   |   1 -
 tests/ref/fate/bfi                            |   1 -
 tests/ref/fate/bmv-audio                      |   1 -
 tests/ref/fate/caf-alac-remux                 |   1 -
 tests/ref/fate/caf-amr_nb-remux               |   1 -
 tests/ref/fate/caf-mace6-remux                |   1 -
 tests/ref/fate/caf-pcm_s24-remux              |   1 -
 tests/ref/fate/caf-pcm_s24le-remux            |   1 -
 tests/ref/fate/caf-qdm2-remux                 |   1 -
 tests/ref/fate/cdxl-demux                     |   1 -
 tests/ref/fate/channel_layout                 | 111 +++
 tests/ref/fate/copy-psp                       |   1 -
 tests/ref/fate/copy-shortest1                 |   1 -
 tests/ref/fate/copy-shortest2                 |   1 -
 tests/ref/fate/copy-trac236                   |   1 -
 tests/ref/fate/copy-trac3074                  |   1 -
 tests/ref/fate/copy-trac4914                  |   1 -
 tests/ref/fate/copy-trac4914-avi              |   1 -
 tests/ref/fate/corepng                        |   1 -
 tests/ref/fate/cover-art-aiff-id3v2-remux     |   1 -
 tests/ref/fate/cover-art-flac-remux           |   6 +-
 tests/ref/fate/cover-art-mp3-id3v2-remux      |   1 -
 tests/ref/fate/creatureshock-avs              |   1 -
 tests/ref/fate/cyberia-c93                    |   1 -
 tests/ref/fate/d-cinema-demux                 |   1 -
 tests/ref/fate/dca-xll_51_16_192_768_0        |   1 -
 tests/ref/fate/dca-xll_51_16_192_768_0-dmix_2 |   1 -
 tests/ref/fate/dca-xll_51_16_192_768_0-dmix_6 |   1 -
 tests/ref/fate/dca-xll_51_16_192_768_1        |   1 -
 tests/ref/fate/dca-xll_51_16_192_768_1-dmix_2 |   1 -
 tests/ref/fate/dca-xll_51_16_192_768_1-dmix_6 |   1 -
 tests/ref/fate/dca-xll_51_24_48_768           |   1 -
 tests/ref/fate/dca-xll_51_24_48_768-dmix_2    |   1 -
 tests/ref/fate/dca-xll_51_24_48_768-dmix_6    |   1 -
 tests/ref/fate/dca-xll_51_24_48_none          |   1 -
 tests/ref/fate/dca-xll_51_24_48_none-dmix_2   |   1 -
 tests/ref/fate/dca-xll_51_24_48_none-dmix_6   |   1 -
 tests/ref/fate/dca-xll_71_24_48_768_0         |   1 -
 tests/ref/fate/dca-xll_71_24_48_768_0-dmix_2  |   1 -
 tests/ref/fate/dca-xll_71_24_48_768_0-dmix_6  |   1 -
 tests/ref/fate/dca-xll_71_24_48_768_1         |   1 -
 tests/ref/fate/dca-xll_71_24_48_768_1-dmix_2  |   1 -
 tests/ref/fate/dca-xll_71_24_48_768_1-dmix_6  |   1 -
 tests/ref/fate/dca-xll_71_24_96_768           |   1 -
 tests/ref/fate/dca-xll_71_24_96_768-dmix_2    |   1 -
 tests/ref/fate/dca-xll_71_24_96_768-dmix_6    |   1 -
 tests/ref/fate/dca-xll_x96_51_24_96_1509      |   1 -
 .../ref/fate/dca-xll_x96_51_24_96_1509-dmix_2 |   1 -
 .../ref/fate/dca-xll_x96_51_24_96_1509-dmix_6 |   1 -
 tests/ref/fate/dca-xll_xch_61_24_48_768       |   1 -
 .../ref/fate/dca-xll_xch_61_24_48_768-dmix_2  |   1 -
 .../ref/fate/dca-xll_xch_61_24_48_768-dmix_6  |   1 -
 tests/ref/fate/dcinema-encode                 |   1 -
 tests/ref/fate/delphine-cin-audio             |   1 -
 tests/ref/fate/dpcm-idroq                     |   1 -
 tests/ref/fate/dpcm-interplay                 |   1 -
 tests/ref/fate/dss-lp                         |   1 -
 tests/ref/fate/dss-sp                         |   1 -
 tests/ref/fate/ffmpeg-attached_pics           |   1 -
 tests/ref/fate/ffmpeg-filter_complex_audio    |   1 -
 tests/ref/fate/filter-acrossfade              |   1 -
 tests/ref/fate/filter-adelay                  |   1 -
 tests/ref/fate/filter-aecho                   |   1 -
 tests/ref/fate/filter-aemphasis               |   2 -
 tests/ref/fate/filter-aemphasis-50fm          |   1 -
 tests/ref/fate/filter-aemphasis-75kf          |   1 -
 tests/ref/fate/filter-afade-esin              |   1 -
 tests/ref/fate/filter-afade-exp               |   1 -
 tests/ref/fate/filter-afade-hsin              |   1 -
 tests/ref/fate/filter-afade-iqsin             |   1 -
 tests/ref/fate/filter-afade-log               |   1 -
 tests/ref/fate/filter-afade-qsin              |   1 -
 tests/ref/fate/filter-agate                   |   1 -
 tests/ref/fate/filter-alimiter                |   1 -
 tests/ref/fate/filter-amerge                  |   1 -
 tests/ref/fate/filter-anequalizer             |   1 -
 tests/ref/fate/filter-apad                    |   1 -
 tests/ref/fate/filter-asetnsamples-nopad      |   1 -
 tests/ref/fate/filter-asetnsamples-pad        |   1 -
 tests/ref/fate/filter-asetrate                |   1 -
 tests/ref/fate/filter-atrim-duration          |   1 -
 tests/ref/fate/filter-atrim-mixed             |   1 -
 tests/ref/fate/filter-atrim-samples           |   1 -
 tests/ref/fate/filter-atrim-time              |   1 -
 tests/ref/fate/filter-chorus                  |   1 -
 tests/ref/fate/filter-compand                 |   1 -
 tests/ref/fate/filter-concat                  |   1 -
 tests/ref/fate/filter-concat-vfr              |   1 -
 tests/ref/fate/filter-dcshift                 |   1 -
 tests/ref/fate/filter-earwax                  |   1 -
 tests/ref/fate/filter-extrastereo             |   1 -
 tests/ref/fate/filter-formats                 |  20 +-
 tests/ref/fate/filter-hls                     |   1 -
 tests/ref/fate/filter-hls-append              |   1 -
 tests/ref/fate/filter-meta-4560-rotate0       |   1 -
 tests/ref/fate/filter-overlay-dvdsub-2397     |   1 -
 tests/ref/fate/filter-pan-downmix1            |   1 -
 tests/ref/fate/filter-pan-downmix2            |   1 -
 tests/ref/fate/filter-pan-mono1               |   1 -
 tests/ref/fate/filter-pan-mono2               |   1 -
 tests/ref/fate/filter-pan-stereo1             |   1 -
 tests/ref/fate/filter-pan-stereo2             |   1 -
 tests/ref/fate/filter-pan-stereo3             |   1 -
 tests/ref/fate/filter-pan-stereo4             |   1 -
 tests/ref/fate/filter-pan-upmix1              |   1 -
 tests/ref/fate/filter-pan-upmix2              |   1 -
 tests/ref/fate/filter-silenceremove           |   1 -
 tests/ref/fate/filter-stereotools             |   1 -
 tests/ref/fate/g722-encode                    |   1 -
 tests/ref/fate/g722dec-1                      |   1 -
 tests/ref/fate/g723_1-dec-1                   |   1 -
 tests/ref/fate/g723_1-dec-2                   |   1 -
 tests/ref/fate/g723_1-dec-3                   |   1 -
 tests/ref/fate/g723_1-dec-4                   |   1 -
 tests/ref/fate/g723_1-dec-5                   |   1 -
 tests/ref/fate/g723_1-dec-6                   |   1 -
 tests/ref/fate/g723_1-dec-7                   |   1 -
 tests/ref/fate/g723_1-dec-8                   |   1 -
 tests/ref/fate/g726-encode-2bit               |   1 -
 tests/ref/fate/g726-encode-3bit               |   1 -
 tests/ref/fate/g726-encode-4bit               |   1 -
 tests/ref/fate/g726-encode-5bit               |   1 -
 tests/ref/fate/gapless-mp3                    |   6 +-
 tests/ref/fate/gsm-ms                         |   1 -
 tests/ref/fate/gsm-toast                      |   1 -
 tests/ref/fate/h264-skip-nointra              |   1 -
 tests/ref/fate/h264-skip-nokey                |   1 -
 tests/ref/fate/h264-xavc-4389                 |   1 -
 tests/ref/fate/hls-fmp4                       |   1 -
 tests/ref/fate/hls-init-time                  |   1 -
 tests/ref/fate/hls-list-size                  |   1 -
 tests/ref/fate/hls-segment-single             |   1 -
 tests/ref/fate/hls-segment-size               |   1 -
 tests/ref/fate/id-cin-video                   |   1 -
 tests/ref/fate/id3v2-chapters                 |   1 -
 tests/ref/fate/id3v2-priv-remux               |   1 -
 tests/ref/fate/jv-demux                       |   1 -
 tests/ref/fate/lmlm4-demux                    |   1 -
 tests/ref/fate/matroska-flac-channel-mapping  |   2 -
 tests/ref/fate/matroska-flac-extradata-update |   3 -
 tests/ref/fate/matroska-lzo-decompression     |   1 -
 .../fate/matroska-mastering-display-metadata  |   2 -
 tests/ref/fate/matroska-mpegts-remux          |   2 -
 .../matroska-wavpack-missing-codecprivate     |   1 -
 tests/ref/fate/matroska-xiph-lacing           |   1 -
 tests/ref/fate/maxis-xa                       |   1 -
 tests/ref/fate/mkv                            |   1 -
 tests/ref/fate/mkv-1242                       |   1 -
 tests/ref/fate/mov-440hz-10ms                 |   1 -
 tests/ref/fate/mov-bbi-elst-starts-b          |   1 -
 tests/ref/fate/mov-cover-image                |   1 -
 tests/ref/fate/mov-mp3-demux                  |   1 -
 .../ref/fate/mov-mp4-disposition-mpegts-remux |   2 -
 tests/ref/fate/mpegps-remuxed-pcm-demux       |   1 -
 tests/ref/fate/mtv                            |   1 -
 tests/ref/fate/mxf-demux                      |   1 -
 tests/ref/fate/nsv-demux                      |   1 -
 tests/ref/fate/oma-atrac3-remux               |   1 -
 tests/ref/fate/oma-atrac3p-remux              |   1 -
 tests/ref/fate/on2avc                         |   1 -
 tests/ref/fate/opt                            |  16 +-
 tests/ref/fate/paf-audio                      |   1 -
 tests/ref/fate/paf-demux                      |   1 -
 tests/ref/fate/pcm-planar                     |   1 -
 tests/ref/fate/pcm_dvd                        |   1 -
 tests/ref/fate/pmp-demux                      |   1 -
 tests/ref/fate/prores-gray                    |   1 -
 tests/ref/fate/prores-transparency            |   1 -
 tests/ref/fate/prores-transparency_skip       |   1 -
 tests/ref/fate/psx-str-demux                  |   1 -
 tests/ref/fate/pva-demux                      |   1 -
 tests/ref/fate/ra3-144                        |   1 -
 tests/ref/fate/redcode-demux                  |   1 -
 tests/ref/fate/s337m-demux                    |   1 -
 tests/ref/fate/segment-adts-to-mkv-header-000 |   1 -
 tests/ref/fate/segment-adts-to-mkv-header-001 |   1 -
 tests/ref/fate/segment-adts-to-mkv-header-002 |   1 -
 tests/ref/fate/segment-adts-to-mkv-header-all |   1 -
 tests/ref/fate/shortest                       |   1 -
 tests/ref/fate/sierra-vmd-audio               |   1 -
 tests/ref/fate/siff-demux                     |   1 -
 tests/ref/fate/smacker-audio                  |   1 -
 tests/ref/fate/smjpeg-demux                   |   1 -
 tests/ref/fate/sp5x                           |   1 -
 tests/ref/fate/tiertex-seq                    |   1 -
 tests/ref/fate/tmv                            |   1 -
 tests/ref/fate/tscc-15bit                     |   1 -
 tests/ref/fate/vqf-demux                      |   2 +-
 tests/ref/fate/wav-ac3                        |   1 -
 tests/ref/fate/wc3movie-xan                   |   1 -
 tests/ref/fate/webm-dash-chapters             |   1 -
 tests/ref/fate/westwood-aud                   |   1 -
 tests/ref/fate/wmv3-drm-nodec                 |   1 -
 tests/ref/fate/wtv-demux                      |   1 -
 tests/ref/fate/xmv-demux                      |   1 -
 710 files changed, 6627 insertions(+), 3444 deletions(-)
 create mode 100644 libavutil/tests/channel_layout.c
 create mode 100644 tests/ref/fate/channel_layout

Comments

Marton Balint Dec. 17, 2021, 12:04 a.m. UTC | #1
On Thu, 16 Dec 2021, James Almer wrote:

> Resending the first two patches only, since this is meant to
> show the implementation of one of the several suggestions made
> in the previous set that need to be discussed and hopefully
> resolved in a call.

Can you push the full branch somewhere?

>
> The proposals so far to extend the API to support either custom
> labels for channels are, or some form of extra user information.
>
> - Fixed array of bytes to hold a label. Simple solution, but
>  the labels will have a hard limit that can only be extended
>  with a major bump. This is what i implemented in this version.
> - "char *name" per channel that the user may allocate and the
>  API will manage, duplicate and free. Simple solution, and the
>  name can be arbitrarily long, but inefficient (av_strdup() per
>  channel with a custom label on layout copy).
> - "const char *name" per channel for compile time constants, or
>  that the user may allocate and free. Very efficient, but for
>  non compile time strings ensuring they outlive the layout can
>  be tricky.
> - Refcounted AVChannelCustom with a dictionary. This can't be
>  done with AVBufferRef, so it would require some other form
>  of reference counting. And a dictionary may add quite a bit of
>  complexity to the API, as you can set anything on them.

Until we have proper refcounting API we can make the AVBufferRef in 
AVChannelLayout a void *, and only allow channel_layout functions to 
dereference it as an AVBufferRef. This would mean adding some extra 
helper functions to channel layout, but overall it is not unsolvable.

The real question is that if you want to use refcounting and add helpers 
to query / replace per-channel metadata, or you find the idea too heavy 
weight and would like to stick to flat structs.

> - Opaque id/s or pointer/s that the API will not touch beyond
>  passing them around (So unlike the above, the helpers would not
>  benefit from this). This can be combined with any of the above,
>  too, and i did as much in this version.
> - Leave API as it was in v1.

Maybe it is not said enough times, but thanks to everybody who worked on 
this. It certainly was huge work, and I know that it is a thankless effort 
to get such a big change merged. Any change based on my suggestions is 
appreciated, even if some of my ideas get rejected in the end.

Thanks,
Marton
James Almer Dec. 17, 2021, 2:37 a.m. UTC | #2
On 12/16/2021 9:04 PM, Marton Balint wrote:
> 
> 
> On Thu, 16 Dec 2021, James Almer wrote:
> 
>> Resending the first two patches only, since this is meant to
>> show the implementation of one of the several suggestions made
>> in the previous set that need to be discussed and hopefully
>> resolved in a call.
> 
> Can you push the full branch somewhere?

Just force pushed the latest version to the same repo as last time in 
https://github.com/jamrial/FFmpeg/commits/channel_layout

> 
>>
>> The proposals so far to extend the API to support either custom
>> labels for channels are, or some form of extra user information.
>>
>> - Fixed array of bytes to hold a label. Simple solution, but
>>  the labels will have a hard limit that can only be extended
>>  with a major bump. This is what i implemented in this version.
>> - "char *name" per channel that the user may allocate and the
>>  API will manage, duplicate and free. Simple solution, and the
>>  name can be arbitrarily long, but inefficient (av_strdup() per
>>  channel with a custom label on layout copy).
>> - "const char *name" per channel for compile time constants, or
>>  that the user may allocate and free. Very efficient, but for
>>  non compile time strings ensuring they outlive the layout can
>>  be tricky.
>> - Refcounted AVChannelCustom with a dictionary. This can't be
>>  done with AVBufferRef, so it would require some other form
>>  of reference counting. And a dictionary may add quite a bit of
>>  complexity to the API, as you can set anything on them.
> 
> Until we have proper refcounting API we can make the AVBufferRef in 
> AVChannelLayout a void *, and only allow channel_layout functions to 
> dereference it as an AVBufferRef. This would mean adding some extra 
> helper functions to channel layout, but overall it is not unsolvable.
> 
> The real question is that if you want to use refcounting and add helpers 
> to query / replace per-channel metadata, or you find the idea too heavy 
> weight and would like to stick to flat structs.
> 
>> - Opaque id/s or pointer/s that the API will not touch beyond
>>  passing them around (So unlike the above, the helpers would not
>>  benefit from this). This can be combined with any of the above,
>>  too, and i did as much in this version.
>> - Leave API as it was in v1.
> 
> Maybe it is not said enough times, but thanks to everybody who worked on 
> this. It certainly was huge work, and I know that it is a thankless 
> effort to get such a big change merged. Any change based on my 
> suggestions is appreciated, even if some of my ideas get rejected in the 
> end.
> 
> Thanks,
> Marton
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Michael Niedermayer Dec. 17, 2021, 11:24 a.m. UTC | #3
On Fri, Dec 17, 2021 at 01:04:19AM +0100, Marton Balint wrote:
> 
> 
> On Thu, 16 Dec 2021, James Almer wrote:
> 
> > Resending the first two patches only, since this is meant to
> > show the implementation of one of the several suggestions made
> > in the previous set that need to be discussed and hopefully
> > resolved in a call.
> 
> Can you push the full branch somewhere?
> 
> > 
> > The proposals so far to extend the API to support either custom
> > labels for channels are, or some form of extra user information.
> > 
> > - Fixed array of bytes to hold a label. Simple solution, but
> >  the labels will have a hard limit that can only be extended
> >  with a major bump. This is what i implemented in this version.
> > - "char *name" per channel that the user may allocate and the
> >  API will manage, duplicate and free. Simple solution, and the
> >  name can be arbitrarily long, but inefficient (av_strdup() per
> >  channel with a custom label on layout copy).
> > - "const char *name" per channel for compile time constants, or
> >  that the user may allocate and free. Very efficient, but for
> >  non compile time strings ensuring they outlive the layout can
> >  be tricky.
> > - Refcounted AVChannelCustom with a dictionary. This can't be
> >  done with AVBufferRef, so it would require some other form
> >  of reference counting. And a dictionary may add quite a bit of
> >  complexity to the API, as you can set anything on them.
> 
> Until we have proper refcounting API we can make the AVBufferRef in
> AVChannelLayout a void *, and only allow channel_layout functions to
> dereference it as an AVBufferRef. This would mean adding some extra helper
> functions to channel layout, but overall it is not unsolvable.
> 
> The real question is that if you want to use refcounting and add helpers to
> query / replace per-channel metadata, or you find the idea too heavy weight
> and would like to stick to flat structs.

what is the advantage of refcounting for channel metadata ?
is it about the used memory, about the reduced need to copy ?

what kind of metadata and what size do you expect ?
bytes, kilobytes, megabytes, gigabytes per channel ?

what is the overhead for dynamic allocation and ref counting?
that is at which point does it even make sense ?

thx

[...]
Marton Balint Dec. 17, 2021, 6:04 p.m. UTC | #4
On Fri, 17 Dec 2021, Michael Niedermayer wrote:

> On Fri, Dec 17, 2021 at 01:04:19AM +0100, Marton Balint wrote:
>>
>>
>> On Thu, 16 Dec 2021, James Almer wrote:
>>
>>> Resending the first two patches only, since this is meant to
>>> show the implementation of one of the several suggestions made
>>> in the previous set that need to be discussed and hopefully
>>> resolved in a call.
>>
>> Can you push the full branch somewhere?
>>
>>>
>>> The proposals so far to extend the API to support either custom
>>> labels for channels are, or some form of extra user information.
>>>
>>> - Fixed array of bytes to hold a label. Simple solution, but
>>>  the labels will have a hard limit that can only be extended
>>>  with a major bump. This is what i implemented in this version.
>>> - "char *name" per channel that the user may allocate and the
>>>  API will manage, duplicate and free. Simple solution, and the
>>>  name can be arbitrarily long, but inefficient (av_strdup() per
>>>  channel with a custom label on layout copy).
>>> - "const char *name" per channel for compile time constants, or
>>>  that the user may allocate and free. Very efficient, but for
>>>  non compile time strings ensuring they outlive the layout can
>>>  be tricky.
>>> - Refcounted AVChannelCustom with a dictionary. This can't be
>>>  done with AVBufferRef, so it would require some other form
>>>  of reference counting. And a dictionary may add quite a bit of
>>>  complexity to the API, as you can set anything on them.
>>
>> Until we have proper refcounting API we can make the AVBufferRef in
>> AVChannelLayout a void *, and only allow channel_layout functions to
>> dereference it as an AVBufferRef. This would mean adding some extra helper
>> functions to channel layout, but overall it is not unsolvable.
>>
>> The real question is that if you want to use refcounting and add helpers to
>> query / replace per-channel metadata, or you find the idea too heavy weight
>> and would like to stick to flat structs.
>
> what is the advantage of refcounting for channel metadata ?
> is it about the used memory, about the reduced need to copy ?

Basicly it is the ability to store per-channel metadata in avdictionary, 
because otherwise it would have to be copyed, and avdictionary is very 
ineffective at copying because of many mallocs.

>
> what kind of metadata and what size do you expect ?
> bytes, kilobytes, megabytes, gigabytes per channel ?

Usually, nothing, because most format don't have support for per-channel 
metadata. In some cases it is going to be a couple of textual metadata 
key-value pairs, such as language, label, group, speaker, positon, so 4-5 
dynamically allocated string pairs, plus the AVDictionary itself, 
multiplied by the number of channels in a layout.

>
> what is the overhead for dynamic allocation and ref counting?
> that is at which point does it even make sense ?

I don't have exact measurements. It is generally felt that copying 
AVDictionary per-channel is a huge overhead for something as lightweight 
as an audio frame which is a 2-4 kB per channel at most and only a couple 
of allocs usually not dependant on the number of channels. That's why 
refcounting was proposed.

Also some people simply don't want to store extendable channel metadata in 
channel layout, and want to keep it simple.

Regards,
Marton
Marton Balint Dec. 17, 2021, 7:20 p.m. UTC | #5
On Thu, 16 Dec 2021, James Almer wrote:

>
>
> On 12/16/2021 9:04 PM, Marton Balint wrote:
>>
>>
>>  On Thu, 16 Dec 2021, James Almer wrote:
>>
>>>  Resending the first two patches only, since this is meant to
>>>  show the implementation of one of the several suggestions made
>>>  in the previous set that need to be discussed and hopefully
>>>  resolved in a call.
>>
>>  Can you push the full branch somewhere?
>
> Just force pushed the latest version to the same repo as last time in 
> https://github.com/jamrial/FFmpeg/commits/channel_layout

Can you check the libfdk-aac patch? The decoder has some garbage text 
before the drc_boost context variable, the encoder does not compile with 
gcc because of the deprecation warning pragmas at the very end of the 
file.

Thanks,
Marton
James Almer Dec. 17, 2021, 7:32 p.m. UTC | #6
On 12/17/2021 4:20 PM, Marton Balint wrote:
> 
> 
> On Thu, 16 Dec 2021, James Almer wrote:
> 
>>
>>
>> On 12/16/2021 9:04 PM, Marton Balint wrote:
>>>
>>>
>>>  On Thu, 16 Dec 2021, James Almer wrote:
>>>
>>>>  Resending the first two patches only, since this is meant to
>>>>  show the implementation of one of the several suggestions made
>>>>  in the previous set that need to be discussed and hopefully
>>>>  resolved in a call.
>>>
>>>  Can you push the full branch somewhere?
>>
>> Just force pushed the latest version to the same repo as last time in 
>> https://github.com/jamrial/FFmpeg/commits/channel_layout
> 
> Can you check the libfdk-aac patch? The decoder has some garbage text 
> before the drc_boost context variable, the encoder does not compile with 
> gcc because of the deprecation warning pragmas at the very end of the file.
> 
> Thanks,
> Marton

Should be fixed, sorry about that.
Michael Niedermayer Dec. 18, 2021, 1:36 p.m. UTC | #7
On Fri, Dec 17, 2021 at 07:04:08PM +0100, Marton Balint wrote:
> 
> 
> On Fri, 17 Dec 2021, Michael Niedermayer wrote:
> 
> > On Fri, Dec 17, 2021 at 01:04:19AM +0100, Marton Balint wrote:
> > > 
> > > 
> > > On Thu, 16 Dec 2021, James Almer wrote:
> > > 
> > > > Resending the first two patches only, since this is meant to
> > > > show the implementation of one of the several suggestions made
> > > > in the previous set that need to be discussed and hopefully
> > > > resolved in a call.
> > > 
> > > Can you push the full branch somewhere?
> > > 
> > > > 
> > > > The proposals so far to extend the API to support either custom
> > > > labels for channels are, or some form of extra user information.
> > > > 
> > > > - Fixed array of bytes to hold a label. Simple solution, but
> > > >  the labels will have a hard limit that can only be extended
> > > >  with a major bump. This is what i implemented in this version.
> > > > - "char *name" per channel that the user may allocate and the
> > > >  API will manage, duplicate and free. Simple solution, and the
> > > >  name can be arbitrarily long, but inefficient (av_strdup() per
> > > >  channel with a custom label on layout copy).
> > > > - "const char *name" per channel for compile time constants, or
> > > >  that the user may allocate and free. Very efficient, but for
> > > >  non compile time strings ensuring they outlive the layout can
> > > >  be tricky.
> > > > - Refcounted AVChannelCustom with a dictionary. This can't be
> > > >  done with AVBufferRef, so it would require some other form
> > > >  of reference counting. And a dictionary may add quite a bit of
> > > >  complexity to the API, as you can set anything on them.
> > > 
> > > Until we have proper refcounting API we can make the AVBufferRef in
> > > AVChannelLayout a void *, and only allow channel_layout functions to
> > > dereference it as an AVBufferRef. This would mean adding some extra helper
> > > functions to channel layout, but overall it is not unsolvable.
> > > 
> > > The real question is that if you want to use refcounting and add helpers to
> > > query / replace per-channel metadata, or you find the idea too heavy weight
> > > and would like to stick to flat structs.
> > 
> > what is the advantage of refcounting for channel metadata ?
> > is it about the used memory, about the reduced need to copy ?
> 
> Basicly it is the ability to store per-channel metadata in avdictionary,
> because otherwise it would have to be copyed, and avdictionary is very
> ineffective at copying because of many mallocs.
> 
> > 
> > what kind of metadata and what size do you expect ?
> > bytes, kilobytes, megabytes, gigabytes per channel ?
> 
> Usually, nothing, because most format don't have support for per-channel
> metadata. In some cases it is going to be a couple of textual metadata
> key-value pairs, such as language, label, group, speaker, positon, so 4-5
> dynamically allocated string pairs, plus the AVDictionary itself, multiplied
> by the number of channels in a layout.
> 
> > 
> > what is the overhead for dynamic allocation and ref counting?
> > that is at which point does it even make sense ?
> 
> I don't have exact measurements. It is generally felt that copying
> AVDictionary per-channel is a huge overhead for something as lightweight as
> an audio frame which is a 2-4 kB per channel at most and only a couple of
> allocs usually not dependant on the number of channels. That's why
> refcounting was proposed.

I was thinking more at a AVStream / AVCodecParameters level.
How will a demuxer transport such metadata over a AVPacket into a decoder
outputting metadata-filled AVFrames?

thx

[...]
Michael Niedermayer Dec. 18, 2021, 2:15 p.m. UTC | #8
On Sat, Dec 18, 2021 at 02:36:12PM +0100, Michael Niedermayer wrote:
> On Fri, Dec 17, 2021 at 07:04:08PM +0100, Marton Balint wrote:
> > 
> > 
> > On Fri, 17 Dec 2021, Michael Niedermayer wrote:
> > 
> > > On Fri, Dec 17, 2021 at 01:04:19AM +0100, Marton Balint wrote:
> > > > 
> > > > 
> > > > On Thu, 16 Dec 2021, James Almer wrote:
> > > > 
> > > > > Resending the first two patches only, since this is meant to
> > > > > show the implementation of one of the several suggestions made
> > > > > in the previous set that need to be discussed and hopefully
> > > > > resolved in a call.
> > > > 
> > > > Can you push the full branch somewhere?
> > > > 
> > > > > 
> > > > > The proposals so far to extend the API to support either custom
> > > > > labels for channels are, or some form of extra user information.
> > > > > 
> > > > > - Fixed array of bytes to hold a label. Simple solution, but
> > > > >  the labels will have a hard limit that can only be extended
> > > > >  with a major bump. This is what i implemented in this version.
> > > > > - "char *name" per channel that the user may allocate and the
> > > > >  API will manage, duplicate and free. Simple solution, and the
> > > > >  name can be arbitrarily long, but inefficient (av_strdup() per
> > > > >  channel with a custom label on layout copy).
> > > > > - "const char *name" per channel for compile time constants, or
> > > > >  that the user may allocate and free. Very efficient, but for
> > > > >  non compile time strings ensuring they outlive the layout can
> > > > >  be tricky.
> > > > > - Refcounted AVChannelCustom with a dictionary. This can't be
> > > > >  done with AVBufferRef, so it would require some other form
> > > > >  of reference counting. And a dictionary may add quite a bit of
> > > > >  complexity to the API, as you can set anything on them.
> > > > 
> > > > Until we have proper refcounting API we can make the AVBufferRef in
> > > > AVChannelLayout a void *, and only allow channel_layout functions to
> > > > dereference it as an AVBufferRef. This would mean adding some extra helper
> > > > functions to channel layout, but overall it is not unsolvable.
> > > > 
> > > > The real question is that if you want to use refcounting and add helpers to
> > > > query / replace per-channel metadata, or you find the idea too heavy weight
> > > > and would like to stick to flat structs.
> > > 
> > > what is the advantage of refcounting for channel metadata ?
> > > is it about the used memory, about the reduced need to copy ?
> > 
> > Basicly it is the ability to store per-channel metadata in avdictionary,
> > because otherwise it would have to be copyed, and avdictionary is very
> > ineffective at copying because of many mallocs.
> > 
> > > 
> > > what kind of metadata and what size do you expect ?
> > > bytes, kilobytes, megabytes, gigabytes per channel ?
> > 
> > Usually, nothing, because most format don't have support for per-channel
> > metadata. In some cases it is going to be a couple of textual metadata
> > key-value pairs, such as language, label, group, speaker, positon, so 4-5
> > dynamically allocated string pairs, plus the AVDictionary itself, multiplied
> > by the number of channels in a layout.
> > 
> > > 
> > > what is the overhead for dynamic allocation and ref counting?
> > > that is at which point does it even make sense ?
> > 
> > I don't have exact measurements. It is generally felt that copying
> > AVDictionary per-channel is a huge overhead for something as lightweight as
> > an audio frame which is a 2-4 kB per channel at most and only a couple of
> > allocs usually not dependant on the number of channels. That's why
> > refcounting was proposed.
> 
> I was thinking more at a AVStream / AVCodecParameters level.

> How will a demuxer transport such metadata over a AVPacket into a decoder
> outputting metadata-filled AVFrames?

or is this never needed ?

thx

[...]
Marton Balint Dec. 19, 2021, 11:35 a.m. UTC | #9
On Sat, 18 Dec 2021, Michael Niedermayer wrote:

> On Sat, Dec 18, 2021 at 02:36:12PM +0100, Michael Niedermayer wrote:
>> On Fri, Dec 17, 2021 at 07:04:08PM +0100, Marton Balint wrote:
>>>
>>>
>>> On Fri, 17 Dec 2021, Michael Niedermayer wrote:
>>>
>>>> On Fri, Dec 17, 2021 at 01:04:19AM +0100, Marton Balint wrote:
>>>>>
>>>>>
>>>>> On Thu, 16 Dec 2021, James Almer wrote:
>>>>>
>>>>>> Resending the first two patches only, since this is meant to
>>>>>> show the implementation of one of the several suggestions made
>>>>>> in the previous set that need to be discussed and hopefully
>>>>>> resolved in a call.
>>>>>
>>>>> Can you push the full branch somewhere?
>>>>>
>>>>>>
>>>>>> The proposals so far to extend the API to support either custom
>>>>>> labels for channels are, or some form of extra user information.
>>>>>>
>>>>>> - Fixed array of bytes to hold a label. Simple solution, but
>>>>>>  the labels will have a hard limit that can only be extended
>>>>>>  with a major bump. This is what i implemented in this version.
>>>>>> - "char *name" per channel that the user may allocate and the
>>>>>>  API will manage, duplicate and free. Simple solution, and the
>>>>>>  name can be arbitrarily long, but inefficient (av_strdup() per
>>>>>>  channel with a custom label on layout copy).
>>>>>> - "const char *name" per channel for compile time constants, or
>>>>>>  that the user may allocate and free. Very efficient, but for
>>>>>>  non compile time strings ensuring they outlive the layout can
>>>>>>  be tricky.
>>>>>> - Refcounted AVChannelCustom with a dictionary. This can't be
>>>>>>  done with AVBufferRef, so it would require some other form
>>>>>>  of reference counting. And a dictionary may add quite a bit of
>>>>>>  complexity to the API, as you can set anything on them.
>>>>>
>>>>> Until we have proper refcounting API we can make the AVBufferRef in
>>>>> AVChannelLayout a void *, and only allow channel_layout functions to
>>>>> dereference it as an AVBufferRef. This would mean adding some extra helper
>>>>> functions to channel layout, but overall it is not unsolvable.
>>>>>
>>>>> The real question is that if you want to use refcounting and add helpers to
>>>>> query / replace per-channel metadata, or you find the idea too heavy weight
>>>>> and would like to stick to flat structs.
>>>>
>>>> what is the advantage of refcounting for channel metadata ?
>>>> is it about the used memory, about the reduced need to copy ?
>>>
>>> Basicly it is the ability to store per-channel metadata in avdictionary,
>>> because otherwise it would have to be copyed, and avdictionary is very
>>> ineffective at copying because of many mallocs.
>>>
>>>>
>>>> what kind of metadata and what size do you expect ?
>>>> bytes, kilobytes, megabytes, gigabytes per channel ?
>>>
>>> Usually, nothing, because most format don't have support for per-channel
>>> metadata. In some cases it is going to be a couple of textual metadata
>>> key-value pairs, such as language, label, group, speaker, positon, so 4-5
>>> dynamically allocated string pairs, plus the AVDictionary itself, multiplied
>>> by the number of channels in a layout.
>>>
>>>>
>>>> what is the overhead for dynamic allocation and ref counting?
>>>> that is at which point does it even make sense ?
>>>
>>> I don't have exact measurements. It is generally felt that copying
>>> AVDictionary per-channel is a huge overhead for something as lightweight as
>>> an audio frame which is a 2-4 kB per channel at most and only a couple of
>>> allocs usually not dependant on the number of channels. That's why
>>> refcounting was proposed.
>>
>> I was thinking more at a AVStream / AVCodecParameters level.
>
>> How will a demuxer transport such metadata over a AVPacket into a decoder
>> outputting metadata-filled AVFrames?
>
> or is this never needed ?

I am not sure I understand. Usually metadata is passed from demuxer to 
decoder by avcodec_parameters_to_context(), this is used for all metadata 
which is in AVCodecParameters.

For per-packet metadata ff_decode_frame_props() has some automatic packet 
side data -> frame side data transfer.

AVStream side data may be transferred to AVPacket side data if 
av_format_inject_global_side_data() is used, but it is not enabled by 
default.

Regards,
Marton
Michael Niedermayer Dec. 19, 2021, 12:51 p.m. UTC | #10
On Sun, Dec 19, 2021 at 12:35:11PM +0100, Marton Balint wrote:
> 
> 
> On Sat, 18 Dec 2021, Michael Niedermayer wrote:
> 
> > On Sat, Dec 18, 2021 at 02:36:12PM +0100, Michael Niedermayer wrote:
> > > On Fri, Dec 17, 2021 at 07:04:08PM +0100, Marton Balint wrote:
> > > > 
> > > > 
> > > > On Fri, 17 Dec 2021, Michael Niedermayer wrote:
> > > > 
> > > > > On Fri, Dec 17, 2021 at 01:04:19AM +0100, Marton Balint wrote:
> > > > > > 
> > > > > > 
> > > > > > On Thu, 16 Dec 2021, James Almer wrote:
> > > > > > 
> > > > > > > Resending the first two patches only, since this is meant to
> > > > > > > show the implementation of one of the several suggestions made
> > > > > > > in the previous set that need to be discussed and hopefully
> > > > > > > resolved in a call.
> > > > > > 
> > > > > > Can you push the full branch somewhere?
> > > > > > 
> > > > > > > 
> > > > > > > The proposals so far to extend the API to support either custom
> > > > > > > labels for channels are, or some form of extra user information.
> > > > > > > 
> > > > > > > - Fixed array of bytes to hold a label. Simple solution, but
> > > > > > >  the labels will have a hard limit that can only be extended
> > > > > > >  with a major bump. This is what i implemented in this version.
> > > > > > > - "char *name" per channel that the user may allocate and the
> > > > > > >  API will manage, duplicate and free. Simple solution, and the
> > > > > > >  name can be arbitrarily long, but inefficient (av_strdup() per
> > > > > > >  channel with a custom label on layout copy).
> > > > > > > - "const char *name" per channel for compile time constants, or
> > > > > > >  that the user may allocate and free. Very efficient, but for
> > > > > > >  non compile time strings ensuring they outlive the layout can
> > > > > > >  be tricky.
> > > > > > > - Refcounted AVChannelCustom with a dictionary. This can't be
> > > > > > >  done with AVBufferRef, so it would require some other form
> > > > > > >  of reference counting. And a dictionary may add quite a bit of
> > > > > > >  complexity to the API, as you can set anything on them.
> > > > > > 
> > > > > > Until we have proper refcounting API we can make the AVBufferRef in
> > > > > > AVChannelLayout a void *, and only allow channel_layout functions to
> > > > > > dereference it as an AVBufferRef. This would mean adding some extra helper
> > > > > > functions to channel layout, but overall it is not unsolvable.
> > > > > > 
> > > > > > The real question is that if you want to use refcounting and add helpers to
> > > > > > query / replace per-channel metadata, or you find the idea too heavy weight
> > > > > > and would like to stick to flat structs.
> > > > > 
> > > > > what is the advantage of refcounting for channel metadata ?
> > > > > is it about the used memory, about the reduced need to copy ?
> > > > 
> > > > Basicly it is the ability to store per-channel metadata in avdictionary,
> > > > because otherwise it would have to be copyed, and avdictionary is very
> > > > ineffective at copying because of many mallocs.
> > > > 
> > > > > 
> > > > > what kind of metadata and what size do you expect ?
> > > > > bytes, kilobytes, megabytes, gigabytes per channel ?
> > > > 
> > > > Usually, nothing, because most format don't have support for per-channel
> > > > metadata. In some cases it is going to be a couple of textual metadata
> > > > key-value pairs, such as language, label, group, speaker, positon, so 4-5
> > > > dynamically allocated string pairs, plus the AVDictionary itself, multiplied
> > > > by the number of channels in a layout.
> > > > 
> > > > > 
> > > > > what is the overhead for dynamic allocation and ref counting?
> > > > > that is at which point does it even make sense ?
> > > > 
> > > > I don't have exact measurements. It is generally felt that copying
> > > > AVDictionary per-channel is a huge overhead for something as lightweight as
> > > > an audio frame which is a 2-4 kB per channel at most and only a couple of
> > > > allocs usually not dependant on the number of channels. That's why
> > > > refcounting was proposed.
> > > 
> > > I was thinking more at a AVStream / AVCodecParameters level.
> > 
> > > How will a demuxer transport such metadata over a AVPacket into a decoder
> > > outputting metadata-filled AVFrames?
> > 
> > or is this never needed ?
> 
> I am not sure I understand. Usually metadata is passed from demuxer to
> decoder by avcodec_parameters_to_context(), this is used for all metadata
> which is in AVCodecParameters.
> 

> For per-packet metadata ff_decode_frame_props() has some automatic packet
> side data -> frame side data transfer.
> 
> AVStream side data may be transferred to AVPacket side data if
> av_format_inject_global_side_data() is used, but it is not enabled by
> default.

The sidedata in AVPacket is not channel specific, the data in AVFrames new
channels is.
The later is as you wrote expensive to copy/alloc so it needs ref counting

what i was trying to point to was that if we need a way to transfer this
data on a per packet base from demuxer forward then we need a flat format.
At least with the current AVPackets
And a flat format is much lighter to copy around so then one is pushed
toward the question, "should that be used for AVFrames too?"
a small <10kb audio frame with 8 audio channels and a ref counted dictionary
or whatever per each of the 8 channels vs. a flat description.
an extra is that a flat format is very simple to memcmp() to check if it
changed.
I have no position in this above, iam just wanting to make sure nothing
is missed in this somewhat rushed design.

also theres yet another orthogonal aspect which has been missed i think
This per channel description whatever its form will be is usefull for another
case. And that are the video/image channels. generally this is 
red/green/blue/(alpha) but there is material with other channels, 
IR/NIR/UV/... and i imagine probably depth from some lidar/radar system

Ideally such a future image channel API can share parts with the audio one

thx

[...]