~medibuntu-maintainers/mplayer/medibuntu.precise

« back to all changes in this revision

Viewing changes to ffmpeg/libavformat/mov_chan.c

  • Committer: Package Import Robot
  • Author(s): Reinhard Tartler
  • Date: 2012-01-12 22:23:28 UTC
  • mfrom: (0.4.7 sid)
  • mto: This revision was merged to the branch mainline in revision 76.
  • Revision ID: package-import@ubuntu.com-20120112222328-8jqdyodym3p84ygu
Tags: 2:1.0~rc4.dfsg1+svn34540-1
* New upstream snapshot
* upload to unstable

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
}