| Index: webrtc/video/video_quality_test.cc
|
| diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc
|
| index a401d6dd42aec5a7dc8a143b77de3e656b3672ec..51160c91c6a2e15b23f8b4c90d536e58eba8478f 100644
|
| --- a/webrtc/video/video_quality_test.cc
|
| +++ b/webrtc/video/video_quality_test.cc
|
| @@ -34,14 +34,67 @@
|
| #include "webrtc/test/testsupport/fileutils.h"
|
| #include "webrtc/test/video_renderer.h"
|
| #include "webrtc/video/video_quality_test.h"
|
| +#include "webrtc/voice_engine/include/voe_base.h"
|
| +#include "webrtc/voice_engine/include/voe_codec.h"
|
| +
|
| +namespace {
|
| +
|
| +constexpr int kSendStatsPollingIntervalMs = 1000;
|
| +constexpr int kPayloadTypeH264 = 122;
|
| +constexpr int kPayloadTypeVP8 = 123;
|
| +constexpr int kPayloadTypeVP9 = 124;
|
| +constexpr size_t kMaxComparisons = 10;
|
| +constexpr char kSyncGroup[] = "av_sync";
|
| +constexpr int kOpusMinBitrate = 6000;
|
| +constexpr int kOpusBitrateFb = 32000;
|
| +
|
| +struct VoiceEngineState {
|
| + VoiceEngineState()
|
| + : voice_engine(nullptr),
|
| + base(nullptr),
|
| + codec(nullptr),
|
| + send_channel_id(-1),
|
| + receive_channel_id(-1) {}
|
| +
|
| + webrtc::VoiceEngine* voice_engine;
|
| + webrtc::VoEBase* base;
|
| + webrtc::VoECodec* codec;
|
| + int send_channel_id;
|
| + int receive_channel_id;
|
| +};
|
|
|
| -namespace webrtc {
|
| +void CreateVoiceEngine(VoiceEngineState* voe,
|
| + rtc::scoped_refptr<webrtc::AudioDecoderFactory>
|
| + decoder_factory) {
|
| + voe->voice_engine = webrtc::VoiceEngine::Create();
|
| + voe->base = webrtc::VoEBase::GetInterface(voe->voice_engine);
|
| + voe->codec = webrtc::VoECodec::GetInterface(voe->voice_engine);
|
| + EXPECT_EQ(0, voe->base->Init(nullptr, nullptr, decoder_factory));
|
| + webrtc::Config voe_config;
|
| + voe_config.Set<webrtc::VoicePacing>(new webrtc::VoicePacing(true));
|
| + voe->send_channel_id = voe->base->CreateChannel(voe_config);
|
| + EXPECT_GE(voe->send_channel_id, 0);
|
| + voe->receive_channel_id = voe->base->CreateChannel();
|
| + EXPECT_GE(voe->receive_channel_id, 0);
|
| +}
|
|
|
| -static const int kSendStatsPollingIntervalMs = 1000;
|
| -static const int kPayloadTypeH264 = 122;
|
| -static const int kPayloadTypeVP8 = 123;
|
| -static const int kPayloadTypeVP9 = 124;
|
| -static const size_t kMaxComparisons = 10;
|
| +void DestroyVoiceEngine(VoiceEngineState* voe) {
|
| + voe->base->DeleteChannel(voe->send_channel_id);
|
| + voe->send_channel_id = -1;
|
| + voe->base->DeleteChannel(voe->receive_channel_id);
|
| + voe->receive_channel_id = -1;
|
| + voe->base->Release();
|
| + voe->base = nullptr;
|
| + voe->codec->Release();
|
| + voe->codec = nullptr;
|
| +
|
| + webrtc::VoiceEngine::Delete(voe->voice_engine);
|
| + voe->voice_engine = nullptr;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +namespace webrtc {
|
|
|
| class VideoAnalyzer : public PacketReceiver,
|
| public Transport,
|
| @@ -1002,6 +1055,7 @@ void VideoQualityTest::CreateCapturer(VideoCaptureInput* input) {
|
| void VideoQualityTest::RunWithAnalyzer(const Params& params) {
|
| params_ = params;
|
|
|
| + RTC_CHECK(!params_.audio);
|
| // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to
|
| // differentiate between the analyzer and the renderer case.
|
| CheckParams();
|
| @@ -1099,7 +1153,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) {
|
| fclose(graph_data_output_file);
|
| }
|
|
|
| -void VideoQualityTest::RunWithVideoRenderer(const Params& params) {
|
| +void VideoQualityTest::RunWithRenderers(const Params& params) {
|
| params_ = params;
|
| CheckParams();
|
|
|
| @@ -1123,6 +1177,15 @@ void VideoQualityTest::RunWithVideoRenderer(const Params& params) {
|
| // match the full stack tests.
|
| Call::Config call_config;
|
| call_config.bitrate_config = params_.common.call_bitrate_config;
|
| +
|
| + ::VoiceEngineState voe;
|
| + if (params_.audio) {
|
| + CreateVoiceEngine(&voe, decoder_factory_);
|
| + AudioState::Config audio_state_config;
|
| + audio_state_config.voice_engine = voe.voice_engine;
|
| + call_config.audio_state = AudioState::Create(audio_state_config);
|
| + }
|
| +
|
| std::unique_ptr<Call> call(Call::Create(call_config));
|
|
|
| test::LayerFilteringTransport transport(
|
| @@ -1137,6 +1200,8 @@ void VideoQualityTest::RunWithVideoRenderer(const Params& params) {
|
|
|
| video_send_config_.local_renderer = local_preview.get();
|
| video_receive_configs_[stream_id].renderer = loopback_video.get();
|
| + if (params_.audio && params_.audio_video_sync)
|
| + video_receive_configs_[stream_id].sync_group = kSyncGroup;
|
|
|
| video_send_config_.suspend_below_min_bitrate =
|
| params_.common.suspend_below_min_bitrate;
|
| @@ -1155,24 +1220,91 @@ void VideoQualityTest::RunWithVideoRenderer(const Params& params) {
|
|
|
| video_send_stream_ =
|
| call->CreateVideoSendStream(video_send_config_, video_encoder_config_);
|
| - VideoReceiveStream* receive_stream =
|
| + VideoReceiveStream* video_receive_stream =
|
| call->CreateVideoReceiveStream(video_receive_configs_[stream_id].Copy());
|
| CreateCapturer(video_send_stream_->Input());
|
|
|
| - receive_stream->Start();
|
| + AudioReceiveStream* audio_receive_stream = nullptr;
|
| + if (params_.audio) {
|
| + audio_send_config_ = AudioSendStream::Config(&transport);
|
| + audio_send_config_.voe_channel_id = voe.send_channel_id;
|
| + audio_send_config_.rtp.ssrc = kAudioSendSsrc;
|
| +
|
| + // Add extension to enable audio send side BWE, and allow audio bit rate
|
| + // adaptation.
|
| + audio_send_config_.rtp.extensions.clear();
|
| + if (params_.common.send_side_bwe) {
|
| + audio_send_config_.rtp.extensions.push_back(webrtc::RtpExtension(
|
| + webrtc::RtpExtension::kTransportSequenceNumberUri,
|
| + test::kTransportSequenceNumberExtensionId));
|
| + audio_send_config_.min_bitrate_kbps = kOpusMinBitrate / 1000;
|
| + audio_send_config_.max_bitrate_kbps = kOpusBitrateFb / 1000;
|
| + }
|
| +
|
| + audio_send_stream_ = call->CreateAudioSendStream(audio_send_config_);
|
| +
|
| + AudioReceiveStream::Config audio_config;
|
| + audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc;
|
| + audio_config.rtcp_send_transport = &transport;
|
| + audio_config.voe_channel_id = voe.receive_channel_id;
|
| + audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc;
|
| + audio_config.rtp.transport_cc = params_.common.send_side_bwe;
|
| + audio_config.rtp.extensions = audio_send_config_.rtp.extensions;
|
| + audio_config.decoder_factory = decoder_factory_;
|
| + if (params_.audio_video_sync)
|
| + audio_config.sync_group = kSyncGroup;
|
| +
|
| + audio_receive_stream =call->CreateAudioReceiveStream(audio_config);
|
| +
|
| + const CodecInst kOpusInst = {120, "OPUS", 48000, 960, 2, 64000};
|
| + EXPECT_EQ(0, voe.codec->SetSendCodec(voe.send_channel_id, kOpusInst));
|
| + }
|
| +
|
| + // Start sending and receiving video.
|
| + video_receive_stream->Start();
|
| video_send_stream_->Start();
|
| capturer_->Start();
|
|
|
| + if (params_.audio) {
|
| + // Start receiving audio.
|
| + audio_receive_stream->Start();
|
| + EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id));
|
| + EXPECT_EQ(0, voe.base->StartReceive(voe.receive_channel_id));
|
| +
|
| + // Start sending audio.
|
| + audio_send_stream_->Start();
|
| + EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id));
|
| + }
|
| +
|
| test::PressEnterToContinue();
|
|
|
| + if (params_.audio) {
|
| + // Stop sending audio.
|
| + EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id));
|
| + audio_send_stream_->Stop();
|
| +
|
| + // Stop receiving audio.
|
| + EXPECT_EQ(0, voe.base->StopReceive(voe.receive_channel_id));
|
| + EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id));
|
| + audio_receive_stream->Stop();
|
| + }
|
| +
|
| + // Stop receiving and sending video.
|
| capturer_->Stop();
|
| video_send_stream_->Stop();
|
| - receive_stream->Stop();
|
| + video_receive_stream->Stop();
|
|
|
| - call->DestroyVideoReceiveStream(receive_stream);
|
| + call->DestroyVideoReceiveStream(video_receive_stream);
|
| call->DestroyVideoSendStream(video_send_stream_);
|
|
|
| + if (params_.audio) {
|
| + call->DestroyAudioSendStream(audio_send_stream_);
|
| + call->DestroyAudioReceiveStream(audio_receive_stream);
|
| + }
|
| +
|
| transport.StopSending();
|
| + if (params_.audio)
|
| + DestroyVoiceEngine(&voe);
|
| }
|
|
|
| } // namespace webrtc
|
|
|