Chromium Code Reviews| Index: webrtc/video/video_quality_test.cc |
| diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc |
| index 66210d08643e62fc93bccff52f0eea2ba70f8b04..e1b06188db3aeab799b0efa2b416786e49d7cea3 100644 |
| --- a/webrtc/video/video_quality_test.cc |
| +++ b/webrtc/video/video_quality_test.cc |
| @@ -34,13 +34,64 @@ |
| #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 char kSyncGroup[] = "av_sync"; |
| + |
| +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; |
| +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, |
| @@ -1110,6 +1161,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( |
| @@ -1124,6 +1184,9 @@ 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; |
| @@ -1142,24 +1205,77 @@ 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; |
| + audio_send_stream_ = call->CreateAudioSendStream(audio_send_config_); |
|
stefan-webrtc
2016/08/08 14:11:18
Is audio configured with BWE?
minyue-webrtc
2016/08/15 15:34:31
The initial CL was made before AudioBWE landed. So
|
| + |
| + 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.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 |