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 d42ed9b0f6b8cf4435a43f13dcedf1da8c1175e6..3ab1f89b576325e7cbf464c7c6343e7f1731527e 100644 |
| --- a/webrtc/video/video_quality_test.cc |
| +++ b/webrtc/video/video_quality_test.cc |
| @@ -915,8 +915,8 @@ void VideoQualityTest::FillScalabilitySettings( |
| } |
| } |
| -void VideoQualityTest::SetupCommon(Transport* send_transport, |
| - Transport* recv_transport) { |
| +void VideoQualityTest::SetupVideo(Transport* send_transport, |
| + Transport* recv_transport) { |
| if (params_.logs) |
| trace_to_stderr_.reset(new test::TraceToStderr); |
| @@ -925,19 +925,19 @@ void VideoQualityTest::SetupCommon(Transport* send_transport, |
| int payload_type; |
| if (params_.video.codec == "H264") { |
| - encoder_.reset(VideoEncoder::Create(VideoEncoder::kH264)); |
| + video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kH264)); |
| payload_type = kPayloadTypeH264; |
| } else if (params_.video.codec == "VP8") { |
| - encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp8)); |
| + video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp8)); |
| payload_type = kPayloadTypeVP8; |
| } else if (params_.video.codec == "VP9") { |
| - encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp9)); |
| + video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp9)); |
| payload_type = kPayloadTypeVP9; |
| } else { |
| RTC_NOTREACHED() << "Codec not supported!"; |
| return; |
| } |
| - video_send_config_.encoder_settings.encoder = encoder_.get(); |
| + video_send_config_.encoder_settings.encoder = video_encoder_.get(); |
| video_send_config_.encoder_settings.payload_name = params_.video.codec; |
| video_send_config_.encoder_settings.payload_type = payload_type; |
| video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| @@ -977,20 +977,22 @@ void VideoQualityTest::SetupScreenshare() { |
| // Fill out codec settings. |
| video_encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; |
| if (params_.video.codec == "VP8") { |
| - codec_settings_.VP8 = VideoEncoder::GetDefaultVp8Settings(); |
| - codec_settings_.VP8.denoisingOn = false; |
| - codec_settings_.VP8.frameDroppingOn = false; |
| - codec_settings_.VP8.numberOfTemporalLayers = |
| + video_codec_settings_.VP8 = VideoEncoder::GetDefaultVp8Settings(); |
| + video_codec_settings_.VP8.denoisingOn = false; |
| + video_codec_settings_.VP8.frameDroppingOn = false; |
| + video_codec_settings_.VP8.numberOfTemporalLayers = |
| static_cast<unsigned char>(params_.video.num_temporal_layers); |
| - video_encoder_config_.encoder_specific_settings = &codec_settings_.VP8; |
| + video_encoder_config_.encoder_specific_settings = |
| + &video_codec_settings_.VP8; |
| } else if (params_.video.codec == "VP9") { |
| - codec_settings_.VP9 = VideoEncoder::GetDefaultVp9Settings(); |
| - codec_settings_.VP9.denoisingOn = false; |
| - codec_settings_.VP9.frameDroppingOn = false; |
| - codec_settings_.VP9.numberOfTemporalLayers = |
| + video_codec_settings_.VP9 = VideoEncoder::GetDefaultVp9Settings(); |
| + video_codec_settings_.VP9.denoisingOn = false; |
| + video_codec_settings_.VP9.frameDroppingOn = false; |
| + video_codec_settings_.VP9.numberOfTemporalLayers = |
| static_cast<unsigned char>(params_.video.num_temporal_layers); |
| - video_encoder_config_.encoder_specific_settings = &codec_settings_.VP9; |
| - codec_settings_.VP9.numberOfSpatialLayers = |
| + video_encoder_config_.encoder_specific_settings = |
| + &video_codec_settings_.VP9; |
| + video_codec_settings_.VP9.numberOfSpatialLayers = |
| static_cast<unsigned char>(params_.ss.num_spatial_layers); |
| } |
| @@ -1032,20 +1034,20 @@ void VideoQualityTest::CreateCapturer(VideoCaptureInput* input) { |
| new test::FrameGeneratorCapturer( |
| clock_, input, frame_generator_.release(), params_.video.fps); |
| EXPECT_TRUE(frame_generator_capturer->Init()); |
| - capturer_.reset(frame_generator_capturer); |
| + video_capturer_.reset(frame_generator_capturer); |
| } else { |
| if (params_.video.clip_name.empty()) { |
| - capturer_.reset(test::VideoCapturer::Create(input, params_.video.width, |
| - params_.video.height, |
| - params_.video.fps, clock_)); |
| + video_capturer_.reset(test::VideoCapturer::Create( |
| + input, params_.video.width, params_.video.height, params_.video.fps, |
| + clock_)); |
| } else { |
| - capturer_.reset(test::FrameGeneratorCapturer::CreateFromYuvFile( |
| + video_capturer_.reset(test::FrameGeneratorCapturer::CreateFromYuvFile( |
| input, test::ResourcePath(params_.video.clip_name, "yuv"), |
| params_.video.width, params_.video.height, params_.video.fps, |
| clock_)); |
| - ASSERT_TRUE(capturer_) << "Could not create capturer for " |
| - << params_.video.clip_name |
| - << ".yuv. Is this resource file present?"; |
| + ASSERT_TRUE(video_capturer_) << "Could not create capturer for " |
| + << params_.video.clip_name |
| + << ".yuv. Is this resource file present?"; |
| } |
| } |
| } |
| @@ -1113,7 +1115,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| send_transport.SetReceiver(&analyzer); |
| recv_transport.SetReceiver(sender_call_->Receiver()); |
| - SetupCommon(&analyzer, &recv_transport); |
| + SetupVideo(&analyzer, &recv_transport); |
| video_receive_configs_[params_.ss.selected_stream].renderer = &analyzer; |
| video_send_config_.pre_encode_callback = analyzer.pre_encode_proxy(); |
| for (auto& config : video_receive_configs_) |
| @@ -1133,14 +1135,14 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| video_send_stream_->Start(); |
| for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| receive_stream->Start(); |
| - capturer_->Start(); |
| + video_capturer_->Start(); |
| analyzer.Wait(); |
| send_transport.StopSending(); |
| recv_transport.StopSending(); |
| - capturer_->Stop(); |
| + video_capturer_->Stop(); |
| for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| receive_stream->Stop(); |
| video_send_stream_->Stop(); |
| @@ -1151,26 +1153,46 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| fclose(graph_data_output_file); |
| } |
| +void VideoQualityTest::SetupAudio(int send_channel_id, |
| + int receive_channel_id, |
| + Call* call, |
| + Transport* transport, |
| + AudioReceiveStream** audio_receive_stream) { |
| + audio_send_config_ = AudioSendStream::Config(transport); |
| + audio_send_config_.voe_channel_id = 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 = 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_.video.enabled && params_.audio.sync_video) |
| + audio_config.sync_group = kSyncGroup; |
| + |
| + *audio_receive_stream = call->CreateAudioReceiveStream(audio_config); |
| +} |
| + |
| void VideoQualityTest::RunWithRenderers(const Params& params) { |
| params_ = params; |
| CheckParams(); |
| - std::unique_ptr<test::VideoRenderer> local_preview( |
| - test::VideoRenderer::Create("Local Preview", params_.video.width, |
| - params_.video.height)); |
| - size_t stream_id = params_.ss.selected_stream; |
| - std::string title = "Loopback Video"; |
| - if (params_.ss.streams.size() > 1) { |
| - std::ostringstream s; |
| - s << stream_id; |
| - title += " - Stream #" + s.str(); |
| - } |
| - |
| - std::unique_ptr<test::VideoRenderer> loopback_video( |
| - test::VideoRenderer::Create(title.c_str(), |
| - params_.ss.streams[stream_id].width, |
| - params_.ss.streams[stream_id].height)); |
| - |
| // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to |
| // match the full stack tests. |
| Call::Config call_config; |
| @@ -1179,6 +1201,8 @@ void VideoQualityTest::RunWithRenderers(const Params& params) { |
| ::VoiceEngineState voe; |
| if (params_.audio.enabled) { |
| CreateVoiceEngine(&voe, decoder_factory_); |
| + const CodecInst kOpusInst = {120, "OPUS", 48000, 960, 2, 64000}; |
| + EXPECT_EQ(0, voe.codec->SetSendCodec(voe.send_channel_id, kOpusInst)); |
| AudioState::Config audio_state_config; |
| audio_state_config.voice_engine = voe.voice_engine; |
| call_config.audio_state = AudioState::Create(audio_state_config); |
| @@ -1186,6 +1210,8 @@ void VideoQualityTest::RunWithRenderers(const Params& params) { |
| std::unique_ptr<Call> call(Call::Create(call_config)); |
| + // TODO(minyue): consider if this is a good transport even for audio only |
| + // calls. |
| test::LayerFilteringTransport transport( |
| params.pipe, call.get(), kPayloadTypeVP8, kPayloadTypeVP9, |
| params.video.selected_tl, params_.ss.selected_sl); |
| @@ -1194,74 +1220,69 @@ void VideoQualityTest::RunWithRenderers(const Params& params) { |
| // the full stack tests better. |
| transport.SetReceiver(call->Receiver()); |
| - SetupCommon(&transport, &transport); |
| + VideoReceiveStream* video_receive_stream = nullptr; |
| + std::unique_ptr<test::VideoRenderer> local_preview; |
| + std::unique_ptr<test::VideoRenderer> loopback_video; |
| + if (params_.video.enabled) { |
| + // Create video renders. |
| + local_preview.reset(test::VideoRenderer::Create( |
| + "Local Preview", params_.video.width, params_.video.height)); |
| + |
| + size_t stream_id = params_.ss.selected_stream; |
| + std::string title = "Loopback Video"; |
| + if (params_.ss.streams.size() > 1) { |
| + std::ostringstream s; |
| + s << stream_id; |
| + title += " - Stream #" + s.str(); |
| + } |
| - video_send_config_.pre_encode_callback = local_preview.get(); |
| - video_receive_configs_[stream_id].renderer = loopback_video.get(); |
| - if (params_.audio.enabled && params_.audio.sync_video) |
| - video_receive_configs_[stream_id].sync_group = kSyncGroup; |
| + loopback_video.reset(test::VideoRenderer::Create( |
| + title.c_str(), params_.ss.streams[stream_id].width, |
| + params_.ss.streams[stream_id].height)); |
| + |
| + SetupVideo(&transport, &transport); |
| + |
| + // TODO(minyue): maybe move the following to SetupVideo() to make code |
|
stefan-webrtc
2016/09/07 13:12:10
Any chance we can do this now? It would look a lot
minyue-webrtc
2016/09/08 15:38:24
The reason that I am not very confident in modifyi
stefan-webrtc
2016/09/13 09:50:23
I'm not sure I follow. This method is called RunWi
minyue-webrtc
2016/10/28 14:00:59
If you compare the lines following SetupVideo() in
|
| + // cleaner. |
| + video_send_config_.pre_encode_callback = local_preview.get(); |
| + video_receive_configs_[stream_id].renderer = loopback_video.get(); |
| + if (params_.audio.enabled && params_.audio.sync_video) |
| + video_receive_configs_[stream_id].sync_group = kSyncGroup; |
| + |
| + video_send_config_.suspend_below_min_bitrate = |
| + params_.video.suspend_below_min_bitrate; |
| + |
| + if (params.video.fec) { |
| + video_send_config_.rtp.fec.red_payload_type = kRedPayloadType; |
| + video_send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
| + video_receive_configs_[stream_id].rtp.fec.red_payload_type = |
| + kRedPayloadType; |
| + video_receive_configs_[stream_id].rtp.fec.ulpfec_payload_type = |
| + kUlpfecPayloadType; |
| + } |
| - video_send_config_.suspend_below_min_bitrate = |
| - params_.video.suspend_below_min_bitrate; |
| + if (params_.screenshare.enabled) |
| + SetupScreenshare(); |
| - if (params.video.fec) { |
| - video_send_config_.rtp.fec.red_payload_type = kRedPayloadType; |
| - video_send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
| - video_receive_configs_[stream_id].rtp.fec.red_payload_type = |
| - kRedPayloadType; |
| - video_receive_configs_[stream_id].rtp.fec.ulpfec_payload_type = |
| - kUlpfecPayloadType; |
| + video_send_stream_ = call->CreateVideoSendStream( |
| + video_send_config_.Copy(), video_encoder_config_.Copy()); |
| + video_receive_stream = call->CreateVideoReceiveStream( |
| + video_receive_configs_[stream_id].Copy()); |
| + CreateCapturer(video_send_stream_->Input()); |
| } |
| - if (params_.screenshare.enabled) |
| - SetupScreenshare(); |
| - |
| - video_send_stream_ = call->CreateVideoSendStream( |
| - video_send_config_.Copy(), video_encoder_config_.Copy()); |
| - VideoReceiveStream* video_receive_stream = |
| - call->CreateVideoReceiveStream(video_receive_configs_[stream_id].Copy()); |
| - CreateCapturer(video_send_stream_->Input()); |
| - |
| AudioReceiveStream* audio_receive_stream = nullptr; |
| if (params_.audio.enabled) { |
| - 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.sync_video) |
| - 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)); |
| + SetupAudio(voe.send_channel_id, voe.receive_channel_id, call.get(), |
| + &transport, &audio_receive_stream); |
| } |
| // Start sending and receiving video. |
| - video_receive_stream->Start(); |
| - video_send_stream_->Start(); |
| - capturer_->Start(); |
| + if (params_.video.enabled) { |
| + video_receive_stream->Start(); |
| + video_send_stream_->Start(); |
| + video_capturer_->Start(); |
| + } |
| if (params_.audio.enabled) { |
| // Start receiving audio. |
| @@ -1285,19 +1306,17 @@ void VideoQualityTest::RunWithRenderers(const Params& params) { |
| EXPECT_EQ(0, voe.base->StopReceive(voe.receive_channel_id)); |
| EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id)); |
| audio_receive_stream->Stop(); |
| + call->DestroyAudioSendStream(audio_send_stream_); |
| + call->DestroyAudioReceiveStream(audio_receive_stream); |
| } |
| // Stop receiving and sending video. |
| - capturer_->Stop(); |
| - video_send_stream_->Stop(); |
| - video_receive_stream->Stop(); |
| - |
| - call->DestroyVideoReceiveStream(video_receive_stream); |
| - call->DestroyVideoSendStream(video_send_stream_); |
| - |
| - if (params_.audio.enabled) { |
| - call->DestroyAudioSendStream(audio_send_stream_); |
| - call->DestroyAudioReceiveStream(audio_receive_stream); |
| + if (params_.video.enabled) { |
| + video_capturer_->Stop(); |
| + video_send_stream_->Stop(); |
| + video_receive_stream->Stop(); |
| + call->DestroyVideoReceiveStream(video_receive_stream); |
| + call->DestroyVideoSendStream(video_send_stream_); |
| } |
| transport.StopSending(); |