Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(308)

Side by Side Diff: webrtc/video/video_quality_test.cc

Issue 2998923002: Use SingleThreadedTaskQueue in DirectTransport (Closed)
Patch Set: Appease win_msvc_rel. Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 #include "webrtc/video/video_quality_test.h" 10 #include "webrtc/video/video_quality_test.h"
(...skipping 19 matching lines...) Expand all
30 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 30 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
31 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h" 31 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
32 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 32 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
33 #include "webrtc/rtc_base/checks.h" 33 #include "webrtc/rtc_base/checks.h"
34 #include "webrtc/rtc_base/cpu_time.h" 34 #include "webrtc/rtc_base/cpu_time.h"
35 #include "webrtc/rtc_base/event.h" 35 #include "webrtc/rtc_base/event.h"
36 #include "webrtc/rtc_base/format_macros.h" 36 #include "webrtc/rtc_base/format_macros.h"
37 #include "webrtc/rtc_base/memory_usage.h" 37 #include "webrtc/rtc_base/memory_usage.h"
38 #include "webrtc/rtc_base/optional.h" 38 #include "webrtc/rtc_base/optional.h"
39 #include "webrtc/rtc_base/platform_file.h" 39 #include "webrtc/rtc_base/platform_file.h"
40 #include "webrtc/rtc_base/ptr_util.h"
40 #include "webrtc/rtc_base/timeutils.h" 41 #include "webrtc/rtc_base/timeutils.h"
41 #include "webrtc/system_wrappers/include/cpu_info.h" 42 #include "webrtc/system_wrappers/include/cpu_info.h"
42 #include "webrtc/system_wrappers/include/field_trial.h" 43 #include "webrtc/system_wrappers/include/field_trial.h"
43 #include "webrtc/test/gtest.h" 44 #include "webrtc/test/gtest.h"
44 #include "webrtc/test/layer_filtering_transport.h" 45 #include "webrtc/test/layer_filtering_transport.h"
45 #include "webrtc/test/run_loop.h" 46 #include "webrtc/test/run_loop.h"
46 #include "webrtc/test/statistics.h" 47 #include "webrtc/test/statistics.h"
47 #include "webrtc/test/testsupport/fileutils.h" 48 #include "webrtc/test/testsupport/fileutils.h"
48 #include "webrtc/test/testsupport/frame_writer.h" 49 #include "webrtc/test/testsupport/frame_writer.h"
49 #include "webrtc/test/vcm_capturer.h" 50 #include "webrtc/test/vcm_capturer.h"
(...skipping 1594 matching lines...) Expand 10 before | Expand all | Expand 10 after
1644 1645
1645 void VideoQualityTest::DestroyThumbnailStreams() { 1646 void VideoQualityTest::DestroyThumbnailStreams() {
1646 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) 1647 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_)
1647 receiver_call_->DestroyVideoSendStream(thumbnail_send_stream); 1648 receiver_call_->DestroyVideoSendStream(thumbnail_send_stream);
1648 thumbnail_send_streams_.clear(); 1649 thumbnail_send_streams_.clear();
1649 for (VideoReceiveStream* thumbnail_receive_stream : 1650 for (VideoReceiveStream* thumbnail_receive_stream :
1650 thumbnail_receive_streams_) 1651 thumbnail_receive_streams_)
1651 sender_call_->DestroyVideoReceiveStream(thumbnail_receive_stream); 1652 sender_call_->DestroyVideoReceiveStream(thumbnail_receive_stream);
1652 thumbnail_send_streams_.clear(); 1653 thumbnail_send_streams_.clear();
1653 thumbnail_receive_streams_.clear(); 1654 thumbnail_receive_streams_.clear();
1655 for (std::unique_ptr<test::VideoCapturer>& video_caputurer :
1656 thumbnail_capturers_) {
1657 video_caputurer.reset();
1658 }
1654 } 1659 }
1655 1660
1656 void VideoQualityTest::SetupScreenshareOrSVC() { 1661 void VideoQualityTest::SetupScreenshareOrSVC() {
1657 if (params_.screenshare.enabled) { 1662 if (params_.screenshare.enabled) {
1658 // Fill out codec settings. 1663 // Fill out codec settings.
1659 video_encoder_config_.content_type = 1664 video_encoder_config_.content_type =
1660 VideoEncoderConfig::ContentType::kScreen; 1665 VideoEncoderConfig::ContentType::kScreen;
1661 degradation_preference_ = 1666 degradation_preference_ =
1662 VideoSendStream::DegradationPreference::kMaintainResolution; 1667 VideoSendStream::DegradationPreference::kMaintainResolution;
1663 if (params_.video.codec == "VP8") { 1668 if (params_.video.codec == "VP8") {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 clock_)); 1767 clock_));
1763 ASSERT_TRUE(video_capturer_) << "Could not create capturer for " 1768 ASSERT_TRUE(video_capturer_) << "Could not create capturer for "
1764 << params_.video.clip_name 1769 << params_.video.clip_name
1765 << ".yuv. Is this resource file present?"; 1770 << ".yuv. Is this resource file present?";
1766 } 1771 }
1767 } 1772 }
1768 RTC_DCHECK(video_capturer_.get()); 1773 RTC_DCHECK(video_capturer_.get());
1769 } 1774 }
1770 1775
1771 void VideoQualityTest::RunWithAnalyzer(const Params& params) { 1776 void VideoQualityTest::RunWithAnalyzer(const Params& params) {
1777 std::unique_ptr<test::LayerFilteringTransport> send_transport;
1778 std::unique_ptr<test::DirectTransport> recv_transport;
1779 FILE* graph_data_output_file = nullptr;
1780 std::unique_ptr<VideoAnalyzer> analyzer;
1781
1772 params_ = params; 1782 params_ = params;
1773 1783
1774 RTC_CHECK(!params_.audio.enabled); 1784 RTC_CHECK(!params_.audio.enabled);
1775 // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to 1785 // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to
1776 // differentiate between the analyzer and the renderer case. 1786 // differentiate between the analyzer and the renderer case.
1777 CheckParams(); 1787 CheckParams();
1778 1788
1779 FILE* graph_data_output_file = nullptr;
1780 if (!params_.analyzer.graph_data_output_filename.empty()) { 1789 if (!params_.analyzer.graph_data_output_filename.empty()) {
1781 graph_data_output_file = 1790 graph_data_output_file =
1782 fopen(params_.analyzer.graph_data_output_filename.c_str(), "w"); 1791 fopen(params_.analyzer.graph_data_output_filename.c_str(), "w");
1783 RTC_CHECK(graph_data_output_file) 1792 RTC_CHECK(graph_data_output_file)
1784 << "Can't open the file " << params_.analyzer.graph_data_output_filename 1793 << "Can't open the file " << params_.analyzer.graph_data_output_filename
1785 << "!"; 1794 << "!";
1786 } 1795 }
1787 1796
1788 if (!params.logging.rtc_event_log_name.empty()) { 1797 if (!params.logging.rtc_event_log_name.empty()) {
1789 event_log_ = RtcEventLog::Create(clock_); 1798 event_log_ = RtcEventLog::Create(clock_);
1790 bool event_log_started = 1799 bool event_log_started =
1791 event_log_->StartLogging(params.logging.rtc_event_log_name, -1); 1800 event_log_->StartLogging(params.logging.rtc_event_log_name, -1);
1792 RTC_DCHECK(event_log_started); 1801 RTC_DCHECK(event_log_started);
1793 } 1802 }
1794 1803
1795 Call::Config call_config(event_log_.get()); 1804 Call::Config call_config(event_log_.get());
1796 call_config.bitrate_config = params.call.call_bitrate_config; 1805 call_config.bitrate_config = params.call.call_bitrate_config;
1797 CreateCalls(call_config, call_config);
1798 1806
1799 test::LayerFilteringTransport send_transport( 1807 task_queue_.SendTask([this, &call_config, &send_transport,
1800 params_.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9, 1808 &recv_transport]() {
1801 params_.video.selected_tl, params_.ss.selected_sl, payload_type_map_); 1809 CreateCalls(call_config, call_config);
1802 1810
1803 test::DirectTransport recv_transport(params_.pipe, receiver_call_.get(), 1811 send_transport = rtc::MakeUnique<test::LayerFilteringTransport>(
1804 payload_type_map_); 1812 &task_queue_, params_.pipe, sender_call_.get(), kPayloadTypeVP8,
1813 kPayloadTypeVP9, params_.video.selected_tl, params_.ss.selected_sl,
1814 payload_type_map_);
1815
1816 recv_transport = rtc::MakeUnique<test::DirectTransport>(
1817 &task_queue_, params_.pipe, receiver_call_.get(), payload_type_map_);
1818 });
1805 1819
1806 std::string graph_title = params_.analyzer.graph_title; 1820 std::string graph_title = params_.analyzer.graph_title;
1807 if (graph_title.empty()) 1821 if (graph_title.empty())
1808 graph_title = VideoQualityTest::GenerateGraphTitle(); 1822 graph_title = VideoQualityTest::GenerateGraphTitle();
1809
1810 bool is_quick_test_enabled = field_trial::IsEnabled("WebRTC-QuickPerfTest"); 1823 bool is_quick_test_enabled = field_trial::IsEnabled("WebRTC-QuickPerfTest");
1811 VideoAnalyzer analyzer( 1824 analyzer = rtc::MakeUnique<VideoAnalyzer>(
1812 &send_transport, params_.analyzer.test_label, 1825 send_transport.get(), params_.analyzer.test_label,
1813 params_.analyzer.avg_psnr_threshold, params_.analyzer.avg_ssim_threshold, 1826 params_.analyzer.avg_psnr_threshold, params_.analyzer.avg_ssim_threshold,
1814 is_quick_test_enabled 1827 is_quick_test_enabled
1815 ? kFramesSentInQuickTest 1828 ? kFramesSentInQuickTest
1816 : params_.analyzer.test_durations_secs * params_.video.fps, 1829 : params_.analyzer.test_durations_secs * params_.video.fps,
1817 graph_data_output_file, graph_title, 1830 graph_data_output_file, graph_title,
1818 kVideoSendSsrcs[params_.ss.selected_stream], 1831 kVideoSendSsrcs[params_.ss.selected_stream],
1819 kSendRtxSsrcs[params_.ss.selected_stream], 1832 kSendRtxSsrcs[params_.ss.selected_stream],
1820 static_cast<size_t>(params_.ss.selected_stream), params.ss.selected_sl, 1833 static_cast<size_t>(params_.ss.selected_stream), params.ss.selected_sl,
1821 params_.video.selected_tl, is_quick_test_enabled, clock_, 1834 params_.video.selected_tl, is_quick_test_enabled, clock_,
1822 params_.logging.rtp_dump_name); 1835 params_.logging.rtp_dump_name);
1823 analyzer.SetCall(sender_call_.get());
1824 analyzer.SetReceiver(receiver_call_->Receiver());
1825 send_transport.SetReceiver(&analyzer);
1826 recv_transport.SetReceiver(sender_call_->Receiver());
1827 1836
1828 SetupVideo(&analyzer, &recv_transport); 1837 task_queue_.SendTask([&]() {
1829 SetupThumbnails(&analyzer, &recv_transport); 1838 analyzer->SetCall(sender_call_.get());
1830 video_receive_configs_[params_.ss.selected_stream].renderer = &analyzer; 1839 analyzer->SetReceiver(receiver_call_->Receiver());
1831 video_send_config_.pre_encode_callback = analyzer.pre_encode_proxy(); 1840 send_transport->SetReceiver(analyzer.get());
1832 RTC_DCHECK(!video_send_config_.post_encode_callback); 1841 recv_transport->SetReceiver(sender_call_->Receiver());
1833 video_send_config_.post_encode_callback = analyzer.encode_timing_proxy();
1834 1842
1835 SetupScreenshareOrSVC(); 1843 SetupVideo(analyzer.get(), recv_transport.get());
1844 SetupThumbnails(analyzer.get(), recv_transport.get());
1845 video_receive_configs_[params_.ss.selected_stream].renderer =
1846 analyzer.get();
1847 video_send_config_.pre_encode_callback = analyzer->pre_encode_proxy();
1848 RTC_DCHECK(!video_send_config_.post_encode_callback);
1849 video_send_config_.post_encode_callback = analyzer->encode_timing_proxy();
1836 1850
1837 CreateFlexfecStreams(); 1851 SetupScreenshareOrSVC();
1838 CreateVideoStreams();
1839 analyzer.SetSendStream(video_send_stream_);
1840 if (video_receive_streams_.size() == 1)
1841 analyzer.SetReceiveStream(video_receive_streams_[0]);
1842 1852
1843 video_send_stream_->SetSource(analyzer.OutputInterface(), 1853 CreateFlexfecStreams();
1844 degradation_preference_); 1854 CreateVideoStreams();
1855 analyzer->SetSendStream(video_send_stream_);
1856 if (video_receive_streams_.size() == 1)
1857 analyzer->SetReceiveStream(video_receive_streams_[0]);
1845 1858
1846 SetupThumbnailCapturers(params_.call.num_thumbnails); 1859 video_send_stream_->SetSource(analyzer->OutputInterface(),
1847 for (size_t i = 0; i < thumbnail_send_streams_.size(); ++i) { 1860 degradation_preference_);
1848 thumbnail_send_streams_[i]->SetSource(thumbnail_capturers_[i].get(),
1849 degradation_preference_);
1850 }
1851 1861
1852 CreateCapturer(); 1862 SetupThumbnailCapturers(params_.call.num_thumbnails);
1863 for (size_t i = 0; i < thumbnail_send_streams_.size(); ++i) {
1864 thumbnail_send_streams_[i]->SetSource(thumbnail_capturers_[i].get(),
1865 degradation_preference_);
1866 }
1853 1867
1854 analyzer.SetSource(video_capturer_.get(), params_.ss.infer_streams); 1868 CreateCapturer();
1855 1869
1856 StartEncodedFrameLogs(video_send_stream_); 1870 analyzer->SetSource(video_capturer_.get(), params_.ss.infer_streams);
1857 StartEncodedFrameLogs(video_receive_streams_[params_.ss.selected_stream]);
1858 video_send_stream_->Start();
1859 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_)
1860 thumbnail_send_stream->Start();
1861 for (VideoReceiveStream* receive_stream : video_receive_streams_)
1862 receive_stream->Start();
1863 for (VideoReceiveStream* thumbnail_receive_stream :
1864 thumbnail_receive_streams_)
1865 thumbnail_receive_stream->Start();
1866 1871
1867 analyzer.StartMeasuringCpuProcessTime(); 1872 StartEncodedFrameLogs(video_send_stream_);
1873 StartEncodedFrameLogs(video_receive_streams_[params_.ss.selected_stream]);
1874 video_send_stream_->Start();
1875 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_)
1876 thumbnail_send_stream->Start();
1877 for (VideoReceiveStream* receive_stream : video_receive_streams_)
1878 receive_stream->Start();
1879 for (VideoReceiveStream* thumbnail_receive_stream :
1880 thumbnail_receive_streams_)
1881 thumbnail_receive_stream->Start();
1868 1882
1869 video_capturer_->Start(); 1883 analyzer->StartMeasuringCpuProcessTime();
1870 for (std::unique_ptr<test::VideoCapturer>& video_caputurer :
1871 thumbnail_capturers_) {
1872 video_caputurer->Start();
1873 }
1874 1884
1875 analyzer.Wait(); 1885 video_capturer_->Start();
1886 for (std::unique_ptr<test::VideoCapturer>& video_caputurer :
1887 thumbnail_capturers_) {
1888 video_caputurer->Start();
1889 }
1890 });
1876 1891
1877 send_transport.StopSending(); 1892 analyzer->Wait();
1878 recv_transport.StopSending();
1879 1893
1880 for (std::unique_ptr<test::VideoCapturer>& video_caputurer : 1894 task_queue_.SendTask([&]() {
1881 thumbnail_capturers_) 1895 for (std::unique_ptr<test::VideoCapturer>& video_caputurer :
1882 video_caputurer->Stop(); 1896 thumbnail_capturers_)
1883 video_capturer_->Stop(); 1897 video_caputurer->Stop();
1884 for (VideoReceiveStream* thumbnail_receive_stream : 1898 video_capturer_->Stop();
1885 thumbnail_receive_streams_) 1899 for (VideoReceiveStream* thumbnail_receive_stream :
1886 thumbnail_receive_stream->Stop(); 1900 thumbnail_receive_streams_)
1887 for (VideoReceiveStream* receive_stream : video_receive_streams_) 1901 thumbnail_receive_stream->Stop();
1888 receive_stream->Stop(); 1902 for (VideoReceiveStream* receive_stream : video_receive_streams_)
1889 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_) 1903 receive_stream->Stop();
1890 thumbnail_send_stream->Stop(); 1904 for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_)
1891 video_send_stream_->Stop(); 1905 thumbnail_send_stream->Stop();
1906 video_send_stream_->Stop();
1892 1907
1893 DestroyStreams(); 1908 DestroyStreams();
1894 DestroyThumbnailStreams(); 1909 DestroyThumbnailStreams();
1895 1910
1896 event_log_->StopLogging(); 1911 event_log_->StopLogging();
1897 if (graph_data_output_file) 1912 if (graph_data_output_file)
1898 fclose(graph_data_output_file); 1913 fclose(graph_data_output_file);
1914
1915 video_capturer_.reset();
1916 send_transport.reset();
1917 recv_transport.reset();
1918
1919 DestroyCalls();
1920 });
1899 } 1921 }
1900 1922
1901 void VideoQualityTest::SetupAudio(int send_channel_id, 1923 void VideoQualityTest::SetupAudio(int send_channel_id,
1902 int receive_channel_id, 1924 int receive_channel_id,
1903 Transport* transport, 1925 Transport* transport,
1904 AudioReceiveStream** audio_receive_stream) { 1926 AudioReceiveStream** audio_receive_stream) {
1905 audio_send_config_ = AudioSendStream::Config(transport); 1927 audio_send_config_ = AudioSendStream::Config(transport);
1906 audio_send_config_.voe_channel_id = send_channel_id; 1928 audio_send_config_.voe_channel_id = send_channel_id;
1907 audio_send_config_.rtp.ssrc = kAudioSendSsrc; 1929 audio_send_config_.rtp.ssrc = kAudioSendSsrc;
1908 1930
(...skipping 26 matching lines...) Expand all
1935 audio_config.decoder_factory = decoder_factory_; 1957 audio_config.decoder_factory = decoder_factory_;
1936 audio_config.decoder_map = {{kAudioSendPayloadType, {"OPUS", 48000, 2}}}; 1958 audio_config.decoder_map = {{kAudioSendPayloadType, {"OPUS", 48000, 2}}};
1937 if (params_.video.enabled && params_.audio.sync_video) 1959 if (params_.video.enabled && params_.audio.sync_video)
1938 audio_config.sync_group = kSyncGroup; 1960 audio_config.sync_group = kSyncGroup;
1939 1961
1940 *audio_receive_stream = 1962 *audio_receive_stream =
1941 receiver_call_->CreateAudioReceiveStream(audio_config); 1963 receiver_call_->CreateAudioReceiveStream(audio_config);
1942 } 1964 }
1943 1965
1944 void VideoQualityTest::RunWithRenderers(const Params& params) { 1966 void VideoQualityTest::RunWithRenderers(const Params& params) {
1945 params_ = params; 1967 std::unique_ptr<test::LayerFilteringTransport> send_transport;
1946 CheckParams(); 1968 std::unique_ptr<test::DirectTransport> recv_transport;
1969 ::VoiceEngineState voe;
1970 std::unique_ptr<test::VideoRenderer> local_preview;
1971 std::vector<std::unique_ptr<test::VideoRenderer>> loopback_renderers;
1972 AudioReceiveStream* audio_receive_stream = nullptr;
1947 1973
1948 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to 1974 task_queue_.SendTask([&]() {
1949 // match the full stack tests. 1975 params_ = params;
1950 Call::Config call_config(event_log_.get()); 1976 CheckParams();
1951 call_config.bitrate_config = params_.call.call_bitrate_config;
1952 1977
1953 ::VoiceEngineState voe; 1978 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to
1954 rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing( 1979 // match the full stack tests.
1955 webrtc::AudioProcessing::Create()); 1980 Call::Config call_config(event_log_.get());
1981 call_config.bitrate_config = params_.call.call_bitrate_config;
1956 1982
1957 if (params_.audio.enabled) { 1983 rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing(
1958 CreateVoiceEngine(&voe, audio_processing.get(), decoder_factory_); 1984 webrtc::AudioProcessing::Create());
1959 AudioState::Config audio_state_config;
1960 audio_state_config.voice_engine = voe.voice_engine;
1961 audio_state_config.audio_mixer = AudioMixerImpl::Create();
1962 audio_state_config.audio_processing = audio_processing;
1963 call_config.audio_state = AudioState::Create(audio_state_config);
1964 }
1965 1985
1966 CreateCalls(call_config, call_config); 1986 if (params_.audio.enabled) {
1967 1987 CreateVoiceEngine(&voe, audio_processing.get(), decoder_factory_);
1968 // TODO(minyue): consider if this is a good transport even for audio only 1988 AudioState::Config audio_state_config;
1969 // calls. 1989 audio_state_config.voice_engine = voe.voice_engine;
1970 test::LayerFilteringTransport send_transport( 1990 audio_state_config.audio_mixer = AudioMixerImpl::Create();
1971 params.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9, 1991 audio_state_config.audio_processing = audio_processing;
1972 params.video.selected_tl, params_.ss.selected_sl, payload_type_map_); 1992 call_config.audio_state = AudioState::Create(audio_state_config);
1973
1974 test::DirectTransport recv_transport(params_.pipe, receiver_call_.get(),
1975 payload_type_map_);
1976
1977 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at
1978 // least share as much code as possible. That way this test would also match
1979 // the full stack tests better.
1980 send_transport.SetReceiver(receiver_call_->Receiver());
1981 recv_transport.SetReceiver(sender_call_->Receiver());
1982
1983 std::unique_ptr<test::VideoRenderer> local_preview;
1984 std::vector<std::unique_ptr<test::VideoRenderer>> loopback_renderers_;
1985 if (params_.video.enabled) {
1986 // Create video renderers.
1987 local_preview.reset(test::VideoRenderer::Create(
1988 "Local Preview", params_.video.width, params_.video.height));
1989
1990 const size_t selected_stream_id = params_.ss.selected_stream;
1991 const size_t num_streams = params_.ss.streams.size();
1992
1993 if (selected_stream_id == num_streams) {
1994 for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) {
1995 std::ostringstream oss;
1996 oss << "Loopback Video - Stream #" << static_cast<int>(stream_id);
1997 loopback_renderers_.emplace_back(test::VideoRenderer::Create(
1998 oss.str().c_str(), params_.ss.streams[stream_id].width,
1999 params_.ss.streams[stream_id].height));
2000 }
2001 } else {
2002 loopback_renderers_.emplace_back(test::VideoRenderer::Create(
2003 "Loopback Video", params_.ss.streams[selected_stream_id].width,
2004 params_.ss.streams[selected_stream_id].height));
2005 } 1993 }
2006 1994
2007 SetupVideo(&send_transport, &recv_transport); 1995 CreateCalls(call_config, call_config);
2008 1996
2009 video_send_config_.pre_encode_callback = local_preview.get(); 1997 // TODO(minyue): consider if this is a good transport even for audio only
2010 if (selected_stream_id == num_streams) { 1998 // calls.
2011 for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) { 1999 send_transport = rtc::MakeUnique<test::LayerFilteringTransport>(
2012 video_receive_configs_[stream_id].renderer = 2000 &task_queue_, params.pipe, sender_call_.get(), kPayloadTypeVP8,
2013 loopback_renderers_[stream_id].get(); 2001 kPayloadTypeVP9, params.video.selected_tl, params_.ss.selected_sl,
2002 payload_type_map_);
2003
2004 recv_transport = rtc::MakeUnique<test::DirectTransport>(
2005 &task_queue_, params_.pipe, receiver_call_.get(), payload_type_map_);
2006
2007 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at
2008 // least share as much code as possible. That way this test would also match
2009 // the full stack tests better.
2010 send_transport->SetReceiver(receiver_call_->Receiver());
2011 recv_transport->SetReceiver(sender_call_->Receiver());
2012
2013 if (params_.video.enabled) {
2014 // Create video renderers.
2015 local_preview.reset(test::VideoRenderer::Create(
2016 "Local Preview", params_.video.width, params_.video.height));
2017
2018 const size_t selected_stream_id = params_.ss.selected_stream;
2019 const size_t num_streams = params_.ss.streams.size();
2020
2021 if (selected_stream_id == num_streams) {
2022 for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) {
2023 std::ostringstream oss;
2024 oss << "Loopback Video - Stream #" << static_cast<int>(stream_id);
2025 loopback_renderers.emplace_back(test::VideoRenderer::Create(
2026 oss.str().c_str(), params_.ss.streams[stream_id].width,
2027 params_.ss.streams[stream_id].height));
2028 }
2029 } else {
2030 loopback_renderers.emplace_back(test::VideoRenderer::Create(
2031 "Loopback Video", params_.ss.streams[selected_stream_id].width,
2032 params_.ss.streams[selected_stream_id].height));
2033 }
2034
2035 SetupVideo(send_transport.get(), recv_transport.get());
2036
2037 video_send_config_.pre_encode_callback = local_preview.get();
2038 if (selected_stream_id == num_streams) {
2039 for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) {
2040 video_receive_configs_[stream_id].renderer =
2041 loopback_renderers[stream_id].get();
2042 if (params_.audio.enabled && params_.audio.sync_video)
2043 video_receive_configs_[stream_id].sync_group = kSyncGroup;
2044 }
2045 } else {
2046 video_receive_configs_[selected_stream_id].renderer =
2047 loopback_renderers.back().get();
2014 if (params_.audio.enabled && params_.audio.sync_video) 2048 if (params_.audio.enabled && params_.audio.sync_video)
2015 video_receive_configs_[stream_id].sync_group = kSyncGroup; 2049 video_receive_configs_[selected_stream_id].sync_group = kSyncGroup;
2016 } 2050 }
2017 } else { 2051
2018 video_receive_configs_[selected_stream_id].renderer = 2052 if (params_.screenshare.enabled)
2019 loopback_renderers_.back().get(); 2053 SetupScreenshareOrSVC();
2020 if (params_.audio.enabled && params_.audio.sync_video) 2054
2021 video_receive_configs_[selected_stream_id].sync_group = kSyncGroup; 2055 CreateFlexfecStreams();
2056 CreateVideoStreams();
2057
2058 CreateCapturer();
2059 video_send_stream_->SetSource(video_capturer_.get(),
2060 degradation_preference_);
2022 } 2061 }
2023 2062
2024 if (params_.screenshare.enabled) 2063 if (params_.audio.enabled) {
2025 SetupScreenshareOrSVC(); 2064 SetupAudio(voe.send_channel_id, voe.receive_channel_id,
2065 send_transport.get(), &audio_receive_stream);
2066 }
2026 2067
2027 CreateFlexfecStreams(); 2068 for (VideoReceiveStream* receive_stream : video_receive_streams_)
2028 CreateVideoStreams(); 2069 StartEncodedFrameLogs(receive_stream);
2070 StartEncodedFrameLogs(video_send_stream_);
2029 2071
2030 CreateCapturer(); 2072 // Start sending and receiving video.
2031 video_send_stream_->SetSource(video_capturer_.get(), 2073 if (params_.video.enabled) {
2032 degradation_preference_); 2074 for (VideoReceiveStream* video_receive_stream : video_receive_streams_)
2033 } 2075 video_receive_stream->Start();
2034 2076
2035 AudioReceiveStream* audio_receive_stream = nullptr; 2077 video_send_stream_->Start();
2036 if (params_.audio.enabled) { 2078 video_capturer_->Start();
2037 SetupAudio(voe.send_channel_id, voe.receive_channel_id, &send_transport, 2079 }
2038 &audio_receive_stream);
2039 }
2040 2080
2041 for (VideoReceiveStream* receive_stream : video_receive_streams_) 2081 if (params_.audio.enabled) {
2042 StartEncodedFrameLogs(receive_stream); 2082 // Start receiving audio.
2043 StartEncodedFrameLogs(video_send_stream_); 2083 audio_receive_stream->Start();
2084 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id));
2044 2085
2045 // Start sending and receiving video. 2086 // Start sending audio.
2046 if (params_.video.enabled) { 2087 audio_send_stream_->Start();
2047 for (VideoReceiveStream* video_receive_stream : video_receive_streams_) 2088 EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id));
2048 video_receive_stream->Start(); 2089 }
2049 2090 });
2050 video_send_stream_->Start();
2051 video_capturer_->Start();
2052 }
2053
2054 if (params_.audio.enabled) {
2055 // Start receiving audio.
2056 audio_receive_stream->Start();
2057 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id));
2058
2059 // Start sending audio.
2060 audio_send_stream_->Start();
2061 EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id));
2062 }
2063 2091
2064 test::PressEnterToContinue(); 2092 test::PressEnterToContinue();
2065 2093
2066 if (params_.audio.enabled) { 2094 task_queue_.SendTask([&]() {
2067 // Stop sending audio. 2095 if (params_.audio.enabled) {
2068 EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id)); 2096 // Stop sending audio.
2069 audio_send_stream_->Stop(); 2097 EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id));
2098 audio_send_stream_->Stop();
2070 2099
2071 // Stop receiving audio. 2100 // Stop receiving audio.
2072 EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id)); 2101 EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id));
2073 audio_receive_stream->Stop(); 2102 audio_receive_stream->Stop();
2074 sender_call_->DestroyAudioSendStream(audio_send_stream_); 2103 sender_call_->DestroyAudioSendStream(audio_send_stream_);
2075 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); 2104 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream);
2076 } 2105 }
2077 2106
2078 // Stop receiving and sending video. 2107 // Stop receiving and sending video.
2079 if (params_.video.enabled) { 2108 if (params_.video.enabled) {
2080 video_capturer_->Stop(); 2109 video_capturer_->Stop();
2081 video_send_stream_->Stop(); 2110 video_send_stream_->Stop();
2082 for (FlexfecReceiveStream* flexfec_receive_stream : 2111 for (FlexfecReceiveStream* flexfec_receive_stream :
2083 flexfec_receive_streams_) { 2112 flexfec_receive_streams_) {
2084 for (VideoReceiveStream* video_receive_stream : video_receive_streams_) { 2113 for (VideoReceiveStream* video_receive_stream :
2085 video_receive_stream->RemoveSecondarySink(flexfec_receive_stream); 2114 video_receive_streams_) {
2115 video_receive_stream->RemoveSecondarySink(flexfec_receive_stream);
2116 }
2117 receiver_call_->DestroyFlexfecReceiveStream(flexfec_receive_stream);
2086 } 2118 }
2087 receiver_call_->DestroyFlexfecReceiveStream(flexfec_receive_stream); 2119 for (VideoReceiveStream* receive_stream : video_receive_streams_) {
2120 receive_stream->Stop();
2121 receiver_call_->DestroyVideoReceiveStream(receive_stream);
2122 }
2123 sender_call_->DestroyVideoSendStream(video_send_stream_);
2088 } 2124 }
2089 for (VideoReceiveStream* receive_stream : video_receive_streams_) {
2090 receive_stream->Stop();
2091 receiver_call_->DestroyVideoReceiveStream(receive_stream);
2092 }
2093 sender_call_->DestroyVideoSendStream(video_send_stream_);
2094 }
2095 2125
2096 send_transport.StopSending(); 2126 video_capturer_.reset();
2097 recv_transport.StopSending(); 2127 send_transport.reset();
2128 recv_transport.reset();
2098 2129
2099 if (params_.audio.enabled) 2130 if (params_.audio.enabled)
2100 DestroyVoiceEngine(&voe); 2131 DestroyVoiceEngine(&voe);
2132
2133 local_preview.reset();
2134 loopback_renderers.clear();
2135
2136 DestroyCalls();
2137 });
2101 } 2138 }
2102 2139
2103 void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) { 2140 void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) {
2104 if (!params_.logging.encoded_frame_base_path.empty()) { 2141 if (!params_.logging.encoded_frame_base_path.empty()) {
2105 std::ostringstream str; 2142 std::ostringstream str;
2106 str << send_logs_++; 2143 str << send_logs_++;
2107 std::string prefix = 2144 std::string prefix =
2108 params_.logging.encoded_frame_base_path + "." + str.str() + ".send."; 2145 params_.logging.encoded_frame_base_path + "." + str.str() + ".send.";
2109 stream->EnableEncodedFrameRecording( 2146 stream->EnableEncodedFrameRecording(
2110 std::vector<rtc::PlatformFile>( 2147 std::vector<rtc::PlatformFile>(
2111 {rtc::CreatePlatformFile(prefix + "1.ivf"), 2148 {rtc::CreatePlatformFile(prefix + "1.ivf"),
2112 rtc::CreatePlatformFile(prefix + "2.ivf"), 2149 rtc::CreatePlatformFile(prefix + "2.ivf"),
2113 rtc::CreatePlatformFile(prefix + "3.ivf")}), 2150 rtc::CreatePlatformFile(prefix + "3.ivf")}),
2114 100000000); 2151 100000000);
2115 } 2152 }
2116 } 2153 }
2117 2154
2118 void VideoQualityTest::StartEncodedFrameLogs(VideoReceiveStream* stream) { 2155 void VideoQualityTest::StartEncodedFrameLogs(VideoReceiveStream* stream) {
2119 if (!params_.logging.encoded_frame_base_path.empty()) { 2156 if (!params_.logging.encoded_frame_base_path.empty()) {
2120 std::ostringstream str; 2157 std::ostringstream str;
2121 str << receive_logs_++; 2158 str << receive_logs_++;
2122 std::string path = 2159 std::string path =
2123 params_.logging.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; 2160 params_.logging.encoded_frame_base_path + "." + str.str() + ".recv.ivf";
2124 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), 2161 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path),
2125 100000000); 2162 100000000);
2126 } 2163 }
2127 } 2164 }
2128 } // namespace webrtc 2165 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698