Chromium Code Reviews| 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 897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 908 RTC_CHECK_GT(v[2], 0); | 908 RTC_CHECK_GT(v[2], 0); |
| 909 | 909 |
| 910 SpatialLayer layer; | 910 SpatialLayer layer; |
| 911 layer.scaling_factor_num = v[0] == -1 ? 1 : v[0]; | 911 layer.scaling_factor_num = v[0] == -1 ? 1 : v[0]; |
| 912 layer.scaling_factor_den = v[1] == -1 ? 1 : v[1]; | 912 layer.scaling_factor_den = v[1] == -1 ? 1 : v[1]; |
| 913 layer.target_bitrate_bps = v[2]; | 913 layer.target_bitrate_bps = v[2]; |
| 914 params->ss.spatial_layers.push_back(layer); | 914 params->ss.spatial_layers.push_back(layer); |
| 915 } | 915 } |
| 916 } | 916 } |
| 917 | 917 |
| 918 void VideoQualityTest::SetupCommon(Transport* send_transport, | 918 void VideoQualityTest::SetupVideo(Transport* send_transport, |
| 919 Transport* recv_transport) { | 919 Transport* recv_transport) { |
| 920 if (params_.logs) | 920 if (params_.logs) |
| 921 trace_to_stderr_.reset(new test::TraceToStderr); | 921 trace_to_stderr_.reset(new test::TraceToStderr); |
| 922 | 922 |
| 923 size_t num_streams = params_.ss.streams.size(); | 923 size_t num_streams = params_.ss.streams.size(); |
| 924 CreateSendConfig(num_streams, 0, send_transport); | 924 CreateSendConfig(num_streams, 0, send_transport); |
| 925 | 925 |
| 926 int payload_type; | 926 int payload_type; |
| 927 if (params_.video.codec == "H264") { | 927 if (params_.video.codec == "H264") { |
| 928 encoder_.reset(VideoEncoder::Create(VideoEncoder::kH264)); | 928 video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kH264)); |
| 929 payload_type = kPayloadTypeH264; | 929 payload_type = kPayloadTypeH264; |
| 930 } else if (params_.video.codec == "VP8") { | 930 } else if (params_.video.codec == "VP8") { |
| 931 encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp8)); | 931 video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp8)); |
| 932 payload_type = kPayloadTypeVP8; | 932 payload_type = kPayloadTypeVP8; |
| 933 } else if (params_.video.codec == "VP9") { | 933 } else if (params_.video.codec == "VP9") { |
| 934 encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp9)); | 934 video_encoder_.reset(VideoEncoder::Create(VideoEncoder::kVp9)); |
| 935 payload_type = kPayloadTypeVP9; | 935 payload_type = kPayloadTypeVP9; |
| 936 } else { | 936 } else { |
| 937 RTC_NOTREACHED() << "Codec not supported!"; | 937 RTC_NOTREACHED() << "Codec not supported!"; |
| 938 return; | 938 return; |
| 939 } | 939 } |
| 940 video_send_config_.encoder_settings.encoder = encoder_.get(); | 940 video_send_config_.encoder_settings.encoder = video_encoder_.get(); |
| 941 video_send_config_.encoder_settings.payload_name = params_.video.codec; | 941 video_send_config_.encoder_settings.payload_name = params_.video.codec; |
| 942 video_send_config_.encoder_settings.payload_type = payload_type; | 942 video_send_config_.encoder_settings.payload_type = payload_type; |
| 943 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 943 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 944 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; | 944 video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType; |
| 945 for (size_t i = 0; i < num_streams; ++i) | 945 for (size_t i = 0; i < num_streams; ++i) |
| 946 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); | 946 video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]); |
| 947 | 947 |
| 948 video_send_config_.rtp.extensions.clear(); | 948 video_send_config_.rtp.extensions.clear(); |
| 949 if (params_.common.send_side_bwe) { | 949 if (params_.common.send_side_bwe) { |
| 950 video_send_config_.rtp.extensions.push_back( | 950 video_send_config_.rtp.extensions.push_back( |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 970 video_receive_configs_[i].rtp.transport_cc = params_.common.send_side_bwe; | 970 video_receive_configs_[i].rtp.transport_cc = params_.common.send_side_bwe; |
| 971 } | 971 } |
| 972 } | 972 } |
| 973 | 973 |
| 974 void VideoQualityTest::SetupScreenshare() { | 974 void VideoQualityTest::SetupScreenshare() { |
| 975 RTC_CHECK(params_.screenshare.enabled); | 975 RTC_CHECK(params_.screenshare.enabled); |
| 976 | 976 |
| 977 // Fill out codec settings. | 977 // Fill out codec settings. |
| 978 video_encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; | 978 video_encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; |
| 979 if (params_.video.codec == "VP8") { | 979 if (params_.video.codec == "VP8") { |
| 980 codec_settings_.VP8 = VideoEncoder::GetDefaultVp8Settings(); | 980 video_codec_settings_.VP8 = VideoEncoder::GetDefaultVp8Settings(); |
| 981 codec_settings_.VP8.denoisingOn = false; | 981 video_codec_settings_.VP8.denoisingOn = false; |
| 982 codec_settings_.VP8.frameDroppingOn = false; | 982 video_codec_settings_.VP8.frameDroppingOn = false; |
| 983 codec_settings_.VP8.numberOfTemporalLayers = | 983 video_codec_settings_.VP8.numberOfTemporalLayers = |
| 984 static_cast<unsigned char>(params_.video.num_temporal_layers); | 984 static_cast<unsigned char>(params_.video.num_temporal_layers); |
| 985 video_encoder_config_.encoder_specific_settings = &codec_settings_.VP8; | 985 video_encoder_config_.encoder_specific_settings = |
| 986 &video_codec_settings_.VP8; | |
| 986 } else if (params_.video.codec == "VP9") { | 987 } else if (params_.video.codec == "VP9") { |
| 987 codec_settings_.VP9 = VideoEncoder::GetDefaultVp9Settings(); | 988 video_codec_settings_.VP9 = VideoEncoder::GetDefaultVp9Settings(); |
| 988 codec_settings_.VP9.denoisingOn = false; | 989 video_codec_settings_.VP9.denoisingOn = false; |
| 989 codec_settings_.VP9.frameDroppingOn = false; | 990 video_codec_settings_.VP9.frameDroppingOn = false; |
| 990 codec_settings_.VP9.numberOfTemporalLayers = | 991 video_codec_settings_.VP9.numberOfTemporalLayers = |
| 991 static_cast<unsigned char>(params_.video.num_temporal_layers); | 992 static_cast<unsigned char>(params_.video.num_temporal_layers); |
| 992 video_encoder_config_.encoder_specific_settings = &codec_settings_.VP9; | 993 video_encoder_config_.encoder_specific_settings = |
| 993 codec_settings_.VP9.numberOfSpatialLayers = | 994 &video_codec_settings_.VP9; |
| 995 video_codec_settings_.VP9.numberOfSpatialLayers = | |
| 994 static_cast<unsigned char>(params_.ss.num_spatial_layers); | 996 static_cast<unsigned char>(params_.ss.num_spatial_layers); |
| 995 } | 997 } |
| 996 | 998 |
| 997 // Setup frame generator. | 999 // Setup frame generator. |
| 998 const size_t kWidth = 1850; | 1000 const size_t kWidth = 1850; |
| 999 const size_t kHeight = 1110; | 1001 const size_t kHeight = 1110; |
| 1000 std::vector<std::string> slides; | 1002 std::vector<std::string> slides; |
| 1001 slides.push_back(test::ResourcePath("web_screenshot_1850_1110", "yuv")); | 1003 slides.push_back(test::ResourcePath("web_screenshot_1850_1110", "yuv")); |
| 1002 slides.push_back(test::ResourcePath("presentation_1850_1110", "yuv")); | 1004 slides.push_back(test::ResourcePath("presentation_1850_1110", "yuv")); |
| 1003 slides.push_back(test::ResourcePath("photo_1850_1110", "yuv")); | 1005 slides.push_back(test::ResourcePath("photo_1850_1110", "yuv")); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1025 kPauseDurationMs)); | 1027 kPauseDurationMs)); |
| 1026 } | 1028 } |
| 1027 } | 1029 } |
| 1028 | 1030 |
| 1029 void VideoQualityTest::CreateCapturer(VideoCaptureInput* input) { | 1031 void VideoQualityTest::CreateCapturer(VideoCaptureInput* input) { |
| 1030 if (params_.screenshare.enabled) { | 1032 if (params_.screenshare.enabled) { |
| 1031 test::FrameGeneratorCapturer* frame_generator_capturer = | 1033 test::FrameGeneratorCapturer* frame_generator_capturer = |
| 1032 new test::FrameGeneratorCapturer( | 1034 new test::FrameGeneratorCapturer( |
| 1033 clock_, input, frame_generator_.release(), params_.video.fps); | 1035 clock_, input, frame_generator_.release(), params_.video.fps); |
| 1034 EXPECT_TRUE(frame_generator_capturer->Init()); | 1036 EXPECT_TRUE(frame_generator_capturer->Init()); |
| 1035 capturer_.reset(frame_generator_capturer); | 1037 video_capturer_.reset(frame_generator_capturer); |
| 1036 } else { | 1038 } else { |
| 1037 if (params_.video.clip_name.empty()) { | 1039 if (params_.video.clip_name.empty()) { |
| 1038 capturer_.reset(test::VideoCapturer::Create(input, params_.video.width, | 1040 video_capturer_.reset(test::VideoCapturer::Create( |
| 1039 params_.video.height, | 1041 input, params_.video.width, params_.video.height, params_.video.fps, |
| 1040 params_.video.fps, clock_)); | 1042 clock_)); |
| 1041 } else { | 1043 } else { |
| 1042 capturer_.reset(test::FrameGeneratorCapturer::CreateFromYuvFile( | 1044 video_capturer_.reset(test::FrameGeneratorCapturer::CreateFromYuvFile( |
| 1043 input, test::ResourcePath(params_.video.clip_name, "yuv"), | 1045 input, test::ResourcePath(params_.video.clip_name, "yuv"), |
| 1044 params_.video.width, params_.video.height, params_.video.fps, | 1046 params_.video.width, params_.video.height, params_.video.fps, |
| 1045 clock_)); | 1047 clock_)); |
| 1046 ASSERT_TRUE(capturer_) << "Could not create capturer for " | 1048 ASSERT_TRUE(video_capturer_) << "Could not create capturer for " |
| 1047 << params_.video.clip_name | 1049 << params_.video.clip_name |
| 1048 << ".yuv. Is this resource file present?"; | 1050 << ".yuv. Is this resource file present?"; |
| 1049 } | 1051 } |
| 1050 } | 1052 } |
| 1051 } | 1053 } |
| 1052 | 1054 |
| 1053 void VideoQualityTest::RunWithAnalyzer(const Params& params) { | 1055 void VideoQualityTest::RunWithAnalyzer(const Params& params) { |
| 1054 params_ = params; | 1056 params_ = params; |
| 1055 | 1057 |
| 1056 RTC_CHECK(!params_.audio.enabled); | 1058 RTC_CHECK(!params_.audio.enabled); |
| 1057 // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to | 1059 // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to |
| 1058 // differentiate between the analyzer and the renderer case. | 1060 // differentiate between the analyzer and the renderer case. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1106 disable_quality_check ? -1.1 : params_.analyzer.avg_psnr_threshold, | 1108 disable_quality_check ? -1.1 : params_.analyzer.avg_psnr_threshold, |
| 1107 disable_quality_check ? -1.1 : params_.analyzer.avg_ssim_threshold, | 1109 disable_quality_check ? -1.1 : params_.analyzer.avg_ssim_threshold, |
| 1108 params_.analyzer.test_durations_secs * params_.video.fps, | 1110 params_.analyzer.test_durations_secs * params_.video.fps, |
| 1109 graph_data_output_file, graph_title, | 1111 graph_data_output_file, graph_title, |
| 1110 kVideoSendSsrcs[params_.ss.selected_stream]); | 1112 kVideoSendSsrcs[params_.ss.selected_stream]); |
| 1111 | 1113 |
| 1112 analyzer.SetReceiver(receiver_call_->Receiver()); | 1114 analyzer.SetReceiver(receiver_call_->Receiver()); |
| 1113 send_transport.SetReceiver(&analyzer); | 1115 send_transport.SetReceiver(&analyzer); |
| 1114 recv_transport.SetReceiver(sender_call_->Receiver()); | 1116 recv_transport.SetReceiver(sender_call_->Receiver()); |
| 1115 | 1117 |
| 1116 SetupCommon(&analyzer, &recv_transport); | 1118 SetupVideo(&analyzer, &recv_transport); |
| 1117 video_receive_configs_[params_.ss.selected_stream].renderer = &analyzer; | 1119 video_receive_configs_[params_.ss.selected_stream].renderer = &analyzer; |
| 1118 video_send_config_.pre_encode_callback = analyzer.pre_encode_proxy(); | 1120 video_send_config_.pre_encode_callback = analyzer.pre_encode_proxy(); |
| 1119 for (auto& config : video_receive_configs_) | 1121 for (auto& config : video_receive_configs_) |
| 1120 config.pre_decode_callback = &analyzer; | 1122 config.pre_decode_callback = &analyzer; |
| 1121 RTC_DCHECK(!video_send_config_.post_encode_callback); | 1123 RTC_DCHECK(!video_send_config_.post_encode_callback); |
| 1122 video_send_config_.post_encode_callback = analyzer.encode_timing_proxy(); | 1124 video_send_config_.post_encode_callback = analyzer.encode_timing_proxy(); |
| 1123 | 1125 |
| 1124 if (params_.screenshare.enabled) | 1126 if (params_.screenshare.enabled) |
| 1125 SetupScreenshare(); | 1127 SetupScreenshare(); |
| 1126 | 1128 |
| 1127 CreateVideoStreams(); | 1129 CreateVideoStreams(); |
| 1128 analyzer.input_ = video_send_stream_->Input(); | 1130 analyzer.input_ = video_send_stream_->Input(); |
| 1129 analyzer.send_stream_ = video_send_stream_; | 1131 analyzer.send_stream_ = video_send_stream_; |
| 1130 | 1132 |
| 1131 CreateCapturer(&analyzer); | 1133 CreateCapturer(&analyzer); |
| 1132 | 1134 |
| 1133 video_send_stream_->Start(); | 1135 video_send_stream_->Start(); |
| 1134 for (VideoReceiveStream* receive_stream : video_receive_streams_) | 1136 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1135 receive_stream->Start(); | 1137 receive_stream->Start(); |
| 1136 capturer_->Start(); | 1138 video_capturer_->Start(); |
| 1137 | 1139 |
| 1138 analyzer.Wait(); | 1140 analyzer.Wait(); |
| 1139 | 1141 |
| 1140 send_transport.StopSending(); | 1142 send_transport.StopSending(); |
| 1141 recv_transport.StopSending(); | 1143 recv_transport.StopSending(); |
| 1142 | 1144 |
| 1143 capturer_->Stop(); | 1145 video_capturer_->Stop(); |
| 1144 for (VideoReceiveStream* receive_stream : video_receive_streams_) | 1146 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1145 receive_stream->Stop(); | 1147 receive_stream->Stop(); |
| 1146 video_send_stream_->Stop(); | 1148 video_send_stream_->Stop(); |
| 1147 | 1149 |
| 1148 DestroyStreams(); | 1150 DestroyStreams(); |
| 1149 | 1151 |
| 1150 if (graph_data_output_file) | 1152 if (graph_data_output_file) |
| 1151 fclose(graph_data_output_file); | 1153 fclose(graph_data_output_file); |
| 1152 } | 1154 } |
| 1153 | 1155 |
| 1156 void VideoQualityTest::SetupAudio(int send_channel_id, | |
| 1157 int receive_channel_id, | |
| 1158 Call* call, | |
| 1159 Transport* transport, | |
| 1160 AudioReceiveStream** audio_receive_stream) { | |
| 1161 audio_send_config_ = AudioSendStream::Config(transport); | |
| 1162 audio_send_config_.voe_channel_id = send_channel_id; | |
| 1163 audio_send_config_.rtp.ssrc = kAudioSendSsrc; | |
| 1164 | |
| 1165 // Add extension to enable audio send side BWE, and allow audio bit rate | |
| 1166 // adaptation. | |
| 1167 audio_send_config_.rtp.extensions.clear(); | |
| 1168 if (params_.common.send_side_bwe) { | |
| 1169 audio_send_config_.rtp.extensions.push_back( | |
| 1170 webrtc::RtpExtension(webrtc::RtpExtension::kTransportSequenceNumberUri, | |
| 1171 test::kTransportSequenceNumberExtensionId)); | |
| 1172 audio_send_config_.min_bitrate_kbps = kOpusMinBitrate / 1000; | |
| 1173 audio_send_config_.max_bitrate_kbps = kOpusBitrateFb / 1000; | |
| 1174 } | |
| 1175 | |
| 1176 audio_send_stream_ = call->CreateAudioSendStream(audio_send_config_); | |
| 1177 | |
| 1178 AudioReceiveStream::Config audio_config; | |
| 1179 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; | |
| 1180 audio_config.rtcp_send_transport = transport; | |
| 1181 audio_config.voe_channel_id = receive_channel_id; | |
| 1182 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; | |
| 1183 audio_config.rtp.transport_cc = params_.common.send_side_bwe; | |
| 1184 audio_config.rtp.extensions = audio_send_config_.rtp.extensions; | |
| 1185 audio_config.decoder_factory = decoder_factory_; | |
| 1186 if (params_.video.enabled && params_.audio.sync_video) | |
| 1187 audio_config.sync_group = kSyncGroup; | |
| 1188 | |
| 1189 *audio_receive_stream = call->CreateAudioReceiveStream(audio_config); | |
| 1190 } | |
| 1191 | |
| 1154 void VideoQualityTest::RunWithRenderers(const Params& params) { | 1192 void VideoQualityTest::RunWithRenderers(const Params& params) { |
| 1155 params_ = params; | 1193 params_ = params; |
| 1156 CheckParams(); | 1194 CheckParams(); |
| 1157 | 1195 |
| 1158 std::unique_ptr<test::VideoRenderer> local_preview( | |
| 1159 test::VideoRenderer::Create("Local Preview", params_.video.width, | |
| 1160 params_.video.height)); | |
| 1161 size_t stream_id = params_.ss.selected_stream; | |
| 1162 std::string title = "Loopback Video"; | |
| 1163 if (params_.ss.streams.size() > 1) { | |
| 1164 std::ostringstream s; | |
| 1165 s << stream_id; | |
| 1166 title += " - Stream #" + s.str(); | |
| 1167 } | |
| 1168 | |
| 1169 std::unique_ptr<test::VideoRenderer> loopback_video( | |
| 1170 test::VideoRenderer::Create(title.c_str(), | |
| 1171 params_.ss.streams[stream_id].width, | |
| 1172 params_.ss.streams[stream_id].height)); | |
| 1173 | |
| 1174 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to | 1196 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to |
| 1175 // match the full stack tests. | 1197 // match the full stack tests. |
| 1176 Call::Config call_config; | 1198 Call::Config call_config; |
| 1177 call_config.bitrate_config = params_.common.call_bitrate_config; | 1199 call_config.bitrate_config = params_.common.call_bitrate_config; |
| 1178 | 1200 |
| 1179 ::VoiceEngineState voe; | 1201 ::VoiceEngineState voe; |
| 1180 if (params_.audio.enabled) { | 1202 if (params_.audio.enabled) { |
| 1181 CreateVoiceEngine(&voe, decoder_factory_); | 1203 CreateVoiceEngine(&voe, decoder_factory_); |
| 1204 const CodecInst kOpusInst = {120, "OPUS", 48000, 960, 2, 64000}; | |
| 1205 EXPECT_EQ(0, voe.codec->SetSendCodec(voe.send_channel_id, kOpusInst)); | |
| 1182 AudioState::Config audio_state_config; | 1206 AudioState::Config audio_state_config; |
| 1183 audio_state_config.voice_engine = voe.voice_engine; | 1207 audio_state_config.voice_engine = voe.voice_engine; |
| 1184 call_config.audio_state = AudioState::Create(audio_state_config); | 1208 call_config.audio_state = AudioState::Create(audio_state_config); |
| 1185 } | 1209 } |
| 1186 | 1210 |
| 1187 std::unique_ptr<Call> call(Call::Create(call_config)); | 1211 std::unique_ptr<Call> call(Call::Create(call_config)); |
| 1188 | 1212 |
| 1213 // TODO(minyue): consider if this is a good transport even for audio only | |
| 1214 // calls. | |
| 1189 test::LayerFilteringTransport transport( | 1215 test::LayerFilteringTransport transport( |
| 1190 params.pipe, call.get(), kPayloadTypeVP8, kPayloadTypeVP9, | 1216 params.pipe, call.get(), kPayloadTypeVP8, kPayloadTypeVP9, |
| 1191 params.video.selected_tl, params_.ss.selected_sl); | 1217 params.video.selected_tl, params_.ss.selected_sl); |
| 1192 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at | 1218 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at |
| 1193 // least share as much code as possible. That way this test would also match | 1219 // least share as much code as possible. That way this test would also match |
| 1194 // the full stack tests better. | 1220 // the full stack tests better. |
| 1195 transport.SetReceiver(call->Receiver()); | 1221 transport.SetReceiver(call->Receiver()); |
| 1196 | 1222 |
| 1197 SetupCommon(&transport, &transport); | 1223 VideoReceiveStream* video_receive_stream = nullptr; |
| 1224 std::unique_ptr<test::VideoRenderer> local_preview; | |
| 1225 std::unique_ptr<test::VideoRenderer> loopback_video; | |
| 1226 if (params_.video.enabled) { | |
| 1227 // Create video renders. | |
| 1228 local_preview.reset(test::VideoRenderer::Create( | |
| 1229 "Local Preview", params_.video.width, params_.video.height)); | |
| 1198 | 1230 |
| 1199 video_send_config_.pre_encode_callback = local_preview.get(); | 1231 size_t stream_id = params_.ss.selected_stream; |
| 1200 video_receive_configs_[stream_id].renderer = loopback_video.get(); | 1232 std::string title = "Loopback Video"; |
| 1201 if (params_.audio.enabled && params_.audio.sync_video) | 1233 if (params_.ss.streams.size() > 1) { |
| 1202 video_receive_configs_[stream_id].sync_group = kSyncGroup; | 1234 std::ostringstream s; |
| 1235 s << stream_id; | |
| 1236 title += " - Stream #" + s.str(); | |
| 1237 } | |
| 1203 | 1238 |
| 1204 video_send_config_.suspend_below_min_bitrate = | 1239 loopback_video.reset(test::VideoRenderer::Create( |
| 1205 params_.video.suspend_below_min_bitrate; | 1240 title.c_str(), params_.ss.streams[stream_id].width, |
| 1241 params_.ss.streams[stream_id].height)); | |
| 1206 | 1242 |
| 1207 if (params.video.fec) { | 1243 SetupVideo(&transport, &transport); |
| 1208 video_send_config_.rtp.fec.red_payload_type = kRedPayloadType; | 1244 |
| 1209 video_send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | 1245 // 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
| |
| 1210 video_receive_configs_[stream_id].rtp.fec.red_payload_type = | 1246 // cleaner. |
| 1211 kRedPayloadType; | 1247 video_send_config_.pre_encode_callback = local_preview.get(); |
| 1212 video_receive_configs_[stream_id].rtp.fec.ulpfec_payload_type = | 1248 video_receive_configs_[stream_id].renderer = loopback_video.get(); |
| 1213 kUlpfecPayloadType; | 1249 if (params_.audio.enabled && params_.audio.sync_video) |
| 1250 video_receive_configs_[stream_id].sync_group = kSyncGroup; | |
| 1251 | |
| 1252 video_send_config_.suspend_below_min_bitrate = | |
| 1253 params_.video.suspend_below_min_bitrate; | |
| 1254 | |
| 1255 if (params.video.fec) { | |
| 1256 video_send_config_.rtp.fec.red_payload_type = kRedPayloadType; | |
| 1257 video_send_config_.rtp.fec.ulpfec_payload_type = kUlpfecPayloadType; | |
| 1258 video_receive_configs_[stream_id].rtp.fec.red_payload_type = | |
| 1259 kRedPayloadType; | |
| 1260 video_receive_configs_[stream_id].rtp.fec.ulpfec_payload_type = | |
| 1261 kUlpfecPayloadType; | |
| 1262 } | |
| 1263 | |
| 1264 if (params_.screenshare.enabled) | |
| 1265 SetupScreenshare(); | |
| 1266 | |
| 1267 video_send_stream_ = call->CreateVideoSendStream( | |
| 1268 video_send_config_.Copy(), video_encoder_config_.Copy()); | |
| 1269 video_receive_stream = call->CreateVideoReceiveStream( | |
| 1270 video_receive_configs_[stream_id].Copy()); | |
| 1271 CreateCapturer(video_send_stream_->Input()); | |
| 1214 } | 1272 } |
| 1215 | 1273 |
| 1216 if (params_.screenshare.enabled) | |
| 1217 SetupScreenshare(); | |
| 1218 | |
| 1219 video_send_stream_ = call->CreateVideoSendStream( | |
| 1220 video_send_config_.Copy(), video_encoder_config_.Copy()); | |
| 1221 VideoReceiveStream* video_receive_stream = | |
| 1222 call->CreateVideoReceiveStream(video_receive_configs_[stream_id].Copy()); | |
| 1223 CreateCapturer(video_send_stream_->Input()); | |
| 1224 | |
| 1225 AudioReceiveStream* audio_receive_stream = nullptr; | 1274 AudioReceiveStream* audio_receive_stream = nullptr; |
| 1226 if (params_.audio.enabled) { | 1275 if (params_.audio.enabled) { |
| 1227 audio_send_config_ = AudioSendStream::Config(&transport); | 1276 SetupAudio(voe.send_channel_id, voe.receive_channel_id, call.get(), |
| 1228 audio_send_config_.voe_channel_id = voe.send_channel_id; | 1277 &transport, &audio_receive_stream); |
| 1229 audio_send_config_.rtp.ssrc = kAudioSendSsrc; | |
| 1230 | |
| 1231 // Add extension to enable audio send side BWE, and allow audio bit rate | |
| 1232 // adaptation. | |
| 1233 audio_send_config_.rtp.extensions.clear(); | |
| 1234 if (params_.common.send_side_bwe) { | |
| 1235 audio_send_config_.rtp.extensions.push_back(webrtc::RtpExtension( | |
| 1236 webrtc::RtpExtension::kTransportSequenceNumberUri, | |
| 1237 test::kTransportSequenceNumberExtensionId)); | |
| 1238 audio_send_config_.min_bitrate_kbps = kOpusMinBitrate / 1000; | |
| 1239 audio_send_config_.max_bitrate_kbps = kOpusBitrateFb / 1000; | |
| 1240 } | |
| 1241 | |
| 1242 audio_send_stream_ = call->CreateAudioSendStream(audio_send_config_); | |
| 1243 | |
| 1244 AudioReceiveStream::Config audio_config; | |
| 1245 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; | |
| 1246 audio_config.rtcp_send_transport = &transport; | |
| 1247 audio_config.voe_channel_id = voe.receive_channel_id; | |
| 1248 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; | |
| 1249 audio_config.rtp.transport_cc = params_.common.send_side_bwe; | |
| 1250 audio_config.rtp.extensions = audio_send_config_.rtp.extensions; | |
| 1251 audio_config.decoder_factory = decoder_factory_; | |
| 1252 if (params_.audio.sync_video) | |
| 1253 audio_config.sync_group = kSyncGroup; | |
| 1254 | |
| 1255 audio_receive_stream =call->CreateAudioReceiveStream(audio_config); | |
| 1256 | |
| 1257 const CodecInst kOpusInst = {120, "OPUS", 48000, 960, 2, 64000}; | |
| 1258 EXPECT_EQ(0, voe.codec->SetSendCodec(voe.send_channel_id, kOpusInst)); | |
| 1259 } | 1278 } |
| 1260 | 1279 |
| 1261 // Start sending and receiving video. | 1280 // Start sending and receiving video. |
| 1262 video_receive_stream->Start(); | 1281 if (params_.video.enabled) { |
| 1263 video_send_stream_->Start(); | 1282 video_receive_stream->Start(); |
| 1264 capturer_->Start(); | 1283 video_send_stream_->Start(); |
| 1284 video_capturer_->Start(); | |
| 1285 } | |
| 1265 | 1286 |
| 1266 if (params_.audio.enabled) { | 1287 if (params_.audio.enabled) { |
| 1267 // Start receiving audio. | 1288 // Start receiving audio. |
| 1268 audio_receive_stream->Start(); | 1289 audio_receive_stream->Start(); |
| 1269 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); | 1290 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); |
| 1270 EXPECT_EQ(0, voe.base->StartReceive(voe.receive_channel_id)); | 1291 EXPECT_EQ(0, voe.base->StartReceive(voe.receive_channel_id)); |
| 1271 | 1292 |
| 1272 // Start sending audio. | 1293 // Start sending audio. |
| 1273 audio_send_stream_->Start(); | 1294 audio_send_stream_->Start(); |
| 1274 EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id)); | 1295 EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id)); |
| 1275 } | 1296 } |
| 1276 | 1297 |
| 1277 test::PressEnterToContinue(); | 1298 test::PressEnterToContinue(); |
| 1278 | 1299 |
| 1279 if (params_.audio.enabled) { | 1300 if (params_.audio.enabled) { |
| 1280 // Stop sending audio. | 1301 // Stop sending audio. |
| 1281 EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id)); | 1302 EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id)); |
| 1282 audio_send_stream_->Stop(); | 1303 audio_send_stream_->Stop(); |
| 1283 | 1304 |
| 1284 // Stop receiving audio. | 1305 // Stop receiving audio. |
| 1285 EXPECT_EQ(0, voe.base->StopReceive(voe.receive_channel_id)); | 1306 EXPECT_EQ(0, voe.base->StopReceive(voe.receive_channel_id)); |
| 1286 EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id)); | 1307 EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id)); |
| 1287 audio_receive_stream->Stop(); | 1308 audio_receive_stream->Stop(); |
| 1288 } | |
| 1289 | |
| 1290 // Stop receiving and sending video. | |
| 1291 capturer_->Stop(); | |
| 1292 video_send_stream_->Stop(); | |
| 1293 video_receive_stream->Stop(); | |
| 1294 | |
| 1295 call->DestroyVideoReceiveStream(video_receive_stream); | |
| 1296 call->DestroyVideoSendStream(video_send_stream_); | |
| 1297 | |
| 1298 if (params_.audio.enabled) { | |
| 1299 call->DestroyAudioSendStream(audio_send_stream_); | 1309 call->DestroyAudioSendStream(audio_send_stream_); |
| 1300 call->DestroyAudioReceiveStream(audio_receive_stream); | 1310 call->DestroyAudioReceiveStream(audio_receive_stream); |
| 1301 } | 1311 } |
| 1302 | 1312 |
| 1313 // Stop receiving and sending video. | |
| 1314 if (params_.video.enabled) { | |
| 1315 video_capturer_->Stop(); | |
| 1316 video_send_stream_->Stop(); | |
| 1317 video_receive_stream->Stop(); | |
| 1318 call->DestroyVideoReceiveStream(video_receive_stream); | |
| 1319 call->DestroyVideoSendStream(video_send_stream_); | |
| 1320 } | |
| 1321 | |
| 1303 transport.StopSending(); | 1322 transport.StopSending(); |
| 1304 if (params_.audio.enabled) | 1323 if (params_.audio.enabled) |
| 1305 DestroyVoiceEngine(&voe); | 1324 DestroyVoiceEngine(&voe); |
| 1306 } | 1325 } |
| 1307 | 1326 |
| 1308 } // namespace webrtc | 1327 } // namespace webrtc |
| OLD | NEW |