Revert of WebRtcVoiceEngine: Use AudioDecoderFactory to generate recv codecs. (patchset #10 id:200001 of https://codereview.webrtc.org/2072753002/ )
Reason for revert:
For some reason, payload_type_mapper.cc is not being picked up in Chrome builds, leading to undefined references. Reverting while investigating.
Original issue's description:
> WebRtcVoiceEngine: Use AudioDecoderFactory to generate recv codecs.
>
> Changed WebRtcVoiceEngine to present receive codecs from the formats
> provided by its decoder factory. Added supported formats to
> BuiltinAudioDecoderFactory. Added helper functions for creating some
> simple decoder factories for mocking.
>
> Created a PayloadTypeMapper for assigning payload types to formats. I
> think we'll eventually want to use this further up, or possibly in
> both the audio and video sides. It would be best if the engines didn't
> have to talk payload types at all, but it might be more difficult to
> get around when payload types depend on each-other, like the RTX
> codecs for video.
>
> This CL also includes some changes to rtc::Optional. I've put them in
> a separate CL that should (or should not) land first, making these
> changes void.
> See: https://codereview.webrtc.org/2072713002/
>
> BUG=webrtc:5805
>
> Committed: https://crrev.com/95eb1ba0db79d8fd134ae61b0a24648598684e8a
> Cr-Commit-Position: refs/heads/master@{#13459}
TBR=ivoc@webrtc.org,tina.legrand@webrtc.org,tommi@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:5805
Review-Url: https://codereview.webrtc.org/2151453002
Cr-Commit-Position: refs/heads/master@{#13460}
diff --git a/webrtc/media/BUILD.gn b/webrtc/media/BUILD.gn
index b4511fb..34e8155 100644
--- a/webrtc/media/BUILD.gn
+++ b/webrtc/media/BUILD.gn
@@ -92,8 +92,6 @@
"base/videosourcebase.h",
"devices/videorendererfactory.h",
"engine/nullwebrtcvideoengine.h",
- "engine/payload_type_mapper.cc",
- "engine/payload_type_mapper.h",
"engine/simulcast.cc",
"engine/simulcast.h",
"engine/webrtccommon.h",
@@ -303,7 +301,6 @@
"base/videoengine_unittest.h",
"base/videoframe_unittest.h",
"engine/nullwebrtcvideoengine_unittest.cc",
- "engine/payload_type_mapper_unittest.cc",
"engine/simulcast_unittest.cc",
"engine/webrtcmediaengine_unittest.cc",
"engine/webrtcvideocapturer_unittest.cc",
diff --git a/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc b/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc
index 52cd0f2..38d6e77 100644
--- a/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc
+++ b/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc
@@ -12,7 +12,6 @@
#include "webrtc/media/engine/nullwebrtcvideoengine.h"
#include "webrtc/media/engine/webrtcvoiceengine.h"
-#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h"
namespace cricket {
@@ -35,9 +34,7 @@
// Simple test to check if NullWebRtcVideoEngine implements the methods
// required by CompositeMediaEngine.
TEST(NullWebRtcVideoEngineTest, CheckInterface) {
- WebRtcMediaEngineNullVideo engine(
- nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr,
- nullptr);
+ WebRtcMediaEngineNullVideo engine(nullptr, nullptr, nullptr, nullptr);
EXPECT_TRUE(engine.Init());
}
diff --git a/webrtc/media/engine/payload_type_mapper.cc b/webrtc/media/engine/payload_type_mapper.cc
deleted file mode 100644
index 87b54be..0000000
--- a/webrtc/media/engine/payload_type_mapper.cc
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2016 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 "webrtc/media/engine/payload_type_mapper.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/media/base/mediaconstants.h"
-
-namespace cricket {
-
-PayloadTypeMapper::PayloadTypeMapper()
- // RFC 3551 reserves payload type numbers in the range 96-127 exclusively
- // for dynamic assignment. Once those are used up, it is recommended that
- // payload types unassigned by the RFC are used for dynamic payload type
- // mapping, before any static payload ids. At this point, we only support
- // mapping within the exclusive range.
- : next_unused_payload_type_(96),
- max_payload_type_(127),
- mappings_({
- // Static payload type assignments according to RFC 3551.
- {{"PCMU", 8000, 1}, 0},
- {{"GSM", 8000, 1}, 3},
- {{"G723", 8000, 1}, 4},
- {{"DVI4", 8000, 1}, 5},
- {{"DVI4", 16000, 1}, 6},
- {{"LPC", 8000, 1}, 7},
- {{"PCMA", 8000, 1}, 8},
- {{"G722", 8000, 1}, 9},
- {{"L16", 44100, 2}, 10},
- {{"L16", 44100, 1}, 11},
- {{"QCELP", 8000, 1}, 12},
- {{"CN", 8000, 1}, 13},
- // RFC 4566 is a bit ambiguous on the contents of the "encoding
- // parameters" field, which, for audio, encodes the number of
- // channels. It is "optional and may be omitted if the number of
- // channels is one". Does that necessarily imply that an omitted
- // encoding parameter means one channel? Since RFC 3551 doesn't
- // specify a value for this parameter for MPA, I've included both 0
- // and 1 here, to increase the chances it will be correctly used if
- // someone implements an MPEG audio encoder/decoder.
- {{"MPA", 90000, 0}, 14},
- {{"MPA", 90000, 1}, 14},
- {{"G728", 8000, 1}, 15},
- {{"DVI4", 11025, 1}, 16},
- {{"DVI4", 22050, 1}, 17},
- {{"G729", 8000, 1}, 18},
-
- // Payload type assignments currently used by WebRTC.
- // Includes video, to reduce collisions (and thus reassignments)
- // RTX codecs mapping to specific video payload types
- {{kRtxCodecName, 90000, 0,
- {{kCodecParamAssociatedPayloadType,
- std::to_string(kDefaultVp8PlType)}}},
- kDefaultRtxVp8PlType},
- {{kRtxCodecName, 90000, 0,
- {{kCodecParamAssociatedPayloadType,
- std::to_string(kDefaultVp9PlType)}}},
- kDefaultRtxVp9PlType},
- {{kRtxCodecName, 90000, 0,
- {{kCodecParamAssociatedPayloadType,
- std::to_string(kDefaultRedPlType)}}},
- kDefaultRtxRedPlType},
- {{kRtxCodecName, 90000, 0,
- {{kCodecParamAssociatedPayloadType,
- std::to_string(kDefaultH264PlType)}}},
- kDefaultRtxH264PlType},
- // Other codecs
- {{kVp8CodecName, 90000, 0}, kDefaultVp8PlType},
- {{kVp9CodecName, 90000, 0}, kDefaultVp9PlType},
- {{kIlbcCodecName, 8000, 1}, 102},
- {{kIsacCodecName, 16000, 1}, 103},
- {{kIsacCodecName, 32000, 1}, 104},
- {{kCnCodecName, 16000, 1}, 105},
- {{kCnCodecName, 32000, 1}, 106},
- {{kH264CodecName, 90000, 0}, kDefaultH264PlType},
- {{kOpusCodecName, 48000, 2,
- {{"minptime", "10"}, {"useinbandfec", "1"}}}, 111},
- {{kRedCodecName, 90000, 0}, kDefaultRedPlType},
- {{kUlpfecCodecName, 90000, 0}, kDefaultUlpfecType},
- {{kDtmfCodecName, 8000, 1}, 126}}) {
- // TODO(ossu): Try to keep this as change-proof as possible until we're able
- // to remove the payload type constants from everywhere in the code.
- for (const auto& mapping : mappings_) {
- used_payload_types_.insert(mapping.second);
- }
-}
-
-PayloadTypeMapper::~PayloadTypeMapper() = default;
-
-rtc::Optional<int> PayloadTypeMapper::GetMappingFor(
- const webrtc::SdpAudioFormat& format) {
- auto iter = mappings_.find(format);
- if (iter != mappings_.end())
- return rtc::Optional<int>(iter->second);
-
- for (; next_unused_payload_type_ <= max_payload_type_;
- ++next_unused_payload_type_) {
- int payload_type = next_unused_payload_type_;
- if (used_payload_types_.find(payload_type) == used_payload_types_.end()) {
- used_payload_types_.insert(payload_type);
- mappings_[format] = payload_type;
- ++next_unused_payload_type_;
- return rtc::Optional<int>(payload_type);
- }
- }
-
- return rtc::Optional<int>();
-}
-
-rtc::Optional<int> PayloadTypeMapper::FindMappingFor(
- const webrtc::SdpAudioFormat& format) const {
- auto iter = mappings_.find(format);
- if (iter != mappings_.end())
- return rtc::Optional<int>(iter->second);
-
- return rtc::Optional<int>();
-}
-
-rtc::Optional<AudioCodec> PayloadTypeMapper::ToAudioCodec(
- const webrtc::SdpAudioFormat& format) {
- // TODO(ossu): We can safely set bitrate to zero here, since that field is
- // not presented in the SDP. It is used to ferry around some target bitrate
- // values for certain codecs (ISAC and Opus) and in ways it really
- // shouldn't. It should be removed once we no longer use CodecInsts in the
- // ACM or NetEq.
- auto opt_payload_type = GetMappingFor(format);
- if (opt_payload_type) {
- AudioCodec codec(*opt_payload_type, format.name, format.clockrate_hz, 0,
- format.num_channels);
- codec.params = format.parameters;
- return rtc::Optional<AudioCodec>(std::move(codec));
- }
-
- return rtc::Optional<AudioCodec>();
-}
-
-bool PayloadTypeMapper::SdpAudioFormatOrdering::operator()(
- const webrtc::SdpAudioFormat& a,
- const webrtc::SdpAudioFormat& b) const {
- if (a.clockrate_hz == b.clockrate_hz) {
- if (a.num_channels == b.num_channels) {
- int name_cmp = STR_CASE_CMP(a.name.c_str(), b.name.c_str());
- if (name_cmp == 0)
- return a.parameters < b.parameters;
- return name_cmp < 0;
- }
- return a.num_channels < b.num_channels;
- }
- return a.clockrate_hz < b.clockrate_hz;
-}
-
-} // namespace cricket
diff --git a/webrtc/media/engine/payload_type_mapper.h b/webrtc/media/engine/payload_type_mapper.h
deleted file mode 100644
index a79fb47..0000000
--- a/webrtc/media/engine/payload_type_mapper.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2016 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 WEBRTC_MEDIA_ENGINE_PAYLOAD_TYPE_MAPPER_H_
-#define WEBRTC_MEDIA_ENGINE_PAYLOAD_TYPE_MAPPER_H_
-
-#include <map>
-#include <set>
-
-#include "webrtc/base/optional.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format.h"
-
-namespace cricket {
-
-class PayloadTypeMapper {
- public:
- PayloadTypeMapper();
- ~PayloadTypeMapper();
-
- // Finds the current payload type for |format| or assigns a new one, if no
- // current mapping exists. Will return an empty value if it was unable to
- // create a mapping, i.e. if all dynamic payload type ids have been used up.
- rtc::Optional<int> GetMappingFor(const webrtc::SdpAudioFormat& format);
-
- // Finds the current payload type for |format|, if any. Returns an empty value
- // if no payload type mapping exists for the format.
- rtc::Optional<int> FindMappingFor(const webrtc::SdpAudioFormat& format) const;
-
- // Like GetMappingFor, but fills in an AudioCodec structure with the necessary
- // information instead.
- rtc::Optional<AudioCodec> ToAudioCodec(const webrtc::SdpAudioFormat& format);
-
- private:
- struct SdpAudioFormatOrdering {
- bool operator()(const webrtc::SdpAudioFormat& a,
- const webrtc::SdpAudioFormat& b) const;
- };
-
- int next_unused_payload_type_;
- int max_payload_type_;
- std::map<webrtc::SdpAudioFormat, int, SdpAudioFormatOrdering> mappings_;
- std::set<int> used_payload_types_;
-};
-
-} // namespace cricket
-#endif // WEBRTC_MEDIA_ENGINE_PAYLOAD_TYPE_MAPPER_H_
diff --git a/webrtc/media/engine/payload_type_mapper_unittest.cc b/webrtc/media/engine/payload_type_mapper_unittest.cc
deleted file mode 100644
index 7042086..0000000
--- a/webrtc/media/engine/payload_type_mapper_unittest.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2016 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 <set>
-#include <string>
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "webrtc/media/engine/payload_type_mapper.h"
-
-namespace cricket {
-
-class PayloadTypeMapperTest : public testing::Test {
- public:
- // TODO(ossu): These are to work around missing comparison operators in
- // rtc::Optional. They should be removed once Optional has been updated.
- int FindMapping(const webrtc::SdpAudioFormat& format) {
- auto opt_mapping = mapper_.FindMappingFor(format);
- if (opt_mapping)
- return *opt_mapping;
- return -1;
- }
-
- int GetMapping(const webrtc::SdpAudioFormat& format) {
- auto opt_mapping = mapper_.GetMappingFor(format);
- if (opt_mapping)
- return *opt_mapping;
- return -1;
- }
-
- protected:
- PayloadTypeMapper mapper_;
-};
-
-TEST_F(PayloadTypeMapperTest, StaticPayloadTypes) {
- EXPECT_EQ(0, FindMapping({"pcmu", 8000, 1}));
- EXPECT_EQ(3, FindMapping({"gsm", 8000, 1}));
- EXPECT_EQ(4, FindMapping({"g723", 8000, 1}));
- EXPECT_EQ(5, FindMapping({"dvi4", 8000, 1}));
- EXPECT_EQ(6, FindMapping({"dvi4", 16000, 1}));
- EXPECT_EQ(7, FindMapping({"lpc", 8000, 1}));
- EXPECT_EQ(8, FindMapping({"pcma", 8000, 1}));
- EXPECT_EQ(9, FindMapping({"g722", 8000, 1}));
- EXPECT_EQ(10, FindMapping({"l16", 44100, 2}));
- EXPECT_EQ(11, FindMapping({"l16", 44100, 1}));
- EXPECT_EQ(12, FindMapping({"qcelp", 8000, 1}));
- EXPECT_EQ(13, FindMapping({"cn", 8000, 1}));
- EXPECT_EQ(14, FindMapping({"mpa", 90000, 0}));
- EXPECT_EQ(14, FindMapping({"mpa", 90000, 1}));
- EXPECT_EQ(15, FindMapping({"g728", 8000, 1}));
- EXPECT_EQ(16, FindMapping({"dvi4", 11025, 1}));
- EXPECT_EQ(17, FindMapping({"dvi4", 22050, 1}));
- EXPECT_EQ(18, FindMapping({"g729", 8000, 1}));
-}
-
-TEST_F(PayloadTypeMapperTest, WebRTCPayloadTypes) {
- // Tests that the payload mapper knows about the formats we've been using in
- // WebRTC, with their hard coded values.
- auto video_mapping = [this] (const char *name) {
- return FindMapping({name, kVideoCodecClockrate, 0});
- };
- EXPECT_EQ(kDefaultVp8PlType, video_mapping(kVp8CodecName));
- EXPECT_EQ(kDefaultVp9PlType, video_mapping(kVp9CodecName));
- EXPECT_EQ(kDefaultH264PlType, video_mapping(kH264CodecName));
- EXPECT_EQ(kDefaultRedPlType, video_mapping(kRedCodecName));
- EXPECT_EQ(kDefaultUlpfecType, video_mapping(kUlpfecCodecName));
-
- auto rtx_mapping = [this] (int payload_type) {
- return FindMapping({kRtxCodecName, kVideoCodecClockrate, 0,
- {{ kCodecParamAssociatedPayloadType, std::to_string(payload_type)}}});
- };
- EXPECT_EQ(kDefaultRtxVp8PlType, rtx_mapping(kDefaultVp8PlType));
- EXPECT_EQ(kDefaultRtxVp9PlType, rtx_mapping(kDefaultVp9PlType));
- EXPECT_EQ(kDefaultRtxH264PlType, rtx_mapping(kDefaultH264PlType));
- EXPECT_EQ(kDefaultRtxRedPlType, rtx_mapping(kDefaultRedPlType));
-
- EXPECT_EQ(102, FindMapping({kIlbcCodecName, 8000, 1}));
- EXPECT_EQ(103, FindMapping({kIsacCodecName, 16000, 1}));
- EXPECT_EQ(104, FindMapping({kIsacCodecName, 32000, 1}));
- EXPECT_EQ(105, FindMapping({kCnCodecName, 16000, 1}));
- EXPECT_EQ(106, FindMapping({kCnCodecName, 32000, 1}));
- EXPECT_EQ(111, FindMapping({kOpusCodecName, 48000, 2,
- {{"minptime", "10"}, {"useinbandfec", "1"}}}));
- EXPECT_EQ(126, FindMapping({kDtmfCodecName, 8000, 1}));
-}
-
-TEST_F(PayloadTypeMapperTest, ValidDynamicPayloadTypes) {
- // RFC 3551 says:
- // "This profile reserves payload type numbers in the range 96-127
- // exclusively for dynamic assignment. Applications SHOULD first use
- // values in this range for dynamic payload types. Those applications
- // which need to define more than 32 dynamic payload types MAY bind
- // codes below 96, in which case it is RECOMMENDED that unassigned
- // payload type numbers be used first. However, the statically assigned
- // payload types are default bindings and MAY be dynamically bound to
- // new encodings if needed."
-
- // Tests that the payload mapper uses values in the dynamic payload type range
- // (96 - 127) before any others and that the values returned are all valid.
- bool has_been_below_96 = false;
- std::set<int> used_payload_types;
- for (int i = 0; i != 256; ++i) {
- std::string format_name = "unknown_format_" + std::to_string(i);
- webrtc::SdpAudioFormat format(format_name.c_str(), i*100, (i % 2) + 1);
- auto opt_payload_type = mapper_.GetMappingFor(format);
- bool mapper_is_full = false;
-
- // There's a limited number of slots for payload types. We're fine with not
- // being able to map them all.
- if (opt_payload_type) {
- int payload_type = *opt_payload_type;
- EXPECT_FALSE(mapper_is_full) << "Mapping should not fail sporadically";
- EXPECT_EQ(used_payload_types.find(payload_type), used_payload_types.end())
- << "Payload types must not be reused";
- used_payload_types.insert(payload_type);
- EXPECT_GE(payload_type, 0) << "Negative payload types are invalid";
- EXPECT_LE(payload_type, 127) << "Payload types above 127 are invalid";
- EXPECT_FALSE(payload_type >= 96 && has_been_below_96);
- if (payload_type < 96)
- has_been_below_96 = true;
-
- EXPECT_EQ(payload_type, FindMapping(format))
- << "Mapping must be permanent after successful call to "
- "GetMappingFor";
- EXPECT_EQ(payload_type, GetMapping(format))
- << "Subsequent calls to GetMappingFor must return the same value";
- } else {
- mapper_is_full = true;
- }
- }
-
- // Also, we must've been able to map at least one dynamic payload type.
- EXPECT_FALSE(used_payload_types.empty())
- << "Mapper must support at least one user-defined payload type";
-}
-
-TEST_F(PayloadTypeMapperTest, ToAudioCodec) {
- webrtc::SdpAudioFormat format("unknown_format", 4711, 17);
- auto opt_payload_type = mapper_.GetMappingFor(format);
- EXPECT_TRUE(opt_payload_type);
- auto opt_audio_codec = mapper_.ToAudioCodec(format);
- EXPECT_TRUE(opt_audio_codec);
-
- if (opt_payload_type && opt_audio_codec) {
- int payload_type = *opt_payload_type;
- const AudioCodec& codec = *opt_audio_codec;
-
- EXPECT_EQ(codec.id, payload_type);
- EXPECT_EQ(codec.name, format.name);
- EXPECT_EQ(codec.clockrate, format.clockrate_hz);
- EXPECT_EQ(codec.channels, format.num_channels);
- EXPECT_EQ(codec.params, format.parameters);
- }
-}
-
-} // namespace cricket
diff --git a/webrtc/media/engine/webrtcmediaengine.h b/webrtc/media/engine/webrtcmediaengine.h
index dae6347..24deeb4 100644
--- a/webrtc/media/engine/webrtcmediaengine.h
+++ b/webrtc/media/engine/webrtcmediaengine.h
@@ -18,7 +18,6 @@
#include "webrtc/media/base/mediaengine.h"
namespace webrtc {
-class AudioDecoderFactory;
class AudioDeviceModule;
}
namespace cricket {
diff --git a/webrtc/media/engine/webrtcvoiceengine.cc b/webrtc/media/engine/webrtcvoiceengine.cc
index 59a2870..469098a 100644
--- a/webrtc/media/engine/webrtcvoiceengine.cc
+++ b/webrtc/media/engine/webrtcvoiceengine.cc
@@ -14,7 +14,6 @@
#include <algorithm>
#include <cstdio>
-#include <functional>
#include <string>
#include <vector>
@@ -33,7 +32,6 @@
#include "webrtc/media/base/audiosource.h"
#include "webrtc/media/base/mediaconstants.h"
#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/engine/payload_type_mapper.h"
#include "webrtc/media/engine/webrtcmediaengine.h"
#include "webrtc/media/engine/webrtcvoe.h"
#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
@@ -250,7 +248,7 @@
public:
// TODO(solenberg): Do this filtering once off-line, add a simple AudioCodec
// list and add a test which verifies VoE supports the listed codecs.
- static std::vector<AudioCodec> SupportedSendCodecs() {
+ static std::vector<AudioCodec> SupportedCodecs() {
std::vector<AudioCodec> result;
// Iterate first over our preferred codecs list, so that the results are
// added in order of preference.
@@ -513,20 +511,13 @@
RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine";
RTC_DCHECK(voe_wrapper);
- RTC_DCHECK(decoder_factory);
signal_thread_checker_.DetachFromThread();
// Load our audio codec list.
- LOG(LS_INFO) << "Supported send codecs in order of preference:";
- send_codecs_ = WebRtcVoiceCodecs::SupportedSendCodecs();
- for (const AudioCodec& codec : send_codecs_) {
- LOG(LS_INFO) << ToString(codec);
- }
-
- LOG(LS_INFO) << "Supported recv codecs in order of preference:";
- recv_codecs_ = CollectRecvCodecs();
- for (const AudioCodec& codec : recv_codecs_) {
+ LOG(LS_INFO) << "Supported codecs in order of preference:";
+ codecs_ = WebRtcVoiceCodecs::SupportedCodecs();
+ for (const AudioCodec& codec : codecs_) {
LOG(LS_INFO) << ToString(codec);
}
@@ -945,12 +936,12 @@
const std::vector<AudioCodec>& WebRtcVoiceEngine::send_codecs() const {
RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
- return send_codecs_;
+ return codecs_;
}
const std::vector<AudioCodec>& WebRtcVoiceEngine::recv_codecs() const {
RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
- return recv_codecs_;
+ return codecs_;
}
RtpCapabilities WebRtcVoiceEngine::GetCapabilities() const {
@@ -1090,61 +1081,6 @@
return adm_;
}
-AudioCodecs WebRtcVoiceEngine::CollectRecvCodecs() const {
- PayloadTypeMapper mapper;
- AudioCodecs out;
- const std::vector<webrtc::SdpAudioFormat>& formats =
- decoder_factory_->GetSupportedFormats();
-
- // Only generate CN payload types for these clockrates
- std::map<int, bool, std::greater<int>> generate_cn = {{ 8000, false },
- { 16000, false },
- { 32000, false }};
-
- auto map_format = [&mapper, &out] (const webrtc::SdpAudioFormat& format) {
- rtc::Optional<AudioCodec> opt_codec = mapper.ToAudioCodec(format);
- if (!opt_codec) {
- LOG(LS_ERROR) << "Unable to assign payload type to format: " << format;
- return false;
- }
-
- auto& codec = *opt_codec;
- if (IsCodec(codec, kOpusCodecName)) {
- // TODO(ossu): Set this specifically for Opus for now, until we have a
- // better way of dealing with rtcp-fb parameters.
- codec.AddFeedbackParam(
- FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty));
- }
- out.push_back(codec);
- return true;
- };
-
- for (const auto& format : formats) {
- if (map_format(format)) {
- // TODO(ossu): We should get more than just a format from the factory, so
- // we can determine if a format should be used with CN or not. For now,
- // generate a CN entry for each supported clock rate also used by a format
- // supported by the factory.
- auto cn = generate_cn.find(format.clockrate_hz);
- if (cn != generate_cn.end() /* && format.allow_comfort_noise */) {
- cn->second = true;
- }
- }
- }
-
- // Add CN codecs after "proper" audio codecs
- for (const auto& cn : generate_cn) {
- if (cn.second) {
- map_format({kCnCodecName, cn.first, 1});
- }
- }
-
- // Add telephone-event codec last
- map_format({kDtmfCodecName, 8000, 1});
-
- return out;
-}
-
class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
: public AudioSource::Sink {
public:
diff --git a/webrtc/media/engine/webrtcvoiceengine.h b/webrtc/media/engine/webrtcvoiceengine.h
index 7955c20..64e0f5b 100644
--- a/webrtc/media/engine/webrtcvoiceengine.h
+++ b/webrtc/media/engine/webrtcvoiceengine.h
@@ -123,8 +123,6 @@
int CreateVoEChannel();
webrtc::AudioDeviceModule* adm();
- AudioCodecs CollectRecvCodecs() const;
-
rtc::ThreadChecker signal_thread_checker_;
rtc::ThreadChecker worker_thread_checker_;
@@ -134,8 +132,7 @@
// The primary instance of WebRtc VoiceEngine.
std::unique_ptr<VoEWrapper> voe_wrapper_;
rtc::scoped_refptr<webrtc::AudioState> audio_state_;
- std::vector<AudioCodec> send_codecs_;
- std::vector<AudioCodec> recv_codecs_;
+ std::vector<AudioCodec> codecs_;
std::vector<WebRtcVoiceMediaChannel*> channels_;
webrtc::Config voe_config_;
bool is_dumping_aec_ = false;
diff --git a/webrtc/media/engine/webrtcvoiceengine_unittest.cc b/webrtc/media/engine/webrtcvoiceengine_unittest.cc
index ec7a168..2db70d1 100644
--- a/webrtc/media/engine/webrtcvoiceengine_unittest.cc
+++ b/webrtc/media/engine/webrtcvoiceengine_unittest.cc
@@ -75,9 +75,7 @@
cricket::FakeWebRtcVoiceEngine voe;
EXPECT_FALSE(voe.IsInited());
{
- cricket::WebRtcVoiceEngine engine(
- &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory(),
- new FakeVoEWrapper(&voe));
+ cricket::WebRtcVoiceEngine engine(&adm, nullptr, new FakeVoEWrapper(&voe));
EXPECT_TRUE(voe.IsInited());
}
EXPECT_FALSE(voe.IsInited());
@@ -98,13 +96,12 @@
explicit WebRtcVoiceEngineTestFake(const char* field_trials)
: call_(webrtc::Call::Config()), override_field_trials_(field_trials) {
- auto factory = webrtc::MockAudioDecoderFactory::CreateUnusedFactory();
EXPECT_CALL(adm_, AddRef()).WillOnce(Return(0));
EXPECT_CALL(adm_, Release()).WillOnce(Return(0));
EXPECT_CALL(adm_, BuiltInAECIsAvailable()).WillOnce(Return(false));
EXPECT_CALL(adm_, BuiltInAGCIsAvailable()).WillOnce(Return(false));
EXPECT_CALL(adm_, BuiltInNSIsAvailable()).WillOnce(Return(false));
- engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, factory,
+ engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, nullptr,
new FakeVoEWrapper(&voe_)));
send_parameters_.codecs.push_back(kPcmuCodec);
recv_parameters_.codecs.push_back(kPcmuCodec);
@@ -3364,10 +3361,20 @@
// Tests that the library initializes and shuts down properly.
TEST(WebRtcVoiceEngineTest, StartupShutdown) {
+ using testing::_;
+ using testing::AnyNumber;
+
// If the VoiceEngine wants to gather available codecs early, that's fine but
// we never want it to create a decoder at this stage.
- cricket::WebRtcVoiceEngine engine(
- nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
+ rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
+ new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
+ ON_CALL(*factory.get(), GetSupportedFormats())
+ .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
+ EXPECT_CALL(*factory.get(), GetSupportedFormats())
+ .Times(AnyNumber());
+ EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
+
+ cricket::WebRtcVoiceEngine engine(nullptr, factory);
std::unique_ptr<webrtc::Call> call(
webrtc::Call::Create(webrtc::Call::Config()));
cricket::VoiceMediaChannel* channel = engine.CreateChannel(
@@ -3382,8 +3389,7 @@
EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
{
- cricket::WebRtcVoiceEngine engine(
- &adm, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
+ cricket::WebRtcVoiceEngine engine(&adm, nullptr);
std::unique_ptr<webrtc::Call> call(
webrtc::Call::Create(webrtc::Call::Config()));
cricket::VoiceMediaChannel* channel = engine.CreateChannel(
@@ -3394,6 +3400,8 @@
}
// Tests that the library is configured with the codecs we want.
+// TODO(ossu): This test should move into the builtin audio codecs module
+// eventually.
TEST(WebRtcVoiceEngineTest, HasCorrectCodecs) {
// TODO(ossu): These tests should move into a future "builtin audio codecs"
// module.
@@ -3449,13 +3457,10 @@
cricket::AudioCodec(0, "", 0, 5000, 1), nullptr));
// Verify the payload id of common audio codecs, including CN, ISAC, and G722.
- // TODO(ossu): Why are the payload types of codecs with non-static payload
- // type assignments checked here? It shouldn't really matter.
- cricket::WebRtcVoiceEngine engine(
- nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
+ cricket::WebRtcVoiceEngine engine(nullptr,
+ webrtc::CreateBuiltinAudioDecoderFactory());
for (std::vector<cricket::AudioCodec>::const_iterator it =
- engine.send_codecs().begin();
- it != engine.send_codecs().end(); ++it) {
+ engine.send_codecs().begin(); it != engine.send_codecs().end(); ++it) {
if (it->name == "CN" && it->clockrate == 16000) {
EXPECT_EQ(105, it->id);
} else if (it->name == "CN" && it->clockrate == 32000) {
@@ -3480,8 +3485,7 @@
// Tests that VoE supports at least 32 channels
TEST(WebRtcVoiceEngineTest, Has32Channels) {
- cricket::WebRtcVoiceEngine engine(
- nullptr, webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
+ cricket::WebRtcVoiceEngine engine(nullptr, nullptr);
std::unique_ptr<webrtc::Call> call(
webrtc::Call::Create(webrtc::Call::Config()));
diff --git a/webrtc/media/media.gyp b/webrtc/media/media.gyp
index 0523b71..1e19a84 100644
--- a/webrtc/media/media.gyp
+++ b/webrtc/media/media.gyp
@@ -69,8 +69,6 @@
'base/videosourcebase.h',
'devices/videorendererfactory.h',
'engine/nullwebrtcvideoengine.h',
- 'engine/payload_type_mapper.cc',
- 'engine/payload_type_mapper.h',
'engine/simulcast.cc',
'engine/simulcast.h',
'engine/webrtccommon.h',
@@ -269,7 +267,6 @@
'base/videoengine_unittest.h',
'base/videoframe_unittest.h',
'engine/nullwebrtcvideoengine_unittest.cc',
- 'engine/payload_type_mapper_unittest.cc',
'engine/simulcast_unittest.cc',
'engine/webrtcmediaengine_unittest.cc',
'engine/webrtcvideocapturer_unittest.cc',
diff --git a/webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.cc b/webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.cc
index a7f7404..48b2f5d 100644
--- a/webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.cc
+++ b/webrtc/modules/audio_coding/codecs/builtin_audio_decoder_factory.cc
@@ -130,31 +130,7 @@
class BuiltinAudioDecoderFactory : public AudioDecoderFactory {
public:
std::vector<SdpAudioFormat> GetSupportedFormats() override {
- static std::vector<SdpAudioFormat> formats = {
-#ifdef WEBRTC_CODEC_OPUS
- { "opus", 48000, 2, {
- {"minptime", "10" },
- {"useinbandfec", "1" }
- }
- },
-#endif
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
- { "isac", 16000, 1 },
-#endif
-#if (defined(WEBRTC_CODEC_ISAC))
- { "isac", 32000, 1 },
-#endif
-#ifdef WEBRTC_CODEC_G722
- { "G722", 8000, 1 },
-#endif
-#ifdef WEBRTC_CODEC_ILBC
- { "iLBC", 8000, 1 },
-#endif
- { "PCMU", 8000, 1 },
- { "PCMA", 8000, 1 }
- };
-
- return formats;
+ FATAL() << "Not implemented yet!";
}
std::unique_ptr<AudioDecoder> MakeAudioDecoder(
diff --git a/webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h b/webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h
index f91a26b..6e5737c 100644
--- a/webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h
+++ b/webrtc/modules/audio_coding/codecs/mock/mock_audio_decoder_factory.h
@@ -14,7 +14,6 @@
#include <vector>
#include "testing/gmock/include/gmock/gmock.h"
-#include "webrtc/base/scoped_ref_ptr.h"
#include "webrtc/modules/audio_coding/codecs/audio_decoder_factory.h"
namespace webrtc {
@@ -31,45 +30,6 @@
MOCK_METHOD2(MakeAudioDecoderMock,
void(const SdpAudioFormat& format,
std::unique_ptr<AudioDecoder>* return_value));
-
- // Creates a MockAudioDecoderFactory with no formats and that may not be
- // invoked to create a codec - useful for initializing a voice engine, for
- // example.
- static rtc::scoped_refptr<webrtc::MockAudioDecoderFactory>
- CreateUnusedFactory() {
- using testing::_;
- using testing::AnyNumber;
- using testing::Return;
-
- rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
- new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
- ON_CALL(*factory.get(), GetSupportedFormats())
- .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
- EXPECT_CALL(*factory.get(), GetSupportedFormats()).Times(AnyNumber());
- EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
- return factory;
- }
-
- // Creates a MockAudioDecoderFactory with no formats that may be invoked to
- // create a codec any number of times. It will, though, return nullptr on each
- // call, since it supports no codecs.
- static rtc::scoped_refptr<webrtc::MockAudioDecoderFactory>
- CreateEmptyFactory() {
- using testing::_;
- using testing::AnyNumber;
- using testing::Return;
- using testing::SetArgPointee;
-
- rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
- new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
- ON_CALL(*factory.get(), GetSupportedFormats())
- .WillByDefault(Return(std::vector<webrtc::SdpAudioFormat>()));
- EXPECT_CALL(*factory.get(), GetSupportedFormats()).Times(AnyNumber());
- ON_CALL(*factory.get(), MakeAudioDecoderMock(_, _))
- .WillByDefault(SetArgPointee<1>(nullptr));
- EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(AnyNumber());
- return factory;
- }
};
} // namespace webrtc