15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_CHANNEL_LAYOUT_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_CHANNEL_LAYOUT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumerates the various representations of the ordering of audio channels.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Logged to UMA, so never reuse a value, always add new/greater ones!
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ChannelLayout {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_NONE = 0,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_UNSUPPORTED = 1,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front C
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_MONO = 2,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_STEREO = 3,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Back C
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_2_1 = 4,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_SURROUND = 5,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Back C
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_4_0 = 6,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Side L, Side R
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_2_2 = 7,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Back L, Back R
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_QUAD = 8,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Side L, Side R
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_5_0 = 9,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Side L, Side R, LFE
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_5_1 = 10,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Back L, Back R
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_5_0_BACK = 11,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Back L, Back R, LFE
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_5_1_BACK = 12,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Side L, Side R, Back L, Back R
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_7_0 = 13,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Side L, Side R, LFE, Back L, Back R
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_7_1 = 14,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Side L, Side R, LFE, Front LofC, Front RofC
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_7_1_WIDE = 15,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_STEREO_DOWNMIX = 16,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, LFE
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_2POINT1 = 17,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Front C, LFE
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_3_1 = 18,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Front C, Rear C, LFE
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_4_1 = 19,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Front C, Side L, Side R, Back C
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_6_0 = 20,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_6_0_FRONT = 21,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Side L, Side R, Front C, Rear C.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_HEXAGONAL = 22,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Side L, Side R, Front C, Rear Center, LFE
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_6_1 = 23,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Back L, Back R, Front C, Rear Center, LFE
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_6_1_BACK = 24,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC, LFE
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_6_1_FRONT = 25,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Side L, Side R, Front LofC, Front RofC
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_7_0_FRONT = 26,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Back L, Back R, LFE, Front LofC, Front RofC
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_7_1_WIDE_BACK = 27,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Front L, Front R, Front C, Side L, Side R, Rear C, Back L, Back R.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHANNEL_LAYOUT_OCTAGONAL = 28,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Channels are not explicitly mapped to speakers.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHANNEL_LAYOUT_DISCRETE = 29,
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Front L, Front R, Front C. Front C contains the keyboard mic audio. This
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // layout is only intended for input for WebRTC. The Front C channel
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // is stripped away in the WebRTC audio input pipeline and never seen outside
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // of that.
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC = 30,
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Max value, must always equal the largest entry ever logged.
10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Channels {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LEFT = 0,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RIGHT,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CENTER,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LFE,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BACK_LEFT,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BACK_RIGHT,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LEFT_OF_CENTER,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RIGHT_OF_CENTER,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BACK_CENTER,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIDE_LEFT,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SIDE_RIGHT,
124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CHANNELS_MAX = SIDE_RIGHT, // Must always equal the largest value ever logged.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the expected channel position in an interleaved stream.  Values of -1
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mean the channel at that index is not used for that layout.  Values range
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from 0 to CHANNELS_MAX - 1.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MEDIA_EXPORT int ChannelOrder(ChannelLayout layout, Channels channel);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the number of channels in a given ChannelLayout.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MEDIA_EXPORT int ChannelLayoutToChannelCount(ChannelLayout layout);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Given the number of channels, return the best layout,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// or return CHANNEL_LAYOUT_UNSUPPORTED if there is no good match.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MEDIA_EXPORT ChannelLayout GuessChannelLayout(int channels);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Returns a string representation of the channel layout.
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)MEDIA_EXPORT const char* ChannelLayoutToString(ChannelLayout layout);
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_BASE_CHANNEL_LAYOUT_H_
145