xref: /aosp_15_r20/external/webrtc/api/audio/channel_layout.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef API_AUDIO_CHANNEL_LAYOUT_H_
12*d9f75844SAndroid Build Coastguard Worker #define API_AUDIO_CHANNEL_LAYOUT_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker // This file is derived from Chromium's base/channel_layout.h.
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker // Enumerates the various representations of the ordering of audio channels.
19*d9f75844SAndroid Build Coastguard Worker // Logged to UMA, so never reuse a value, always add new/greater ones!
20*d9f75844SAndroid Build Coastguard Worker enum ChannelLayout {
21*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_NONE = 0,
22*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_UNSUPPORTED = 1,
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker   // Front C
25*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_MONO = 2,
26*d9f75844SAndroid Build Coastguard Worker 
27*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R
28*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_STEREO = 3,
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Back C
31*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_2_1 = 4,
32*d9f75844SAndroid Build Coastguard Worker 
33*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C
34*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_SURROUND = 5,
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, Back C
37*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_4_0 = 6,
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Side L, Side R
40*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_2_2 = 7,
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Back L, Back R
43*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_QUAD = 8,
44*d9f75844SAndroid Build Coastguard Worker 
45*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, Side L, Side R
46*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_5_0 = 9,
47*d9f75844SAndroid Build Coastguard Worker 
48*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, LFE, Side L, Side R
49*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_5_1 = 10,
50*d9f75844SAndroid Build Coastguard Worker 
51*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, Back L, Back R
52*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_5_0_BACK = 11,
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, LFE, Back L, Back R
55*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_5_1_BACK = 12,
56*d9f75844SAndroid Build Coastguard Worker 
57*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, Side L, Side R, Back L, Back R
58*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_7_0 = 13,
59*d9f75844SAndroid Build Coastguard Worker 
60*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, LFE, Side L, Side R, Back L, Back R
61*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_7_1 = 14,
62*d9f75844SAndroid Build Coastguard Worker 
63*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, LFE, Side L, Side R, Front LofC, Front RofC
64*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_7_1_WIDE = 15,
65*d9f75844SAndroid Build Coastguard Worker 
66*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R
67*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_STEREO_DOWNMIX = 16,
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, LFE
70*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_2POINT1 = 17,
71*d9f75844SAndroid Build Coastguard Worker 
72*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Front C, LFE
73*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_3_1 = 18,
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Front C, Rear C, LFE
76*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_4_1 = 19,
77*d9f75844SAndroid Build Coastguard Worker 
78*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Front C, Side L, Side R, Back C
79*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_6_0 = 20,
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC
82*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_6_0_FRONT = 21,
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Front C, Rear L, Rear R, Rear C
85*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_HEXAGONAL = 22,
86*d9f75844SAndroid Build Coastguard Worker 
87*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Front C, LFE, Side L, Side R, Rear Center
88*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_6_1 = 23,
89*d9f75844SAndroid Build Coastguard Worker 
90*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Front C, LFE, Back L, Back R, Rear Center
91*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_6_1_BACK = 24,
92*d9f75844SAndroid Build Coastguard Worker 
93*d9f75844SAndroid Build Coastguard Worker   // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC, LFE
94*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_6_1_FRONT = 25,
95*d9f75844SAndroid Build Coastguard Worker 
96*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, Side L, Side R, Front LofC, Front RofC
97*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_7_0_FRONT = 26,
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, LFE, Back L, Back R, Front LofC, Front RofC
100*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_7_1_WIDE_BACK = 27,
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C, Side L, Side R, Rear L, Back R, Back C.
103*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_OCTAGONAL = 28,
104*d9f75844SAndroid Build Coastguard Worker 
105*d9f75844SAndroid Build Coastguard Worker   // Channels are not explicitly mapped to speakers.
106*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_DISCRETE = 29,
107*d9f75844SAndroid Build Coastguard Worker 
108*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Front C. Front C contains the keyboard mic audio. This
109*d9f75844SAndroid Build Coastguard Worker   // layout is only intended for input for WebRTC. The Front C channel
110*d9f75844SAndroid Build Coastguard Worker   // is stripped away in the WebRTC audio input pipeline and never seen outside
111*d9f75844SAndroid Build Coastguard Worker   // of that.
112*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC = 30,
113*d9f75844SAndroid Build Coastguard Worker 
114*d9f75844SAndroid Build Coastguard Worker   // Front L, Front R, Side L, Side R, LFE
115*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_4_1_QUAD_SIDE = 31,
116*d9f75844SAndroid Build Coastguard Worker 
117*d9f75844SAndroid Build Coastguard Worker   // Actual channel layout is specified in the bitstream and the actual channel
118*d9f75844SAndroid Build Coastguard Worker   // count is unknown at Chromium media pipeline level (useful for audio
119*d9f75844SAndroid Build Coastguard Worker   // pass-through mode).
120*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_BITSTREAM = 32,
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker   // Max value, must always equal the largest entry ever logged.
123*d9f75844SAndroid Build Coastguard Worker   CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_BITSTREAM
124*d9f75844SAndroid Build Coastguard Worker };
125*d9f75844SAndroid Build Coastguard Worker 
126*d9f75844SAndroid Build Coastguard Worker // Note: Do not reorder or reassign these values; other code depends on their
127*d9f75844SAndroid Build Coastguard Worker // ordering to operate correctly. E.g., CoreAudio channel layout computations.
128*d9f75844SAndroid Build Coastguard Worker enum Channels {
129*d9f75844SAndroid Build Coastguard Worker   LEFT = 0,
130*d9f75844SAndroid Build Coastguard Worker   RIGHT,
131*d9f75844SAndroid Build Coastguard Worker   CENTER,
132*d9f75844SAndroid Build Coastguard Worker   LFE,
133*d9f75844SAndroid Build Coastguard Worker   BACK_LEFT,
134*d9f75844SAndroid Build Coastguard Worker   BACK_RIGHT,
135*d9f75844SAndroid Build Coastguard Worker   LEFT_OF_CENTER,
136*d9f75844SAndroid Build Coastguard Worker   RIGHT_OF_CENTER,
137*d9f75844SAndroid Build Coastguard Worker   BACK_CENTER,
138*d9f75844SAndroid Build Coastguard Worker   SIDE_LEFT,
139*d9f75844SAndroid Build Coastguard Worker   SIDE_RIGHT,
140*d9f75844SAndroid Build Coastguard Worker   CHANNELS_MAX =
141*d9f75844SAndroid Build Coastguard Worker       SIDE_RIGHT,  // Must always equal the largest value ever logged.
142*d9f75844SAndroid Build Coastguard Worker };
143*d9f75844SAndroid Build Coastguard Worker 
144*d9f75844SAndroid Build Coastguard Worker // The maximum number of concurrently active channels for all possible layouts.
145*d9f75844SAndroid Build Coastguard Worker // ChannelLayoutToChannelCount() will never return a value higher than this.
146*d9f75844SAndroid Build Coastguard Worker constexpr int kMaxConcurrentChannels = 8;
147*d9f75844SAndroid Build Coastguard Worker 
148*d9f75844SAndroid Build Coastguard Worker // Returns the expected channel position in an interleaved stream.  Values of -1
149*d9f75844SAndroid Build Coastguard Worker // mean the channel at that index is not used for that layout.  Values range
150*d9f75844SAndroid Build Coastguard Worker // from 0 to ChannelLayoutToChannelCount(layout) - 1.
151*d9f75844SAndroid Build Coastguard Worker int ChannelOrder(ChannelLayout layout, Channels channel);
152*d9f75844SAndroid Build Coastguard Worker 
153*d9f75844SAndroid Build Coastguard Worker // Returns the number of channels in a given ChannelLayout.
154*d9f75844SAndroid Build Coastguard Worker int ChannelLayoutToChannelCount(ChannelLayout layout);
155*d9f75844SAndroid Build Coastguard Worker 
156*d9f75844SAndroid Build Coastguard Worker // Given the number of channels, return the best layout,
157*d9f75844SAndroid Build Coastguard Worker // or return CHANNEL_LAYOUT_UNSUPPORTED if there is no good match.
158*d9f75844SAndroid Build Coastguard Worker ChannelLayout GuessChannelLayout(int channels);
159*d9f75844SAndroid Build Coastguard Worker 
160*d9f75844SAndroid Build Coastguard Worker // Returns a string representation of the channel layout.
161*d9f75844SAndroid Build Coastguard Worker const char* ChannelLayoutToString(ChannelLayout layout);
162*d9f75844SAndroid Build Coastguard Worker 
163*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
164*d9f75844SAndroid Build Coastguard Worker 
165*d9f75844SAndroid Build Coastguard Worker #endif  // API_AUDIO_CHANNEL_LAYOUT_H_
166