PeerConnection end-to-end test with a non-builtin codec

BUG=webrtc:8159

Change-Id: I27f3fc8a6204115c480d70238225b0565c41bd81
Reviewed-on: https://webrtc-review.googlesource.com/6283
Commit-Queue: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20245}
This commit is contained in:
Karl Wiberg 2017-10-10 23:17:17 +02:00 committed by Commit Bot
parent 8ffeeb2e34
commit c5bb00b6bf
2 changed files with 93 additions and 3 deletions

View File

@ -457,8 +457,11 @@ if (rtc_include_tests) {
"../api:fakemetricsobserver",
"../api:libjingle_peerconnection_test_api",
"../api:rtc_stats_api",
"../api/audio_codecs:audio_codecs_api",
"../api/audio_codecs:builtin_audio_decoder_factory",
"../api/audio_codecs:builtin_audio_encoder_factory",
"../api/audio_codecs/L16:audio_decoder_L16",
"../api/audio_codecs/L16:audio_encoder_L16",
"../media:rtc_audio_video",
"../media:rtc_data", # TODO(phoglund): AFAIK only used for one sctp constant.
"../media:rtc_media_base",

View File

@ -10,6 +10,10 @@
#include <memory>
#include "api/audio_codecs/L16/audio_decoder_L16.h"
#include "api/audio_codecs/L16/audio_encoder_L16.h"
#include "api/audio_codecs/audio_decoder_factory_template.h"
#include "api/audio_codecs/audio_encoder_factory_template.h"
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "rtc_base/gunit.h"
@ -174,6 +178,8 @@ class PeerConnectionEndToEndTest
webrtc::PeerConnectionInterface::RTCConfiguration config_;
};
namespace {
std::unique_ptr<webrtc::AudioDecoder> CreateForwardingMockDecoder(
std::unique_ptr<webrtc::AudioDecoder> real_decoder) {
class ForwardingMockDecoder : public StrictMock<webrtc::MockAudioDecoder> {
@ -257,12 +263,84 @@ CreateForwardingMockDecoderFactory(
return mock_decoder_factory;
}
struct AudioEncoderUnicornSparklesRainbow {
using Config = webrtc::AudioEncoderL16::Config;
static rtc::Optional<Config> SdpToConfig(webrtc::SdpAudioFormat format) {
if (STR_CASE_CMP(format.name.c_str(), "UnicornSparklesRainbow") == 0) {
const webrtc::SdpAudioFormat::Parameters expected_params = {
{"num_horns", "1"}};
EXPECT_EQ(expected_params, format.parameters);
format.parameters.clear();
format.name = "L16";
return webrtc::AudioEncoderL16::SdpToConfig(format);
} else {
return rtc::Optional<Config>();
}
}
static void AppendSupportedEncoders(
std::vector<webrtc::AudioCodecSpec>* specs) {
std::vector<webrtc::AudioCodecSpec> new_specs;
webrtc::AudioEncoderL16::AppendSupportedEncoders(&new_specs);
for (auto& spec : new_specs) {
spec.format.name = "UnicornSparklesRainbow";
EXPECT_TRUE(spec.format.parameters.empty());
spec.format.parameters.emplace("num_horns", "1");
specs->push_back(spec);
}
}
static webrtc::AudioCodecInfo QueryAudioEncoder(const Config& config) {
return webrtc::AudioEncoderL16::QueryAudioEncoder(config);
}
static std::unique_ptr<webrtc::AudioEncoder> MakeAudioEncoder(
const Config& config,
int payload_type) {
return webrtc::AudioEncoderL16::MakeAudioEncoder(config, payload_type);
}
};
struct AudioDecoderUnicornSparklesRainbow {
using Config = webrtc::AudioDecoderL16::Config;
static rtc::Optional<Config> SdpToConfig(webrtc::SdpAudioFormat format) {
if (STR_CASE_CMP(format.name.c_str(), "UnicornSparklesRainbow") == 0) {
const webrtc::SdpAudioFormat::Parameters expected_params = {
{"num_horns", "1"}};
EXPECT_EQ(expected_params, format.parameters);
format.parameters.clear();
format.name = "L16";
return webrtc::AudioDecoderL16::SdpToConfig(format);
} else {
return rtc::Optional<Config>();
}
}
static void AppendSupportedDecoders(
std::vector<webrtc::AudioCodecSpec>* specs) {
std::vector<webrtc::AudioCodecSpec> new_specs;
webrtc::AudioDecoderL16::AppendSupportedDecoders(&new_specs);
for (auto& spec : new_specs) {
spec.format.name = "UnicornSparklesRainbow";
EXPECT_TRUE(spec.format.parameters.empty());
spec.format.parameters.emplace("num_horns", "1");
specs->push_back(spec);
}
}
static std::unique_ptr<webrtc::AudioDecoder> MakeAudioDecoder(
const Config& config) {
return webrtc::AudioDecoderL16::MakeAudioDecoder(config);
}
};
} // namespace
// Disabled for TSan v2, see
// https://bugs.chromium.org/p/webrtc/issues/detail?id=4719 for details.
// Disabled for Mac, see
// https://bugs.chromium.org/p/webrtc/issues/detail?id=5231 for details.
#if !defined(THREAD_SANITIZER) && !defined(WEBRTC_MAC)
TEST_F(PeerConnectionEndToEndTest, Call) {
#if defined(THREAD_SANITIZER) || defined(WEBRTC_MAC)
#define MAYBE_Call DISABLED_Call
#else
#define MAYBE_Call Call
#endif
TEST_F(PeerConnectionEndToEndTest, MAYBE_Call) {
rtc::scoped_refptr<webrtc::AudioDecoderFactory> real_decoder_factory =
webrtc::CreateBuiltinAudioDecoderFactory();
CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
@ -271,7 +349,6 @@ TEST_F(PeerConnectionEndToEndTest, Call) {
Negotiate();
WaitForCallEstablished();
}
#endif // if !defined(THREAD_SANITIZER) && !defined(WEBRTC_MAC)
#if !defined(ADDRESS_SANITIZER)
TEST_F(PeerConnectionEndToEndTest, CallWithLegacySdp) {
@ -286,6 +363,16 @@ TEST_F(PeerConnectionEndToEndTest, CallWithLegacySdp) {
}
#endif // !defined(ADDRESS_SANITIZER)
TEST_F(PeerConnectionEndToEndTest, CallWithCustomCodec) {
CreatePcs(
nullptr,
webrtc::CreateAudioEncoderFactory<AudioEncoderUnicornSparklesRainbow>(),
webrtc::CreateAudioDecoderFactory<AudioDecoderUnicornSparklesRainbow>());
GetAndAddUserMedia();
Negotiate();
WaitForCallEstablished();
}
#ifdef HAVE_SCTP
// Verifies that a DataChannel created before the negotiation can transition to
// "OPEN" and transfer data.