| Index: media/base/channel_mixer.cc
|
| ===================================================================
|
| --- media/base/channel_mixer.cc (revision 189875)
|
| +++ media/base/channel_mixer.cc (working copy)
|
| @@ -11,7 +11,6 @@
|
| #include <cmath>
|
|
|
| #include "base/logging.h"
|
| -#include "media/audio/audio_parameters.h"
|
| #include "media/base/audio_bus.h"
|
| #include "media/base/vector_math.h"
|
|
|
| @@ -21,11 +20,14 @@
|
| // value for stereo -> mono and mono -> stereo mixes.
|
| static const float kEqualPowerScale = static_cast<float>(M_SQRT1_2);
|
|
|
| -static void ValidateLayout(ChannelLayout layout) {
|
| +static int ValidateLayout(ChannelLayout layout) {
|
| CHECK_NE(layout, CHANNEL_LAYOUT_NONE);
|
| CHECK_NE(layout, CHANNEL_LAYOUT_MAX);
|
| +
|
| + // TODO(dalecurtis, crogers): We will eventually handle unsupported layouts by
|
| + // simply copying the input channels to the output channels, similar to if the
|
| + // user requests identical input and output layouts today.
|
| CHECK_NE(layout, CHANNEL_LAYOUT_UNSUPPORTED);
|
| - CHECK_NE(layout, CHANNEL_LAYOUT_DISCRETE);
|
|
|
| // Verify there's at least one channel. Should always be true here by virtue
|
| // of not being one of the invalid layouts, but lets double check to be sure.
|
| @@ -50,60 +52,24 @@
|
| DCHECK_EQ(layout, CHANNEL_LAYOUT_MONO);
|
| }
|
|
|
| - return;
|
| + return channel_count;
|
| }
|
|
|
| -ChannelMixer::ChannelMixer(ChannelLayout input_layout,
|
| - ChannelLayout output_layout) {
|
| - Initialize(input_layout,
|
| - ChannelLayoutToChannelCount(input_layout),
|
| - output_layout,
|
| - ChannelLayoutToChannelCount(output_layout));
|
| -}
|
| -
|
| -ChannelMixer::ChannelMixer(
|
| - const AudioParameters& input, const AudioParameters& output) {
|
| - Initialize(input.channel_layout(),
|
| - input.channels(),
|
| - output.channel_layout(),
|
| - output.channels());
|
| -}
|
| -
|
| -void ChannelMixer::Initialize(
|
| - ChannelLayout input_layout, int input_channels,
|
| - ChannelLayout output_layout, int output_channels) {
|
| - input_layout_ = input_layout;
|
| - output_layout_ = output_layout;
|
| - remapping_ = false;
|
| -
|
| +ChannelMixer::ChannelMixer(ChannelLayout input, ChannelLayout output)
|
| + : input_layout_(input),
|
| + output_layout_(output),
|
| + remapping_(false) {
|
| // Stereo down mix should never be the output layout.
|
| CHECK_NE(output_layout_, CHANNEL_LAYOUT_STEREO_DOWNMIX);
|
|
|
| - if (input_layout_ != CHANNEL_LAYOUT_DISCRETE)
|
| - ValidateLayout(input_layout_);
|
| - if (output_layout_ != CHANNEL_LAYOUT_DISCRETE)
|
| - ValidateLayout(output_layout_);
|
| + int input_channels = ValidateLayout(input_layout_);
|
| + int output_channels = ValidateLayout(output_layout_);
|
|
|
| // Size out the initial matrix.
|
| matrix_.reserve(output_channels);
|
| for (int output_ch = 0; output_ch < output_channels; ++output_ch)
|
| matrix_.push_back(std::vector<float>(input_channels, 0));
|
|
|
| - // First check for discrete case.
|
| - if (input_layout_ == CHANNEL_LAYOUT_DISCRETE ||
|
| - output_layout_ == CHANNEL_LAYOUT_DISCRETE) {
|
| - // If the number of input channels is more than output channels, then
|
| - // copy as many as we can then drop the remaining input channels.
|
| - // If the number of input channels is less than output channels, then
|
| - // copy them all, then zero out the remaining output channels.
|
| - int passthrough_channels = std::min(input_channels, output_channels);
|
| - for (int i = 0; i < passthrough_channels; ++i)
|
| - matrix_[i][i] = 1;
|
| -
|
| - remapping_ = true;
|
| - return;
|
| - }
|
| -
|
| // Route matching channels and figure out which ones aren't accounted for.
|
| for (Channels ch = LEFT; ch < CHANNELS_MAX;
|
| ch = static_cast<Channels>(ch + 1)) {
|
| @@ -136,8 +102,7 @@
|
| // When down mixing to mono from stereo, we need to be careful of full scale
|
| // stereo mixes. Scaling by 1 / sqrt(2) here will likely lead to clipping
|
| // so we use 1 / 2 instead.
|
| - float scale =
|
| - (output_layout_ == CHANNEL_LAYOUT_MONO && input_channels == 2) ?
|
| + float scale = (output == CHANNEL_LAYOUT_MONO && input_channels == 2) ?
|
| 0.5 : kEqualPowerScale;
|
| Mix(LEFT, CENTER, scale);
|
| Mix(RIGHT, CENTER, scale);
|
| @@ -146,8 +111,7 @@
|
| // Mix center into front LR.
|
| if (IsUnaccounted(CENTER)) {
|
| // When up mixing from mono, just do a copy to front LR.
|
| - float scale =
|
| - (input_layout_ == CHANNEL_LAYOUT_MONO) ? 1 : kEqualPowerScale;
|
| + float scale = (input == CHANNEL_LAYOUT_MONO) ? 1 : kEqualPowerScale;
|
| MixWithoutAccounting(CENTER, LEFT, scale);
|
| Mix(CENTER, RIGHT, scale);
|
| }
|
| @@ -164,7 +128,7 @@
|
| // Mix back LR into back center.
|
| Mix(BACK_LEFT, BACK_CENTER, kEqualPowerScale);
|
| Mix(BACK_RIGHT, BACK_CENTER, kEqualPowerScale);
|
| - } else if (output_layout_ > CHANNEL_LAYOUT_MONO) {
|
| + } else if (output > CHANNEL_LAYOUT_MONO) {
|
| // Mix back LR into front LR.
|
| Mix(BACK_LEFT, LEFT, kEqualPowerScale);
|
| Mix(BACK_RIGHT, RIGHT, kEqualPowerScale);
|
| @@ -187,7 +151,7 @@
|
| // Mix side LR into back center.
|
| Mix(SIDE_LEFT, BACK_CENTER, kEqualPowerScale);
|
| Mix(SIDE_RIGHT, BACK_CENTER, kEqualPowerScale);
|
| - } else if (output_layout_ > CHANNEL_LAYOUT_MONO) {
|
| + } else if (output > CHANNEL_LAYOUT_MONO) {
|
| // Mix side LR into front LR.
|
| Mix(SIDE_LEFT, LEFT, kEqualPowerScale);
|
| Mix(SIDE_RIGHT, RIGHT, kEqualPowerScale);
|
| @@ -208,7 +172,7 @@
|
| // Mix back center into side LR.
|
| MixWithoutAccounting(BACK_CENTER, SIDE_LEFT, kEqualPowerScale);
|
| Mix(BACK_CENTER, SIDE_RIGHT, kEqualPowerScale);
|
| - } else if (output_layout_ > CHANNEL_LAYOUT_MONO) {
|
| + } else if (output > CHANNEL_LAYOUT_MONO) {
|
| // Mix back center into front LR.
|
| // TODO(dalecurtis): Not sure about these values?
|
| MixWithoutAccounting(BACK_CENTER, LEFT, kEqualPowerScale);
|
|
|