Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavformat
mov_chan.c
Go to the documentation of this file.
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
26
#include <stdint.h>
27
28
#include "
libavutil/audioconvert.h
"
29
#include "
libavcodec/avcodec.h
"
30
#include "
mov_chan.h
"
31
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
1
U
<< (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
}