summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/base/channel_layout.cc54
-rw-r--r--media/base/channel_layout.h38
-rw-r--r--media/base/channel_mixer.cc10
-rw-r--r--media/ffmpeg/ffmpeg_common.cc26
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;
}