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)#include "media/base/channel_layout.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kLayoutToChannels[] = {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0,   // CHANNEL_LAYOUT_NONE
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    0,   // CHANNEL_LAYOUT_UNSUPPORTED
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    1,   // CHANNEL_LAYOUT_MONO
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    2,   // CHANNEL_LAYOUT_STEREO
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    3,   // CHANNEL_LAYOUT_2_1
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    3,   // CHANNEL_LAYOUT_SURROUND
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    4,   // CHANNEL_LAYOUT_4_0
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    4,   // CHANNEL_LAYOUT_2_2
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    4,   // CHANNEL_LAYOUT_QUAD
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    5,   // CHANNEL_LAYOUT_5_0
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    6,   // CHANNEL_LAYOUT_5_1
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    5,   // CHANNEL_LAYOUT_5_0_BACK
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    6,   // CHANNEL_LAYOUT_5_1_BACK
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    7,   // CHANNEL_LAYOUT_7_0
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    8,   // CHANNEL_LAYOUT_7_1
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    8,   // CHANNEL_LAYOUT_7_1_WIDE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    2,   // CHANNEL_LAYOUT_STEREO_DOWNMIX
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    3,   // CHANNEL_LAYOUT_2POINT1
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    4,   // CHANNEL_LAYOUT_3_1
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    5,   // CHANNEL_LAYOUT_4_1
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    6,   // CHANNEL_LAYOUT_6_0
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    6,   // CHANNEL_LAYOUT_6_0_FRONT
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    6,   // CHANNEL_LAYOUT_HEXAGONAL
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    7,   // CHANNEL_LAYOUT_6_1
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    7,   // CHANNEL_LAYOUT_6_1_BACK
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    7,   // CHANNEL_LAYOUT_6_1_FRONT
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    7,   // CHANNEL_LAYOUT_7_0_FRONT
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    8,   // CHANNEL_LAYOUT_7_1_WIDE_BACK
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    8,   // CHANNEL_LAYOUT_OCTAGONAL
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    0,   // CHANNEL_LAYOUT_DISCRETE
4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    3,   // CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// The channel orderings for each layout as specified by FFmpeg. Each value
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// represents the index of each channel in each layout.  Values of -1 mean the
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// channel at that index is not used for that layout. For example, the left side
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// surround sound channel in FFmpeg's 5.1 layout is in the 5th position (because
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the order is L, R, C, LFE, LS, RS), so
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kChannelOrderings[CHANNEL_LAYOUT_5POINT1][SIDE_LEFT] = 4;
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const int kChannelOrderings[CHANNEL_LAYOUT_MAX + 1][CHANNELS_MAX + 1] = {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_NONE
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  -1 , -1 , -1 , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_UNSUPPORTED
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  -1 , -1 , -1 , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_MONO
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  -1 , -1 , 0  , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_STEREO
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_2_1
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 , -1  , -1 , -1 , -1    , -1    , 2  , -1 , -1 },
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_SURROUND
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_4_0
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , -1 , -1 , -1    , -1    , 3  , -1 , -1 },
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_2_2
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 , -1  , -1 , -1 , -1    , -1    , -1 , 2  ,  3 },
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_QUAD
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 , -1  , 2  , 3  , -1    , -1    , -1 , -1 , -1 },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_5_0
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , -1 , -1 , -1    , -1    , -1 , 3  ,  4 },
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_5_1
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , 3   , -1 , -1 , -1    , -1    , -1 , 4  ,  5 },
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_5_0_BACK
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , 3  , 4  , -1    , -1    , -1 , -1 , -1 },
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_5_1_BACK
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , 3   , 4  , 5  , -1    , -1    , -1 , -1 , -1 },
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_7_0
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , 5  , 6  , -1    , -1    , -1 , 3  ,  4 },
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_7_1
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , 3   , 6  , 7  , -1    , -1    , -1 , 4  ,  5 },
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_7_1_WIDE
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , 3   , -1 , -1 , 6     , 7     , -1 , 4  ,  5 },
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_STEREO_DOWNMIX
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_2POINT1
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 ,  2  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_3_1
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  ,  2 ,  3  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_4_1
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  ,  2 ,  4  , -1 , -1 , -1    , -1    ,  3 , -1 , -1 },
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_6_0
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , -1 , -1 , -1    , -1    ,  5 , 3  ,  4 },
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_6_0_FRONT
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 , -1  , -1 , -1 ,  4    ,  5    , -1 , 2  ,  3 },
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_HEXAGONAL
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , 3  , 4  , -1    , -1    ,  5 , -1 , -1 },
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_6_1
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , 3   , -1 , -1 , -1    , -1    ,  6 , 4  ,  5 },
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_6_1_BACK
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , 3   , 4  , 5  , -1    , -1    ,  6 , -1 , -1 },
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_6_1_FRONT
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , -1 , 6   , -1 , -1 , 4     , 5     , -1 , 2  ,  3 },
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_7_0_FRONT
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , -1 , -1 , 5     , 6     , -1 , 3  ,  4 },
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_7_1_WIDE_BACK
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , 3   , 4  , 5  , 6     , 7     , -1 , -1 , -1 },
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // CHANNEL_LAYOUT_OCTAGONAL
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {  0  , 1  , 2  , -1  , 5  , 6  , -1    , -1    ,  7 , 3  ,  4 },
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // CHANNEL_LAYOUT_DISCRETE
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {  -1 , -1 , -1 , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC
15023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    {  0  , 1  , 2  , -1  , -1 , -1 , -1    , -1    , -1 , -1 , -1 },
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChannelLayoutToChannelCount(ChannelLayout layout) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(static_cast<size_t>(layout), arraysize(kLayoutToChannels));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kLayoutToChannels[layout];
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Converts a channel count into a channel layout.
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ChannelLayout GuessChannelLayout(int channels) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (channels) {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 1:
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_MONO;
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 2:
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_STEREO;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 3:
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_SURROUND;
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 4:
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_QUAD;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 5:
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_5_0;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 6:
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_5_1;
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 7:
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_6_1;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case 8:
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return CHANNEL_LAYOUT_7_1;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DVLOG(1) << "Unsupported channel count: " << channels;
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CHANNEL_LAYOUT_UNSUPPORTED;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ChannelOrder(ChannelLayout layout, Channels channel) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(static_cast<size_t>(layout), arraysize(kChannelOrderings));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_LT(static_cast<size_t>(channel), arraysize(kChannelOrderings[0]));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kChannelOrderings[layout][channel];
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char* ChannelLayoutToString(ChannelLayout layout) {
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  switch (layout) {
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_NONE:
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "NONE";
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_UNSUPPORTED:
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "UNSUPPORTED";
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_MONO:
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "MONO";
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_STEREO:
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "STEREO";
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_2_1:
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "2.1";
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_SURROUND:
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "SURROUND";
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_4_0:
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "4.0";
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_2_2:
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "2.2";
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_QUAD:
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "QUAD";
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_5_0:
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "5.0";
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_5_1:
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "5.1";
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_5_0_BACK:
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "5.0_BACK";
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_5_1_BACK:
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "5.1_BACK";
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_7_0:
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "7.0";
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_7_1:
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "7.1";
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_7_1_WIDE:
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "7.1_WIDE";
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_STEREO_DOWNMIX:
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "STEREO_DOWNMIX";
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_2POINT1:
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "2POINT1";
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_3_1:
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "3.1";
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_4_1:
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "4.1";
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_6_0:
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "6.0";
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_6_0_FRONT:
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "6.0_FRONT";
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_HEXAGONAL:
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "HEXAGONAL";
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_6_1:
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "6.1";
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_6_1_BACK:
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "6.1_BACK";
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_6_1_FRONT:
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "6.1_FRONT";
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_7_0_FRONT:
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "7.0_FRONT";
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_7_1_WIDE_BACK:
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "7.1_WIDE_BACK";
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_OCTAGONAL:
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "OCTAGONAL";
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    case CHANNEL_LAYOUT_DISCRETE:
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return "DISCRETE";
25323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    case CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC:
25423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return "STEREO_AND_KEYBOARD_MIC";
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NOTREACHED() << "Invalid channel layout provided: " << layout;
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return "";
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
261