diff options
-rw-r--r-- | media/base/channel_layout.cc | 54 | ||||
-rw-r--r-- | media/base/channel_layout.h | 38 | ||||
-rw-r--r-- | media/base/channel_mixer.cc | 10 | ||||
-rw-r--r-- | media/ffmpeg/ffmpeg_common.cc | 26 |
4 files changed, 120 insertions, 8 deletions
diff --git a/media/base/channel_layout.cc b/media/base/channel_layout.cc index 2efd204..e622f91 100644 --- a/media/base/channel_layout.cc +++ b/media/base/channel_layout.cc @@ -27,6 +27,18 @@ static const int kLayoutToChannels[] = { 8, // CHANNEL_LAYOUT_7POINT1 8, // CHANNEL_LAYOUT_7POINT1_WIDE 2, // CHANNEL_LAYOUT_STEREO_DOWNMIX + 3, // CHANNEL_LAYOUT_2POINT1 + 4, // CHANNEL_LAYOUT_3_1 + 5, // CHANNEL_LAYOUT_4_1 + 6, // CHANNEL_LAYOUT_6_0 + 6, // CHANNEL_LAYOUT_6_0_FRONT + 6, // CHANNEL_LAYOUT_HEXAGONAL + 7, // CHANNEL_LAYOUT_6_1 + 7, // CHANNEL_LAYOUT_6_1_BACK + 7, // CHANNEL_LAYOUT_6_1_FRONT + 7, // CHANNEL_LAYOUT_7_0_FRONT + 8, // CHANNEL_LAYOUT_7_1_WIDE_BACK + 8, // CHANNEL_LAYOUT_OCTAGONAL }; // The channel orderings for each layout as specified by FFmpeg. Each value @@ -71,6 +83,8 @@ static const int kChannelOrderings[CHANNEL_LAYOUT_MAX][CHANNELS_MAX] = { // CHANNEL_LAYOUT_5POINT1 { 0 , 1 , 2 , 3 , -1 , -1 , -1 , -1 , -1 , 4 , 5 }, + // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR + // CHANNEL_LAYOUT_5POINT0_BACK { 0 , 1 , 2 , -1 , 3 , 4 , -1 , -1 , -1 , -1 , -1 }, @@ -84,11 +98,49 @@ static const int kChannelOrderings[CHANNEL_LAYOUT_MAX][CHANNELS_MAX] = { { 0 , 1 , 2 , 3 , 6 , 7 , -1 , -1 , -1 , 4 , 5 }, // CHANNEL_LAYOUT_7POINT1_WIDE - { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , -1 , -1 , -1 }, + { 0 , 1 , 2 , 3 , -1 , -1 , 6 , 7 , -1 , 4 , 5 }, // CHANNEL_LAYOUT_STEREO_DOWNMIX { 0 , 1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 }, + // CHANNEL_LAYOUT_2POINT1 + { 0 , 1 , -1 , 2 , -1 , -1 , -1 , -1 , -1 , -1 , -1 }, + + // CHANNEL_LAYOUT_3_1 + { 0 , 1 , 2 , 3 , -1 , -1 , -1 , -1 , -1 , -1 , -1 }, + + // CHANNEL_LAYOUT_4_1 + { 0 , 1 , 2 , 4 , -1 , -1 , -1 , -1 , 3 , -1 , -1 }, + + // CHANNEL_LAYOUT_6_0 + { 0 , 1 , 2 , -1 , -1 , -1 , -1 , -1 , 5 , 3 , 4 }, + + // CHANNEL_LAYOUT_6_0_FRONT + { 0 , 1 , -1 , -1 , -1 , -1 , 4 , 5 , -1 , 2 , 3 }, + + // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR + + // CHANNEL_LAYOUT_HEXAGONAL + { 0 , 1 , 2 , -1 , 3 , 4 , -1 , -1 , 5 , -1 , -1 }, + + // CHANNEL_LAYOUT_6_1 + { 0 , 1 , 2 , 3 , -1 , -1 , -1 , -1 , 6 , 4 , 5 }, + + // CHANNEL_LAYOUT_6_1_BACK + { 0 , 1 , 2 , 3 , 4 , 5 , -1 , -1 , 6 , -1 , -1 }, + + // CHANNEL_LAYOUT_6_1_FRONT + { 0 , 1 , -1 , 6 , -1 , -1 , 4 , 5 , -1 , 2 , 3 }, + + // CHANNEL_LAYOUT_7_0_FRONT + { 0 , 1 , 2 , -1 , -1 , -1 , 5 , 6 , -1 , 3 , 4 }, + + // CHANNEL_LAYOUT_7_1_WIDE_BACK + { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , -1 , -1 , -1 }, + + // CHANNEL_LAYOUT_OCTAGONAL + { 0 , 1 , 2 , -1 , 5 , 6 , -1 , -1 , 7 , 3 , 4 }, + // FL | FR | FC | LFE | BL | BR | FLofC | FRofC | BC | SL | SR }; diff --git a/media/base/channel_layout.h b/media/base/channel_layout.h index 51e5089..8153ca6 100644 --- a/media/base/channel_layout.h +++ b/media/base/channel_layout.h @@ -54,12 +54,48 @@ enum ChannelLayout { // Front L, Front R, Front C, Side L, Side R, LFE, Back L, Back R CHANNEL_LAYOUT_7_1 = 14, - // Front L, Front R, Front C, Back L, Back R, LFE, Front LofC, Front RofC + // Front L, Front R, Front C, Side L, Side R, LFE, Front LofC, Front RofC CHANNEL_LAYOUT_7_1_WIDE = 15, // Stereo L, Stereo R CHANNEL_LAYOUT_STEREO_DOWNMIX = 16, + // Stereo L, Stereo R, LFE + CHANNEL_LAYOUT_2POINT1 = 17, + + // Stereo L, Stereo R, Front C, LFE + CHANNEL_LAYOUT_3_1 = 18, + + // Stereo L, Stereo R, Front C, Rear C, LFE + CHANNEL_LAYOUT_4_1 = 19, + + // Stereo L, Stereo R, Front C, Side L, Side R, Back C + CHANNEL_LAYOUT_6_0 = 20, + + // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC + CHANNEL_LAYOUT_6_0_FRONT = 21, + + // Stereo L, Stereo R, Side L, Side R, Front C, Rear C. + CHANNEL_LAYOUT_HEXAGONAL = 22, + + // Stereo L, Stereo R, Side L, Side R, Front C, Rear Center, LFE + CHANNEL_LAYOUT_6_1 = 23, + + // Stereo L, Stereo R, Back L, Back R, Front C, Rear Center, LFE + CHANNEL_LAYOUT_6_1_BACK = 24, + + // Stereo L, Stereo R, Side L, Side R, Front LofC, Front RofC, LFE + CHANNEL_LAYOUT_6_1_FRONT = 25, + + // Front L, Front R, Front C, Side L, Side R, Front LofC, Front RofC + CHANNEL_LAYOUT_7_0_FRONT = 26, + + // Front L, Front R, Front C, Back L, Back R, LFE, Front LofC, Front RofC + CHANNEL_LAYOUT_7_1_WIDE_BACK = 27, + + // Front L, Front R, Front C, Side L, Side R, Rear C, Back L, Back R. + CHANNEL_LAYOUT_OCTAGONAL = 28, + // Total number of layouts. CHANNEL_LAYOUT_MAX // Must always be last! }; diff --git a/media/base/channel_mixer.cc b/media/base/channel_mixer.cc index 5fd8f59..fa4cbb6 100644 --- a/media/base/channel_mixer.cc +++ b/media/base/channel_mixer.cc @@ -186,14 +186,14 @@ ChannelMixer::ChannelMixer(ChannelLayout input, ChannelLayout output) // Mix LR of center into: front center || front LR. if (IsUnaccounted(LEFT_OF_CENTER)) { - if (HasOutputChannel(CENTER)) { - // Mix LR of center into front center. - Mix(LEFT_OF_CENTER, CENTER, kEqualPowerScale); - Mix(RIGHT_OF_CENTER, CENTER, kEqualPowerScale); - } else { + if (HasOutputChannel(LEFT)) { // Mix LR of center into front LR. Mix(LEFT_OF_CENTER, LEFT, kEqualPowerScale); Mix(RIGHT_OF_CENTER, RIGHT, kEqualPowerScale); + } else { + // Mix LR of center into front center. + Mix(LEFT_OF_CENTER, CENTER, kEqualPowerScale); + Mix(RIGHT_OF_CENTER, CENTER, kEqualPowerScale); } } diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index 973dc81..6820066 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc @@ -353,6 +353,30 @@ ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout, return CHANNEL_LAYOUT_7_1_WIDE; case AV_CH_LAYOUT_STEREO_DOWNMIX: return CHANNEL_LAYOUT_STEREO_DOWNMIX; + case AV_CH_LAYOUT_2POINT1: + return CHANNEL_LAYOUT_2POINT1; + case AV_CH_LAYOUT_3POINT1: + return CHANNEL_LAYOUT_3_1; + case AV_CH_LAYOUT_4POINT1: + return CHANNEL_LAYOUT_4_1; + case AV_CH_LAYOUT_6POINT0: + return CHANNEL_LAYOUT_6_0; + case AV_CH_LAYOUT_6POINT0_FRONT: + return CHANNEL_LAYOUT_6_0_FRONT; + case AV_CH_LAYOUT_HEXAGONAL: + return CHANNEL_LAYOUT_HEXAGONAL; + case AV_CH_LAYOUT_6POINT1: + return CHANNEL_LAYOUT_6_1; + case AV_CH_LAYOUT_6POINT1_BACK: + return CHANNEL_LAYOUT_6_1_BACK; + case AV_CH_LAYOUT_6POINT1_FRONT: + return CHANNEL_LAYOUT_6_1_FRONT; + case AV_CH_LAYOUT_7POINT0_FRONT: + return CHANNEL_LAYOUT_7_0_FRONT; + case AV_CH_LAYOUT_7POINT1_WIDE_BACK: + return CHANNEL_LAYOUT_7_1_WIDE_BACK; + case AV_CH_LAYOUT_OCTAGONAL: + return CHANNEL_LAYOUT_OCTAGONAL; default: // FFmpeg channel_layout is 0 for .wav and .mp3. We know mono and stereo // from the number of channels, otherwise report errors. @@ -360,7 +384,7 @@ ChannelLayout ChannelLayoutToChromeChannelLayout(int64_t layout, return CHANNEL_LAYOUT_MONO; if (channels == 2) return CHANNEL_LAYOUT_STEREO; - DVLOG(1) << "Unsupported channel layout: " << layout; + LOG(ERROR) << "Unsupported channel layout: " << layout; } return CHANNEL_LAYOUT_UNSUPPORTED; } |