Index: webrtc/video/video_quality_test.cc |
diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc |
index 6ad64bc33f601de042309c8c869626d2f700a716..16d7356053d4af34d18c63a9b44bf79277c62afb 100644 |
--- a/webrtc/video/video_quality_test.cc |
+++ b/webrtc/video/video_quality_test.cc |
@@ -37,6 +37,7 @@ |
#include "webrtc/rtc_base/memory_usage.h" |
#include "webrtc/rtc_base/optional.h" |
#include "webrtc/rtc_base/platform_file.h" |
+#include "webrtc/rtc_base/ptr_util.h" |
#include "webrtc/rtc_base/timeutils.h" |
#include "webrtc/system_wrappers/include/cpu_info.h" |
#include "webrtc/system_wrappers/include/field_trial.h" |
@@ -1651,6 +1652,10 @@ void VideoQualityTest::DestroyThumbnailStreams() { |
sender_call_->DestroyVideoReceiveStream(thumbnail_receive_stream); |
thumbnail_send_streams_.clear(); |
thumbnail_receive_streams_.clear(); |
+ for (std::unique_ptr<test::VideoCapturer>& video_caputurer : |
+ thumbnail_capturers_) { |
+ video_caputurer.reset(); |
+ } |
} |
void VideoQualityTest::SetupScreenshareOrSVC() { |
@@ -1769,6 +1774,11 @@ void VideoQualityTest::CreateCapturer() { |
} |
void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
+ std::unique_ptr<test::LayerFilteringTransport> send_transport; |
+ std::unique_ptr<test::DirectTransport> recv_transport; |
+ FILE* graph_data_output_file = nullptr; |
+ std::unique_ptr<VideoAnalyzer> analyzer; |
+ |
params_ = params; |
RTC_CHECK(!params_.audio.enabled); |
@@ -1776,7 +1786,6 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
// differentiate between the analyzer and the renderer case. |
CheckParams(); |
- FILE* graph_data_output_file = nullptr; |
if (!params_.analyzer.graph_data_output_filename.empty()) { |
graph_data_output_file = |
fopen(params_.analyzer.graph_data_output_filename.c_str(), "w"); |
@@ -1794,22 +1803,26 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
Call::Config call_config(event_log_.get()); |
call_config.bitrate_config = params.call.call_bitrate_config; |
- CreateCalls(call_config, call_config); |
- test::LayerFilteringTransport send_transport( |
- params_.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9, |
- params_.video.selected_tl, params_.ss.selected_sl, payload_type_map_); |
+ task_queue_.SendTask([this, &call_config, &send_transport, |
+ &recv_transport]() { |
+ CreateCalls(call_config, call_config); |
- test::DirectTransport recv_transport(params_.pipe, receiver_call_.get(), |
- payload_type_map_); |
+ send_transport = rtc::MakeUnique<test::LayerFilteringTransport>( |
+ &task_queue_, params_.pipe, sender_call_.get(), kPayloadTypeVP8, |
+ kPayloadTypeVP9, params_.video.selected_tl, params_.ss.selected_sl, |
+ payload_type_map_); |
+ |
+ recv_transport = rtc::MakeUnique<test::DirectTransport>( |
+ &task_queue_, params_.pipe, receiver_call_.get(), payload_type_map_); |
+ }); |
std::string graph_title = params_.analyzer.graph_title; |
if (graph_title.empty()) |
graph_title = VideoQualityTest::GenerateGraphTitle(); |
- |
bool is_quick_test_enabled = field_trial::IsEnabled("WebRTC-QuickPerfTest"); |
- VideoAnalyzer analyzer( |
- &send_transport, params_.analyzer.test_label, |
+ analyzer = rtc::MakeUnique<VideoAnalyzer>( |
+ send_transport.get(), params_.analyzer.test_label, |
params_.analyzer.avg_psnr_threshold, params_.analyzer.avg_ssim_threshold, |
is_quick_test_enabled |
? kFramesSentInQuickTest |
@@ -1820,82 +1833,91 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
static_cast<size_t>(params_.ss.selected_stream), params.ss.selected_sl, |
params_.video.selected_tl, is_quick_test_enabled, clock_, |
params_.logging.rtp_dump_name); |
- analyzer.SetCall(sender_call_.get()); |
- analyzer.SetReceiver(receiver_call_->Receiver()); |
- send_transport.SetReceiver(&analyzer); |
- recv_transport.SetReceiver(sender_call_->Receiver()); |
- SetupVideo(&analyzer, &recv_transport); |
- SetupThumbnails(&analyzer, &recv_transport); |
- video_receive_configs_[params_.ss.selected_stream].renderer = &analyzer; |
- video_send_config_.pre_encode_callback = analyzer.pre_encode_proxy(); |
- RTC_DCHECK(!video_send_config_.post_encode_callback); |
- video_send_config_.post_encode_callback = analyzer.encode_timing_proxy(); |
+ task_queue_.SendTask([&]() { |
+ analyzer->SetCall(sender_call_.get()); |
+ analyzer->SetReceiver(receiver_call_->Receiver()); |
+ send_transport->SetReceiver(analyzer.get()); |
+ recv_transport->SetReceiver(sender_call_->Receiver()); |
- SetupScreenshareOrSVC(); |
+ SetupVideo(analyzer.get(), recv_transport.get()); |
+ SetupThumbnails(analyzer.get(), recv_transport.get()); |
+ video_receive_configs_[params_.ss.selected_stream].renderer = |
+ analyzer.get(); |
+ video_send_config_.pre_encode_callback = analyzer->pre_encode_proxy(); |
+ RTC_DCHECK(!video_send_config_.post_encode_callback); |
+ video_send_config_.post_encode_callback = analyzer->encode_timing_proxy(); |
- CreateFlexfecStreams(); |
- CreateVideoStreams(); |
- analyzer.SetSendStream(video_send_stream_); |
- if (video_receive_streams_.size() == 1) |
- analyzer.SetReceiveStream(video_receive_streams_[0]); |
+ SetupScreenshareOrSVC(); |
- video_send_stream_->SetSource(analyzer.OutputInterface(), |
- degradation_preference_); |
+ CreateFlexfecStreams(); |
+ CreateVideoStreams(); |
+ analyzer->SetSendStream(video_send_stream_); |
+ if (video_receive_streams_.size() == 1) |
+ analyzer->SetReceiveStream(video_receive_streams_[0]); |
- SetupThumbnailCapturers(params_.call.num_thumbnails); |
- for (size_t i = 0; i < thumbnail_send_streams_.size(); ++i) { |
- thumbnail_send_streams_[i]->SetSource(thumbnail_capturers_[i].get(), |
- degradation_preference_); |
- } |
+ video_send_stream_->SetSource(analyzer->OutputInterface(), |
+ degradation_preference_); |
- CreateCapturer(); |
+ SetupThumbnailCapturers(params_.call.num_thumbnails); |
+ for (size_t i = 0; i < thumbnail_send_streams_.size(); ++i) { |
+ thumbnail_send_streams_[i]->SetSource(thumbnail_capturers_[i].get(), |
+ degradation_preference_); |
+ } |
- analyzer.SetSource(video_capturer_.get(), params_.ss.infer_streams); |
+ CreateCapturer(); |
- StartEncodedFrameLogs(video_send_stream_); |
- StartEncodedFrameLogs(video_receive_streams_[params_.ss.selected_stream]); |
- video_send_stream_->Start(); |
- for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) |
- thumbnail_send_stream->Start(); |
- for (VideoReceiveStream* receive_stream : video_receive_streams_) |
- receive_stream->Start(); |
- for (VideoReceiveStream* thumbnail_receive_stream : |
- thumbnail_receive_streams_) |
- thumbnail_receive_stream->Start(); |
+ analyzer->SetSource(video_capturer_.get(), params_.ss.infer_streams); |
- analyzer.StartMeasuringCpuProcessTime(); |
+ StartEncodedFrameLogs(video_send_stream_); |
+ StartEncodedFrameLogs(video_receive_streams_[params_.ss.selected_stream]); |
+ video_send_stream_->Start(); |
+ for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) |
+ thumbnail_send_stream->Start(); |
+ for (VideoReceiveStream* receive_stream : video_receive_streams_) |
+ receive_stream->Start(); |
+ for (VideoReceiveStream* thumbnail_receive_stream : |
+ thumbnail_receive_streams_) |
+ thumbnail_receive_stream->Start(); |
- video_capturer_->Start(); |
- for (std::unique_ptr<test::VideoCapturer>& video_caputurer : |
- thumbnail_capturers_) { |
- video_caputurer->Start(); |
- } |
+ analyzer->StartMeasuringCpuProcessTime(); |
- analyzer.Wait(); |
+ video_capturer_->Start(); |
+ for (std::unique_ptr<test::VideoCapturer>& video_caputurer : |
+ thumbnail_capturers_) { |
+ video_caputurer->Start(); |
+ } |
+ }); |
- send_transport.StopSending(); |
- recv_transport.StopSending(); |
+ analyzer->Wait(); |
- for (std::unique_ptr<test::VideoCapturer>& video_caputurer : |
- thumbnail_capturers_) |
- video_caputurer->Stop(); |
- video_capturer_->Stop(); |
- for (VideoReceiveStream* thumbnail_receive_stream : |
- thumbnail_receive_streams_) |
- thumbnail_receive_stream->Stop(); |
- for (VideoReceiveStream* receive_stream : video_receive_streams_) |
- receive_stream->Stop(); |
- for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) |
- thumbnail_send_stream->Stop(); |
- video_send_stream_->Stop(); |
+ task_queue_.SendTask([&]() { |
+ for (std::unique_ptr<test::VideoCapturer>& video_caputurer : |
+ thumbnail_capturers_) |
+ video_caputurer->Stop(); |
+ video_capturer_->Stop(); |
+ for (VideoReceiveStream* thumbnail_receive_stream : |
+ thumbnail_receive_streams_) |
+ thumbnail_receive_stream->Stop(); |
+ for (VideoReceiveStream* receive_stream : video_receive_streams_) |
+ receive_stream->Stop(); |
+ for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) |
+ thumbnail_send_stream->Stop(); |
+ video_send_stream_->Stop(); |
+ |
+ DestroyStreams(); |
+ DestroyThumbnailStreams(); |
- DestroyStreams(); |
- DestroyThumbnailStreams(); |
+ event_log_->StopLogging(); |
+ if (graph_data_output_file) |
+ fclose(graph_data_output_file); |
- event_log_->StopLogging(); |
- if (graph_data_output_file) |
- fclose(graph_data_output_file); |
+ video_capturer_.reset(); |
+ send_transport.reset(); |
+ recv_transport.reset(); |
+ |
+ DestroyCalls(); |
+ }); |
} |
void VideoQualityTest::SetupAudio(int send_channel_id, |
@@ -1942,162 +1964,177 @@ void VideoQualityTest::SetupAudio(int send_channel_id, |
} |
void VideoQualityTest::RunWithRenderers(const Params& params) { |
- params_ = params; |
- CheckParams(); |
- |
- // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to |
- // match the full stack tests. |
- Call::Config call_config(event_log_.get()); |
- call_config.bitrate_config = params_.call.call_bitrate_config; |
- |
+ std::unique_ptr<test::LayerFilteringTransport> send_transport; |
+ std::unique_ptr<test::DirectTransport> recv_transport; |
::VoiceEngineState voe; |
- rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing( |
- webrtc::AudioProcessing::Create()); |
- |
- if (params_.audio.enabled) { |
- CreateVoiceEngine(&voe, audio_processing.get(), decoder_factory_); |
- AudioState::Config audio_state_config; |
- audio_state_config.voice_engine = voe.voice_engine; |
- audio_state_config.audio_mixer = AudioMixerImpl::Create(); |
- audio_state_config.audio_processing = audio_processing; |
- call_config.audio_state = AudioState::Create(audio_state_config); |
- } |
- |
- CreateCalls(call_config, call_config); |
- |
- // TODO(minyue): consider if this is a good transport even for audio only |
- // calls. |
- test::LayerFilteringTransport send_transport( |
- params.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9, |
- params.video.selected_tl, params_.ss.selected_sl, payload_type_map_); |
- |
- test::DirectTransport recv_transport(params_.pipe, receiver_call_.get(), |
- payload_type_map_); |
+ std::unique_ptr<test::VideoRenderer> local_preview; |
+ std::vector<std::unique_ptr<test::VideoRenderer>> loopback_renderers; |
+ AudioReceiveStream* audio_receive_stream = nullptr; |
- // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at |
- // least share as much code as possible. That way this test would also match |
- // the full stack tests better. |
- send_transport.SetReceiver(receiver_call_->Receiver()); |
- recv_transport.SetReceiver(sender_call_->Receiver()); |
+ task_queue_.SendTask([&]() { |
+ params_ = params; |
+ CheckParams(); |
+ |
+ // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to |
+ // match the full stack tests. |
+ Call::Config call_config(event_log_.get()); |
+ call_config.bitrate_config = params_.call.call_bitrate_config; |
+ |
+ rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing( |
+ webrtc::AudioProcessing::Create()); |
+ |
+ if (params_.audio.enabled) { |
+ CreateVoiceEngine(&voe, audio_processing.get(), decoder_factory_); |
+ AudioState::Config audio_state_config; |
+ audio_state_config.voice_engine = voe.voice_engine; |
+ audio_state_config.audio_mixer = AudioMixerImpl::Create(); |
+ audio_state_config.audio_processing = audio_processing; |
+ call_config.audio_state = AudioState::Create(audio_state_config); |
+ } |
- std::unique_ptr<test::VideoRenderer> local_preview; |
- std::vector<std::unique_ptr<test::VideoRenderer>> loopback_renderers_; |
- if (params_.video.enabled) { |
- // Create video renderers. |
- local_preview.reset(test::VideoRenderer::Create( |
- "Local Preview", params_.video.width, params_.video.height)); |
- |
- const size_t selected_stream_id = params_.ss.selected_stream; |
- const size_t num_streams = params_.ss.streams.size(); |
- |
- if (selected_stream_id == num_streams) { |
- for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) { |
- std::ostringstream oss; |
- oss << "Loopback Video - Stream #" << static_cast<int>(stream_id); |
- loopback_renderers_.emplace_back(test::VideoRenderer::Create( |
- oss.str().c_str(), params_.ss.streams[stream_id].width, |
- params_.ss.streams[stream_id].height)); |
+ CreateCalls(call_config, call_config); |
+ |
+ // TODO(minyue): consider if this is a good transport even for audio only |
+ // calls. |
+ send_transport = rtc::MakeUnique<test::LayerFilteringTransport>( |
+ &task_queue_, params.pipe, sender_call_.get(), kPayloadTypeVP8, |
+ kPayloadTypeVP9, params.video.selected_tl, params_.ss.selected_sl, |
+ payload_type_map_); |
+ |
+ recv_transport = rtc::MakeUnique<test::DirectTransport>( |
+ &task_queue_, params_.pipe, receiver_call_.get(), payload_type_map_); |
+ |
+ // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at |
+ // least share as much code as possible. That way this test would also match |
+ // the full stack tests better. |
+ send_transport->SetReceiver(receiver_call_->Receiver()); |
+ recv_transport->SetReceiver(sender_call_->Receiver()); |
+ |
+ if (params_.video.enabled) { |
+ // Create video renderers. |
+ local_preview.reset(test::VideoRenderer::Create( |
+ "Local Preview", params_.video.width, params_.video.height)); |
+ |
+ const size_t selected_stream_id = params_.ss.selected_stream; |
+ const size_t num_streams = params_.ss.streams.size(); |
+ |
+ if (selected_stream_id == num_streams) { |
+ for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) { |
+ std::ostringstream oss; |
+ oss << "Loopback Video - Stream #" << static_cast<int>(stream_id); |
+ loopback_renderers.emplace_back(test::VideoRenderer::Create( |
+ oss.str().c_str(), params_.ss.streams[stream_id].width, |
+ params_.ss.streams[stream_id].height)); |
+ } |
+ } else { |
+ loopback_renderers.emplace_back(test::VideoRenderer::Create( |
+ "Loopback Video", params_.ss.streams[selected_stream_id].width, |
+ params_.ss.streams[selected_stream_id].height)); |
} |
- } else { |
- loopback_renderers_.emplace_back(test::VideoRenderer::Create( |
- "Loopback Video", params_.ss.streams[selected_stream_id].width, |
- params_.ss.streams[selected_stream_id].height)); |
- } |
- SetupVideo(&send_transport, &recv_transport); |
+ SetupVideo(send_transport.get(), recv_transport.get()); |
- video_send_config_.pre_encode_callback = local_preview.get(); |
- if (selected_stream_id == num_streams) { |
- for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) { |
- video_receive_configs_[stream_id].renderer = |
- loopback_renderers_[stream_id].get(); |
+ video_send_config_.pre_encode_callback = local_preview.get(); |
+ if (selected_stream_id == num_streams) { |
+ for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) { |
+ video_receive_configs_[stream_id].renderer = |
+ loopback_renderers[stream_id].get(); |
+ if (params_.audio.enabled && params_.audio.sync_video) |
+ video_receive_configs_[stream_id].sync_group = kSyncGroup; |
+ } |
+ } else { |
+ video_receive_configs_[selected_stream_id].renderer = |
+ loopback_renderers.back().get(); |
if (params_.audio.enabled && params_.audio.sync_video) |
- video_receive_configs_[stream_id].sync_group = kSyncGroup; |
+ video_receive_configs_[selected_stream_id].sync_group = kSyncGroup; |
} |
- } else { |
- video_receive_configs_[selected_stream_id].renderer = |
- loopback_renderers_.back().get(); |
- if (params_.audio.enabled && params_.audio.sync_video) |
- video_receive_configs_[selected_stream_id].sync_group = kSyncGroup; |
- } |
- if (params_.screenshare.enabled) |
- SetupScreenshareOrSVC(); |
+ if (params_.screenshare.enabled) |
+ SetupScreenshareOrSVC(); |
- CreateFlexfecStreams(); |
- CreateVideoStreams(); |
+ CreateFlexfecStreams(); |
+ CreateVideoStreams(); |
- CreateCapturer(); |
- video_send_stream_->SetSource(video_capturer_.get(), |
- degradation_preference_); |
- } |
+ CreateCapturer(); |
+ video_send_stream_->SetSource(video_capturer_.get(), |
+ degradation_preference_); |
+ } |
- AudioReceiveStream* audio_receive_stream = nullptr; |
- if (params_.audio.enabled) { |
- SetupAudio(voe.send_channel_id, voe.receive_channel_id, &send_transport, |
- &audio_receive_stream); |
- } |
+ if (params_.audio.enabled) { |
+ SetupAudio(voe.send_channel_id, voe.receive_channel_id, |
+ send_transport.get(), &audio_receive_stream); |
+ } |
- for (VideoReceiveStream* receive_stream : video_receive_streams_) |
- StartEncodedFrameLogs(receive_stream); |
- StartEncodedFrameLogs(video_send_stream_); |
+ for (VideoReceiveStream* receive_stream : video_receive_streams_) |
+ StartEncodedFrameLogs(receive_stream); |
+ StartEncodedFrameLogs(video_send_stream_); |
- // Start sending and receiving video. |
- if (params_.video.enabled) { |
- for (VideoReceiveStream* video_receive_stream : video_receive_streams_) |
- video_receive_stream->Start(); |
+ // Start sending and receiving video. |
+ if (params_.video.enabled) { |
+ for (VideoReceiveStream* video_receive_stream : video_receive_streams_) |
+ video_receive_stream->Start(); |
- video_send_stream_->Start(); |
- video_capturer_->Start(); |
- } |
+ video_send_stream_->Start(); |
+ video_capturer_->Start(); |
+ } |
- if (params_.audio.enabled) { |
- // Start receiving audio. |
- audio_receive_stream->Start(); |
- EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); |
+ if (params_.audio.enabled) { |
+ // Start receiving audio. |
+ audio_receive_stream->Start(); |
+ EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); |
- // Start sending audio. |
- audio_send_stream_->Start(); |
- EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id)); |
- } |
+ // Start sending audio. |
+ audio_send_stream_->Start(); |
+ EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id)); |
+ } |
+ }); |
test::PressEnterToContinue(); |
- if (params_.audio.enabled) { |
- // 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->StopPlayout(voe.receive_channel_id)); |
- audio_receive_stream->Stop(); |
- sender_call_->DestroyAudioSendStream(audio_send_stream_); |
- receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); |
- } |
+ task_queue_.SendTask([&]() { |
+ if (params_.audio.enabled) { |
+ // 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->StopPlayout(voe.receive_channel_id)); |
+ audio_receive_stream->Stop(); |
+ sender_call_->DestroyAudioSendStream(audio_send_stream_); |
+ receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); |
+ } |
- // Stop receiving and sending video. |
- if (params_.video.enabled) { |
- video_capturer_->Stop(); |
- video_send_stream_->Stop(); |
- for (FlexfecReceiveStream* flexfec_receive_stream : |
- flexfec_receive_streams_) { |
- for (VideoReceiveStream* video_receive_stream : video_receive_streams_) { |
- video_receive_stream->RemoveSecondarySink(flexfec_receive_stream); |
+ // Stop receiving and sending video. |
+ if (params_.video.enabled) { |
+ video_capturer_->Stop(); |
+ video_send_stream_->Stop(); |
+ for (FlexfecReceiveStream* flexfec_receive_stream : |
+ flexfec_receive_streams_) { |
+ for (VideoReceiveStream* video_receive_stream : |
+ video_receive_streams_) { |
+ video_receive_stream->RemoveSecondarySink(flexfec_receive_stream); |
+ } |
+ receiver_call_->DestroyFlexfecReceiveStream(flexfec_receive_stream); |
} |
- receiver_call_->DestroyFlexfecReceiveStream(flexfec_receive_stream); |
- } |
- for (VideoReceiveStream* receive_stream : video_receive_streams_) { |
- receive_stream->Stop(); |
- receiver_call_->DestroyVideoReceiveStream(receive_stream); |
+ for (VideoReceiveStream* receive_stream : video_receive_streams_) { |
+ receive_stream->Stop(); |
+ receiver_call_->DestroyVideoReceiveStream(receive_stream); |
+ } |
+ sender_call_->DestroyVideoSendStream(video_send_stream_); |
} |
- sender_call_->DestroyVideoSendStream(video_send_stream_); |
- } |
- send_transport.StopSending(); |
- recv_transport.StopSending(); |
+ video_capturer_.reset(); |
+ send_transport.reset(); |
+ recv_transport.reset(); |
+ |
+ if (params_.audio.enabled) |
+ DestroyVoiceEngine(&voe); |
+ |
+ local_preview.reset(); |
+ loopback_renderers.clear(); |
- if (params_.audio.enabled) |
- DestroyVoiceEngine(&voe); |
+ DestroyCalls(); |
+ }); |
} |
void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) { |