Repo created
This commit is contained in:
parent
81b91f4139
commit
f8c34fa5ee
22732 changed files with 4815320 additions and 2 deletions
110
TMessagesProj/jni/voip/webrtc/api/audio_codecs/opus/BUILD.gn
Normal file
110
TMessagesProj/jni/voip/webrtc/api/audio_codecs/opus/BUILD.gn
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
# Copyright (c) 2017 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.
|
||||
|
||||
import("../../../webrtc.gni")
|
||||
if (is_android) {
|
||||
import("//build/config/android/config.gni")
|
||||
import("//build/config/android/rules.gni")
|
||||
}
|
||||
|
||||
rtc_library("audio_encoder_opus_config") {
|
||||
visibility = [ "*" ]
|
||||
sources = [
|
||||
"audio_encoder_multi_channel_opus_config.cc",
|
||||
"audio_encoder_multi_channel_opus_config.h",
|
||||
"audio_encoder_opus_config.cc",
|
||||
"audio_encoder_opus_config.h",
|
||||
]
|
||||
deps = [ "../../../rtc_base/system:rtc_export" ]
|
||||
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
|
||||
defines = []
|
||||
if (rtc_opus_variable_complexity) {
|
||||
defines += [ "WEBRTC_OPUS_VARIABLE_COMPLEXITY=1" ]
|
||||
} else {
|
||||
defines += [ "WEBRTC_OPUS_VARIABLE_COMPLEXITY=0" ]
|
||||
}
|
||||
}
|
||||
|
||||
rtc_source_set("audio_decoder_opus_config") {
|
||||
visibility = [ "*" ]
|
||||
sources = [ "audio_decoder_multi_channel_opus_config.h" ]
|
||||
deps = [ "..:audio_codecs_api" ]
|
||||
}
|
||||
|
||||
rtc_library("audio_encoder_opus") {
|
||||
visibility = [ "*" ]
|
||||
poisonous = [ "audio_codecs" ]
|
||||
public = [ "audio_encoder_opus.h" ]
|
||||
sources = [ "audio_encoder_opus.cc" ]
|
||||
deps = [
|
||||
":audio_encoder_opus_config",
|
||||
"..:audio_codecs_api",
|
||||
"../../../api:field_trials_view",
|
||||
"../../../modules/audio_coding:webrtc_opus",
|
||||
"../../../rtc_base/system:rtc_export",
|
||||
]
|
||||
absl_deps = [
|
||||
"//third_party/abseil-cpp/absl/strings",
|
||||
"//third_party/abseil-cpp/absl/types:optional",
|
||||
]
|
||||
}
|
||||
|
||||
rtc_library("audio_decoder_opus") {
|
||||
visibility = [ "*" ]
|
||||
poisonous = [ "audio_codecs" ]
|
||||
sources = [
|
||||
"audio_decoder_opus.cc",
|
||||
"audio_decoder_opus.h",
|
||||
]
|
||||
deps = [
|
||||
"..:audio_codecs_api",
|
||||
"../../../api:field_trials_view",
|
||||
"../../../modules/audio_coding:webrtc_opus",
|
||||
"../../../rtc_base/system:rtc_export",
|
||||
]
|
||||
absl_deps = [
|
||||
"//third_party/abseil-cpp/absl/strings",
|
||||
"//third_party/abseil-cpp/absl/types:optional",
|
||||
]
|
||||
}
|
||||
|
||||
rtc_library("audio_encoder_multiopus") {
|
||||
visibility = [ "*" ]
|
||||
poisonous = [ "audio_codecs" ]
|
||||
public = [ "audio_encoder_multi_channel_opus.h" ]
|
||||
sources = [ "audio_encoder_multi_channel_opus.cc" ]
|
||||
deps = [
|
||||
"..:audio_codecs_api",
|
||||
"../../../api:field_trials_view",
|
||||
"../../../modules/audio_coding:webrtc_multiopus",
|
||||
"../../../rtc_base/system:rtc_export",
|
||||
"../opus:audio_encoder_opus_config",
|
||||
]
|
||||
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
|
||||
}
|
||||
|
||||
rtc_library("audio_decoder_multiopus") {
|
||||
visibility = [ "*" ]
|
||||
poisonous = [ "audio_codecs" ]
|
||||
sources = [
|
||||
"audio_decoder_multi_channel_opus.cc",
|
||||
"audio_decoder_multi_channel_opus.h",
|
||||
]
|
||||
deps = [
|
||||
":audio_decoder_opus_config",
|
||||
"..:audio_codecs_api",
|
||||
"../../../api:field_trials_view",
|
||||
"../../../modules/audio_coding:webrtc_multiopus",
|
||||
"../../../rtc_base/system:rtc_export",
|
||||
]
|
||||
absl_deps = [
|
||||
"//third_party/abseil-cpp/absl/memory",
|
||||
"//third_party/abseil-cpp/absl/strings",
|
||||
"//third_party/abseil-cpp/absl/types:optional",
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "api/audio_codecs/opus/audio_decoder_multi_channel_opus.h"
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/memory/memory.h"
|
||||
#include "absl/strings/match.h"
|
||||
#include "modules/audio_coding/codecs/opus/audio_decoder_multi_channel_opus_impl.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
absl::optional<AudioDecoderMultiChannelOpusConfig>
|
||||
AudioDecoderMultiChannelOpus::SdpToConfig(const SdpAudioFormat& format) {
|
||||
return AudioDecoderMultiChannelOpusImpl::SdpToConfig(format);
|
||||
}
|
||||
|
||||
void AudioDecoderMultiChannelOpus::AppendSupportedDecoders(
|
||||
std::vector<AudioCodecSpec>* specs) {
|
||||
// To get full utilization of the surround support of the Opus lib, we can
|
||||
// mark which channel is the low frequency effects (LFE). But that is not done
|
||||
// ATM.
|
||||
{
|
||||
AudioCodecInfo surround_5_1_opus_info{48000, 6,
|
||||
/* default_bitrate_bps= */ 128000};
|
||||
surround_5_1_opus_info.allow_comfort_noise = false;
|
||||
surround_5_1_opus_info.supports_network_adaption = false;
|
||||
SdpAudioFormat opus_format({"multiopus",
|
||||
48000,
|
||||
6,
|
||||
{{"minptime", "10"},
|
||||
{"useinbandfec", "1"},
|
||||
{"channel_mapping", "0,4,1,2,3,5"},
|
||||
{"num_streams", "4"},
|
||||
{"coupled_streams", "2"}}});
|
||||
specs->push_back({std::move(opus_format), surround_5_1_opus_info});
|
||||
}
|
||||
{
|
||||
AudioCodecInfo surround_7_1_opus_info{48000, 8,
|
||||
/* default_bitrate_bps= */ 200000};
|
||||
surround_7_1_opus_info.allow_comfort_noise = false;
|
||||
surround_7_1_opus_info.supports_network_adaption = false;
|
||||
SdpAudioFormat opus_format({"multiopus",
|
||||
48000,
|
||||
8,
|
||||
{{"minptime", "10"},
|
||||
{"useinbandfec", "1"},
|
||||
{"channel_mapping", "0,6,1,2,3,4,5,7"},
|
||||
{"num_streams", "5"},
|
||||
{"coupled_streams", "3"}}});
|
||||
specs->push_back({std::move(opus_format), surround_7_1_opus_info});
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<AudioDecoder> AudioDecoderMultiChannelOpus::MakeAudioDecoder(
|
||||
AudioDecoderMultiChannelOpusConfig config,
|
||||
absl::optional<AudioCodecPairId> /*codec_pair_id*/,
|
||||
const FieldTrialsView* field_trials) {
|
||||
return AudioDecoderMultiChannelOpusImpl::MakeAudioDecoder(config);
|
||||
}
|
||||
} // namespace webrtc
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* 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_CODECS_OPUS_AUDIO_DECODER_MULTI_CHANNEL_OPUS_H_
|
||||
#define API_AUDIO_CODECS_OPUS_AUDIO_DECODER_MULTI_CHANNEL_OPUS_H_
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "api/audio_codecs/audio_codec_pair_id.h"
|
||||
#include "api/audio_codecs/audio_decoder.h"
|
||||
#include "api/audio_codecs/audio_format.h"
|
||||
#include "api/audio_codecs/opus/audio_decoder_multi_channel_opus_config.h"
|
||||
#include "api/field_trials_view.h"
|
||||
#include "rtc_base/system/rtc_export.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
// Opus decoder API for use as a template parameter to
|
||||
// CreateAudioDecoderFactory<...>().
|
||||
struct RTC_EXPORT AudioDecoderMultiChannelOpus {
|
||||
using Config = AudioDecoderMultiChannelOpusConfig;
|
||||
static absl::optional<AudioDecoderMultiChannelOpusConfig> SdpToConfig(
|
||||
const SdpAudioFormat& audio_format);
|
||||
static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
|
||||
static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
|
||||
AudioDecoderMultiChannelOpusConfig config,
|
||||
absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
|
||||
const FieldTrialsView* field_trials = nullptr);
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // API_AUDIO_CODECS_OPUS_AUDIO_DECODER_MULTI_CHANNEL_OPUS_H_
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* 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_CODECS_OPUS_AUDIO_DECODER_MULTI_CHANNEL_OPUS_CONFIG_H_
|
||||
#define API_AUDIO_CODECS_OPUS_AUDIO_DECODER_MULTI_CHANNEL_OPUS_CONFIG_H_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "api/audio_codecs/audio_decoder.h"
|
||||
|
||||
namespace webrtc {
|
||||
struct AudioDecoderMultiChannelOpusConfig {
|
||||
// The number of channels that the decoder will output.
|
||||
int num_channels;
|
||||
|
||||
// Number of mono or stereo encoded Opus streams.
|
||||
int num_streams;
|
||||
|
||||
// Number of channel pairs coupled together, see RFC 7845 section
|
||||
// 5.1.1. Has to be less than the number of streams.
|
||||
int coupled_streams;
|
||||
|
||||
// Channel mapping table, defines the mapping from encoded streams to output
|
||||
// channels. See RFC 7845 section 5.1.1.
|
||||
std::vector<unsigned char> channel_mapping;
|
||||
|
||||
bool IsOk() const {
|
||||
if (num_channels < 1 || num_channels > AudioDecoder::kMaxNumberOfChannels ||
|
||||
num_streams < 0 || coupled_streams < 0) {
|
||||
return false;
|
||||
}
|
||||
if (num_streams < coupled_streams) {
|
||||
return false;
|
||||
}
|
||||
if (channel_mapping.size() != static_cast<size_t>(num_channels)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Every mono stream codes one channel, every coupled stream codes two. This
|
||||
// is the total coded channel count:
|
||||
const int max_coded_channel = num_streams + coupled_streams;
|
||||
for (const auto& x : channel_mapping) {
|
||||
// Coded channels >= max_coded_channel don't exist. Except for 255, which
|
||||
// tells Opus to put silence in output channel x.
|
||||
if (x >= max_coded_channel && x != 255) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_channels > 255 || max_coded_channel >= 255) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // API_AUDIO_CODECS_OPUS_AUDIO_DECODER_MULTI_CHANNEL_OPUS_CONFIG_H_
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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.
|
||||
*/
|
||||
|
||||
#include "api/audio_codecs/opus/audio_decoder_opus.h"
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/strings/match.h"
|
||||
#include "modules/audio_coding/codecs/opus/audio_decoder_opus.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
bool AudioDecoderOpus::Config::IsOk() const {
|
||||
if (sample_rate_hz != 16000 && sample_rate_hz != 48000) {
|
||||
// Unsupported sample rate. (libopus supports a few other rates as
|
||||
// well; we can add support for them when needed.)
|
||||
return false;
|
||||
}
|
||||
if (num_channels != 1 && num_channels != 2) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
absl::optional<AudioDecoderOpus::Config> AudioDecoderOpus::SdpToConfig(
|
||||
const SdpAudioFormat& format) {
|
||||
const auto num_channels = [&]() -> absl::optional<int> {
|
||||
auto stereo = format.parameters.find("stereo");
|
||||
if (stereo != format.parameters.end()) {
|
||||
if (stereo->second == "0") {
|
||||
return 1;
|
||||
} else if (stereo->second == "1") {
|
||||
return 2;
|
||||
} else {
|
||||
return absl::nullopt; // Bad stereo parameter.
|
||||
}
|
||||
}
|
||||
return 1; // Default to mono.
|
||||
}();
|
||||
if (absl::EqualsIgnoreCase(format.name, "opus") &&
|
||||
format.clockrate_hz == 48000 && format.num_channels == 2 &&
|
||||
num_channels) {
|
||||
Config config;
|
||||
config.num_channels = *num_channels;
|
||||
if (!config.IsOk()) {
|
||||
RTC_DCHECK_NOTREACHED();
|
||||
return absl::nullopt;
|
||||
}
|
||||
return config;
|
||||
} else {
|
||||
return absl::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
void AudioDecoderOpus::AppendSupportedDecoders(
|
||||
std::vector<AudioCodecSpec>* specs) {
|
||||
AudioCodecInfo opus_info{48000, 1, 64000, 6000, 510000};
|
||||
opus_info.allow_comfort_noise = false;
|
||||
opus_info.supports_network_adaption = true;
|
||||
SdpAudioFormat opus_format(
|
||||
{"opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}});
|
||||
specs->push_back({std::move(opus_format), opus_info});
|
||||
}
|
||||
|
||||
std::unique_ptr<AudioDecoder> AudioDecoderOpus::MakeAudioDecoder(
|
||||
Config config,
|
||||
absl::optional<AudioCodecPairId> /*codec_pair_id*/,
|
||||
const FieldTrialsView* field_trials) {
|
||||
if (!config.IsOk()) {
|
||||
RTC_DCHECK_NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
return std::make_unique<AudioDecoderOpusImpl>(config.num_channels,
|
||||
config.sample_rate_hz);
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
|
||||
#define API_AUDIO_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "api/audio_codecs/audio_codec_pair_id.h"
|
||||
#include "api/audio_codecs/audio_decoder.h"
|
||||
#include "api/audio_codecs/audio_format.h"
|
||||
#include "api/field_trials_view.h"
|
||||
#include "rtc_base/system/rtc_export.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
// Opus decoder API for use as a template parameter to
|
||||
// CreateAudioDecoderFactory<...>().
|
||||
struct RTC_EXPORT AudioDecoderOpus {
|
||||
struct Config {
|
||||
bool IsOk() const; // Checks if the values are currently OK.
|
||||
int sample_rate_hz = 48000;
|
||||
int num_channels = 1;
|
||||
};
|
||||
static absl::optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
|
||||
static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
|
||||
static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
|
||||
Config config,
|
||||
absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
|
||||
const FieldTrialsView* field_trials = nullptr);
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // API_AUDIO_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "api/audio_codecs/opus/audio_encoder_multi_channel_opus.h"
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "modules/audio_coding/codecs/opus/audio_encoder_multi_channel_opus_impl.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
absl::optional<AudioEncoderMultiChannelOpusConfig>
|
||||
AudioEncoderMultiChannelOpus::SdpToConfig(const SdpAudioFormat& format) {
|
||||
return AudioEncoderMultiChannelOpusImpl::SdpToConfig(format);
|
||||
}
|
||||
|
||||
void AudioEncoderMultiChannelOpus::AppendSupportedEncoders(
|
||||
std::vector<AudioCodecSpec>* specs) {
|
||||
// To get full utilization of the surround support of the Opus lib, we can
|
||||
// mark which channel is the low frequency effects (LFE). But that is not done
|
||||
// ATM.
|
||||
{
|
||||
AudioCodecInfo surround_5_1_opus_info{48000, 6,
|
||||
/* default_bitrate_bps= */ 128000};
|
||||
surround_5_1_opus_info.allow_comfort_noise = false;
|
||||
surround_5_1_opus_info.supports_network_adaption = false;
|
||||
SdpAudioFormat opus_format({"multiopus",
|
||||
48000,
|
||||
6,
|
||||
{{"minptime", "10"},
|
||||
{"useinbandfec", "1"},
|
||||
{"channel_mapping", "0,4,1,2,3,5"},
|
||||
{"num_streams", "4"},
|
||||
{"coupled_streams", "2"}}});
|
||||
specs->push_back({std::move(opus_format), surround_5_1_opus_info});
|
||||
}
|
||||
{
|
||||
AudioCodecInfo surround_7_1_opus_info{48000, 8,
|
||||
/* default_bitrate_bps= */ 200000};
|
||||
surround_7_1_opus_info.allow_comfort_noise = false;
|
||||
surround_7_1_opus_info.supports_network_adaption = false;
|
||||
SdpAudioFormat opus_format({"multiopus",
|
||||
48000,
|
||||
8,
|
||||
{{"minptime", "10"},
|
||||
{"useinbandfec", "1"},
|
||||
{"channel_mapping", "0,6,1,2,3,4,5,7"},
|
||||
{"num_streams", "5"},
|
||||
{"coupled_streams", "3"}}});
|
||||
specs->push_back({std::move(opus_format), surround_7_1_opus_info});
|
||||
}
|
||||
}
|
||||
|
||||
AudioCodecInfo AudioEncoderMultiChannelOpus::QueryAudioEncoder(
|
||||
const AudioEncoderMultiChannelOpusConfig& config) {
|
||||
return AudioEncoderMultiChannelOpusImpl::QueryAudioEncoder(config);
|
||||
}
|
||||
|
||||
std::unique_ptr<AudioEncoder> AudioEncoderMultiChannelOpus::MakeAudioEncoder(
|
||||
const AudioEncoderMultiChannelOpusConfig& config,
|
||||
int payload_type,
|
||||
absl::optional<AudioCodecPairId> /*codec_pair_id*/,
|
||||
const FieldTrialsView* field_trials) {
|
||||
return AudioEncoderMultiChannelOpusImpl::MakeAudioEncoder(config,
|
||||
payload_type);
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* 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_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_H_
|
||||
#define API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_H_
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "api/audio_codecs/audio_codec_pair_id.h"
|
||||
#include "api/audio_codecs/audio_encoder.h"
|
||||
#include "api/audio_codecs/audio_format.h"
|
||||
#include "api/audio_codecs/opus/audio_encoder_multi_channel_opus_config.h"
|
||||
#include "api/field_trials_view.h"
|
||||
#include "rtc_base/system/rtc_export.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
// Opus encoder API for use as a template parameter to
|
||||
// CreateAudioEncoderFactory<...>().
|
||||
struct RTC_EXPORT AudioEncoderMultiChannelOpus {
|
||||
using Config = AudioEncoderMultiChannelOpusConfig;
|
||||
static absl::optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
|
||||
static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
|
||||
static AudioCodecInfo QueryAudioEncoder(const Config& config);
|
||||
static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
|
||||
const Config& config,
|
||||
int payload_type,
|
||||
absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
|
||||
const FieldTrialsView* field_trials = nullptr);
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_H_
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "api/audio_codecs/opus/audio_encoder_multi_channel_opus_config.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
namespace {
|
||||
constexpr int kDefaultComplexity = 9;
|
||||
} // namespace
|
||||
|
||||
AudioEncoderMultiChannelOpusConfig::AudioEncoderMultiChannelOpusConfig()
|
||||
: frame_size_ms(kDefaultFrameSizeMs),
|
||||
num_channels(1),
|
||||
application(ApplicationMode::kVoip),
|
||||
bitrate_bps(32000),
|
||||
fec_enabled(false),
|
||||
cbr_enabled(false),
|
||||
dtx_enabled(false),
|
||||
max_playback_rate_hz(48000),
|
||||
complexity(kDefaultComplexity),
|
||||
num_streams(-1),
|
||||
coupled_streams(-1) {}
|
||||
AudioEncoderMultiChannelOpusConfig::AudioEncoderMultiChannelOpusConfig(
|
||||
const AudioEncoderMultiChannelOpusConfig&) = default;
|
||||
AudioEncoderMultiChannelOpusConfig::~AudioEncoderMultiChannelOpusConfig() =
|
||||
default;
|
||||
AudioEncoderMultiChannelOpusConfig&
|
||||
AudioEncoderMultiChannelOpusConfig::operator=(
|
||||
const AudioEncoderMultiChannelOpusConfig&) = default;
|
||||
|
||||
bool AudioEncoderMultiChannelOpusConfig::IsOk() const {
|
||||
if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
|
||||
return false;
|
||||
if (num_channels >= 255) {
|
||||
return false;
|
||||
}
|
||||
if (bitrate_bps < kMinBitrateBps || bitrate_bps > kMaxBitrateBps)
|
||||
return false;
|
||||
if (complexity < 0 || complexity > 10)
|
||||
return false;
|
||||
|
||||
// Check the lengths:
|
||||
if (num_streams < 0 || coupled_streams < 0) {
|
||||
return false;
|
||||
}
|
||||
if (num_streams < coupled_streams) {
|
||||
return false;
|
||||
}
|
||||
if (channel_mapping.size() != static_cast<size_t>(num_channels)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Every mono stream codes one channel, every coupled stream codes two. This
|
||||
// is the total coded channel count:
|
||||
const int max_coded_channel = num_streams + coupled_streams;
|
||||
for (const auto& x : channel_mapping) {
|
||||
// Coded channels >= max_coded_channel don't exist. Except for 255, which
|
||||
// tells Opus to ignore input channel x.
|
||||
if (x >= max_coded_channel && x != 255) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Inverse mapping.
|
||||
constexpr int kNotSet = -1;
|
||||
std::vector<int> coded_channels_to_input_channels(max_coded_channel, kNotSet);
|
||||
for (size_t i = 0; i < num_channels; ++i) {
|
||||
if (channel_mapping[i] == 255) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If it's not ignored, put it in the inverted mapping. But first check if
|
||||
// we've told Opus to use another input channel for this coded channel:
|
||||
const int coded_channel = channel_mapping[i];
|
||||
if (coded_channels_to_input_channels[coded_channel] != kNotSet) {
|
||||
// Coded channel `coded_channel` comes from both input channels
|
||||
// `coded_channels_to_input_channels[coded_channel]` and `i`.
|
||||
return false;
|
||||
}
|
||||
|
||||
coded_channels_to_input_channels[coded_channel] = i;
|
||||
}
|
||||
|
||||
// Check that we specified what input the encoder should use to produce
|
||||
// every coded channel.
|
||||
for (int i = 0; i < max_coded_channel; ++i) {
|
||||
if (coded_channels_to_input_channels[i] == kNotSet) {
|
||||
// Coded channel `i` has unspecified input channel.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_channels > 255 || max_coded_channel >= 255) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* 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_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_CONFIG_H_
|
||||
#define API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_CONFIG_H_
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "api/audio_codecs/opus/audio_encoder_opus_config.h"
|
||||
#include "rtc_base/system/rtc_export.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
struct RTC_EXPORT AudioEncoderMultiChannelOpusConfig {
|
||||
static constexpr int kDefaultFrameSizeMs = 20;
|
||||
|
||||
// Opus API allows a min bitrate of 500bps, but Opus documentation suggests
|
||||
// bitrate should be in the range of 6000 to 510000, inclusive.
|
||||
static constexpr int kMinBitrateBps = 6000;
|
||||
static constexpr int kMaxBitrateBps = 510000;
|
||||
|
||||
AudioEncoderMultiChannelOpusConfig();
|
||||
AudioEncoderMultiChannelOpusConfig(const AudioEncoderMultiChannelOpusConfig&);
|
||||
~AudioEncoderMultiChannelOpusConfig();
|
||||
AudioEncoderMultiChannelOpusConfig& operator=(
|
||||
const AudioEncoderMultiChannelOpusConfig&);
|
||||
|
||||
int frame_size_ms;
|
||||
size_t num_channels;
|
||||
enum class ApplicationMode { kVoip, kAudio };
|
||||
ApplicationMode application;
|
||||
int bitrate_bps;
|
||||
bool fec_enabled;
|
||||
bool cbr_enabled;
|
||||
bool dtx_enabled;
|
||||
int max_playback_rate_hz;
|
||||
std::vector<int> supported_frame_lengths_ms;
|
||||
|
||||
int complexity;
|
||||
|
||||
// Number of mono/stereo Opus streams.
|
||||
int num_streams;
|
||||
|
||||
// Number of channel pairs coupled together, see RFC 7845 section
|
||||
// 5.1.1. Has to be less than the number of streams
|
||||
int coupled_streams;
|
||||
|
||||
// Channel mapping table, defines the mapping from encoded streams to input
|
||||
// channels. See RFC 7845 section 5.1.1.
|
||||
std::vector<unsigned char> channel_mapping;
|
||||
|
||||
bool IsOk() const;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
#endif // API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_MULTI_CHANNEL_OPUS_CONFIG_H_
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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.
|
||||
*/
|
||||
|
||||
#include "api/audio_codecs/opus/audio_encoder_opus.h"
|
||||
|
||||
#include "modules/audio_coding/codecs/opus/audio_encoder_opus.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
absl::optional<AudioEncoderOpusConfig> AudioEncoderOpus::SdpToConfig(
|
||||
const SdpAudioFormat& format) {
|
||||
return AudioEncoderOpusImpl::SdpToConfig(format);
|
||||
}
|
||||
|
||||
void AudioEncoderOpus::AppendSupportedEncoders(
|
||||
std::vector<AudioCodecSpec>* specs) {
|
||||
AudioEncoderOpusImpl::AppendSupportedEncoders(specs);
|
||||
}
|
||||
|
||||
AudioCodecInfo AudioEncoderOpus::QueryAudioEncoder(
|
||||
const AudioEncoderOpusConfig& config) {
|
||||
return AudioEncoderOpusImpl::QueryAudioEncoder(config);
|
||||
}
|
||||
|
||||
std::unique_ptr<AudioEncoder> AudioEncoderOpus::MakeAudioEncoder(
|
||||
const AudioEncoderOpusConfig& config,
|
||||
int payload_type,
|
||||
absl::optional<AudioCodecPairId> /*codec_pair_id*/,
|
||||
const FieldTrialsView* field_trials) {
|
||||
if (!config.IsOk()) {
|
||||
RTC_DCHECK_NOTREACHED();
|
||||
return nullptr;
|
||||
}
|
||||
return AudioEncoderOpusImpl::MakeAudioEncoder(config, payload_type);
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
|
||||
#define API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "api/audio_codecs/audio_codec_pair_id.h"
|
||||
#include "api/audio_codecs/audio_encoder.h"
|
||||
#include "api/audio_codecs/audio_format.h"
|
||||
#include "api/audio_codecs/opus/audio_encoder_opus_config.h"
|
||||
#include "api/field_trials_view.h"
|
||||
#include "rtc_base/system/rtc_export.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
// Opus encoder API for use as a template parameter to
|
||||
// CreateAudioEncoderFactory<...>().
|
||||
struct RTC_EXPORT AudioEncoderOpus {
|
||||
using Config = AudioEncoderOpusConfig;
|
||||
static absl::optional<AudioEncoderOpusConfig> SdpToConfig(
|
||||
const SdpAudioFormat& audio_format);
|
||||
static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
|
||||
static AudioCodecInfo QueryAudioEncoder(const AudioEncoderOpusConfig& config);
|
||||
static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
|
||||
const AudioEncoderOpusConfig& config,
|
||||
int payload_type,
|
||||
absl::optional<AudioCodecPairId> codec_pair_id = absl::nullopt,
|
||||
const FieldTrialsView* field_trials = nullptr);
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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.
|
||||
*/
|
||||
|
||||
#include "api/audio_codecs/opus/audio_encoder_opus_config.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
namespace {
|
||||
|
||||
#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
|
||||
constexpr int kDefaultComplexity = 5;
|
||||
#else
|
||||
constexpr int kDefaultComplexity = 9;
|
||||
#endif
|
||||
|
||||
constexpr int kDefaultLowRateComplexity =
|
||||
WEBRTC_OPUS_VARIABLE_COMPLEXITY ? 9 : kDefaultComplexity;
|
||||
|
||||
} // namespace
|
||||
|
||||
constexpr int AudioEncoderOpusConfig::kDefaultFrameSizeMs;
|
||||
constexpr int AudioEncoderOpusConfig::kMinBitrateBps;
|
||||
constexpr int AudioEncoderOpusConfig::kMaxBitrateBps;
|
||||
|
||||
AudioEncoderOpusConfig::AudioEncoderOpusConfig()
|
||||
: frame_size_ms(kDefaultFrameSizeMs),
|
||||
sample_rate_hz(48000),
|
||||
num_channels(1),
|
||||
application(ApplicationMode::kVoip),
|
||||
bitrate_bps(32000),
|
||||
fec_enabled(false),
|
||||
cbr_enabled(false),
|
||||
max_playback_rate_hz(48000),
|
||||
complexity(kDefaultComplexity),
|
||||
low_rate_complexity(kDefaultLowRateComplexity),
|
||||
complexity_threshold_bps(12500),
|
||||
complexity_threshold_window_bps(1500),
|
||||
dtx_enabled(false),
|
||||
uplink_bandwidth_update_interval_ms(200),
|
||||
payload_type(-1) {}
|
||||
AudioEncoderOpusConfig::AudioEncoderOpusConfig(const AudioEncoderOpusConfig&) =
|
||||
default;
|
||||
AudioEncoderOpusConfig::~AudioEncoderOpusConfig() = default;
|
||||
AudioEncoderOpusConfig& AudioEncoderOpusConfig::operator=(
|
||||
const AudioEncoderOpusConfig&) = default;
|
||||
|
||||
bool AudioEncoderOpusConfig::IsOk() const {
|
||||
if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
|
||||
return false;
|
||||
if (sample_rate_hz != 16000 && sample_rate_hz != 48000) {
|
||||
// Unsupported input sample rate. (libopus supports a few other rates as
|
||||
// well; we can add support for them when needed.)
|
||||
return false;
|
||||
}
|
||||
if (num_channels >= 255) {
|
||||
return false;
|
||||
}
|
||||
if (!bitrate_bps)
|
||||
return false;
|
||||
if (*bitrate_bps < kMinBitrateBps || *bitrate_bps > kMaxBitrateBps)
|
||||
return false;
|
||||
if (complexity < 0 || complexity > 10)
|
||||
return false;
|
||||
if (low_rate_complexity < 0 || low_rate_complexity > 10)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
} // namespace webrtc
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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_CODECS_OPUS_AUDIO_ENCODER_OPUS_CONFIG_H_
|
||||
#define API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_CONFIG_H_
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "rtc_base/system/rtc_export.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
struct RTC_EXPORT AudioEncoderOpusConfig {
|
||||
static constexpr int kDefaultFrameSizeMs = 20;
|
||||
|
||||
// Opus API allows a min bitrate of 500bps, but Opus documentation suggests
|
||||
// bitrate should be in the range of 6000 to 510000, inclusive.
|
||||
static constexpr int kMinBitrateBps = 6000;
|
||||
static constexpr int kMaxBitrateBps = 510000;
|
||||
|
||||
AudioEncoderOpusConfig();
|
||||
AudioEncoderOpusConfig(const AudioEncoderOpusConfig&);
|
||||
~AudioEncoderOpusConfig();
|
||||
AudioEncoderOpusConfig& operator=(const AudioEncoderOpusConfig&);
|
||||
|
||||
bool IsOk() const; // Checks if the values are currently OK.
|
||||
|
||||
int frame_size_ms;
|
||||
int sample_rate_hz;
|
||||
size_t num_channels;
|
||||
enum class ApplicationMode { kVoip, kAudio };
|
||||
ApplicationMode application;
|
||||
|
||||
// NOTE: This member must always be set.
|
||||
// TODO(kwiberg): Turn it into just an int.
|
||||
absl::optional<int> bitrate_bps;
|
||||
|
||||
bool fec_enabled;
|
||||
bool cbr_enabled;
|
||||
int max_playback_rate_hz;
|
||||
|
||||
// `complexity` is used when the bitrate goes above
|
||||
// `complexity_threshold_bps` + `complexity_threshold_window_bps`;
|
||||
// `low_rate_complexity` is used when the bitrate falls below
|
||||
// `complexity_threshold_bps` - `complexity_threshold_window_bps`. In the
|
||||
// interval in the middle, we keep using the most recent of the two
|
||||
// complexity settings.
|
||||
int complexity;
|
||||
int low_rate_complexity;
|
||||
int complexity_threshold_bps;
|
||||
int complexity_threshold_window_bps;
|
||||
|
||||
bool dtx_enabled;
|
||||
std::vector<int> supported_frame_lengths_ms;
|
||||
int uplink_bandwidth_update_interval_ms;
|
||||
|
||||
// NOTE: This member isn't necessary, and will soon go away. See
|
||||
// https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
|
||||
int payload_type;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_CONFIG_H_
|
||||
Loading…
Add table
Add a link
Reference in a new issue