~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavformat/mov_chan.c

  • Committer: Gauvain Pocentek
  • Date: 2012-03-06 11:59:12 UTC
  • mfrom: (66.1.15 precise)
  • Revision ID: gauvain@pocentek.net-20120306115912-h9d6kt9j0l532oo5
* Merge from Ubuntu:
  - put back faac support
  - recommends apport-hooks-medibuntu
  - change Maintainer, Uploaders & Vcs-* fields.
* New upstream snapshot
* upload to unstable
* Build against external libmpeg2
* drop 51_FTBFS_arm.patch again
* no longer build depend on libcdparanoia-dev on the Hurd
* Fix FTBFS on the hurd.
  Thanks to Samuel Thibault <sthibault@debian.org> (Closes: #654974)
* Fix FTBFS on arm
* New upstream snapshot, Closes: #650339, #643621, #481807
* Imported Upstream version 1.0~rc4+svn34492
* Bump standards version
* Bump dependency on libav >= 4:0.8~, Closes: #653887
* Fix build-indep
* Build mplayer-gui again, Closes: #568514
* Drop debian/all-lang-config-mak.sh, no longer needed
* include .dfsg1 in version number
* remove get-orig-source target
* no longer prune compiler flags from the environment
* No longer advertise nor build 3fdx, mga and dxr3 backends,
  Closes: #496106, #442181, #533546
* beautify mplayer version identification string
* Brown paperbag upload.
* Next try to fix build failure on sparce after recent binutils change.
* Brown paperbag upload.
* Really fix build failure on sparc after recent binutils change.
* Properly set Replaces/Conflicts on mplayer2{,-dbg} to avoid
  file overwrite errors.
* Adjust versioning of mplayer listed in the mplayer-dbg's Depends field.
* Fix build failure on sparc after recent binutils change.
* Urgency medium bumped because of RC-level bugfix
  and speeding up x264 transition.
* Update to my @debian.org email.
* Upload to unstable
* Enable joystick support on Linux only, Closes: #638408
* Rebuild fixes toolchain issue on arm, Closes: #637077
* New upstream snapshot
* following the discussion started by Diego Biurrun <diego@biurrun.de>
  in debian-devel, I have prepared a new packaging of 'mplayer'
  (with code that comes from CVS)
* the upstream tar.bz cannot be distributed by Debian, since it contains
   CSS code; so I am repackaging it 
* I have tried my best to address all known issues:
  - the package contains the detailed Copyright made by Diego Biurrun 
  - the package does not contain CSS code, or  AFAIK other code on which 
     there is active patent enforcement
  - there is a script  debian/cvs-changelog.sh  that shows all changes
     done to files included in this source.
    This should comply with GPLv2 sec 2.a  (in spirit if not in letter)
    For this reason, the source code contains CVS directories.
* needs   make (>= 3.80) for 'html-chunked-$(1)' in DOCS/xml/Makefile

* some corrections, as suggested Diego Biurrun
  - binary codecs should go into /usr/lib/codecs (upstream default)
  - better template 'mplayer/install_codecs'
  - an empty 'font=' in mplayer.conf breaks mplayer: postinst corrected
* correction in 'mplayer/cfgnote'
* better mplayer.postinst and mplayer.config

* New upstream release
* better debian/copyright file
* do not ship a skin
* New upstream release
* changed DEB_BUILD_OPTIONS to DEB_BUILD_CONFIGURE ,
  DEB_BUILD_OPTIONS is used as in debian policy
* use gcc-3.4
* changed xlibs-dev to a long list of dependencies, for Debian/etch
* try to adhere to  http://www.mplayerhq.hu/DOCS/tech/binary-packaging.txt
  (see README.Debian for details)
* removed dependency on xlibmesa-dev, disabled opengl
* New upstream release
* Simon McVittie <hacks@pseudorandom.co.uk> wonderful work:
- Work around Debian bug #267442 (glibc's sys/uio.h and gcc's altivec.h have
  conflicting uses for __vector) by re-ordering #includes
- Fix potential symlink attack in ./configure
- Disable support for binary codecs on platforms for which those codecs
  aren't available; also disable the corresponding Debconf note when it's
  inappropriate
- Changed Build-Depends: so it works in pbuilder
- Explicitly build-depend on libjpeg62-dev, libfontconfig1-dev,
  libungif4-dev 
- Tweak debian/rules to avoid certain errors being ignored
- Use --language=all
* provide a target  'debian/rules get-orig-source' 
  that recreates the orig.tar.gz ; then use the above orig.tar.gz
* rewrote some parts of debian/rules
* don't clean and recompile docs if upstream ships them
* mplayer-doc was shipping too much stuff
* translated man pages where not installed properly
* compile with libdv4-dev
* correct README.Debian
* Forgot build-dep on libtheora
* Must not depend on libxvidcore
* New upstream release
* new release.
* rc1 to become 0.90
* new pre-release
* new pre-release
* gtk bug fixed.
* new release.
* version bumped
* 0.60 pre2 release
* 0.60 pre-release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2011 Justin Ruggles
 
3
 *
 
4
 * This file is part of Libav.
 
5
 *
 
6
 * Libav 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
 * Libav 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 Libav; 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 <stdint.h>
 
27
 
 
28
#include "libavutil/audioconvert.h"
 
29
#include "libavcodec/avcodec.h"
 
30
#include "mov_chan.h"
 
31
 
 
32
/**
 
33
 * Channel Layout Tag
 
34
 * This tells which channels are present in the audio stream and the order in
 
35
 * which they appear.
 
36
 *
 
37
 * @note We're using the channel layout tag to indicate channel order
 
38
 *       when the value is greater than 0x10000. The Apple documentation has
 
39
 *       some contradictions as to how this is actually supposed to be handled.
 
40
 *
 
41
 *       Core Audio File Format Spec:
 
42
 *           "The high 16 bits indicates a specific ordering of the channels."
 
43
 *       Core Audio Data Types Reference:
 
44
 *           "These identifiers specify the channels included in a layout but
 
45
 *            do not specify a particular ordering of those channels."
 
46
 */
 
47
enum MovChannelLayoutTag {
 
48
    MOV_CH_LAYOUT_UNKNOWN               = 0xFFFF0000,
 
49
    MOV_CH_LAYOUT_USE_DESCRIPTIONS      = (  0 << 16) | 0,
 
50
    MOV_CH_LAYOUT_USE_BITMAP            = (  1 << 16) | 0,
 
51
    MOV_CH_LAYOUT_DISCRETEINORDER       = (147 << 16) | 0,
 
52
    MOV_CH_LAYOUT_MONO                  = (100 << 16) | 1,
 
53
    MOV_CH_LAYOUT_STEREO                = (101 << 16) | 2,
 
54
    MOV_CH_LAYOUT_STEREOHEADPHONES      = (102 << 16) | 2,
 
55
    MOV_CH_LAYOUT_MATRIXSTEREO          = (103 << 16) | 2,
 
56
    MOV_CH_LAYOUT_MIDSIDE               = (104 << 16) | 2,
 
57
    MOV_CH_LAYOUT_XY                    = (105 << 16) | 2,
 
58
    MOV_CH_LAYOUT_BINAURAL              = (106 << 16) | 2,
 
59
    MOV_CH_LAYOUT_AMBISONIC_B_FORMAT    = (107 << 16) | 4,
 
60
    MOV_CH_LAYOUT_QUADRAPHONIC          = (108 << 16) | 4,
 
61
    MOV_CH_LAYOUT_PENTAGONAL            = (109 << 16) | 5,
 
62
    MOV_CH_LAYOUT_HEXAGONAL             = (110 << 16) | 6,
 
63
    MOV_CH_LAYOUT_OCTAGONAL             = (111 << 16) | 8,
 
64
    MOV_CH_LAYOUT_CUBE                  = (112 << 16) | 8,
 
65
    MOV_CH_LAYOUT_MPEG_3_0_A            = (113 << 16) | 3,
 
66
    MOV_CH_LAYOUT_MPEG_3_0_B            = (114 << 16) | 3,
 
67
    MOV_CH_LAYOUT_MPEG_4_0_A            = (115 << 16) | 4,
 
68
    MOV_CH_LAYOUT_MPEG_4_0_B            = (116 << 16) | 4,
 
69
    MOV_CH_LAYOUT_MPEG_5_0_A            = (117 << 16) | 5,
 
70
    MOV_CH_LAYOUT_MPEG_5_0_B            = (118 << 16) | 5,
 
71
    MOV_CH_LAYOUT_MPEG_5_0_C            = (119 << 16) | 5,
 
72
    MOV_CH_LAYOUT_MPEG_5_0_D            = (120 << 16) | 5,
 
73
    MOV_CH_LAYOUT_MPEG_5_1_A            = (121 << 16) | 6,
 
74
    MOV_CH_LAYOUT_MPEG_5_1_B            = (122 << 16) | 6,
 
75
    MOV_CH_LAYOUT_MPEG_5_1_C            = (123 << 16) | 6,
 
76
    MOV_CH_LAYOUT_MPEG_5_1_D            = (124 << 16) | 6,
 
77
    MOV_CH_LAYOUT_MPEG_6_1_A            = (125 << 16) | 7,
 
78
    MOV_CH_LAYOUT_MPEG_7_1_A            = (126 << 16) | 8,
 
79
    MOV_CH_LAYOUT_MPEG_7_1_B            = (127 << 16) | 8,
 
80
    MOV_CH_LAYOUT_MPEG_7_1_C            = (128 << 16) | 8,
 
81
    MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1    = (129 << 16) | 8,
 
82
    MOV_CH_LAYOUT_SMPTE_DTV             = (130 << 16) | 8,
 
83
    MOV_CH_LAYOUT_ITU_2_1               = (131 << 16) | 3,
 
84
    MOV_CH_LAYOUT_ITU_2_2               = (132 << 16) | 4,
 
85
    MOV_CH_LAYOUT_DVD_4                 = (133 << 16) | 3,
 
86
    MOV_CH_LAYOUT_DVD_5                 = (134 << 16) | 4,
 
87
    MOV_CH_LAYOUT_DVD_6                 = (135 << 16) | 5,
 
88
    MOV_CH_LAYOUT_DVD_10                = (136 << 16) | 4,
 
89
    MOV_CH_LAYOUT_DVD_11                = (137 << 16) | 5,
 
90
    MOV_CH_LAYOUT_DVD_18                = (138 << 16) | 5,
 
91
    MOV_CH_LAYOUT_AUDIOUNIT_6_0         = (139 << 16) | 6,
 
92
    MOV_CH_LAYOUT_AUDIOUNIT_7_0         = (140 << 16) | 7,
 
93
    MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT   = (148 << 16) | 7,
 
94
    MOV_CH_LAYOUT_AAC_6_0               = (141 << 16) | 6,
 
95
    MOV_CH_LAYOUT_AAC_6_1               = (142 << 16) | 7,
 
96
    MOV_CH_LAYOUT_AAC_7_0               = (143 << 16) | 7,
 
97
    MOV_CH_LAYOUT_AAC_OCTAGONAL         = (144 << 16) | 8,
 
98
    MOV_CH_LAYOUT_TMH_10_2_STD          = (145 << 16) | 16,
 
99
    MOV_CH_LAYOUT_TMH_10_2_FULL         = (146 << 16) | 21,
 
100
    MOV_CH_LAYOUT_AC3_1_0_1             = (149 << 16) | 2,
 
101
    MOV_CH_LAYOUT_AC3_3_0               = (150 << 16) | 3,
 
102
    MOV_CH_LAYOUT_AC3_3_1               = (151 << 16) | 4,
 
103
    MOV_CH_LAYOUT_AC3_3_0_1             = (152 << 16) | 4,
 
104
    MOV_CH_LAYOUT_AC3_2_1_1             = (153 << 16) | 4,
 
105
    MOV_CH_LAYOUT_AC3_3_1_1             = (154 << 16) | 5,
 
106
    MOV_CH_LAYOUT_EAC3_6_0_A            = (155 << 16) | 6,
 
107
    MOV_CH_LAYOUT_EAC3_7_0_A            = (156 << 16) | 7,
 
108
    MOV_CH_LAYOUT_EAC3_6_1_A            = (157 << 16) | 7,
 
109
    MOV_CH_LAYOUT_EAC3_6_1_B            = (158 << 16) | 7,
 
110
    MOV_CH_LAYOUT_EAC3_6_1_C            = (159 << 16) | 7,
 
111
    MOV_CH_LAYOUT_EAC3_7_1_A            = (160 << 16) | 8,
 
112
    MOV_CH_LAYOUT_EAC3_7_1_B            = (161 << 16) | 8,
 
113
    MOV_CH_LAYOUT_EAC3_7_1_C            = (162 << 16) | 8,
 
114
    MOV_CH_LAYOUT_EAC3_7_1_D            = (163 << 16) | 8,
 
115
    MOV_CH_LAYOUT_EAC3_7_1_E            = (164 << 16) | 8,
 
116
    MOV_CH_LAYOUT_EAC3_7_1_F            = (165 << 16) | 8,
 
117
    MOV_CH_LAYOUT_EAC3_7_1_G            = (166 << 16) | 8,
 
118
    MOV_CH_LAYOUT_EAC3_7_1_H            = (167 << 16) | 8,
 
119
    MOV_CH_LAYOUT_DTS_3_1               = (168 << 16) | 4,
 
120
    MOV_CH_LAYOUT_DTS_4_1               = (169 << 16) | 5,
 
121
    MOV_CH_LAYOUT_DTS_6_0_A             = (170 << 16) | 6,
 
122
    MOV_CH_LAYOUT_DTS_6_0_B             = (171 << 16) | 6,
 
123
    MOV_CH_LAYOUT_DTS_6_0_C             = (172 << 16) | 6,
 
124
    MOV_CH_LAYOUT_DTS_6_1_A             = (173 << 16) | 7,
 
125
    MOV_CH_LAYOUT_DTS_6_1_B             = (174 << 16) | 7,
 
126
    MOV_CH_LAYOUT_DTS_6_1_C             = (175 << 16) | 7,
 
127
    MOV_CH_LAYOUT_DTS_6_1_D             = (182 << 16) | 7,
 
128
    MOV_CH_LAYOUT_DTS_7_0               = (176 << 16) | 7,
 
129
    MOV_CH_LAYOUT_DTS_7_1               = (177 << 16) | 8,
 
130
    MOV_CH_LAYOUT_DTS_8_0_A             = (178 << 16) | 8,
 
131
    MOV_CH_LAYOUT_DTS_8_0_B             = (179 << 16) | 8,
 
132
    MOV_CH_LAYOUT_DTS_8_1_A             = (180 << 16) | 9,
 
133
    MOV_CH_LAYOUT_DTS_8_1_B             = (181 << 16) | 9,
 
134
};
 
135
 
 
136
struct MovChannelLayoutMap {
 
137
    uint32_t tag;
 
138
    uint64_t layout;
 
139
};
 
140
 
 
141
static const struct MovChannelLayoutMap mov_ch_layout_map_misc[] = {
 
142
    { MOV_CH_LAYOUT_USE_DESCRIPTIONS,   0 },
 
143
    { MOV_CH_LAYOUT_USE_BITMAP,         0 },
 
144
    { MOV_CH_LAYOUT_DISCRETEINORDER,    0 },
 
145
    { MOV_CH_LAYOUT_UNKNOWN,            0 },
 
146
    { MOV_CH_LAYOUT_TMH_10_2_STD,       0 }, // L,   R,  C,    Vhc, Lsd, Rsd,
 
147
                                             // Ls,  Rs, Vhl,  Vhr, Lw,  Rw,
 
148
                                             // Csd, Cs, LFE1, LFE2
 
149
    { MOV_CH_LAYOUT_TMH_10_2_FULL,      0 }, // L,   R,  C,    Vhc,  Lsd, Rsd,
 
150
                                             // Ls,  Rs, Vhl,  Vhr,  Lw,  Rw,
 
151
                                             // Csd, Cs, LFE1, LFE2, Lc,  Rc,
 
152
                                             // HI,  VI, Haptic
 
153
    { 0, 0 },
 
154
};
 
155
 
 
156
static const struct MovChannelLayoutMap mov_ch_layout_map_1ch[] = {
 
157
    { MOV_CH_LAYOUT_MONO,               AV_CH_LAYOUT_MONO }, // C
 
158
};
 
159
 
 
160
static const struct MovChannelLayoutMap mov_ch_layout_map_2ch[] = {
 
161
    { MOV_CH_LAYOUT_STEREO,             AV_CH_LAYOUT_STEREO         }, // L, R
 
162
    { MOV_CH_LAYOUT_STEREOHEADPHONES,   AV_CH_LAYOUT_STEREO         }, // L, R
 
163
    { MOV_CH_LAYOUT_BINAURAL,           AV_CH_LAYOUT_STEREO         }, // L, R
 
164
    { MOV_CH_LAYOUT_MIDSIDE,            AV_CH_LAYOUT_STEREO         }, // C, sides
 
165
    { MOV_CH_LAYOUT_XY,                 AV_CH_LAYOUT_STEREO         }, // X (left), Y (right)
 
166
 
 
167
    { MOV_CH_LAYOUT_MATRIXSTEREO,       AV_CH_LAYOUT_STEREO_DOWNMIX }, // Lt, Rt
 
168
 
 
169
    { MOV_CH_LAYOUT_AC3_1_0_1,          AV_CH_LAYOUT_MONO |            // C, LFE
 
170
                                        AV_CH_LOW_FREQUENCY         },
 
171
    { 0, 0 },
 
172
};
 
173
 
 
174
static const struct MovChannelLayoutMap mov_ch_layout_map_3ch[] = {
 
175
    { MOV_CH_LAYOUT_MPEG_3_0_A,         AV_CH_LAYOUT_SURROUND }, // L, R, C
 
176
    { MOV_CH_LAYOUT_MPEG_3_0_B,         AV_CH_LAYOUT_SURROUND }, // C, L, R
 
177
    { MOV_CH_LAYOUT_AC3_3_0,            AV_CH_LAYOUT_SURROUND }, // L, C, R
 
178
 
 
179
    { MOV_CH_LAYOUT_ITU_2_1,            AV_CH_LAYOUT_2_1      }, // L, R, Cs
 
180
 
 
181
    { MOV_CH_LAYOUT_DVD_4,              AV_CH_LAYOUT_2POINT1  }, // L, R, LFE
 
182
    { 0, 0 },
 
183
};
 
184
 
 
185
static const struct MovChannelLayoutMap mov_ch_layout_map_4ch[] = {
 
186
    { MOV_CH_LAYOUT_AMBISONIC_B_FORMAT, 0 },                    // W, X, Y, Z
 
187
 
 
188
    { MOV_CH_LAYOUT_QUADRAPHONIC,       AV_CH_LAYOUT_QUAD    }, // L, R, Rls, Rrs
 
189
 
 
190
    { MOV_CH_LAYOUT_MPEG_4_0_A,         AV_CH_LAYOUT_4POINT0 }, // L, R, C, Cs
 
191
    { MOV_CH_LAYOUT_MPEG_4_0_B,         AV_CH_LAYOUT_4POINT0 }, // C, L, R, Cs
 
192
    { MOV_CH_LAYOUT_AC3_3_1,            AV_CH_LAYOUT_4POINT0 }, // L, C, R, Cs
 
193
 
 
194
    { MOV_CH_LAYOUT_ITU_2_2,            AV_CH_LAYOUT_2_2     }, // L, R, Ls, Rs
 
195
 
 
196
    { MOV_CH_LAYOUT_DVD_5,              AV_CH_LAYOUT_2_1 |      // L, R, LFE, Cs
 
197
                                        AV_CH_LOW_FREQUENCY  },
 
198
    { MOV_CH_LAYOUT_AC3_2_1_1,          AV_CH_LAYOUT_2_1 |      // L, R, Cs, LFE
 
199
                                        AV_CH_LOW_FREQUENCY  },
 
200
 
 
201
    { MOV_CH_LAYOUT_DVD_10,             AV_CH_LAYOUT_3POINT1 }, // L, R, C, LFE
 
202
    { MOV_CH_LAYOUT_AC3_3_0_1,          AV_CH_LAYOUT_3POINT1 }, // L, C, R, LFE
 
203
    { MOV_CH_LAYOUT_DTS_3_1,            AV_CH_LAYOUT_3POINT1 }, // C, L, R, LFE
 
204
    { 0, 0 },
 
205
};
 
206
 
 
207
static const struct MovChannelLayoutMap mov_ch_layout_map_5ch[] = {
 
208
    { MOV_CH_LAYOUT_PENTAGONAL,         AV_CH_LAYOUT_5POINT0_BACK }, // L, R, Rls, Rrs, C
 
209
 
 
210
    { MOV_CH_LAYOUT_MPEG_5_0_A,         AV_CH_LAYOUT_5POINT0 },      // L, R, C,  Ls, Rs
 
211
    { MOV_CH_LAYOUT_MPEG_5_0_B,         AV_CH_LAYOUT_5POINT0 },      // L, R, Ls, Rs, C
 
212
    { MOV_CH_LAYOUT_MPEG_5_0_C,         AV_CH_LAYOUT_5POINT0 },      // L, C, R,  Ls, Rs
 
213
    { MOV_CH_LAYOUT_MPEG_5_0_D,         AV_CH_LAYOUT_5POINT0 },      // C, L, R,  Ls, Rs
 
214
 
 
215
    { MOV_CH_LAYOUT_DVD_6,              AV_CH_LAYOUT_2_2 |           // L, R, LFE, Ls, Rs
 
216
                                        AV_CH_LOW_FREQUENCY },
 
217
    { MOV_CH_LAYOUT_DVD_18,             AV_CH_LAYOUT_2_2 |           // L, R, Ls, Rs, LFE
 
218
                                        AV_CH_LOW_FREQUENCY },
 
219
 
 
220
    { MOV_CH_LAYOUT_DVD_11,             AV_CH_LAYOUT_4POINT1 },      // L, R, C, LFE, Cs
 
221
    { MOV_CH_LAYOUT_AC3_3_1_1,          AV_CH_LAYOUT_4POINT1 },      // L, C, R, Cs,  LFE
 
222
    { MOV_CH_LAYOUT_DTS_4_1,            AV_CH_LAYOUT_4POINT1 },      // C, L, R, Cs,  LFE
 
223
    { 0, 0 },
 
224
};
 
225
 
 
226
static const struct MovChannelLayoutMap mov_ch_layout_map_6ch[] = {
 
227
    { MOV_CH_LAYOUT_HEXAGONAL,          AV_CH_LAYOUT_HEXAGONAL },      // L, R,  Rls, Rrs, C,   Cs
 
228
    { MOV_CH_LAYOUT_DTS_6_0_C,          AV_CH_LAYOUT_HEXAGONAL },      // C, Cs, L,   R,   Rls, Rrs
 
229
 
 
230
    { MOV_CH_LAYOUT_MPEG_5_1_A,         AV_CH_LAYOUT_5POINT1 },        // L, R, C,  LFE, Ls, Rs
 
231
    { MOV_CH_LAYOUT_MPEG_5_1_B,         AV_CH_LAYOUT_5POINT1 },        // L, R, Ls, Rs,  C,  LFE
 
232
    { MOV_CH_LAYOUT_MPEG_5_1_C,         AV_CH_LAYOUT_5POINT1 },        // L, C, R,  Ls,  Rs, LFE
 
233
    { MOV_CH_LAYOUT_MPEG_5_1_D,         AV_CH_LAYOUT_5POINT1 },        // C, L, R,  Ls,  Rs, LFE
 
234
 
 
235
    { MOV_CH_LAYOUT_AUDIOUNIT_6_0,      AV_CH_LAYOUT_6POINT0 },        // L, R, Ls, Rs, C,  Cs
 
236
    { MOV_CH_LAYOUT_AAC_6_0,            AV_CH_LAYOUT_6POINT0 },        // C, L, R,  Ls, Rs, Cs
 
237
    { MOV_CH_LAYOUT_EAC3_6_0_A,         AV_CH_LAYOUT_6POINT0 },        // L, C, R,  Ls, Rs, Cs
 
238
 
 
239
    { MOV_CH_LAYOUT_DTS_6_0_A,          AV_CH_LAYOUT_6POINT0_FRONT },  // Lc, Rc, L, R, Ls, Rs
 
240
 
 
241
    { MOV_CH_LAYOUT_DTS_6_0_B,          AV_CH_LAYOUT_5POINT0_BACK |    // C, L, R, Rls, Rrs, Ts
 
242
                                        AV_CH_TOP_CENTER },
 
243
    { 0, 0 },
 
244
};
 
245
 
 
246
static const struct MovChannelLayoutMap mov_ch_layout_map_7ch[] = {
 
247
    { MOV_CH_LAYOUT_MPEG_6_1_A,          AV_CH_LAYOUT_6POINT1 },        // L, R, C, LFE, Ls, Rs,  Cs
 
248
    { MOV_CH_LAYOUT_AAC_6_1,             AV_CH_LAYOUT_6POINT1 },        // C, L, R, Ls,  Rs, Cs,  LFE
 
249
    { MOV_CH_LAYOUT_EAC3_6_1_A,          AV_CH_LAYOUT_6POINT1 },        // L, C, R, Ls,  Rs, LFE, Cs
 
250
    { MOV_CH_LAYOUT_DTS_6_1_D,           AV_CH_LAYOUT_6POINT1 },        // C, L, R, Ls,  Rs, LFE, Cs
 
251
 
 
252
    { MOV_CH_LAYOUT_AUDIOUNIT_7_0,       AV_CH_LAYOUT_7POINT0 },        // L, R, Ls, Rs, C,  Rls, Rrs
 
253
    { MOV_CH_LAYOUT_AAC_7_0,             AV_CH_LAYOUT_7POINT0 },        // C, L, R,  Ls, Rs, Rls, Rrs
 
254
    { MOV_CH_LAYOUT_EAC3_7_0_A,          AV_CH_LAYOUT_7POINT0 },        // L, C, R,  Ls, Rs, Rls, Rrs
 
255
 
 
256
    { MOV_CH_LAYOUT_AUDIOUNIT_7_0_FRONT, AV_CH_LAYOUT_7POINT0_FRONT },  // L,  R, Ls, Rs, C, Lc, Rc
 
257
    { MOV_CH_LAYOUT_DTS_7_0,             AV_CH_LAYOUT_7POINT0_FRONT },  // Lc, C, Rc, L,  R, Ls, Rs
 
258
 
 
259
    { MOV_CH_LAYOUT_EAC3_6_1_B,          AV_CH_LAYOUT_5POINT1 |         // L, C, R, Ls, Rs, LFE, Ts
 
260
                                         AV_CH_TOP_CENTER },
 
261
 
 
262
    { MOV_CH_LAYOUT_EAC3_6_1_C,          AV_CH_LAYOUT_5POINT1 |         // L, C, R, Ls, Rs, LFE, Vhc
 
263
                                         AV_CH_TOP_FRONT_CENTER },
 
264
 
 
265
    { MOV_CH_LAYOUT_DTS_6_1_A,           AV_CH_LAYOUT_6POINT1_FRONT },  // Lc, Rc, L, R, Ls, Rs, LFE
 
266
 
 
267
    { MOV_CH_LAYOUT_DTS_6_1_B,           AV_CH_LAYOUT_5POINT1_BACK |    // C, L, R, Rls, Rrs, Ts, LFE
 
268
                                         AV_CH_TOP_CENTER },
 
269
 
 
270
    { MOV_CH_LAYOUT_DTS_6_1_C,           AV_CH_LAYOUT_6POINT1_BACK },   // C, Cs, L, R, Rls, Rrs, LFE
 
271
    { 0, 0 },
 
272
};
 
273
 
 
274
static const struct MovChannelLayoutMap mov_ch_layout_map_8ch[] = {
 
275
    { MOV_CH_LAYOUT_OCTAGONAL,           AV_CH_LAYOUT_OCTAGONAL },      // L, R, Rls, Rrs, C,  Cs,  Ls,  Rs
 
276
    { MOV_CH_LAYOUT_AAC_OCTAGONAL,       AV_CH_LAYOUT_OCTAGONAL },      // C, L, R,   Ls,  Rs, Rls, Rrs, Cs
 
277
 
 
278
    { MOV_CH_LAYOUT_CUBE,                AV_CH_LAYOUT_QUAD     |        // L, R, Rls, Rrs, Vhl, Vhr, Rlt, Rrt
 
279
                                         AV_CH_TOP_FRONT_LEFT  |
 
280
                                         AV_CH_TOP_FRONT_RIGHT |
 
281
                                         AV_CH_TOP_BACK_LEFT   |
 
282
                                         AV_CH_TOP_BACK_RIGHT },
 
283
 
 
284
    { MOV_CH_LAYOUT_MPEG_7_1_A,          AV_CH_LAYOUT_7POINT1_WIDE },   // L,  R,  C,  LFE, Ls, Rs,  Lc, Rc
 
285
    { MOV_CH_LAYOUT_MPEG_7_1_B,          AV_CH_LAYOUT_7POINT1_WIDE },   // C,  Lc, Rc, L,   R,  Ls,  Rs, LFE
 
286
    { MOV_CH_LAYOUT_EMAGIC_DEFAULT_7_1,  AV_CH_LAYOUT_7POINT1_WIDE },   // L,  R,  Ls, Rs,  C,  LFE, Lc, Rc
 
287
    { MOV_CH_LAYOUT_EAC3_7_1_B,          AV_CH_LAYOUT_7POINT1_WIDE },   // L,  C,  R,  Ls,  Rs, LFE, Lc, Rc
 
288
    { MOV_CH_LAYOUT_DTS_7_1,             AV_CH_LAYOUT_7POINT1_WIDE },   // Lc, C,  Rc, L,   R,  Ls,  Rs, LFE
 
289
 
 
290
    { MOV_CH_LAYOUT_MPEG_7_1_C,          AV_CH_LAYOUT_7POINT1 },        // L, R, C, LFE, Ls, Rs,  Rls, Rrs
 
291
    { MOV_CH_LAYOUT_EAC3_7_1_A,          AV_CH_LAYOUT_7POINT1 },        // L, C, R, Ls,  Rs, LFE, Rls, Rrs
 
292
 
 
293
    { MOV_CH_LAYOUT_SMPTE_DTV,           AV_CH_LAYOUT_5POINT1 |         // L, R, C, LFE, Ls, Rs, Lt, Rt
 
294
                                         AV_CH_LAYOUT_STEREO_DOWNMIX },
 
295
 
 
296
    { MOV_CH_LAYOUT_EAC3_7_1_C,          AV_CH_LAYOUT_5POINT1        |  // L, C, R, Ls, Rs, LFE, Lsd, Rsd
 
297
                                         AV_CH_SURROUND_DIRECT_LEFT  |
 
298
                                         AV_CH_SURROUND_DIRECT_RIGHT },
 
299
 
 
300
    { MOV_CH_LAYOUT_EAC3_7_1_D,          AV_CH_LAYOUT_5POINT1 |         // L, C, R, Ls, Rs, LFE, Lw, Rw
 
301
                                         AV_CH_WIDE_LEFT      |
 
302
                                         AV_CH_WIDE_RIGHT },
 
303
 
 
304
    { MOV_CH_LAYOUT_EAC3_7_1_E,          AV_CH_LAYOUT_5POINT1 |         // L, C, R, Ls, Rs, LFE, Vhl, Vhr
 
305
                                         AV_CH_TOP_FRONT_LEFT |
 
306
                                         AV_CH_TOP_FRONT_RIGHT },
 
307
 
 
308
    { MOV_CH_LAYOUT_EAC3_7_1_F,          AV_CH_LAYOUT_5POINT1 |         // L, C, R, Ls, Rs, LFE, Cs, Ts
 
309
                                         AV_CH_BACK_CENTER    |
 
310
                                         AV_CH_TOP_CENTER },
 
311
 
 
312
    { MOV_CH_LAYOUT_EAC3_7_1_G,          AV_CH_LAYOUT_5POINT1 |         // L, C, R, Ls, Rs, LFE, Cs, Vhc
 
313
                                         AV_CH_BACK_CENTER    |
 
314
                                         AV_CH_TOP_FRONT_CENTER },
 
315
 
 
316
    { MOV_CH_LAYOUT_EAC3_7_1_H,          AV_CH_LAYOUT_5POINT1 |         // L, C, R, Ls, Rs, LFE, Ts, Vhc
 
317
                                         AV_CH_TOP_CENTER     |
 
318
                                         AV_CH_TOP_FRONT_CENTER },
 
319
 
 
320
    { MOV_CH_LAYOUT_DTS_8_0_A,           AV_CH_LAYOUT_2_2           |   // Lc, Rc, L, R, Ls, Rs, Rls, Rrs
 
321
                                         AV_CH_BACK_LEFT            |
 
322
                                         AV_CH_BACK_RIGHT           |
 
323
                                         AV_CH_FRONT_LEFT_OF_CENTER |
 
324
                                         AV_CH_FRONT_RIGHT_OF_CENTER },
 
325
 
 
326
    { MOV_CH_LAYOUT_DTS_8_0_B,           AV_CH_LAYOUT_5POINT0        |  // Lc, C, Rc, L, R, Ls, Cs, Rs
 
327
                                         AV_CH_FRONT_LEFT_OF_CENTER  |
 
328
                                         AV_CH_FRONT_RIGHT_OF_CENTER |
 
329
                                         AV_CH_BACK_CENTER },
 
330
    { 0, 0 },
 
331
};
 
332
 
 
333
static const struct MovChannelLayoutMap mov_ch_layout_map_9ch[] = {
 
334
    { MOV_CH_LAYOUT_DTS_8_1_A,           AV_CH_LAYOUT_2_2            | // Lc, Rc, L, R, Ls, Rs, Rls, Rrs, LFE
 
335
                                         AV_CH_BACK_LEFT             |
 
336
                                         AV_CH_BACK_RIGHT            |
 
337
                                         AV_CH_FRONT_LEFT_OF_CENTER  |
 
338
                                         AV_CH_FRONT_RIGHT_OF_CENTER |
 
339
                                         AV_CH_LOW_FREQUENCY },
 
340
 
 
341
    { MOV_CH_LAYOUT_DTS_8_1_B,           AV_CH_LAYOUT_7POINT1_WIDE   | // Lc, C, Rc, L, R, Ls, Cs, Rs, LFE
 
342
                                         AV_CH_BACK_CENTER },
 
343
    { 0, 0 },
 
344
};
 
345
 
 
346
static const struct MovChannelLayoutMap *mov_ch_layout_map[] = {
 
347
    mov_ch_layout_map_misc,
 
348
    mov_ch_layout_map_1ch,
 
349
    mov_ch_layout_map_2ch,
 
350
    mov_ch_layout_map_3ch,
 
351
    mov_ch_layout_map_4ch,
 
352
    mov_ch_layout_map_5ch,
 
353
    mov_ch_layout_map_6ch,
 
354
    mov_ch_layout_map_7ch,
 
355
    mov_ch_layout_map_8ch,
 
356
    mov_ch_layout_map_9ch,
 
357
};
 
358
 
 
359
static const enum MovChannelLayoutTag mov_ch_layouts_aac[] = {
 
360
    MOV_CH_LAYOUT_MONO,
 
361
    MOV_CH_LAYOUT_STEREO,
 
362
    MOV_CH_LAYOUT_AC3_1_0_1,
 
363
    MOV_CH_LAYOUT_MPEG_3_0_B,
 
364
    MOV_CH_LAYOUT_ITU_2_1,
 
365
    MOV_CH_LAYOUT_DVD_4,
 
366
    MOV_CH_LAYOUT_QUADRAPHONIC,
 
367
    MOV_CH_LAYOUT_MPEG_4_0_B,
 
368
    MOV_CH_LAYOUT_ITU_2_2,
 
369
    MOV_CH_LAYOUT_AC3_2_1_1,
 
370
    MOV_CH_LAYOUT_DTS_3_1,
 
371
    MOV_CH_LAYOUT_MPEG_5_0_D,
 
372
    MOV_CH_LAYOUT_DVD_18,
 
373
    MOV_CH_LAYOUT_DTS_4_1,
 
374
    MOV_CH_LAYOUT_MPEG_5_1_D,
 
375
    MOV_CH_LAYOUT_AAC_6_0,
 
376
    MOV_CH_LAYOUT_DTS_6_0_A,
 
377
    MOV_CH_LAYOUT_AAC_6_1,
 
378
    MOV_CH_LAYOUT_AAC_7_0,
 
379
    MOV_CH_LAYOUT_DTS_6_1_A,
 
380
    MOV_CH_LAYOUT_AAC_OCTAGONAL,
 
381
    MOV_CH_LAYOUT_MPEG_7_1_B,
 
382
    MOV_CH_LAYOUT_DTS_8_0_A,
 
383
    0,
 
384
};
 
385
 
 
386
static const enum MovChannelLayoutTag mov_ch_layouts_ac3[] = {
 
387
    MOV_CH_LAYOUT_MONO,
 
388
    MOV_CH_LAYOUT_STEREO,
 
389
    MOV_CH_LAYOUT_AC3_1_0_1,
 
390
    MOV_CH_LAYOUT_AC3_3_0,
 
391
    MOV_CH_LAYOUT_ITU_2_1,
 
392
    MOV_CH_LAYOUT_DVD_4,
 
393
    MOV_CH_LAYOUT_AC3_3_1,
 
394
    MOV_CH_LAYOUT_ITU_2_2,
 
395
    MOV_CH_LAYOUT_AC3_2_1_1,
 
396
    MOV_CH_LAYOUT_AC3_3_0_1,
 
397
    MOV_CH_LAYOUT_MPEG_5_0_C,
 
398
    MOV_CH_LAYOUT_DVD_18,
 
399
    MOV_CH_LAYOUT_AC3_3_1_1,
 
400
    MOV_CH_LAYOUT_MPEG_5_1_C,
 
401
    0,
 
402
};
 
403
 
 
404
static const enum MovChannelLayoutTag mov_ch_layouts_alac[] = {
 
405
    MOV_CH_LAYOUT_MONO,
 
406
    MOV_CH_LAYOUT_STEREO,
 
407
    MOV_CH_LAYOUT_MPEG_3_0_B,
 
408
    MOV_CH_LAYOUT_MPEG_4_0_B,
 
409
    MOV_CH_LAYOUT_MPEG_5_0_D,
 
410
    MOV_CH_LAYOUT_MPEG_5_1_D,
 
411
    MOV_CH_LAYOUT_AAC_6_1,
 
412
    MOV_CH_LAYOUT_MPEG_7_1_B,
 
413
    0,
 
414
};
 
415
 
 
416
static const struct {
 
417
    enum CodecID codec_id;
 
418
    const enum MovChannelLayoutTag *layouts;
 
419
} mov_codec_ch_layouts[] = {
 
420
    { CODEC_ID_AAC,     mov_ch_layouts_aac      },
 
421
    { CODEC_ID_AC3,     mov_ch_layouts_ac3      },
 
422
    { CODEC_ID_ALAC,    mov_ch_layouts_alac     },
 
423
    { CODEC_ID_NONE,    NULL                    },
 
424
};
 
425
 
 
426
uint64_t ff_mov_get_channel_layout(uint32_t tag, uint32_t bitmap)
 
427
{
 
428
    int i, channels;
 
429
    const struct MovChannelLayoutMap *layout_map;
 
430
 
 
431
    /* use ff_mov_get_channel_label() to build a layout instead */
 
432
    if (tag == MOV_CH_LAYOUT_USE_DESCRIPTIONS)
 
433
        return 0;
 
434
 
 
435
    /* handle the use of the channel bitmap */
 
436
    if (tag == MOV_CH_LAYOUT_USE_BITMAP)
 
437
        return bitmap < 0x40000 ? bitmap : 0;
 
438
 
 
439
    /* get the layout map based on the channel count for the specified layout tag */
 
440
    channels = tag & 0xFFFF;
 
441
    if (channels > 9)
 
442
        channels = 0;
 
443
    layout_map = mov_ch_layout_map[channels];
 
444
 
 
445
    /* find the channel layout for the specified layout tag */
 
446
    for (i = 0; layout_map[i].tag != 0; i++) {
 
447
        if (layout_map[i].tag == tag)
 
448
            break;
 
449
    }
 
450
    return layout_map[i].layout;
 
451
}
 
452
 
 
453
uint32_t ff_mov_get_channel_label(uint32_t label)
 
454
{
 
455
    if (label == 0)
 
456
        return 0;
 
457
    if (label <= 18)
 
458
        return 1U << (label - 1);
 
459
    if (label == 38)
 
460
        return AV_CH_STEREO_LEFT;
 
461
    if (label == 39)
 
462
        return AV_CH_STEREO_RIGHT;
 
463
    return 0;
 
464
}
 
465
 
 
466
uint32_t ff_mov_get_channel_layout_tag(enum CodecID codec_id,
 
467
                                       uint64_t channel_layout,
 
468
                                       uint32_t *bitmap)
 
469
{
 
470
    int i, j;
 
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 != CODEC_ID_NONE; i++) {
 
476
        if (mov_codec_ch_layouts[i].codec_id == codec_id)
 
477
            break;
 
478
    }
 
479
    if (mov_codec_ch_layouts[i].codec_id != CODEC_ID_NONE)
 
480
        layouts = mov_codec_ch_layouts[i].layouts;
 
481
 
 
482
    if (layouts) {
 
483
        int channels;
 
484
        const struct MovChannelLayoutMap *layout_map;
 
485
 
 
486
        /* get the layout map based on the channel count */
 
487
        channels = av_get_channel_layout_nb_channels(channel_layout);
 
488
        if (channels > 9)
 
489
            channels = 0;
 
490
        layout_map = mov_ch_layout_map[channels];
 
491
 
 
492
        /* find the layout tag for the specified channel layout */
 
493
        for (i = 0; layouts[i] != 0; i++) {
 
494
            if (layouts[i] & 0xFFFF != channels)
 
495
                continue;
 
496
            for (j = 0; layout_map[j].tag != 0; j++) {
 
497
                if (layout_map[j].tag    == layouts[i] &&
 
498
                    layout_map[j].layout == channel_layout)
 
499
                    break;
 
500
            }
 
501
            if (layout_map[j].tag)
 
502
                break;
 
503
        }
 
504
        tag = layouts[i];
 
505
    }
 
506
 
 
507
    /* if no tag was found, use channel bitmap as a backup if possible */
 
508
    if (tag == 0 && channel_layout > 0 && channel_layout < 0x40000) {
 
509
        tag     = MOV_CH_LAYOUT_USE_BITMAP;
 
510
        *bitmap = (uint32_t)channel_layout;
 
511
    } else
 
512
        *bitmap = 0;
 
513
 
 
514
    /* TODO: set channel descriptions as a secondary backup */
 
515
 
 
516
    return tag;
 
517
}