OLD | NEW |
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 <stdio.h> | 10 #include <stdio.h> |
(...skipping 16 matching lines...) Expand all Loading... |
27 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 27 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
28 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 28 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
29 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
30 #include "webrtc/system_wrappers/include/cpu_info.h" | 30 #include "webrtc/system_wrappers/include/cpu_info.h" |
31 #include "webrtc/test/layer_filtering_transport.h" | 31 #include "webrtc/test/layer_filtering_transport.h" |
32 #include "webrtc/test/run_loop.h" | 32 #include "webrtc/test/run_loop.h" |
33 #include "webrtc/test/statistics.h" | 33 #include "webrtc/test/statistics.h" |
34 #include "webrtc/test/testsupport/fileutils.h" | 34 #include "webrtc/test/testsupport/fileutils.h" |
35 #include "webrtc/test/video_renderer.h" | 35 #include "webrtc/test/video_renderer.h" |
36 #include "webrtc/video/video_quality_test.h" | 36 #include "webrtc/video/video_quality_test.h" |
| 37 #include "webrtc/voice_engine/include/voe_base.h" |
| 38 #include "webrtc/voice_engine/include/voe_codec.h" |
| 39 |
| 40 namespace { |
| 41 |
| 42 constexpr int kSendStatsPollingIntervalMs = 1000; |
| 43 constexpr int kPayloadTypeH264 = 122; |
| 44 constexpr int kPayloadTypeVP8 = 123; |
| 45 constexpr int kPayloadTypeVP9 = 124; |
| 46 constexpr size_t kMaxComparisons = 10; |
| 47 constexpr char kSyncGroup[] = "av_sync"; |
| 48 constexpr int kOpusMinBitrate = 6000; |
| 49 constexpr int kOpusBitrateFb = 32000; |
| 50 |
| 51 struct VoiceEngineState { |
| 52 VoiceEngineState() |
| 53 : voice_engine(nullptr), |
| 54 base(nullptr), |
| 55 codec(nullptr), |
| 56 send_channel_id(-1), |
| 57 receive_channel_id(-1) {} |
| 58 |
| 59 webrtc::VoiceEngine* voice_engine; |
| 60 webrtc::VoEBase* base; |
| 61 webrtc::VoECodec* codec; |
| 62 int send_channel_id; |
| 63 int receive_channel_id; |
| 64 }; |
| 65 |
| 66 void CreateVoiceEngine(VoiceEngineState* voe, |
| 67 rtc::scoped_refptr<webrtc::AudioDecoderFactory> |
| 68 decoder_factory) { |
| 69 voe->voice_engine = webrtc::VoiceEngine::Create(); |
| 70 voe->base = webrtc::VoEBase::GetInterface(voe->voice_engine); |
| 71 voe->codec = webrtc::VoECodec::GetInterface(voe->voice_engine); |
| 72 EXPECT_EQ(0, voe->base->Init(nullptr, nullptr, decoder_factory)); |
| 73 webrtc::Config voe_config; |
| 74 voe_config.Set<webrtc::VoicePacing>(new webrtc::VoicePacing(true)); |
| 75 voe->send_channel_id = voe->base->CreateChannel(voe_config); |
| 76 EXPECT_GE(voe->send_channel_id, 0); |
| 77 voe->receive_channel_id = voe->base->CreateChannel(); |
| 78 EXPECT_GE(voe->receive_channel_id, 0); |
| 79 } |
| 80 |
| 81 void DestroyVoiceEngine(VoiceEngineState* voe) { |
| 82 voe->base->DeleteChannel(voe->send_channel_id); |
| 83 voe->send_channel_id = -1; |
| 84 voe->base->DeleteChannel(voe->receive_channel_id); |
| 85 voe->receive_channel_id = -1; |
| 86 voe->base->Release(); |
| 87 voe->base = nullptr; |
| 88 voe->codec->Release(); |
| 89 voe->codec = nullptr; |
| 90 |
| 91 webrtc::VoiceEngine::Delete(voe->voice_engine); |
| 92 voe->voice_engine = nullptr; |
| 93 } |
| 94 |
| 95 } // namespace |
37 | 96 |
38 namespace webrtc { | 97 namespace webrtc { |
39 | 98 |
40 static const int kSendStatsPollingIntervalMs = 1000; | |
41 static const int kPayloadTypeH264 = 122; | |
42 static const int kPayloadTypeVP8 = 123; | |
43 static const int kPayloadTypeVP9 = 124; | |
44 static const size_t kMaxComparisons = 10; | |
45 | |
46 class VideoAnalyzer : public PacketReceiver, | 99 class VideoAnalyzer : public PacketReceiver, |
47 public Transport, | 100 public Transport, |
48 public rtc::VideoSinkInterface<VideoFrame>, | 101 public rtc::VideoSinkInterface<VideoFrame>, |
49 public VideoCaptureInput, | 102 public VideoCaptureInput, |
50 public EncodedFrameObserver { | 103 public EncodedFrameObserver { |
51 public: | 104 public: |
52 VideoAnalyzer(test::LayerFilteringTransport* transport, | 105 VideoAnalyzer(test::LayerFilteringTransport* transport, |
53 const std::string& test_label, | 106 const std::string& test_label, |
54 double avg_psnr_threshold, | 107 double avg_psnr_threshold, |
55 double avg_ssim_threshold, | 108 double avg_ssim_threshold, |
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
995 ASSERT_TRUE(capturer_) << "Could not create capturer for " | 1048 ASSERT_TRUE(capturer_) << "Could not create capturer for " |
996 << params_.video.clip_name | 1049 << params_.video.clip_name |
997 << ".yuv. Is this resource file present?"; | 1050 << ".yuv. Is this resource file present?"; |
998 } | 1051 } |
999 } | 1052 } |
1000 } | 1053 } |
1001 | 1054 |
1002 void VideoQualityTest::RunWithAnalyzer(const Params& params) { | 1055 void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
1003 params_ = params; | 1056 params_ = params; |
1004 | 1057 |
| 1058 RTC_CHECK(!params_.audio); |
1005 // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to | 1059 // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to |
1006 // differentiate between the analyzer and the renderer case. | 1060 // differentiate between the analyzer and the renderer case. |
1007 CheckParams(); | 1061 CheckParams(); |
1008 | 1062 |
1009 FILE* graph_data_output_file = nullptr; | 1063 FILE* graph_data_output_file = nullptr; |
1010 if (!params_.analyzer.graph_data_output_filename.empty()) { | 1064 if (!params_.analyzer.graph_data_output_filename.empty()) { |
1011 graph_data_output_file = | 1065 graph_data_output_file = |
1012 fopen(params_.analyzer.graph_data_output_filename.c_str(), "w"); | 1066 fopen(params_.analyzer.graph_data_output_filename.c_str(), "w"); |
1013 RTC_CHECK(graph_data_output_file) | 1067 RTC_CHECK(graph_data_output_file) |
1014 << "Can't open the file " << params_.analyzer.graph_data_output_filename | 1068 << "Can't open the file " << params_.analyzer.graph_data_output_filename |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 for (VideoReceiveStream* receive_stream : video_receive_streams_) | 1146 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
1093 receive_stream->Stop(); | 1147 receive_stream->Stop(); |
1094 video_send_stream_->Stop(); | 1148 video_send_stream_->Stop(); |
1095 | 1149 |
1096 DestroyStreams(); | 1150 DestroyStreams(); |
1097 | 1151 |
1098 if (graph_data_output_file) | 1152 if (graph_data_output_file) |
1099 fclose(graph_data_output_file); | 1153 fclose(graph_data_output_file); |
1100 } | 1154 } |
1101 | 1155 |
1102 void VideoQualityTest::RunWithVideoRenderer(const Params& params) { | 1156 void VideoQualityTest::RunWithRenderers(const Params& params) { |
1103 params_ = params; | 1157 params_ = params; |
1104 CheckParams(); | 1158 CheckParams(); |
1105 | 1159 |
1106 std::unique_ptr<test::VideoRenderer> local_preview( | 1160 std::unique_ptr<test::VideoRenderer> local_preview( |
1107 test::VideoRenderer::Create("Local Preview", params_.common.width, | 1161 test::VideoRenderer::Create("Local Preview", params_.common.width, |
1108 params_.common.height)); | 1162 params_.common.height)); |
1109 size_t stream_id = params_.ss.selected_stream; | 1163 size_t stream_id = params_.ss.selected_stream; |
1110 std::string title = "Loopback Video"; | 1164 std::string title = "Loopback Video"; |
1111 if (params_.ss.streams.size() > 1) { | 1165 if (params_.ss.streams.size() > 1) { |
1112 std::ostringstream s; | 1166 std::ostringstream s; |
1113 s << stream_id; | 1167 s << stream_id; |
1114 title += " - Stream #" + s.str(); | 1168 title += " - Stream #" + s.str(); |
1115 } | 1169 } |
1116 | 1170 |
1117 std::unique_ptr<test::VideoRenderer> loopback_video( | 1171 std::unique_ptr<test::VideoRenderer> loopback_video( |
1118 test::VideoRenderer::Create(title.c_str(), | 1172 test::VideoRenderer::Create(title.c_str(), |
1119 params_.ss.streams[stream_id].width, | 1173 params_.ss.streams[stream_id].width, |
1120 params_.ss.streams[stream_id].height)); | 1174 params_.ss.streams[stream_id].height)); |
1121 | 1175 |
1122 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to | 1176 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to |
1123 // match the full stack tests. | 1177 // match the full stack tests. |
1124 Call::Config call_config; | 1178 Call::Config call_config; |
1125 call_config.bitrate_config = params_.common.call_bitrate_config; | 1179 call_config.bitrate_config = params_.common.call_bitrate_config; |
| 1180 |
| 1181 ::VoiceEngineState voe; |
| 1182 if (params_.audio) { |
| 1183 CreateVoiceEngine(&voe, decoder_factory_); |
| 1184 AudioState::Config audio_state_config; |
| 1185 audio_state_config.voice_engine = voe.voice_engine; |
| 1186 call_config.audio_state = AudioState::Create(audio_state_config); |
| 1187 } |
| 1188 |
1126 std::unique_ptr<Call> call(Call::Create(call_config)); | 1189 std::unique_ptr<Call> call(Call::Create(call_config)); |
1127 | 1190 |
1128 test::LayerFilteringTransport transport( | 1191 test::LayerFilteringTransport transport( |
1129 params.pipe, call.get(), kPayloadTypeVP8, kPayloadTypeVP9, | 1192 params.pipe, call.get(), kPayloadTypeVP8, kPayloadTypeVP9, |
1130 params.common.selected_tl, params_.ss.selected_sl); | 1193 params.common.selected_tl, params_.ss.selected_sl); |
1131 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at | 1194 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at |
1132 // least share as much code as possible. That way this test would also match | 1195 // least share as much code as possible. That way this test would also match |
1133 // the full stack tests better. | 1196 // the full stack tests better. |
1134 transport.SetReceiver(call->Receiver()); | 1197 transport.SetReceiver(call->Receiver()); |
1135 | 1198 |
1136 SetupCommon(&transport, &transport); | 1199 SetupCommon(&transport, &transport); |
1137 | 1200 |
1138 video_send_config_.local_renderer = local_preview.get(); | 1201 video_send_config_.local_renderer = local_preview.get(); |
1139 video_receive_configs_[stream_id].renderer = loopback_video.get(); | 1202 video_receive_configs_[stream_id].renderer = loopback_video.get(); |
| 1203 if (params_.audio && params_.audio_video_sync) |
| 1204 video_receive_configs_[stream_id].sync_group = kSyncGroup; |
1140 | 1205 |
1141 video_send_config_.suspend_below_min_bitrate = | 1206 video_send_config_.suspend_below_min_bitrate = |
1142 params_.common.suspend_below_min_bitrate; | 1207 params_.common.suspend_below_min_bitrate; |
1143 | 1208 |
1144 if (params.common.fec) { | 1209 if (params.common.fec) { |
1145 video_send_config_.rtp.fec.red_payload_type = kRedPayloadType; | 1210 video_send_config_.rtp.fec.red_payload_type = kRedPayloadType; |
1146 video_send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 1211 video_send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; |
1147 video_receive_configs_[stream_id].rtp.fec.red_payload_type = | 1212 video_receive_configs_[stream_id].rtp.fec.red_payload_type = |
1148 kRedPayloadType; | 1213 kRedPayloadType; |
1149 video_receive_configs_[stream_id].rtp.fec.ulpfec_payload_type = | 1214 video_receive_configs_[stream_id].rtp.fec.ulpfec_payload_type = |
1150 kUlpfecPayloadType; | 1215 kUlpfecPayloadType; |
1151 } | 1216 } |
1152 | 1217 |
1153 if (params_.screenshare.enabled) | 1218 if (params_.screenshare.enabled) |
1154 SetupScreenshare(); | 1219 SetupScreenshare(); |
1155 | 1220 |
1156 video_send_stream_ = | 1221 video_send_stream_ = |
1157 call->CreateVideoSendStream(video_send_config_, video_encoder_config_); | 1222 call->CreateVideoSendStream(video_send_config_, video_encoder_config_); |
1158 VideoReceiveStream* receive_stream = | 1223 VideoReceiveStream* video_receive_stream = |
1159 call->CreateVideoReceiveStream(video_receive_configs_[stream_id].Copy()); | 1224 call->CreateVideoReceiveStream(video_receive_configs_[stream_id].Copy()); |
1160 CreateCapturer(video_send_stream_->Input()); | 1225 CreateCapturer(video_send_stream_->Input()); |
1161 | 1226 |
1162 receive_stream->Start(); | 1227 AudioReceiveStream* audio_receive_stream = nullptr; |
| 1228 if (params_.audio) { |
| 1229 audio_send_config_ = AudioSendStream::Config(&transport); |
| 1230 audio_send_config_.voe_channel_id = voe.send_channel_id; |
| 1231 audio_send_config_.rtp.ssrc = kAudioSendSsrc; |
| 1232 |
| 1233 // Add extension to enable audio send side BWE, and allow audio bit rate |
| 1234 // adaptation. |
| 1235 audio_send_config_.rtp.extensions.clear(); |
| 1236 if (params_.common.send_side_bwe) { |
| 1237 audio_send_config_.rtp.extensions.push_back(webrtc::RtpExtension( |
| 1238 webrtc::RtpExtension::kTransportSequenceNumberUri, |
| 1239 test::kTransportSequenceNumberExtensionId)); |
| 1240 audio_send_config_.min_bitrate_kbps = kOpusMinBitrate / 1000; |
| 1241 audio_send_config_.max_bitrate_kbps = kOpusBitrateFb / 1000; |
| 1242 } |
| 1243 |
| 1244 audio_send_stream_ = call->CreateAudioSendStream(audio_send_config_); |
| 1245 |
| 1246 AudioReceiveStream::Config audio_config; |
| 1247 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; |
| 1248 audio_config.rtcp_send_transport = &transport; |
| 1249 audio_config.voe_channel_id = voe.receive_channel_id; |
| 1250 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; |
| 1251 audio_config.rtp.transport_cc = params_.common.send_side_bwe; |
| 1252 audio_config.rtp.extensions = audio_send_config_.rtp.extensions; |
| 1253 audio_config.decoder_factory = decoder_factory_; |
| 1254 if (params_.audio_video_sync) |
| 1255 audio_config.sync_group = kSyncGroup; |
| 1256 |
| 1257 audio_receive_stream =call->CreateAudioReceiveStream(audio_config); |
| 1258 |
| 1259 const CodecInst kOpusInst = {120, "OPUS", 48000, 960, 2, 64000}; |
| 1260 EXPECT_EQ(0, voe.codec->SetSendCodec(voe.send_channel_id, kOpusInst)); |
| 1261 } |
| 1262 |
| 1263 // Start sending and receiving video. |
| 1264 video_receive_stream->Start(); |
1163 video_send_stream_->Start(); | 1265 video_send_stream_->Start(); |
1164 capturer_->Start(); | 1266 capturer_->Start(); |
1165 | 1267 |
| 1268 if (params_.audio) { |
| 1269 // Start receiving audio. |
| 1270 audio_receive_stream->Start(); |
| 1271 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); |
| 1272 EXPECT_EQ(0, voe.base->StartReceive(voe.receive_channel_id)); |
| 1273 |
| 1274 // Start sending audio. |
| 1275 audio_send_stream_->Start(); |
| 1276 EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id)); |
| 1277 } |
| 1278 |
1166 test::PressEnterToContinue(); | 1279 test::PressEnterToContinue(); |
1167 | 1280 |
| 1281 if (params_.audio) { |
| 1282 // Stop sending audio. |
| 1283 EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id)); |
| 1284 audio_send_stream_->Stop(); |
| 1285 |
| 1286 // Stop receiving audio. |
| 1287 EXPECT_EQ(0, voe.base->StopReceive(voe.receive_channel_id)); |
| 1288 EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id)); |
| 1289 audio_receive_stream->Stop(); |
| 1290 } |
| 1291 |
| 1292 // Stop receiving and sending video. |
1168 capturer_->Stop(); | 1293 capturer_->Stop(); |
1169 video_send_stream_->Stop(); | 1294 video_send_stream_->Stop(); |
1170 receive_stream->Stop(); | 1295 video_receive_stream->Stop(); |
1171 | 1296 |
1172 call->DestroyVideoReceiveStream(receive_stream); | 1297 call->DestroyVideoReceiveStream(video_receive_stream); |
1173 call->DestroyVideoSendStream(video_send_stream_); | 1298 call->DestroyVideoSendStream(video_send_stream_); |
1174 | 1299 |
| 1300 if (params_.audio) { |
| 1301 call->DestroyAudioSendStream(audio_send_stream_); |
| 1302 call->DestroyAudioReceiveStream(audio_receive_stream); |
| 1303 } |
| 1304 |
1175 transport.StopSending(); | 1305 transport.StopSending(); |
| 1306 if (params_.audio) |
| 1307 DestroyVoiceEngine(&voe); |
1176 } | 1308 } |
1177 | 1309 |
1178 } // namespace webrtc | 1310 } // namespace webrtc |
OLD | NEW |