demux: mp4: update coreaudio definitions
[vlc.git] / modules / demux / mp4 / coreaudio.h
blob9ba7fb3a9ea4f140ba873ae34c760b50c521fcbb
1 /*****************************************************************************
2 * coreaudio.h : CoreAudio definitions for vlc
3 *****************************************************************************
4 * Copyright (C) 2014-2018 VideoLabs, VLC authors and VideoLAN
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program 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
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
20 #ifndef VLC_DEMUX_COREAUDIO_H
21 #define VLC_DEMUX_COREAUDIO_H
22 #include <vlc_aout.h>
24 struct CoreAudio_layout_s
26 uint32_t i_channels_layout_tag;
27 uint32_t i_channels_bitmap;
28 uint32_t i_channels_description_count;
29 struct
31 uint32_t i_channel_label;
32 uint32_t i_channel_flags;
33 float f_coordinates[3];
34 } *p_descriptions;
37 static inline void CoreAudio_Layout_Clean(struct CoreAudio_layout_s *c)
39 free( c->p_descriptions );
42 /* According to Apple's CoreAudio_Bitmap/CoreAudio_BitmapTypes.h */
43 enum
45 CoreAudio_Bitmap_LEFT = (1<<0),
46 CoreAudio_Bitmap_RIGHT = (1<<1),
47 CoreAudio_Bitmap_CENTER = (1<<2),
48 CoreAudio_Bitmap_LFESCREEN = (1<<3),
49 CoreAudio_Bitmap_LEFTSURROUND = (1<<4),
50 CoreAudio_Bitmap_RIGHTSURROUND = (1<<5),
51 CoreAudio_Bitmap_LEFTCENTER = (1<<6),
52 CoreAudio_Bitmap_RIGHTCENTER = (1<<7),
53 CoreAudio_Bitmap_CENTERSURROUND = (1<<8),
54 CoreAudio_Bitmap_LEFTSURROUNDDIRECT = (1<<9),
55 CoreAudio_Bitmap_RIGHTSURROUNDDIRECT = (1<<10),
56 CoreAudio_Bitmap_TOPCENTERSURROUND = (1<<11),
57 CoreAudio_Bitmap_VHEIGHTLEFT = (1<<12),
58 CoreAudio_Bitmap_VHEIGHTCENTER = (1<<13),
59 CoreAudio_Bitmap_VHEIGHTRIGHT = (1<<14),
60 CoreAudio_Bitmap_TOPBACKLEFT = (1<<15),
61 CoreAudio_Bitmap_TOPBACKCENTER = (1<<16),
62 CoreAudio_Bitmap_TOPBACKRIGHT = (1<<17),
63 CoreAudio_Bitmap_LEFTTOPFRONT = CoreAudio_Bitmap_VHEIGHTLEFT,
64 CoreAudio_Bitmap_CENTERTOPFRONT = CoreAudio_Bitmap_VHEIGHTCENTER,
65 CoreAudio_Bitmap_RIGHTTOPFRONT = CoreAudio_Bitmap_VHEIGHTRIGHT,
66 CoreAudio_Bitmap_LEFTTOPMIDDLE = (1<<21),
67 CoreAudio_Bitmap_CENTERTOPMIDDLE = CoreAudio_Bitmap_TOPCENTERSURROUND,
68 CoreAudio_Bitmap_RIGHTTOPMIDDLE = (1<<23),
69 CoreAudio_Bitmap_LEFTTOPREAR = (1<<24),
70 CoreAudio_Bitmap_CENTERTOPREAR = (1<<25),
71 CoreAudio_Bitmap_RIGHTTOPREAR = (1<<26),
74 static const uint32_t pi_vlc_chan_order_CoreAudio[] =
76 AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
77 AOUT_CHAN_LFE,
78 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
79 AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_REARCENTER,
80 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
84 static const struct
86 uint32_t i_bitmap;
87 uint32_t i_vlc_bitmap;
88 } CoreAudio_Bitmap_mapping[] = {
89 { CoreAudio_Bitmap_LEFT, AOUT_CHAN_LEFT },
90 { CoreAudio_Bitmap_RIGHT, AOUT_CHAN_RIGHT },
91 { CoreAudio_Bitmap_CENTER, AOUT_CHAN_CENTER },
92 { CoreAudio_Bitmap_LFESCREEN, AOUT_CHAN_LFE },
93 { CoreAudio_Bitmap_LEFTSURROUND, AOUT_CHAN_REARLEFT },
94 { CoreAudio_Bitmap_RIGHTSURROUND, AOUT_CHAN_REARRIGHT },
95 { CoreAudio_Bitmap_LEFTCENTER, AOUT_CHAN_LEFT },
96 { CoreAudio_Bitmap_RIGHTCENTER, AOUT_CHAN_RIGHT },
97 { CoreAudio_Bitmap_CENTERSURROUND, AOUT_CHAN_REARCENTER },
98 { CoreAudio_Bitmap_LEFTSURROUNDDIRECT, AOUT_CHAN_MIDDLELEFT },
99 { CoreAudio_Bitmap_RIGHTSURROUNDDIRECT, AOUT_CHAN_MIDDLERIGHT },
100 { CoreAudio_Bitmap_TOPCENTERSURROUND, 0 },
101 { CoreAudio_Bitmap_VHEIGHTLEFT, 0 },
102 { CoreAudio_Bitmap_VHEIGHTCENTER,0 },
103 { CoreAudio_Bitmap_VHEIGHTRIGHT,0 },
104 { CoreAudio_Bitmap_TOPBACKLEFT, 0 },
105 { CoreAudio_Bitmap_TOPBACKCENTER,0 },
106 { CoreAudio_Bitmap_TOPBACKRIGHT, 0 },
107 // CoreAudio_Bitmap_LEFTTOPFRONT
108 // CoreAudio_Bitmap_CENTERTOPFRONT
109 // CoreAudio_Bitmap_RIGHTTOPFRONT
110 { CoreAudio_Bitmap_LEFTTOPMIDDLE, 0 },
111 // CoreAudio_Bitmap_CENTERTOPMIDDLE
112 { CoreAudio_Bitmap_RIGHTTOPMIDDLE, 0 },
113 { CoreAudio_Bitmap_LEFTTOPREAR, 0 },
114 { CoreAudio_Bitmap_CENTERTOPREAR, 0 },
115 { CoreAudio_Bitmap_RIGHTTOPREAR, 0 },
118 enum CoreAudio_Layout
120 CoreAudio_Layout_DESC = 0,
121 CoreAudio_Layout_BITMAP = (1<<16),
123 CoreAudio_Layout_Mono = (100<<16) | 1,
124 CoreAudio_Layout_Stereo = (101<<16) | 2,
125 CoreAudio_Layout_StereoHeadphones = (102<<16) | 2,
126 CoreAudio_Layout_MatrixStereo = (103<<16) | 2,
127 CoreAudio_Layout_MidSide = (104<<16) | 2,
128 CoreAudio_Layout_XY = (105<<16) | 2,
129 CoreAudio_Layout_Binaural = (106<<16) | 2,
130 CoreAudio_Layout_Ambisonic_B_Format = (107<<16) | 4,
132 CoreAudio_Layout_Quadraphonic = (108<<16) | 4,
133 CoreAudio_Layout_Pentagonal = (109<<16) | 5,
134 CoreAudio_Layout_Hexagonal = (110<<16) | 6,
135 CoreAudio_Layout_Octagonal = (111<<16) | 8,
136 CoreAudio_Layout_Cube = (112<<16) | 8,
138 CoreAudio_Layout_MPEG_1_0 = CoreAudio_Layout_Mono,// C
139 CoreAudio_Layout_MPEG_2_0 = CoreAudio_Layout_Stereo, // L R
140 CoreAudio_Layout_MPEG_3_0_A = (113<<16) | 3, // L R C
141 CoreAudio_Layout_MPEG_3_0_B = (114<<16) | 3, // C L R
142 CoreAudio_Layout_MPEG_4_0_A = (115<<16) | 4, // L R C Cs
143 CoreAudio_Layout_MPEG_4_0_B = (116<<16) | 4, // C L R Cs
144 CoreAudio_Layout_MPEG_5_0_A = (117<<16) | 5, // L R C Ls Rs
145 CoreAudio_Layout_MPEG_5_0_B = (118<<16) | 5, // L R Ls Rs C
146 CoreAudio_Layout_MPEG_5_0_C = (119<<16) | 5, // L C R Ls Rs
147 CoreAudio_Layout_MPEG_5_0_D = (120<<16) | 5, // C L R Ls Rs
148 CoreAudio_Layout_MPEG_5_1_A = (121<<16) | 6, // L R C LFE Ls Rs
149 CoreAudio_Layout_MPEG_5_1_B = (122<<16) | 6, // L R Ls Rs C LFE
150 CoreAudio_Layout_MPEG_5_1_C = (123<<16) | 6, // L C R Ls Rs LFE
151 CoreAudio_Layout_MPEG_5_1_D = (124<<16) | 6, // C L R Ls Rs LFE
152 CoreAudio_Layout_MPEG_6_1_A = (125<<16) | 7, // L R C LFE Ls Rs Cs
153 CoreAudio_Layout_MPEG_7_1_A = (126<<16) | 8, // L R C LFE Ls Rs Lc Rc
154 CoreAudio_Layout_MPEG_7_1_B = (127<<16) | 8, // C Lc Rc L R Ls Rs LFE (13818-7 table 42)
155 CoreAudio_Layout_MPEG_7_1_C = (128<<16) | 8, // L R C LFE Ls Rs Rls Rrs
156 CoreAudio_Layout_Emagic_Default_7_1 = (129<<16) | 8, // L R Ls Rs C LFE Lc Rc
157 CoreAudio_Layout_SMPTE_DTV = (130<<16) | 8, // L R C LFE Ls Rs Lt Rt
159 CoreAudio_Layout_ITU_1_0 = CoreAudio_Layout_Mono,// C
160 CoreAudio_Layout_ITU_2_0 = CoreAudio_Layout_Stereo, // L R
162 CoreAudio_Layout_ITU_2_1 = (131<<16) | 3, // L R Cs
163 CoreAudio_Layout_ITU_2_2 = (132<<16) | 4, // L R Ls Rs
164 CoreAudio_Layout_ITU_3_0 = CoreAudio_Layout_MPEG_3_0_A,// L R C
165 CoreAudio_Layout_ITU_3_1 = CoreAudio_Layout_MPEG_4_0_A,// L R C Cs
167 CoreAudio_Layout_ITU_3_2 = CoreAudio_Layout_MPEG_5_0_A,// L R C Ls Rs
168 CoreAudio_Layout_ITU_3_2_1 = CoreAudio_Layout_MPEG_5_1_A,// L R C LFE Ls Rs
169 CoreAudio_Layout_ITU_3_4_1 = CoreAudio_Layout_MPEG_7_1_C,// L R C LFE Ls Rs Rls Rrs
171 CoreAudio_Layout_DVD_0 = CoreAudio_Layout_Mono,// C (mono)
172 CoreAudio_Layout_DVD_1 = CoreAudio_Layout_Stereo, // L R
173 CoreAudio_Layout_DVD_2 = CoreAudio_Layout_ITU_2_1,// L R Cs
174 CoreAudio_Layout_DVD_3 = CoreAudio_Layout_ITU_2_2,// L R Ls Rs
175 CoreAudio_Layout_DVD_4 = (133<<16) | 3, // L R LFE
176 CoreAudio_Layout_DVD_5 = (134<<16) | 4, // L R LFE Cs
177 CoreAudio_Layout_DVD_6 = (135<<16) | 5, // L R LFE Ls Rs
178 CoreAudio_Layout_DVD_7 = CoreAudio_Layout_MPEG_3_0_A,// L R C
179 CoreAudio_Layout_DVD_8 = CoreAudio_Layout_MPEG_4_0_A,// L R C Cs
180 CoreAudio_Layout_DVD_9 = CoreAudio_Layout_MPEG_5_0_A,// L R C Ls Rs
181 CoreAudio_Layout_DVD_10 = (136<<16) | 4, // L R C LFE
182 CoreAudio_Layout_DVD_11 = (137<<16) | 5, // L R C LFE Cs
183 CoreAudio_Layout_DVD_12 = CoreAudio_Layout_MPEG_5_1_A,// L R C LFE Ls Rs
184 CoreAudio_Layout_DVD_13 = CoreAudio_Layout_DVD_8, // L R C Cs
185 CoreAudio_Layout_DVD_14 = CoreAudio_Layout_DVD_9, // L R C Ls Rs
186 CoreAudio_Layout_DVD_15 = CoreAudio_Layout_DVD_10, // L R C LFE
187 CoreAudio_Layout_DVD_16 = CoreAudio_Layout_DVD_11, // L R C LFE Cs
188 CoreAudio_Layout_DVD_17 = CoreAudio_Layout_DVD_12, // L R C LFE Ls Rs
189 CoreAudio_Layout_DVD_18 = (138<<16) | 5, // L R Ls Rs LFE
190 CoreAudio_Layout_DVD_19 = CoreAudio_Layout_MPEG_5_0_B,// L R Ls Rs C
191 CoreAudio_Layout_DVD_20 = CoreAudio_Layout_MPEG_5_1_B,// L R Ls Rs C LFE
193 CoreAudio_Layout_AudioUnit_4 = CoreAudio_Layout_Quadraphonic,
194 CoreAudio_Layout_AudioUnit_5 = CoreAudio_Layout_Pentagonal,
195 CoreAudio_Layout_AudioUnit_6 = CoreAudio_Layout_Hexagonal,
196 CoreAudio_Layout_AudioUnit_8 = CoreAudio_Layout_Octagonal,
198 CoreAudio_Layout_AudioUnit_5_0 = CoreAudio_Layout_MPEG_5_0_B,// L R Ls Rs C
199 CoreAudio_Layout_AudioUnit_6_0 = (139<<16) | 6, // L R Ls Rs C Cs
200 CoreAudio_Layout_AudioUnit_7_0 = (140<<16) | 7, // L R Ls Rs C Rls Rrs
201 CoreAudio_Layout_AudioUnit_7_0_Front= (148<<16) | 7, // L R Ls Rs C Lc Rc
202 CoreAudio_Layout_AudioUnit_5_1 = CoreAudio_Layout_MPEG_5_1_A,// L R C LFE Ls Rs
203 CoreAudio_Layout_AudioUnit_6_1 = CoreAudio_Layout_MPEG_6_1_A,// L R C LFE Ls Rs Cs
204 CoreAudio_Layout_AudioUnit_7_1 = CoreAudio_Layout_MPEG_7_1_C,// L R C LFE Ls Rs Rls Rrs
205 CoreAudio_Layout_AudioUnit_7_1_Front= CoreAudio_Layout_MPEG_7_1_A,// L R C LFE Ls Rs Lc Rc
207 CoreAudio_Layout_AAC_3_0 = CoreAudio_Layout_MPEG_3_0_B,// C L R
208 CoreAudio_Layout_AAC_Quadraphonic = CoreAudio_Layout_Quadraphonic, // L R Ls Rs
209 CoreAudio_Layout_AAC_4_0 = CoreAudio_Layout_MPEG_4_0_B,// C L R Cs
210 CoreAudio_Layout_AAC_5_0 = CoreAudio_Layout_MPEG_5_0_D,// C L R Ls Rs
211 CoreAudio_Layout_AAC_5_1 = CoreAudio_Layout_MPEG_5_1_D,// C L R Ls Rs Lfe
212 CoreAudio_Layout_AAC_6_0 = (141<<16) | 6, // C L R Ls Rs Cs
213 CoreAudio_Layout_AAC_6_1 = (142<<16) | 7, // C L R Ls Rs Cs Lfe
214 CoreAudio_Layout_AAC_7_0 = (143<<16) | 7, // C L R Ls Rs Rls Rrs
215 CoreAudio_Layout_AAC_7_1 = CoreAudio_Layout_MPEG_7_1_B,// C Lc Rc L R Ls Rs Lfe
216 CoreAudio_Layout_AAC_7_1_B = (183<<16) | 8, // C L R Ls Rs Rls Rrs LFE
217 CoreAudio_Layout_AAC_Octagonal = (144<<16) | 8, // C L R Ls Rs Rls Rrs Cs
219 CoreAudio_Layout_TMH_10_2_std = (145<<16) | 16, // L R C Vhc Lsd Rsd Ls Rs Vhl Vhr Lw Rw Csd Cs LFE1 LFE2
220 CoreAudio_Layout_TMH_10_2_full = (146<<16) | 21, // TMH_10_2_std plus: Lc Rc HI VI Haptic
222 CoreAudio_Layout_AC3_1_0_1 = (149<<16) | 2, // C LFE
223 CoreAudio_Layout_AC3_3_0 = (150<<16) | 3, // L C R
224 CoreAudio_Layout_AC3_3_1 = (151<<16) | 4, // L C R Cs
225 CoreAudio_Layout_AC3_3_0_1 = (152<<16) | 4, // L C R LFE
226 CoreAudio_Layout_AC3_2_1_1 = (153<<16) | 4, // L R Cs LFE
227 CoreAudio_Layout_AC3_3_1_1 = (154<<16) | 5, // L C R Cs LFE
229 CoreAudio_Layout_EAC_6_0_A = (155<<16) | 6, // L C R Ls Rs Cs
230 CoreAudio_Layout_EAC_7_0_A = (156<<16) | 7, // L C R Ls Rs Rls Rrs
232 CoreAudio_Layout_EAC3_6_1_A = (157<<16) | 7, // L C R Ls Rs LFE Cs
233 CoreAudio_Layout_EAC3_6_1_B = (158<<16) | 7, // L C R Ls Rs LFE Ts
234 CoreAudio_Layout_EAC3_6_1_C = (159<<16) | 7, // L C R Ls Rs LFE Vhc
235 CoreAudio_Layout_EAC3_7_1_A = (160<<16) | 8, // L C R Ls Rs LFE Rls Rrs
236 CoreAudio_Layout_EAC3_7_1_B = (161<<16) | 8, // L C R Ls Rs LFE Lc Rc
237 CoreAudio_Layout_EAC3_7_1_C = (162<<16) | 8, // L C R Ls Rs LFE Lsd Rsd
238 CoreAudio_Layout_EAC3_7_1_D = (163<<16) | 8, // L C R Ls Rs LFE Lw Rw
239 CoreAudio_Layout_EAC3_7_1_E = (164<<16) | 8, // L C R Ls Rs LFE Vhl Vhr
241 CoreAudio_Layout_EAC3_7_1_F = (165<<16) | 8,// L C R Ls Rs LFE Cs Ts
242 CoreAudio_Layout_EAC3_7_1_G = (166<<16) | 8,// L C R Ls Rs LFE Cs Vhc
243 CoreAudio_Layout_EAC3_7_1_H = (167<<16) | 8,// L C R Ls Rs LFE Ts Vhc
245 CoreAudio_Layout_DTS_3_1 = (168<<16) | 4,// C L R LFE
246 CoreAudio_Layout_DTS_4_1 = (169<<16) | 5,// C L R Cs LFE
247 CoreAudio_Layout_DTS_6_0_A = (170<<16) | 6,// Lc Rc L R Ls Rs
248 CoreAudio_Layout_DTS_6_0_B = (171<<16) | 6,// C L R Rls Rrs Ts
249 CoreAudio_Layout_DTS_6_0_C = (172<<16) | 6,// C Cs L R Rls Rrs
250 CoreAudio_Layout_DTS_6_1_A = (173<<16) | 7,// Lc Rc L R Ls Rs LFE
251 CoreAudio_Layout_DTS_6_1_B = (174<<16) | 7,// C L R Rls Rrs Ts LFE
252 CoreAudio_Layout_DTS_6_1_C = (175<<16) | 7,// C Cs L R Rls Rrs LFE
253 CoreAudio_Layout_DTS_7_0 = (176<<16) | 7,// Lc C Rc L R Ls Rs
254 CoreAudio_Layout_DTS_7_1 = (177<<16) | 8,// Lc C Rc L R Ls Rs LFE
255 CoreAudio_Layout_DTS_8_0_A = (178<<16) | 8,// Lc Rc L R Ls Rs Rls Rrs
256 CoreAudio_Layout_DTS_8_0_B = (179<<16) | 8,// Lc C Rc L R Ls Cs Rs
257 CoreAudio_Layout_DTS_8_1_A = (180<<16) | 9,// Lc Rc L R Ls Rs Rls Rrs LFE
258 CoreAudio_Layout_DTS_8_1_B = (181<<16) | 9,// Lc C Rc L R Ls Cs Rs LFE
259 CoreAudio_Layout_DTS_6_1_D = (182<<16) | 7,// C L R Ls Rs LFE Cs
261 CoreAudio_Layout_WAVE_2_1 = CoreAudio_Layout_DVD_4,
262 CoreAudio_Layout_WAVE_3_0 = CoreAudio_Layout_MPEG_3_0_A,
263 CoreAudio_Layout_WAVE_4_0_A = CoreAudio_Layout_ITU_2_2,
264 CoreAudio_Layout_WAVE_4_0_B = (185<<16) | 4,// L R Ls Rs
265 CoreAudio_Layout_WAVE_5_0_A = CoreAudio_Layout_MPEG_5_0_A,
266 CoreAudio_Layout_WAVE_5_0_B = (186<<16) | 5,// L R C Ls Rs
267 CoreAudio_Layout_WAVE_5_1_A = CoreAudio_Layout_MPEG_5_1_A,
268 CoreAudio_Layout_WAVE_5_1_B = (187<<16) | 6,// L R C LFE Ls Rs
269 CoreAudio_Layout_WAVE_6_1 = (188<<16) | 7,// L R C LFE Cs Ls Rs
270 CoreAudio_Layout_WAVE_7_1 = (189<<16) | 8,// L R C LFE Rls Rrs Ls Rs
272 CoreAudio_Layout_HOA_ACN_SN3D = (190<<16) | 0,// Ambisonics SN3D
273 CoreAudio_Layout_HOA_ACN_N3D = (191<<16) | 0,// Ambisonics N3D
275 CoreAudio_Layout_Atmos_7_1_4 = (192<<16) | 12, // L R C LFE Ls Rs Rls Rrs Vhl VHr Ltr Rtr
276 CoreAudio_Layout_Atmos_9_1_6 = (193<<16) | 16, // L R C LFE Ls Rs Rls Rrs Lw Rw Vhl VHr Ltm Rtm Ltr Rtr
277 CoreAudio_Layout_Atmos_5_1_2 = (194<<16) | 8, // L R C LFE Ls Rs Ltm Rtm
279 CoreAudio_Layout_DiscreteInOrder = (147<<16) | 0,
280 CoreAudio_Layout_Unknown = 0xFFFF0000
283 static inline int CoreAudio_Bitmap_to_vlc_bitmap( const struct CoreAudio_layout_s *c,
284 uint16_t *pi_mapping,
285 uint8_t *pi_channels,
286 const uint32_t **pp_chans_order )
288 *pp_chans_order = pi_vlc_chan_order_CoreAudio;
289 *pi_mapping = 0;
290 *pi_channels = 0;
291 for (uint8_t i=0;i<ARRAY_SIZE(CoreAudio_Bitmap_mapping);i++)
293 if ( CoreAudio_Bitmap_mapping[i].i_bitmap & c->i_channels_bitmap )
295 if ( (CoreAudio_Bitmap_mapping[i].i_vlc_bitmap & *pi_mapping) ||
296 *pi_channels >= AOUT_CHAN_MAX )
298 /* double mapping or unsupported number of channels */
299 *pi_mapping = 0;
300 *pi_channels = 0;
301 return VLC_EGENERIC;
303 *pi_mapping |= CoreAudio_Bitmap_mapping[i].i_vlc_bitmap;
306 return VLC_SUCCESS;
309 static const uint32_t pi_vlc_chan_order_C[] = {
310 AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT,
311 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARCENTER, AOUT_CHAN_REARRIGHT,
312 AOUT_CHAN_LFE,
313 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
317 static const uint32_t pi_vlc_chan_order_B[] = {
318 AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
319 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
320 AOUT_CHAN_CENTER,
321 AOUT_CHAN_LFE,
322 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
323 AOUT_CHAN_REARCENTER,
327 static const uint32_t pi_vlc_chan_order_AAC[] = {
328 AOUT_CHAN_CENTER, AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
329 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
330 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_REARCENTER,
331 AOUT_CHAN_LFE, 0
334 static const uint32_t pi_vlc_chan_order_EAC[] = {
335 AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT,
336 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
337 AOUT_CHAN_LFE,
338 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARCENTER, AOUT_CHAN_REARRIGHT,
342 static const uint32_t pi_vlc_chan_order_DTS[] = {
343 AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT,
344 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
345 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARCENTER, AOUT_CHAN_REARRIGHT,
346 AOUT_CHAN_LFE,
350 static const uint32_t pi_vlc_chan_order_DTS_C[] = {
351 AOUT_CHAN_CENTER, AOUT_CHAN_REARCENTER,
352 AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
353 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
354 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
355 AOUT_CHAN_LFE,
359 static const uint32_t pi_vlc_chan_order_Atmos[] = {
360 AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_CENTER,
361 AOUT_CHAN_LFE,
362 AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
363 /* Lw, Rw, VHl, VHr */
364 AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
365 /* Ltr, Rtr */
369 static const struct CoreAudioTableEntry
371 enum CoreAudio_Layout layout;
372 const uint32_t *p_chans_order;
373 uint16_t i_vlc_bitmap;
374 } CoreAudio_Layout_mapping[] = {
375 { CoreAudio_Layout_Mono, NULL, AOUT_CHAN_CENTER },
376 { CoreAudio_Layout_Stereo, NULL, AOUT_CHANS_STEREO },
377 { CoreAudio_Layout_StereoHeadphones, NULL, AOUT_CHANS_STEREO },
378 { CoreAudio_Layout_Binaural, NULL, AOUT_CHANS_STEREO },
379 // CoreAudio_Layout_Ambisonic_B_Format
381 { CoreAudio_Layout_Quadraphonic, NULL, AOUT_CHANS_4_0_MIDDLE },
382 { CoreAudio_Layout_Pentagonal, pi_vlc_chan_order_B, AOUT_CHANS_4_0 | AOUT_CHAN_CENTER },
383 // { CoreAudio_Layout_Hexagonal
384 // { CoreAudio_Layout_Octagonal
385 // { CoreAudio_Layout_Cube
387 { CoreAudio_Layout_MPEG_3_0_A, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_3_0 },
388 { CoreAudio_Layout_MPEG_3_0_B, NULL, AOUT_CHANS_3_0 },
389 { CoreAudio_Layout_MPEG_4_0_A, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_3_0 | AOUT_CHAN_REARCENTER },
390 { CoreAudio_Layout_MPEG_4_0_B, NULL, AOUT_CHANS_3_0 | AOUT_CHAN_REARCENTER },
391 { CoreAudio_Layout_MPEG_5_0_A, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_5_0 },
392 { CoreAudio_Layout_MPEG_5_0_B, pi_vlc_chan_order_B, AOUT_CHANS_5_0 },
393 { CoreAudio_Layout_MPEG_5_0_C, pi_vlc_chan_order_C, AOUT_CHANS_5_0 },
394 { CoreAudio_Layout_MPEG_5_0_D, NULL, AOUT_CHANS_5_0 },
395 { CoreAudio_Layout_MPEG_5_1_A, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_5_1 },
396 { CoreAudio_Layout_MPEG_5_1_B, pi_vlc_chan_order_B, AOUT_CHANS_5_1 },
397 { CoreAudio_Layout_MPEG_5_1_C, pi_vlc_chan_order_C, AOUT_CHANS_5_1 },
398 { CoreAudio_Layout_MPEG_5_1_D, NULL, AOUT_CHANS_5_1 },
399 { CoreAudio_Layout_MPEG_6_1_A, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_5_1 | AOUT_CHAN_REARCENTER },
400 { CoreAudio_Layout_MPEG_7_1_A, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_7_1 },
401 { CoreAudio_Layout_MPEG_7_1_B, pi_vlc_chan_order_AAC, AOUT_CHANS_7_1 },
402 { CoreAudio_Layout_MPEG_7_1_C, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_7_1 },
403 { CoreAudio_Layout_Emagic_Default_7_1, pi_vlc_chan_order_B, AOUT_CHANS_7_1 },
405 { CoreAudio_Layout_ITU_2_1, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_3_0 },
406 { CoreAudio_Layout_ITU_2_2, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_4_0 },
408 { CoreAudio_Layout_DVD_4, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_2_1 },
409 { CoreAudio_Layout_DVD_5, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_2_1 | AOUT_CHAN_REARCENTER },
410 { CoreAudio_Layout_DVD_6, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_2_1 | AOUT_CHANS_REAR },
411 { CoreAudio_Layout_DVD_10, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_3_1 },
412 { CoreAudio_Layout_DVD_11, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_3_1 | AOUT_CHAN_REARCENTER },
413 { CoreAudio_Layout_DVD_18, pi_vlc_chan_order_B, AOUT_CHANS_5_1 },
415 { CoreAudio_Layout_AudioUnit_6_0, pi_vlc_chan_order_B, AOUT_CHANS_5_0 | AOUT_CHAN_REARCENTER },
416 //CoreAudio_Layout_AudioUnit_7_0
417 { CoreAudio_Layout_AudioUnit_7_0_Front, pi_vlc_chan_order_B, AOUT_CHANS_5_0 | AOUT_CHANS_MIDDLE },
419 { CoreAudio_Layout_AAC_6_0, pi_vlc_chan_order_AAC, AOUT_CHANS_5_0 | AOUT_CHAN_REARCENTER },
420 { CoreAudio_Layout_AAC_6_1, pi_vlc_chan_order_AAC, AOUT_CHANS_5_0 | AOUT_CHAN_REARCENTER | AOUT_CHAN_LFE },
421 { CoreAudio_Layout_AAC_7_0, pi_vlc_chan_order_AAC, AOUT_CHANS_5_0 | AOUT_CHANS_MIDDLE },
422 { CoreAudio_Layout_AAC_7_1_B, pi_vlc_chan_order_AAC, AOUT_CHANS_7_1 },
423 { CoreAudio_Layout_AAC_Octagonal, pi_vlc_chan_order_AAC, AOUT_CHANS_7_0 | AOUT_CHAN_REARCENTER },
425 // CoreAudio_Layout_TMH_10_2_std
426 // CoreAudio_Layout_TMH_10_2_full
428 { CoreAudio_Layout_AC3_1_0_1, pi_vlc_chan_order_C, AOUT_CHAN_CENTER | AOUT_CHAN_LFE },
429 { CoreAudio_Layout_AC3_3_0, pi_vlc_chan_order_C, AOUT_CHANS_3_0 },
430 { CoreAudio_Layout_AC3_3_1, pi_vlc_chan_order_C, AOUT_CHANS_3_0 | AOUT_CHAN_REARCENTER },
431 { CoreAudio_Layout_AC3_3_0_1, pi_vlc_chan_order_C, AOUT_CHANS_3_0 | AOUT_CHAN_LFE },
432 { CoreAudio_Layout_AC3_2_1_1, pi_vlc_chan_order_C, AOUT_CHANS_2_1 | AOUT_CHAN_REARCENTER },
433 { CoreAudio_Layout_AC3_3_1_1, pi_vlc_chan_order_C, AOUT_CHANS_3_1 | AOUT_CHAN_REARCENTER },
435 { CoreAudio_Layout_EAC_6_0_A, pi_vlc_chan_order_C, AOUT_CHANS_4_0 | AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER },
436 { CoreAudio_Layout_EAC_7_0_A, pi_vlc_chan_order_C, AOUT_CHANS_6_0 | AOUT_CHAN_CENTER },
438 { CoreAudio_Layout_EAC3_6_1_A, pi_vlc_chan_order_EAC, AOUT_CHANS_4_0 | AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER | AOUT_CHAN_LFE },
439 // { CoreAudio_Layout_EAC3_6_1_B, pi_vlc_chan_order_EAC, },
440 // { CoreAudio_Layout_EAC3_6_1_C, pi_vlc_chan_order_EAC, },
441 // { CoreAudio_Layout_EAC3_7_1_A, pi_vlc_chan_order_EAC, },
442 { CoreAudio_Layout_EAC3_7_1_B, pi_vlc_chan_order_EAC, AOUT_CHANS_7_1 },
443 // { CoreAudio_Layout_EAC3_7_1_C, pi_vlc_chan_order_EAC, },
444 // { CoreAudio_Layout_EAC3_7_1_D, pi_vlc_chan_order_EAC, },
445 // { CoreAudio_Layout_EAC3_7_1_E, pi_vlc_chan_order_EAC, },
447 // { CoreAudio_Layout_EAC3_7_1_F, pi_vlc_chan_order_EAC, },
448 // { CoreAudio_Layout_EAC3_7_1_G, pi_vlc_chan_order_EAC, },
449 // { CoreAudio_Layout_EAC3_7_1_H, pi_vlc_chan_order_EAC, },
451 { CoreAudio_Layout_DTS_3_1, NULL, AOUT_CHANS_3_1 },
452 { CoreAudio_Layout_DTS_4_1, NULL, AOUT_CHANS_3_1 | AOUT_CHAN_REARCENTER },
453 { CoreAudio_Layout_DTS_6_0_A, NULL, AOUT_CHANS_6_0 },
454 // { CoreAudio_Layout_DTS_6_0_B, NULL, },
455 { CoreAudio_Layout_DTS_6_0_C, pi_vlc_chan_order_DTS_C, AOUT_CHANS_6_0 },
456 { CoreAudio_Layout_DTS_6_1_A, NULL, AOUT_CHANS_6_1_MIDDLE },
457 //{ CoreAudio_Layout_DTS_6_1_B, NULL, },
458 { CoreAudio_Layout_DTS_6_1_C, pi_vlc_chan_order_DTS_C, AOUT_CHANS_6_1_MIDDLE },
459 { CoreAudio_Layout_DTS_7_0, pi_vlc_chan_order_DTS, AOUT_CHANS_6_0 | AOUT_CHAN_CENTER },
460 { CoreAudio_Layout_DTS_7_1, pi_vlc_chan_order_DTS, AOUT_CHANS_7_1 },
461 // { CoreAudio_Layout_DTS_8_0_A
462 { CoreAudio_Layout_DTS_8_0_B, pi_vlc_chan_order_DTS, AOUT_CHANS_5_0 | AOUT_CHANS_MIDDLE | AOUT_CHAN_REARCENTER },
463 //{ CoreAudio_Layout_DTS_8_1_A
464 //{ CoreAudio_Layout_DTS_8_1_B = (181<<16) | 9,// Lc C Rc L R Ls Cs Rs LFE
465 //{ CoreAudio_Layout_DTS_6_1_D = (182<<16) | 7,// C L R Ls Rs LFE Cs
467 // { CoreAudio_Layout_WAVE_2_1 = CoreAudio_Layout_DVD_4,
468 // { CoreAudio_Layout_WAVE_3_0 = CoreAudio_Layout_MPEG_3_0_A,
469 // { CoreAudio_Layout_WAVE_4_0_A = CoreAudio_Layout_ITU_2_2,
470 { CoreAudio_Layout_WAVE_4_0_B, pi_vlc_chan_order_B, AOUT_CHANS_FRONT | AOUT_CHANS_MIDDLE },
471 // { CoreAudio_Layout_WAVE_5_0_A = CoreAudio_Layout_MPEG_5_0_A,
472 { CoreAudio_Layout_WAVE_5_0_B, pi_vlc_chan_order_B, AOUT_CHANS_FRONT | AOUT_CHAN_CENTER | AOUT_CHANS_MIDDLE },
473 // { CoreAudio_Layout_WAVE_5_1_A = CoreAudio_Layout_MPEG_5_1_A,
474 { CoreAudio_Layout_WAVE_5_1_B, pi_vlc_chan_order_B, AOUT_CHANS_FRONT | AOUT_CHAN_CENTER | AOUT_CHAN_LFE | AOUT_CHANS_MIDDLE },
475 //{ CoreAudio_Layout_WAVE_6_1, pi_vlc_chan_order_CoreAudio, 0 },// L R C LFE Cs Ls Rs
476 { CoreAudio_Layout_WAVE_7_1, pi_vlc_chan_order_CoreAudio, AOUT_CHANS_7_0 | AOUT_CHAN_LFE },
478 // { CoreAudio_Layout_HOA_ACN_SN3D = (190<<16) | 0,// Ambisonics SN3D
479 // { CoreAudio_Layout_HOA_ACN_N3D = (191<<16) | 0,// Ambisonics N3D
481 // { CoreAudio_Layout_Atmos_7_1_4 = (192<<16) | 12, // L R C LFE Ls Rs Rls Rrs Vhl VHr Ltr Rtr
482 // { CoreAudio_Layout_Atmos_9_1_6 = (193<<16) | 16, // L R C LFE Ls Rs Rls Rrs Lw Rw Vhl VHr Ltm Rtm Ltr Rtr
483 { CoreAudio_Layout_Atmos_5_1_2, pi_vlc_chan_order_Atmos, AOUT_CHANS_7_1 }, // L R C LFE Ls Rs Ltm Rtm
486 static inline int CoreAudio_Layout_to_vlc( const struct CoreAudio_layout_s *c,
487 uint16_t *pi_bitmap,
488 uint8_t *pi_channels,
489 const uint32_t **pp_chans_order )
491 if( c->i_channels_layout_tag == CoreAudio_Layout_BITMAP )
492 return CoreAudio_Bitmap_to_vlc_bitmap( c, pi_bitmap, pi_channels, pp_chans_order );
494 for (size_t i=0;i<ARRAY_SIZE(CoreAudio_Layout_mapping);i++)
496 if(CoreAudio_Layout_mapping[i].layout == c->i_channels_layout_tag )
498 *pi_bitmap = CoreAudio_Layout_mapping[i].i_vlc_bitmap;
499 *pp_chans_order = CoreAudio_Layout_mapping[i].p_chans_order;
500 *pi_channels = c->i_channels_layout_tag & 0xFF;
501 break;
504 return VLC_SUCCESS;
506 #endif