FFmpeg
mov_chan.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011 Justin Ruggles
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * mov 'chan' tag reading/writing.
23  * @author Justin Ruggles
24  */
25 
26 #include <assert.h>
27 #include <stdint.h>
28 
29 #include "libavutil/avassert.h"
31 #include "libavutil/mem.h"
32 #include "libavcodec/codec_id.h"
33 #include "mov_chan.h"
34 
35 enum {
52  // = AV_CHAN_TOP_BACK_CENTER,
61  // = AV_CHAN_TOP_SIDE_LEFT,
62  // = AV_CHAN_TOP_SIDE_RIGHT,
63  // = AV_CHAN_BOTTOM_FRONT_CENTER,
64  // = AV_CHAN_BOTTOM_FRONT_LEFT,
65  // = AV_CHAN_BOTTOM_FRONT_RIGHT,
70  /* The following have no exact counterparts */
76 };
77 
78 enum {
88  /* Side and surround are not exactly the same, but in order to have
89  * consistent 5.1/7.1 layouts we map them to the side channels. */
101  // = AV_CHAN_STEREO_LEFT,
102  // = AV_CHAN_STEREO_RIGHT,
113  /* The following have no exact counterparts */
116 };
117 
119  union {
120  uint32_t tag;
121  enum AVChannel id;
122  };
123 };
124 
125 #define TAG(_tag, _cnt) {.tag = _tag}
126 #define ID(_0) {.id = c_##_0}
127 #define CHLIST01(_tag, _1) CHLIST(_tag, 1, ID(_1))
128 #define CHLIST02(_tag, _1, _2) CHLIST(_tag, 2, ID(_1), ID(_2))
129 #define CHLIST03(_tag, _1, _2, _3) CHLIST(_tag, 3, ID(_1), ID(_2), ID(_3))
130 #define CHLIST04(_tag, _1, _2, _3, _4) CHLIST(_tag, 4, ID(_1), ID(_2), ID(_3), ID(_4))
131 #define CHLIST05(_tag, _1, _2, _3, _4, _5) CHLIST(_tag, 5, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5))
132 #define CHLIST06(_tag, _1, _2, _3, _4, _5, _6) CHLIST(_tag, 6, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6))
133 #define CHLIST07(_tag, _1, _2, _3, _4, _5, _6, _7) CHLIST(_tag, 7, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7))
134 #define CHLIST08(_tag, _1, _2, _3, _4, _5, _6, _7, _8) CHLIST(_tag, 8, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8))
135 #define CHLIST09(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9) CHLIST(_tag, 9, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9))
136 #define CHLIST16(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \
137  CHLIST(_tag, 16, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \
138  ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16))
139 #define CHLIST21(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21) \
140  CHLIST(_tag, 21, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \
141  ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), ID(_21))
142 #define CHLIST24(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24) \
143  CHLIST(_tag, 24, ID(_1), ID(_2), ID(_3), ID(_4), ID(_5), ID(_6), ID(_7), ID(_8), ID(_9), ID(_10), \
144  ID(_11), ID(_12), ID(_13), ID(_14), ID(_15), ID(_16), ID(_17), ID(_18), ID(_19), ID(_20), \
145  ID(_21), ID(_22), ID(_23), ID(_24))
146 
147 #define MOV_CH_LAYOUT_MAP \
148  CHLIST01( MOV_CH_LAYOUT_MONO, C )\
149  CHLIST02( MOV_CH_LAYOUT_STEREO, L, R )\
150  CHLIST02( MOV_CH_LAYOUT_STEREOHEADPHONES, L, R )\
151  CHLIST02( MOV_CH_LAYOUT_BINAURAL, L, R )\
152  CHLIST02( MOV_CH_LAYOUT_MIDSIDE, L, R )\
153  CHLIST02( MOV_CH_LAYOUT_XY, L, R )\
154  CHLIST02( MOV_CH_LAYOUT_MATRIXSTEREO, Lt, Rt )\
155  CHLIST02( MOV_CH_LAYOUT_AC3_1_0_1, C, LFE )\
156  CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_A, L, R, C )\
157  CHLIST03( MOV_CH_LAYOUT_MPEG_3_0_B, C, L, R )\
158  CHLIST03( MOV_CH_LAYOUT_AC3_3_0, L, C, R )\
159  CHLIST03( MOV_CH_LAYOUT_ITU_2_1, L, R, Cs )\
160  CHLIST03( MOV_CH_LAYOUT_DVD_4, L, R, LFE )\
161  CHLIST04( MOV_CH_LAYOUT_AMBISONIC_B_FORMAT, W, X, Y, Z )\
162  CHLIST04( MOV_CH_LAYOUT_QUADRAPHONIC, L, R, Rls, Rrs )\
163  CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_A, L, R, C, Cs )\
164  CHLIST04( MOV_CH_LAYOUT_MPEG_4_0_B, C, L, R, Cs )\
165  CHLIST04( MOV_CH_LAYOUT_AC3_3_1, L, C, R, Cs )\
166  CHLIST04( MOV_CH_LAYOUT_ITU_2_2, L, R, Ls, Rs )\
167  CHLIST04( MOV_CH_LAYOUT_DVD_5, L, R, LFE, Cs )\
168  CHLIST04( MOV_CH_LAYOUT_AC3_2_1_1, L, R, Cs, LFE )\
169  CHLIST04( MOV_CH_LAYOUT_DVD_10, L, R, C, LFE )\
170  CHLIST04( MOV_CH_LAYOUT_AC3_3_0_1, L, C, R, LFE )\
171  CHLIST04( MOV_CH_LAYOUT_DTS_3_1, C, L, R, LFE )\
172  CHLIST05( MOV_CH_LAYOUT_PENTAGONAL, L, R, Rls, Rrs, C )\
173  CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_A, L, R, C, Ls, Rs )\
174  CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_B, L, R, Ls, Rs, C )\
175  CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_C, L, C, R, Ls, Rs )\
176  CHLIST05( MOV_CH_LAYOUT_MPEG_5_0_D, C, L, R, Ls, Rs )\
177  CHLIST05( MOV_CH_LAYOUT_DVD_6, L, R, LFE, Ls, Rs )\
178  CHLIST05( MOV_CH_LAYOUT_DVD_18, L, R, Ls, Rs, LFE )\
179  CHLIST05( MOV_CH_LAYOUT_DVD_11, L, R, C, LFE, Cs )\
180  CHLIST05( MOV_CH_LAYOUT_AC3_3_1_1, L, C, R, Cs, LFE )\
181  CHLIST05( MOV_CH_LAYOUT_DTS_4_1, C, L, R, Cs, LFE )\
182  CHLIST06( MOV_CH_LAYOUT_HEXAGONAL, L, R, Rls, Rrs, C, Cs )\
183  CHLIST06( MOV_CH_LAYOUT_DTS_6_0_C, C, Cs, L, R, Rls, Rrs )\
184  CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_A, L, R, C, LFE, Ls, Rs )\
185  CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_B, L, R, Ls, Rs, C, LFE )\
186  CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_C, L, C, R, Ls, Rs, LFE )\
187  CHLIST06( MOV_CH_LAYOUT_MPEG_5_1_D, C, L, R, Ls, Rs, LFE )\
188  CHLIST06( MOV_CH_LAYOUT_AUDIOUNIT_6_0, L, R, Ls, Rs, C, Cs )\
189  CHLIST06( MOV_CH_LAYOUT_AAC_6_0, C, L, R, Ls, Rs, Cs )\
190  CHLIST06( MOV_CH_LAYOUT_EAC3_6_0_A, L, C, R, Ls, Rs, Cs )\
191  CHLIST06( MOV_CH_LAYOUT_DTS_6_0_A, Lc, Rc, L, R, Ls, Rs )\
192  CHLIST06( MOV_CH_LAYOUT_DTS_6_0_B, C, L, R, Rls, Rrs, Ts )\
193  CHLIST07( MOV_CH_LAYOUT_MPEG_6_1_A, L, R, C, LFE, Ls, Rs, Cs )\
194  CHLIST07( MOV_CH_LAYOUT_AAC_6_1, C, L, R, Ls, Rs, Cs, LFE )\
195  CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_A, L, C, R, Ls, Rs, LFE, Cs )\
196  CHLIST07( MOV_CH_LAYOUT_DTS_6_1_D, C, L, R, Ls, Rs, LFE, Cs )\
197  CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0, L, R, Ls, Rs, C, Rls, Rrs )\
198  CHLIST07( MOV_CH_LAYOUT_AAC_7_0, C, L, R, Ls, Rs, Rls, Rrs )\
199  CHLIST07( MOV_CH_LAYOUT_EAC3_7_0_A, L, C, R, Ls, Rs, Rls, Rrs )\
200  CHLIST07( MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT, L, R, Ls, Rs, C, Lc, Rc )\
201  CHLIST07( MOV_CH_LAYOUT_DTS_7_0, Lc, C, Rc, L, R, Ls, Rs )\
202  CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_B, L, C, R, Ls, Rs, LFE, Ts )\
203  CHLIST07( MOV_CH_LAYOUT_EAC3_6_1_C, L, C, R, Ls, Rs, LFE, Vhc )\
204  CHLIST07( MOV_CH_LAYOUT_DTS_6_1_A, Lc, Rc, L, R, Ls, Rs, LFE )\
205  CHLIST07( MOV_CH_LAYOUT_DTS_6_1_B, C, L, R, Rls, Rrs, Ts, LFE )\
206  CHLIST07( MOV_CH_LAYOUT_DTS_6_1_C, C, Cs, L, R, Rls, Rrs, LFE )\
207  CHLIST08( MOV_CH_LAYOUT_OCTAGONAL, L, R, Rls, Rrs, C, Cs, Ls, Rs )\
208  CHLIST08( MOV_CH_LAYOUT_AAC_OCTAGONAL, C, L, R, Ls, Rs, Rls, Rrs, Cs )\
209  CHLIST08( MOV_CH_LAYOUT_CUBE, L, R, Rls, Rrs, Vhl, Vhr, Rlt, Rrt )\
210  CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_A, L, R, C, LFE, Ls, Rs, Lc, Rc )\
211  CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_B, C, Lc, Rc, L, R, Ls, Rs, LFE )\
212  CHLIST08( MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1, L, R, Ls, Rs, C, LFE, Lc, Rc )\
213  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_B, L, C, R, Ls, Rs, LFE, Lc, Rc )\
214  CHLIST08( MOV_CH_LAYOUT_DTS_7_1, Lc, C, Rc, L, R, Ls, Rs, LFE )\
215  CHLIST08( MOV_CH_LAYOUT_MPEG_7_1_C, L, R, C, LFE, Ls, Rs, Rls, Rrs )\
216  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_A, L, C, R, Ls, Rs, LFE, Rls, Rrs )\
217  CHLIST08( MOV_CH_LAYOUT_SMPTE_DTV, L, R, C, LFE, Ls, Rs, Lt, Rt )\
218  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_C, L, C, R, Ls, Rs, LFE, Lsd, Rsd )\
219  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_D, L, C, R, Ls, Rs, LFE, Lw, Rw )\
220  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_E, L, C, R, Ls, Rs, LFE, Vhl, Vhr )\
221  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_F, L, C, R, Ls, Rs, LFE, Cs, Ts )\
222  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_G, L, C, R, Ls, Rs, LFE, Cs, Vhc )\
223  CHLIST08( MOV_CH_LAYOUT_EAC3_7_1_H, L, C, R, Ls, Rs, LFE, Ts, Vhc )\
224  CHLIST08( MOV_CH_LAYOUT_DTS_8_0_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs )\
225  CHLIST08( MOV_CH_LAYOUT_DTS_8_0_B, Lc, C, Rc, L, R, Ls, Cs, Rs )\
226  CHLIST09( MOV_CH_LAYOUT_DTS_8_1_A, Lc, Rc, L, R, Ls, Rs, Rls, Rrs, LFE )\
227  CHLIST09( MOV_CH_LAYOUT_DTS_8_1_B, Lc, C, Rc, L, R, Ls, Cs, Rs, LFE )\
228  CHLIST16( MOV_CH_LAYOUT_TMH_10_2_STD, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2 )\
229  CHLIST21( MOV_CH_LAYOUT_TMH_10_2_FULL, L, R, C, Vhc, Lsd, Rsd, Ls, Rs, Vhl, Vhr, Lw, Rw, Csd, Cs, LFE1, LFE2, Lc, Rc, HI, VI, Haptic )\
230 
231 #define CHLIST(_tag, _cnt, ...) static_assert((_tag & 0xffff) == _cnt, "Channel count of " #_tag " is not " #_cnt);
233 #undef CHLIST
234 #define CHLIST(_tag, _cnt, ...) TAG(_tag, _cnt), __VA_ARGS__,
235 static const struct MovChannelLayoutMap mov_ch_layout_map[] = {
237  { {0} },
238 };
239 
240 #undef ID
241 #undef TAG
242 #define ID(_0) {.id = iso_##_0}
243 #define TAG(_tag, _cnt) {.tag = (_tag << 16) | _cnt}
244 
245 /* ISO/IEC 23001-8 */
246 static const struct MovChannelLayoutMap iso_ch_layout_map[] = {
247  CHLIST01( 1, C )
248  CHLIST02( 2, L, R )
249  CHLIST03( 3, C, L, R )
250  CHLIST04( 4, C, L, R, Cs )
251  CHLIST05( 5, C, L, R, Ls, Rs )
252  CHLIST06( 6, C, L, R, Ls, Rs, LFE )
253  CHLIST08( 7, C, Lc, Rc, L, R, Ls, Rs, LFE )
254  CHLIST03( 9, L, R, Cs )
255  CHLIST04( 10, L, R, Ls, Rs )
256  CHLIST07( 11, C, L, R, Ls, Rs, Cs, LFE )
257  CHLIST08( 12, C, L, R, Ls, Rs, Lsr, Rsr, LFE )
258  CHLIST24( 13, C, Lc, Rc, L, R, Lss, Rss, Lsr, Rsr, Cs, LFE, LFE2, Cv, Lv, Rv, Lvss, Rvss, Ts, Lvr, Rvr, Cvr, Cb, Lb, Rb)
259  CHLIST08( 14, C, L, R, Ls, Rs, LFE, Lv, Rv)
260  { {0} },
261 };
262 
287  0,
288 };
289 
305  0,
306 };
307 
317  0,
318 };
319 
332  0,
333 };
334 
335 static const struct {
338 } mov_codec_ch_layouts[] = {
354  { AV_CODEC_ID_NONE, NULL },
355 };
356 
357 static const struct MovChannelLayoutMap* find_layout_map(uint32_t tag, const struct MovChannelLayoutMap *map)
358 {
359  for (int i = 0; map[i].tag & 0xffff; i += 1 + (map[i].tag & 0xffff))
360  if (map[i].tag == tag)
361  return &map[i + 1];
362  return NULL;
363 }
364 
365 /**
366  * Get the channel layout for the specified non-special channel layout tag if
367  * known.
368  *
369  * @param[in,out] ch_layout channel layout
370  * @param[in] tag channel layout tag
371  * @return <0 on error
372  */
373 static int mov_get_channel_layout(AVChannelLayout *ch_layout, uint32_t tag, uint64_t omitted_channel_map, const struct MovChannelLayoutMap *map)
374 {
375  const struct MovChannelLayoutMap *layout_map;
376 
377  /* find the channel layout for the specified layout tag */
378  layout_map = find_layout_map(tag, map);
379  if (layout_map) {
380  int ret;
381  int map_layout_nb_channels = tag & 0xFFFF;
382  int nb_channels = ch_layout->nb_channels;
383 
384  /* Omitted channel bits must not exceed number of channels in map */
385  if (omitted_channel_map >> map_layout_nb_channels)
386  return AVERROR_INVALIDDATA;
387 
388  av_channel_layout_uninit(ch_layout);
389  ret = av_channel_layout_custom_init(ch_layout, nb_channels);
390  if (ret < 0)
391  return ret;
392 
393  for (int i = 0, idx = 0; i < map_layout_nb_channels && idx < nb_channels; i++, omitted_channel_map >>= 1) {
394  if (!(omitted_channel_map & 1)) {
395  enum AVChannel id = layout_map[i].id;
396  ch_layout->u.map[idx++].id = (id != AV_CHAN_NONE ? id : AV_CHAN_UNKNOWN);
397  }
398  }
399 
401  }
402  return 0;
403 }
404 
405 static enum AVChannel mov_get_channel_id(uint32_t label)
406 {
407  if (label == 0)
408  return AV_CHAN_UNUSED;
409  if (label <= 18)
410  return (label - 1);
411  if (label == 35)
412  return AV_CHAN_WIDE_LEFT;
413  if (label == 36)
414  return AV_CHAN_WIDE_RIGHT;
415  if (label == 37)
417  if (label == 38)
418  return AV_CHAN_STEREO_LEFT;
419  if (label == 39)
420  return AV_CHAN_STEREO_RIGHT;
421  return AV_CHAN_UNKNOWN;
422 }
423 
425 {
426  if (channel < 0)
427  return 0;
429  return channel + 1;
430  if (channel == AV_CHAN_WIDE_LEFT)
431  return 35;
433  return 36;
435  return 37;
437  return 38;
439  return 39;
440  return 0;
441 }
442 
443 static int is_layout_valid_for_tag(const AVChannelLayout *ch_layout, uint32_t tag, const struct MovChannelLayoutMap *map)
444 {
445  const struct MovChannelLayoutMap *layout_map;
446  int channels = ch_layout->nb_channels;
447 
448  /* get the layout map based on the channel count */
449  if ((tag & 0xFFFF) != channels)
450  return 0;
451 
452  layout_map = find_layout_map(tag, map);
453  if (layout_map) {
454  int i;
455  for (i = 0; i < channels; i++) {
456  if (av_channel_layout_channel_from_index(ch_layout, i) != layout_map[i].id)
457  break;
458  }
459  if (i == channels)
460  return 1;
461  }
462  return 0;
463 }
464 
466  uint32_t *layout,
467  uint32_t *bitmap,
468  uint32_t **pchannel_desc)
469 {
470  int i;
471  uint32_t tag = 0;
472  const enum MovChannelLayoutTag *layouts = NULL;
473 
474  /* find the layout list for the specified codec */
475  for (i = 0; mov_codec_ch_layouts[i].codec_id != AV_CODEC_ID_NONE; i++) {
477  break;
478  }
480  layouts = mov_codec_ch_layouts[i].layouts;
481 
482  if (layouts) {
483  /* find the layout tag for the specified channel layout */
484  for (i = 0; layouts[i] != 0; i++)
486  break;
487 
488  tag = layouts[i];
489  }
490 
491  *layout = tag;
492  *bitmap = 0;
493  *pchannel_desc = NULL;
494 
495  /* if no tag was found, use channel bitmap or description as a backup if possible */
496  if (tag == 0) {
497  uint32_t *channel_desc;
499  par->ch_layout.u.mask < 0x40000) {
501  *bitmap = (uint32_t)par->ch_layout.u.mask;
502  return 0;
503  } else if (par->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC)
504  return AVERROR(ENOSYS);
505 
506  channel_desc = av_malloc_array(par->ch_layout.nb_channels, sizeof(*channel_desc));
507  if (!channel_desc)
508  return AVERROR(ENOMEM);
509 
510  for (i = 0; i < par->ch_layout.nb_channels; i++) {
511  channel_desc[i] =
513 
514  if (channel_desc[i] == 0) {
515  av_free(channel_desc);
516  return AVERROR(ENOSYS);
517  }
518  }
519 
520  *pchannel_desc = channel_desc;
521  }
522 
523  return 0;
524 }
525 
527  int64_t size)
528 {
529  uint32_t layout_tag, bitmap, num_descr;
530  int ret;
531  AVChannelLayout *ch_layout = &st->codecpar->ch_layout;
532 
533  if (size < 12)
534  return AVERROR_INVALIDDATA;
535 
536  layout_tag = avio_rb32(pb);
537  bitmap = avio_rb32(pb);
538  num_descr = avio_rb32(pb);
539 
540  av_log(s, AV_LOG_DEBUG, "chan: layout=%"PRIu32" "
541  "bitmap=%"PRIu32" num_descr=%"PRIu32"\n",
542  layout_tag, bitmap, num_descr);
543 
544  if (size < 12ULL + num_descr * 20ULL)
545  return 0;
546 
547  if (layout_tag == MOV_CH_LAYOUT_USE_DESCRIPTIONS) {
548  int nb_channels = ch_layout->nb_channels ? ch_layout->nb_channels : num_descr;
549  if (num_descr > nb_channels) {
550  av_log(s, AV_LOG_WARNING, "got %d channel descriptions, capping to the number of channels %d\n",
551  num_descr, nb_channels);
552  num_descr = nb_channels;
553  }
554 
555  av_channel_layout_uninit(ch_layout);
556  ret = av_channel_layout_custom_init(ch_layout, nb_channels);
557  if (ret < 0)
558  goto out;
559 
560  for (int i = 0; i < num_descr; i++) {
561  uint32_t label;
562  if (pb->eof_reached) {
564  "reached EOF while reading channel layout\n");
565  return AVERROR_INVALIDDATA;
566  }
567  label = avio_rb32(pb); // mChannelLabel
568  avio_rb32(pb); // mChannelFlags
569  avio_rl32(pb); // mCoordinates[0]
570  avio_rl32(pb); // mCoordinates[1]
571  avio_rl32(pb); // mCoordinates[2]
572  size -= 20;
573  ch_layout->u.map[i].id = mov_get_channel_id(label);
574  }
575 
577  if (ret < 0)
578  goto out;
579  } else if (layout_tag == MOV_CH_LAYOUT_USE_BITMAP) {
580  if (!ch_layout->nb_channels || av_popcount(bitmap) == ch_layout->nb_channels) {
581  if (bitmap < 0x40000) {
582  av_channel_layout_uninit(ch_layout);
583  av_channel_layout_from_mask(ch_layout, bitmap);
584  }
585  } else {
586  av_log(s, AV_LOG_WARNING, "ignoring channel layout bitmap with %d channels because number of channels is %d\n",
587  av_popcount64(bitmap), ch_layout->nb_channels);
588  }
589  } else if (layout_tag & 0xFFFF) {
590  int nb_channels = layout_tag & 0xFFFF;
591  if (!ch_layout->nb_channels)
592  ch_layout->nb_channels = nb_channels;
593  if (nb_channels == ch_layout->nb_channels) {
594  ret = mov_get_channel_layout(ch_layout, layout_tag, 0, mov_ch_layout_map);
595  if (ret < 0)
596  return ret;
597  } else {
598  av_log(s, AV_LOG_WARNING, "ignoring layout tag with %d channels because number of channels is %d\n",
599  nb_channels, ch_layout->nb_channels);
600  }
601  }
602  ret = 0;
603 
604 out:
605  avio_skip(pb, size - 12);
606 
607  return ret;
608 }
609 
610 /* ISO/IEC 23001-8, table 8 */
611 static const enum AVChannel iso_channel_position[] = {
612  // 0: left front
614 
615  // 1: right front
617 
618  // 2: centre front
620 
621  // 3: low frequence enhancement
623 
624  // 4: left surround
625  // TODO
626  AV_CHAN_NONE,
627 
628  // 5: right surround
629  // TODO
630  AV_CHAN_NONE,
631 
632  // 6: left front centre
634 
635  // 7: right front centre
637 
638  // 8: rear surround left
640 
641  // 9: rear surround right
643 
644  // 10: rear centre
646 
647  // 11: left surround direct
649 
650  // 12: right surround direct
652 
653  // 13: left side surround
655 
656  // 14: right side surround
658 
659  // 15: left wide front
661 
662  // 16: right wide front
664 
665  // 17: left front vertical height
667 
668  // 18: right front vertical height
670 
671  // 19: centre front vertical height
673 
674  // 20: left surround vertical height rear
676 
677  // 21: right surround vertical height rear
679 
680  // 22: centre vertical height rear
682 
683  // 23: left vertical height side surround
685 
686  // 24: right vertical height side surround
688 
689  // 25: top centre surround
691 
692  // 26: low frequency enhancement 2
694 
695  // 27: left front vertical bottom
697 
698  // 28: right front vertical bottom
700 
701  // 29: centre front vertical bottom
703 
704  // 30: left vertical height surround
705  // TODO
706  AV_CHAN_NONE,
707 
708  // 31: right vertical height surround
709  // TODO
710  AV_CHAN_NONE,
711 
712  // 32, 33, 34, 35, reserved
713  AV_CHAN_NONE,
714  AV_CHAN_NONE,
715  AV_CHAN_NONE,
716  AV_CHAN_NONE,
717 
718  // 36: low frequency enhancement 3
719  AV_CHAN_NONE,
720 
721  // 37: left edge of screen
722  AV_CHAN_NONE,
723  // 38: right edge of screen
724  AV_CHAN_NONE,
725  // 39: half-way between centre of screen and left edge of screen
726  AV_CHAN_NONE,
727  // 40: half-way between centre of screen and right edge of screen
728  AV_CHAN_NONE,
729 
730  // 41: left back surround
731  AV_CHAN_NONE,
732 
733  // 42: right back surround
734  AV_CHAN_NONE,
735 
736  // 43 - 125: reserved
737  // 126: explicit position
738  // 127: unknown /undefined
739 };
740 
742 {
743  // Set default value which means any setup in 23001-8
744  *config = 0;
745  for (int i = 0; iso_ch_layout_map[i].tag & 0xffff; i += 1 + (iso_ch_layout_map[i].tag & 0xffff)) {
747  *config = iso_ch_layout_map[i].tag >> 16;
748  break;
749  }
750  }
751 
752  return 0;
753 }
754 
755 int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout, uint64_t omitted_channel_map)
756 {
757  if (config > 0) {
758  uint32_t layout_tag;
759  int nb_omitted_channels = av_popcount64(omitted_channel_map);
760 
761  if (layout->nb_channels <= 0 || layout->nb_channels > UINT16_MAX - nb_omitted_channels)
762  return AVERROR_INVALIDDATA;
763 
764  layout_tag = (config << 16) | (layout->nb_channels + nb_omitted_channels);
765  return mov_get_channel_layout(layout, layout_tag, omitted_channel_map, iso_ch_layout_map);
766  }
767  return 1;
768 }
769 
771  uint8_t *position, int position_num)
772 {
773  enum AVChannel channel;
774 
775  if (position_num < layout->nb_channels)
776  return AVERROR(EINVAL);
777 
778  for (int i = 0; i < layout->nb_channels; i++) {
779  position[i] = 127;
781  if (channel == AV_CHAN_NONE)
782  return AVERROR(EINVAL);
783 
784  for (int j = 0; j < FF_ARRAY_ELEMS(iso_channel_position); j++) {
785  if (iso_channel_position[j] == channel) {
786  position[i] = j;
787  break;
788  }
789  }
790  if (position[i] == 127)
791  return AVERROR(EINVAL);
792  }
793 
794  return 0;
795 }
796 
798 {
799  int stream_structure = avio_r8(pb);
800  int ret;
801 
802  // stream carries channels
803  if (stream_structure & 1) {
804  int layout = avio_r8(pb);
805 
806  av_log(s, AV_LOG_TRACE, "'chnl' layout %d\n", layout);
807  if (!layout) {
808  AVChannelLayout *ch_layout = &st->codecpar->ch_layout;
809  int nb_channels = ch_layout->nb_channels;
810 
811  av_channel_layout_uninit(ch_layout);
812  ret = av_channel_layout_custom_init(ch_layout, nb_channels);
813  if (ret < 0)
814  return ret;
815 
816  for (int i = 0; i < nb_channels; i++) {
817  int speaker_pos = avio_r8(pb);
818  enum AVChannel channel;
819 
820  if (speaker_pos == 126) // explicit position
821  avio_skip(pb, 3); // azimuth, elevation
822 
823  if (speaker_pos >= FF_ARRAY_ELEMS(iso_channel_position))
825  else
826  channel = iso_channel_position[speaker_pos];
827 
828  if (channel == AV_CHAN_NONE) {
829  av_log(s, AV_LOG_WARNING, "speaker position %d is not implemented\n", speaker_pos);
831  }
832 
833  ch_layout->u.map[i].id = channel;
834  }
835 
837  if (ret < 0)
838  return ret;
839  } else {
840  uint64_t omitted_channel_map = avio_rb64(pb);
841  ret = ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout, omitted_channel_map);
842  if (ret < 0)
843  return ret;
844  }
845  }
846 
847  // stream carries objects
848  if (stream_structure & 2) {
849  int obj_count = avio_r8(pb);
850  av_log(s, AV_LOG_TRACE, "'chnl' with object_count %d\n", obj_count);
851  }
852 
853  return 0;
854 }
MOV_CH_LAYOUT_QUADRAPHONIC
@ MOV_CH_LAYOUT_QUADRAPHONIC
Definition: mov_chan.h:64
AV_CODEC_ID_PCM_S16LE
@ AV_CODEC_ID_PCM_S16LE
Definition: codec_id.h:328
iso_Lvs
@ iso_Lvs
Definition: mov_chan.c:114
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AV_CODEC_ID_PCM_F32BE
@ AV_CODEC_ID_PCM_F32BE
Definition: codec_id.h:348
AV_CODEC_ID_AC3
@ AV_CODEC_ID_AC3
Definition: codec_id.h:443
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
iso_Lw
@ iso_Lw
Definition: mov_chan.c:103
iso_Lv
@ iso_Lv
Definition: mov_chan.c:95
MOV_CH_LAYOUT_MPEG_5_1_A
@ MOV_CH_LAYOUT_MPEG_5_1_A
Definition: mov_chan.h:77
ff_mov_get_channel_layout_from_config
int ff_mov_get_channel_layout_from_config(int config, AVChannelLayout *layout, uint64_t omitted_channel_map)
Get AVChannelLayout from ISO/IEC 23001-8 ChannelConfiguration.
Definition: mov_chan.c:755
iso_Rw
@ iso_Rw
Definition: mov_chan.c:104
out
FILE * out
Definition: movenc.c:55
codec_id
enum AVCodecID codec_id
Definition: mov_chan.c:336
iso_Ls
@ iso_Ls
Definition: mov_chan.c:90
iso_ch_layout_map
static const struct MovChannelLayoutMap iso_ch_layout_map[]
Definition: mov_chan.c:246
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
av_popcount64
#define av_popcount64
Definition: common.h:156
layouts
enum MovChannelLayoutTag * layouts
Definition: mov_chan.c:337
c_Lsd
@ c_Lsd
Definition: mov_chan.c:58
iso_C
@ iso_C
Definition: mov_chan.c:81
AV_CHAN_WIDE_LEFT
@ AV_CHAN_WIDE_LEFT
Definition: channel_layout.h:72
MOV_CH_LAYOUT_DTS_8_0_A
@ MOV_CH_LAYOUT_DTS_8_0_A
Definition: mov_chan.h:134
c_Rt
@ c_Rt
Definition: mov_chan.c:55
mov_codec_ch_layouts
static const struct @354 mov_codec_ch_layouts[]
AVChannelLayout::map
AVChannelCustom * map
This member must be used when the channel order is AV_CHANNEL_ORDER_CUSTOM.
Definition: channel_layout.h:354
iso_Rv
@ iso_Rv
Definition: mov_chan.c:97
MOV_CH_LAYOUT_AC3_3_0_1
@ MOV_CH_LAYOUT_AC3_3_0_1
Definition: mov_chan.h:107
av_channel_layout_channel_from_index
enum AVChannel av_channel_layout_channel_from_index(const AVChannelLayout *channel_layout, unsigned int idx)
Get the channel with the given index in a channel layout.
Definition: channel_layout.c:665
R
#define R
Definition: huffyuv.h:44
AV_CODEC_ID_ALAC
@ AV_CODEC_ID_ALAC
Definition: codec_id.h:456
mov_ch_layout_map
static const struct MovChannelLayoutMap mov_ch_layout_map[]
Definition: mov_chan.c:235
c_Z
@ c_Z
Definition: mov_chan.c:68
CHLIST01
#define CHLIST01(_tag, _1)
Definition: mov_chan.c:127
iso_Rsr
@ iso_Rsr
Definition: mov_chan.c:84
MOV_CH_LAYOUT_ITU_2_1
@ MOV_CH_LAYOUT_ITU_2_1
Definition: mov_chan.h:87
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:308
MOV_CH_LAYOUT_AAC_7_0
@ MOV_CH_LAYOUT_AAC_7_0
Definition: mov_chan.h:100
iso_Cb
@ iso_Cb
Definition: mov_chan.c:110
iso_Rss
@ iso_Rss
Definition: mov_chan.c:93
AVChannelLayout::mask
uint64_t mask
This member must be used for AV_CHANNEL_ORDER_NATIVE, and may be used for AV_CHANNEL_ORDER_AMBISONIC ...
Definition: channel_layout.h:335
av_popcount
#define av_popcount
Definition: common.h:153
CHLIST24
#define CHLIST24(_tag, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24)
Definition: mov_chan.c:142
ff_mov_get_channel_layout_tag
int ff_mov_get_channel_layout_tag(const AVCodecParameters *par, uint32_t *layout, uint32_t *bitmap, uint32_t **pchannel_desc)
Get the channel layout tag for the specified codec id and channel layout.
Definition: mov_chan.c:465
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:313
iso_Rvs
@ iso_Rvs
Definition: mov_chan.c:115
c_Ls
@ c_Ls
Definition: mov_chan.c:45
tf_sess_config.config
config
Definition: tf_sess_config.py:33
MOV_CH_LAYOUT_AC3_3_0
@ MOV_CH_LAYOUT_AC3_3_0
Definition: mov_chan.h:105
c_Rls
@ c_Rls
Definition: mov_chan.c:40
c_Vhc
@ c_Vhc
Definition: mov_chan.c:49
MOV_CH_LAYOUT_DTS_6_0_A
@ MOV_CH_LAYOUT_DTS_6_0_A
Definition: mov_chan.h:125
mov_get_channel_layout
static int mov_get_channel_layout(AVChannelLayout *ch_layout, uint32_t tag, uint64_t omitted_channel_map, const struct MovChannelLayoutMap *map)
Get the channel layout for the specified non-special channel layout tag if known.
Definition: mov_chan.c:373
MOV_CH_LAYOUT_MATRIXSTEREO
@ MOV_CH_LAYOUT_MATRIXSTEREO
Definition: mov_chan.h:59
c_X
@ c_X
Definition: mov_chan.c:69
AV_CHAN_SURROUND_DIRECT_LEFT
@ AV_CHAN_SURROUND_DIRECT_LEFT
Definition: channel_layout.h:74
iso_Lsd
@ iso_Lsd
Definition: mov_chan.c:105
MOV_CH_LAYOUT_MPEG_5_0_A
@ MOV_CH_LAYOUT_MPEG_5_0_A
Definition: mov_chan.h:73
AV_CODEC_ID_PCM_S16BE
@ AV_CODEC_ID_PCM_S16BE
Definition: codec_id.h:329
iso_Lsr
@ iso_Lsr
Definition: mov_chan.c:83
AV_CHAN_TOP_BACK_RIGHT
@ AV_CHAN_TOP_BACK_RIGHT
Definition: channel_layout.h:67
c_Rs
@ c_Rs
Definition: mov_chan.c:46
iso_Rc
@ iso_Rc
Definition: mov_chan.c:86
c_Vhr
@ c_Vhr
Definition: mov_chan.c:50
c_Rrt
@ c_Rrt
Definition: mov_chan.c:53
MOV_CH_LAYOUT_MPEG_5_1_D
@ MOV_CH_LAYOUT_MPEG_5_1_D
Definition: mov_chan.h:80
mov_ch_layouts_alac
static enum MovChannelLayoutTag mov_ch_layouts_alac[]
Definition: mov_chan.c:308
c_VI
@ c_VI
Definition: mov_chan.c:74
iso_LFE
@ iso_LFE
Definition: mov_chan.c:82
MOV_CH_LAYOUT_MONO
@ MOV_CH_LAYOUT_MONO
Definition: mov_chan.h:56
AV_CHAN_STEREO_RIGHT
@ AV_CHAN_STEREO_RIGHT
See above.
Definition: channel_layout.h:71
MOV_CH_LAYOUT_ITU_2_2
@ MOV_CH_LAYOUT_ITU_2_2
Definition: mov_chan.h:88
C
s EdgeDetect Foobar g libavfilter vf_edgedetect c libavfilter vf_foobar c edit libavfilter and add an entry for foobar following the pattern of the other filters edit libavfilter allfilters and add an entry for foobar following the pattern of the other filters configure make j< whatever > ffmpeg ffmpeg i you should get a foobar png with Lena edge detected That s your new playground is ready Some little details about what s going which in turn will define variables for the build system and the C
Definition: writing_filters.txt:58
AV_CODEC_ID_PCM_S8
@ AV_CODEC_ID_PCM_S8
Definition: codec_id.h:332
avassert.h
iso_Rb
@ iso_Rb
Definition: mov_chan.c:112
AV_CHAN_BOTTOM_FRONT_LEFT
@ AV_CHAN_BOTTOM_FRONT_LEFT
Definition: channel_layout.h:80
avio_rb32
unsigned int avio_rb32(AVIOContext *s)
Definition: aviobuf.c:761
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:206
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
MOV_CH_LAYOUT_AC3_1_0_1
@ MOV_CH_LAYOUT_AC3_1_0_1
Definition: mov_chan.h:104
codec_id.h
MOV_CH_LAYOUT_MPEG_5_1_C
@ MOV_CH_LAYOUT_MPEG_5_1_C
Definition: mov_chan.h:79
MOV_CH_LAYOUT_AAC_6_0
@ MOV_CH_LAYOUT_AAC_6_0
Definition: mov_chan.h:98
c_Lc
@ c_Lc
Definition: mov_chan.c:42
s
#define s(width, name)
Definition: cbs_vp9.c:198
find_layout_map
static const struct MovChannelLayoutMap * find_layout_map(uint32_t tag, const struct MovChannelLayoutMap *map)
Definition: mov_chan.c:357
c_Csd
@ c_Csd
Definition: mov_chan.c:72
AV_CHAN_UNKNOWN
@ AV_CHAN_UNKNOWN
Channel contains data, but its position is unknown.
Definition: channel_layout.h:87
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:112
av_channel_layout_from_mask
int av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask)
Initialize a native channel layout from a bitmask indicating which channels are present.
Definition: channel_layout.c:243
AV_CHAN_SIDE_RIGHT
@ AV_CHAN_SIDE_RIGHT
Definition: channel_layout.h:60
MOV_CH_LAYOUT_AC3_3_1
@ MOV_CH_LAYOUT_AC3_3_1
Definition: mov_chan.h:106
CHLIST08
#define CHLIST08(_tag, _1, _2, _3, _4, _5, _6, _7, _8)
Definition: mov_chan.c:134
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
c_Haptic
@ c_Haptic
Definition: mov_chan.c:75
c_R
@ c_R
Definition: mov_chan.c:37
channels
channels
Definition: aptx.h:31
MOV_CH_LAYOUT_MPEG_7_1_B
@ MOV_CH_LAYOUT_MPEG_7_1_B
Definition: mov_chan.h:83
CHLIST04
#define CHLIST04(_tag, _1, _2, _3, _4)
Definition: mov_chan.c:130
AV_CHAN_TOP_SIDE_LEFT
@ AV_CHAN_TOP_SIDE_LEFT
Definition: channel_layout.h:77
AV_CHAN_TOP_SIDE_RIGHT
@ AV_CHAN_TOP_SIDE_RIGHT
Definition: channel_layout.h:78
c_Rw
@ c_Rw
Definition: mov_chan.c:57
AVFormatContext
Format I/O context.
Definition: avformat.h:1255
MOV_CH_LAYOUT_SMPTE_DTV
@ MOV_CH_LAYOUT_SMPTE_DTV
Definition: mov_chan.h:86
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:766
MovChannelLayoutTag
MovChannelLayoutTag
mov 'chan' tag reading/writing.
Definition: mov_chan.h:51
AVChannelLayout::u
union AVChannelLayout::@379 u
Details about which channels are present in this layout.
MOV_CH_LAYOUT_STEREO
@ MOV_CH_LAYOUT_STEREO
Definition: mov_chan.h:57
c_LFE1
@ c_LFE1
Definition: mov_chan.c:71
NULL
#define NULL
Definition: coverity.c:32
MOV_CH_LAYOUT_DTS_4_1
@ MOV_CH_LAYOUT_DTS_4_1
Definition: mov_chan.h:124
iso_LFE2
@ iso_LFE2
Definition: mov_chan.c:107
MOV_CH_LAYOUT_MAP
#define MOV_CH_LAYOUT_MAP
Definition: mov_chan.c:147
c_Cs
@ c_Cs
Definition: mov_chan.c:44
AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL
#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL
The specified retype target order is ignored and the simplest possible (canonical) order is used for ...
Definition: channel_layout.h:692
AV_CHAN_TOP_BACK_CENTER
@ AV_CHAN_TOP_BACK_CENTER
Definition: channel_layout.h:66
avio_rb64
uint64_t avio_rb64(AVIOContext *s)
Definition: aviobuf.c:908
CHLIST05
#define CHLIST05(_tag, _1, _2, _3, _4, _5)
Definition: mov_chan.c:131
mov_get_channel_id
static enum AVChannel mov_get_channel_id(uint32_t label)
Definition: mov_chan.c:405
AV_CHAN_BOTTOM_FRONT_RIGHT
@ AV_CHAN_BOTTOM_FRONT_RIGHT
Definition: channel_layout.h:81
MOV_CH_LAYOUT_MPEG_3_0_B
@ MOV_CH_LAYOUT_MPEG_3_0_B
Definition: mov_chan.h:70
ff_mov_get_channel_positions_from_layout
int ff_mov_get_channel_positions_from_layout(const AVChannelLayout *layout, uint8_t *position, int position_num)
Get ISO/IEC 23001-8 OutputChannelPosition from AVChannelLayout.
Definition: mov_chan.c:770
AV_CHAN_TOP_CENTER
@ AV_CHAN_TOP_CENTER
Definition: channel_layout.h:61
iso_Cs
@ iso_Cs
Definition: mov_chan.c:87
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
MovChannelLayoutMap
Definition: mov_chan.c:118
AV_CHAN_FRONT_RIGHT_OF_CENTER
@ AV_CHAN_FRONT_RIGHT_OF_CENTER
Definition: channel_layout.h:57
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
AV_CHAN_FRONT_RIGHT
@ AV_CHAN_FRONT_RIGHT
Definition: channel_layout.h:51
AV_CHAN_FRONT_CENTER
@ AV_CHAN_FRONT_CENTER
Definition: channel_layout.h:52
AV_CODEC_ID_AAC
@ AV_CODEC_ID_AAC
Definition: codec_id.h:442
ff_mov_get_channel_config_from_layout
int ff_mov_get_channel_config_from_layout(const AVChannelLayout *layout, int *config)
Get ISO/IEC 23001-8 ChannelConfiguration from AVChannelLayout.
Definition: mov_chan.c:741
iso_Rs
@ iso_Rs
Definition: mov_chan.c:92
avio_rl32
unsigned int avio_rl32(AVIOContext *s)
Definition: aviobuf.c:730
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AV_CODEC_ID_PCM_S24LE
@ AV_CODEC_ID_PCM_S24LE
Definition: codec_id.h:340
iso_Cv
@ iso_Cv
Definition: mov_chan.c:96
MOV_CH_LAYOUT_AAC_6_1
@ MOV_CH_LAYOUT_AAC_6_1
Definition: mov_chan.h:99
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:303
CHLIST07
#define CHLIST07(_tag, _1, _2, _3, _4, _5, _6, _7)
Definition: mov_chan.c:133
AV_CHAN_LOW_FREQUENCY
@ AV_CHAN_LOW_FREQUENCY
Definition: channel_layout.h:53
size
int size
Definition: twinvq_data.h:10344
AV_CHAN_BACK_RIGHT
@ AV_CHAN_BACK_RIGHT
Definition: channel_layout.h:55
c_Vhl
@ c_Vhl
Definition: mov_chan.c:48
AV_CHAN_SIDE_LEFT
@ AV_CHAN_SIDE_LEFT
Definition: channel_layout.h:59
MOV_CH_LAYOUT_MPEG_7_1_A
@ MOV_CH_LAYOUT_MPEG_7_1_A
Definition: mov_chan.h:82
c_Lw
@ c_Lw
Definition: mov_chan.c:56
iso_Ts
@ iso_Ts
Definition: mov_chan.c:94
iso_Lc
@ iso_Lc
Definition: mov_chan.c:85
avio_r8
int avio_r8(AVIOContext *s)
Definition: aviobuf.c:603
av_channel_layout_retype
int av_channel_layout_retype(AVChannelLayout *channel_layout, enum AVChannelOrder order, int flags)
Change the AVChannelOrder of a channel layout.
Definition: channel_layout.c:877
MOV_CH_LAYOUT_DTS_6_1_A
@ MOV_CH_LAYOUT_DTS_6_1_A
Definition: mov_chan.h:128
MOV_CH_LAYOUT_MPEG_3_0_A
@ MOV_CH_LAYOUT_MPEG_3_0_A
Definition: mov_chan.h:69
c_LFE2
@ c_LFE2
Definition: mov_chan.c:60
AV_CHAN_TOP_FRONT_RIGHT
@ AV_CHAN_TOP_FRONT_RIGHT
Definition: channel_layout.h:64
AV_CHANNEL_ORDER_NATIVE
@ AV_CHANNEL_ORDER_NATIVE
The native channel order, i.e.
Definition: channel_layout.h:118
AV_CHAN_FRONT_LEFT_OF_CENTER
@ AV_CHAN_FRONT_LEFT_OF_CENTER
Definition: channel_layout.h:56
MOV_CH_LAYOUT_DVD_18
@ MOV_CH_LAYOUT_DVD_18
Definition: mov_chan.h:94
AV_CHAN_UNUSED
@ AV_CHAN_UNUSED
Channel is empty can be safely skipped.
Definition: channel_layout.h:84
c_Rrs
@ c_Rrs
Definition: mov_chan.c:41
av_channel_layout_custom_init
int av_channel_layout_custom_init(AVChannelLayout *channel_layout, int nb_channels)
Initialize a custom channel layout with the specified number of channels.
Definition: channel_layout.c:223
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
AVChannel
AVChannel
Definition: channel_layout.h:47
MOV_CH_LAYOUT_MPEG_5_0_D
@ MOV_CH_LAYOUT_MPEG_5_0_D
Definition: mov_chan.h:76
AV_CHAN_SURROUND_DIRECT_RIGHT
@ AV_CHAN_SURROUND_DIRECT_RIGHT
Definition: channel_layout.h:75
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
c_L
@ c_L
Definition: mov_chan.c:36
iso_L
@ iso_L
Definition: mov_chan.c:79
c_Rlt
@ c_Rlt
Definition: mov_chan.c:51
av_malloc_array
#define av_malloc_array(a, b)
Definition: tableprint_vlc.h:31
iso_Lss
@ iso_Lss
Definition: mov_chan.c:91
CHLIST03
#define CHLIST03(_tag, _1, _2, _3)
Definition: mov_chan.c:129
AV_CODEC_ID_PCM_F64BE
@ AV_CODEC_ID_PCM_F64BE
Definition: codec_id.h:350
MOV_CH_LAYOUT_MPEG_6_1_A
@ MOV_CH_LAYOUT_MPEG_6_1_A
Definition: mov_chan.h:81
AV_CODEC_ID_PCM_S32BE
@ AV_CODEC_ID_PCM_S32BE
Definition: codec_id.h:337
c_Rc
@ c_Rc
Definition: mov_chan.c:43
CHLIST06
#define CHLIST06(_tag, _1, _2, _3, _4, _5, _6)
Definition: mov_chan.c:132
MOV_CH_LAYOUT_AC3_2_1_1
@ MOV_CH_LAYOUT_AC3_2_1_1
Definition: mov_chan.h:108
AV_CHAN_STEREO_LEFT
@ AV_CHAN_STEREO_LEFT
Stereo downmix.
Definition: channel_layout.h:69
MOV_CH_LAYOUT_MPEG_4_0_B
@ MOV_CH_LAYOUT_MPEG_4_0_B
Definition: mov_chan.h:72
MovChannelLayoutMap::tag
uint32_t tag
Definition: mov_chan.c:120
MOV_CH_LAYOUT_MPEG_5_0_C
@ MOV_CH_LAYOUT_MPEG_5_0_C
Definition: mov_chan.h:75
iso_Lvss
@ iso_Lvss
Definition: mov_chan.c:108
mov_chan.h
tag
uint32_t tag
Definition: movenc.c:1787
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:743
c_Rsd
@ c_Rsd
Definition: mov_chan.c:59
c_W
@ c_W
Definition: mov_chan.c:66
MOV_CH_LAYOUT_DVD_4
@ MOV_CH_LAYOUT_DVD_4
Definition: mov_chan.h:89
c_LFE
@ c_LFE
Definition: mov_chan.c:39
id
enum AVCodecID id
Definition: dts2pts.c:365
AV_CHAN_BACK_CENTER
@ AV_CHAN_BACK_CENTER
Definition: channel_layout.h:58
iso_Lb
@ iso_Lb
Definition: mov_chan.c:111
AV_CHAN_NONE
@ AV_CHAN_NONE
Invalid channel index.
Definition: channel_layout.h:49
iso_Cvr
@ iso_Cvr
Definition: mov_chan.c:99
channel_layout.h
c_Lt
@ c_Lt
Definition: mov_chan.c:54
AV_CHAN_LOW_FREQUENCY_2
@ AV_CHAN_LOW_FREQUENCY_2
Definition: channel_layout.h:76
AV_CHAN_TOP_BACK_LEFT
@ AV_CHAN_TOP_BACK_LEFT
Definition: channel_layout.h:65
iso_Rvss
@ iso_Rvss
Definition: mov_chan.c:109
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:433
AV_CHAN_BACK_LEFT
@ AV_CHAN_BACK_LEFT
Definition: channel_layout.h:54
c_C
@ c_C
Definition: mov_chan.c:38
L
#define L(x)
Definition: vpx_arith.h:36
AVIOContext::eof_reached
int eof_reached
true if was unable to read due to error or eof
Definition: avio.h:238
MOV_CH_LAYOUT_MPEG_7_1_C
@ MOV_CH_LAYOUT_MPEG_7_1_C
Definition: mov_chan.h:84
AV_CHAN_BOTTOM_FRONT_CENTER
@ AV_CHAN_BOTTOM_FRONT_CENTER
Definition: channel_layout.h:79
avio_skip
int64_t avio_skip(AVIOContext *s, int64_t offset)
Skip given number of bytes forward.
Definition: aviobuf.c:318
MovChannelLayoutMap::id
enum AVChannel id
Definition: mov_chan.c:121
is_layout_valid_for_tag
static int is_layout_valid_for_tag(const AVChannelLayout *ch_layout, uint32_t tag, const struct MovChannelLayoutMap *map)
Definition: mov_chan.c:443
mov_ch_layouts_aac
static enum MovChannelLayoutTag mov_ch_layouts_aac[]
Definition: mov_chan.c:263
MOV_CH_LAYOUT_AAC_OCTAGONAL
@ MOV_CH_LAYOUT_AAC_OCTAGONAL
Definition: mov_chan.h:101
iso_channel_position
static enum AVChannel iso_channel_position[]
Definition: mov_chan.c:611
AV_CHAN_TOP_FRONT_CENTER
@ AV_CHAN_TOP_FRONT_CENTER
Definition: channel_layout.h:63
AV_CODEC_ID_PCM_S32LE
@ AV_CODEC_ID_PCM_S32LE
Definition: codec_id.h:336
MOV_CH_LAYOUT_DTS_3_1
@ MOV_CH_LAYOUT_DTS_3_1
Definition: mov_chan.h:123
mov_get_channel_label
static uint32_t mov_get_channel_label(enum AVChannel channel)
Definition: mov_chan.c:424
mem.h
AV_CHAN_WIDE_RIGHT
@ AV_CHAN_WIDE_RIGHT
Definition: channel_layout.h:73
AV_CODEC_ID_PCM_U8
@ AV_CODEC_ID_PCM_U8
Definition: codec_id.h:333
iso_Lvr
@ iso_Lvr
Definition: mov_chan.c:98
CHLIST02
#define CHLIST02(_tag, _1, _2)
Definition: mov_chan.c:128
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
MOV_CH_LAYOUT_AC3_3_1_1
@ MOV_CH_LAYOUT_AC3_3_1_1
Definition: mov_chan.h:109
AV_CODEC_ID_PCM_F64LE
@ AV_CODEC_ID_PCM_F64LE
Definition: codec_id.h:351
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
c_HI
@ c_HI
Definition: mov_chan.c:73
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
c_Ts
@ c_Ts
Definition: mov_chan.c:47
AV_CHAN_TOP_FRONT_LEFT
@ AV_CHAN_TOP_FRONT_LEFT
Definition: channel_layout.h:62
AV_CHAN_AMBISONIC_BASE
@ AV_CHAN_AMBISONIC_BASE
Range of channels between AV_CHAN_AMBISONIC_BASE and AV_CHAN_AMBISONIC_END represent Ambisonic compon...
Definition: channel_layout.h:101
ff_mov_read_chnl
int ff_mov_read_chnl(AVFormatContext *s, AVIOContext *pb, AVStream *st)
Read 'chnl' tag from the input stream.
Definition: mov_chan.c:797
AV_CODEC_ID_PCM_F32LE
@ AV_CODEC_ID_PCM_F32LE
Definition: codec_id.h:349
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
AV_CHAN_FRONT_LEFT
@ AV_CHAN_FRONT_LEFT
Definition: channel_layout.h:50
iso_R
@ iso_R
Definition: mov_chan.c:80
iso_Rvr
@ iso_Rvr
Definition: mov_chan.c:100
mov_ch_layouts_wav
static enum MovChannelLayoutTag mov_ch_layouts_wav[]
Definition: mov_chan.c:320
AV_CODEC_ID_PCM_S24BE
@ AV_CODEC_ID_PCM_S24BE
Definition: codec_id.h:341
mov_ch_layouts_ac3
static enum MovChannelLayoutTag mov_ch_layouts_ac3[]
Definition: mov_chan.c:290
AVChannelCustom::id
enum AVChannel id
Definition: channel_layout.h:268
channel
channel
Definition: ebur128.h:39
c_Y
@ c_Y
Definition: mov_chan.c:67
MOV_CH_LAYOUT_USE_BITMAP
@ MOV_CH_LAYOUT_USE_BITMAP
Definition: mov_chan.h:54
MOV_CH_LAYOUT_USE_DESCRIPTIONS
@ MOV_CH_LAYOUT_USE_DESCRIPTIONS
Definition: mov_chan.h:53
ff_mov_read_chan
int ff_mov_read_chan(AVFormatContext *s, AVIOContext *pb, AVStream *st, int64_t size)
Read 'chan' tag from the input stream.
Definition: mov_chan.c:526
iso_Rsd
@ iso_Rsd
Definition: mov_chan.c:106