mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 22:00:47 +01:00

Two new classes are added to WebRTC from Chrome: ChannelMixer and ChannelMixingMatrix but they are not yet utilized in the audio path for WebRTC. The idea is to utilize these new classes when adding support for multi- channel encoding/decoding in WebRTC/Chrome. Adds support for a new enumerator call webrtc::ChannelLayout and some helper methods which maps between channel layout and number of channels. These parts are also copied from Chrome. Minor (cosmetic) changes are also done on the AudioFrame to prepare for upcoming work. Bug: webrtc:10783 Change-Id: I6cd7a13a3bc1c8bbfa19bc974c7a011d22d19197 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/141674 Commit-Queue: Henrik Andreassson <henrika@webrtc.org> Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28482}
165 lines
5 KiB
C++
165 lines
5 KiB
C++
/*
|
|
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef API_AUDIO_CHANNEL_LAYOUT_H_
|
|
#define API_AUDIO_CHANNEL_LAYOUT_H_
|
|
|
|
namespace webrtc {
|
|
|
|
// This file is derived from Chromium's base/channel_layout.h.
|
|
|
|
// Enumerates the various representations of the ordering of audio channels.
|
|
// Logged to UMA, so never reuse a value, always add new/greater ones!
|
|
enum ChannelLayout {
|
|
CHANNEL_LAYOUT_NONE = 0,
|
|
CHANNEL_LAYOUT_UNSUPPORTED = 1,
|
|
|
|
// Front C
|
|
CHANNEL_LAYOUT_MONO = 2,
|
|
|
|
// Front L, Front R
|
|
CHANNEL_LAYOUT_STEREO = 3,
|
|
|
|
// Front L, Front R, Back C
|
|
CHANNEL_LAYOUT_2_1 = 4,
|
|
|
|
// Front L, Front R, Front C
|
|
CHANNEL_LAYOUT_SURROUND = 5,
|
|
|
|
// Front L, Front R, Front C, Back C
|
|
CHANNEL_LAYOUT_4_0 = 6,
|
|
|
|
// Front L, Front R, Side L, Side R
|
|
CHANNEL_LAYOUT_2_2 = 7,
|
|
|
|
// Front L, Front R, Back L, Back R
|
|
CHANNEL_LAYOUT_QUAD = 8,
|
|
|
|
// Front L, Front R, Front C, Side L, Side R
|
|
CHANNEL_LAYOUT_5_0 = 9,
|
|
|
|
// Front L, Front R, Front C, LFE, Side L, Side R
|
|
CHANNEL_LAYOUT_5_1 = 10,
|
|
|
|
// Front L, Front R, Front C, Back L, Back R
|
|
CHANNEL_LAYOUT_5_0_BACK = 11,
|
|
|
|
// Front L, Front R, Front C, LFE, Back L, Back R
|
|
CHANNEL_LAYOUT_5_1_BACK = 12,
|
|
|
|
// Front L, Front R, Front C, Side L, Side R, Back L, Back R
|
|
CHANNEL_LAYOUT_7_0 = 13,
|
|
|
|
// Front L, Front R, Front C, LFE, Side L, Side R, Back L, Back R
|
|
CHANNEL_LAYOUT_7_1 = 14,
|
|
|
|
// Front L, Front R, Front C, LFE, Side L, Side R, 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, Front C, Rear L, Rear R, Rear C
|
|
CHANNEL_LAYOUT_HEXAGONAL = 22,
|
|
|
|
// Stereo L, Stereo R, Front C, LFE, Side L, Side R, Rear Center
|
|
CHANNEL_LAYOUT_6_1 = 23,
|
|
|
|
// Stereo L, Stereo R, Front C, LFE, Back L, Back R, Rear Center
|
|
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, LFE, Back L, Back R, Front LofC, Front RofC
|
|
CHANNEL_LAYOUT_7_1_WIDE_BACK = 27,
|
|
|
|
// Front L, Front R, Front C, Side L, Side R, Rear L, Back R, Back C.
|
|
CHANNEL_LAYOUT_OCTAGONAL = 28,
|
|
|
|
// Channels are not explicitly mapped to speakers.
|
|
CHANNEL_LAYOUT_DISCRETE = 29,
|
|
|
|
// Front L, Front R, Front C. Front C contains the keyboard mic audio. This
|
|
// layout is only intended for input for WebRTC. The Front C channel
|
|
// is stripped away in the WebRTC audio input pipeline and never seen outside
|
|
// of that.
|
|
CHANNEL_LAYOUT_STEREO_AND_KEYBOARD_MIC = 30,
|
|
|
|
// Front L, Front R, Side L, Side R, LFE
|
|
CHANNEL_LAYOUT_4_1_QUAD_SIDE = 31,
|
|
|
|
// Actual channel layout is specified in the bitstream and the actual channel
|
|
// count is unknown at Chromium media pipeline level (useful for audio
|
|
// pass-through mode).
|
|
CHANNEL_LAYOUT_BITSTREAM = 32,
|
|
|
|
// Max value, must always equal the largest entry ever logged.
|
|
CHANNEL_LAYOUT_MAX = CHANNEL_LAYOUT_BITSTREAM
|
|
};
|
|
|
|
// Note: Do not reorder or reassign these values; other code depends on their
|
|
// ordering to operate correctly. E.g., CoreAudio channel layout computations.
|
|
enum Channels {
|
|
LEFT = 0,
|
|
RIGHT,
|
|
CENTER,
|
|
LFE,
|
|
BACK_LEFT,
|
|
BACK_RIGHT,
|
|
LEFT_OF_CENTER,
|
|
RIGHT_OF_CENTER,
|
|
BACK_CENTER,
|
|
SIDE_LEFT,
|
|
SIDE_RIGHT,
|
|
CHANNELS_MAX =
|
|
SIDE_RIGHT, // Must always equal the largest value ever logged.
|
|
};
|
|
|
|
// The maximum number of concurrently active channels for all possible layouts.
|
|
// ChannelLayoutToChannelCount() will never return a value higher than this.
|
|
constexpr int kMaxConcurrentChannels = 8;
|
|
|
|
// Returns the expected channel position in an interleaved stream. Values of -1
|
|
// mean the channel at that index is not used for that layout. Values range
|
|
// from 0 to ChannelLayoutToChannelCount(layout) - 1.
|
|
int ChannelOrder(ChannelLayout layout, Channels channel);
|
|
|
|
// Returns the number of channels in a given ChannelLayout.
|
|
int ChannelLayoutToChannelCount(ChannelLayout layout);
|
|
|
|
// Given the number of channels, return the best layout,
|
|
// or return CHANNEL_LAYOUT_UNSUPPORTED if there is no good match.
|
|
ChannelLayout GuessChannelLayout(int channels);
|
|
|
|
// Returns a string representation of the channel layout.
|
|
const char* ChannelLayoutToString(ChannelLayout layout);
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // API_AUDIO_CHANNEL_LAYOUT_H_
|