| 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 "webrtc/video/video_quality_test.h" | 10 #include "webrtc/video/video_quality_test.h" |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 constexpr int kPayloadTypeVP9 = 124; | 57 constexpr int kPayloadTypeVP9 = 124; |
| 58 | 58 |
| 59 constexpr size_t kMaxComparisons = 10; | 59 constexpr size_t kMaxComparisons = 10; |
| 60 constexpr char kSyncGroup[] = "av_sync"; | 60 constexpr char kSyncGroup[] = "av_sync"; |
| 61 constexpr int kOpusMinBitrateBps = 6000; | 61 constexpr int kOpusMinBitrateBps = 6000; |
| 62 constexpr int kOpusBitrateFbBps = 32000; | 62 constexpr int kOpusBitrateFbBps = 32000; |
| 63 constexpr int kFramesSentInQuickTest = 1; | 63 constexpr int kFramesSentInQuickTest = 1; |
| 64 constexpr uint32_t kThumbnailSendSsrcStart = 0xE0000; | 64 constexpr uint32_t kThumbnailSendSsrcStart = 0xE0000; |
| 65 constexpr uint32_t kThumbnailRtxSsrcStart = 0xF0000; | 65 constexpr uint32_t kThumbnailRtxSsrcStart = 0xF0000; |
| 66 | 66 |
| 67 constexpr int kDefaultMaxQp = cricket::WebRtcVideoChannel::kDefaultQpMax; |
| 68 |
| 67 struct VoiceEngineState { | 69 struct VoiceEngineState { |
| 68 VoiceEngineState() | 70 VoiceEngineState() |
| 69 : voice_engine(nullptr), | 71 : voice_engine(nullptr), |
| 70 base(nullptr), | 72 base(nullptr), |
| 71 send_channel_id(-1), | 73 send_channel_id(-1), |
| 72 receive_channel_id(-1) {} | 74 receive_channel_id(-1) {} |
| 73 | 75 |
| 74 webrtc::VoiceEngine* voice_engine; | 76 webrtc::VoiceEngine* voice_engine; |
| 75 webrtc::VoEBase* base; | 77 webrtc::VoEBase* base; |
| 76 int send_channel_id; | 78 int send_channel_id; |
| (...skipping 1040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 RTC_CHECK(params_.video.selected_tl == -1 || | 1119 RTC_CHECK(params_.video.selected_tl == -1 || |
| 1118 params_.video.selected_tl == | 1120 params_.video.selected_tl == |
| 1119 params_.video.num_temporal_layers - 1); | 1121 params_.video.num_temporal_layers - 1); |
| 1120 } | 1122 } |
| 1121 | 1123 |
| 1122 // TODO(ivica): Should max_bitrate_bps == -1 represent inf max bitrate, as it | 1124 // TODO(ivica): Should max_bitrate_bps == -1 represent inf max bitrate, as it |
| 1123 // does in some parts of the code? | 1125 // does in some parts of the code? |
| 1124 RTC_CHECK_GE(params_.video.max_bitrate_bps, params_.video.target_bitrate_bps); | 1126 RTC_CHECK_GE(params_.video.max_bitrate_bps, params_.video.target_bitrate_bps); |
| 1125 RTC_CHECK_GE(params_.video.target_bitrate_bps, params_.video.min_bitrate_bps); | 1127 RTC_CHECK_GE(params_.video.target_bitrate_bps, params_.video.min_bitrate_bps); |
| 1126 RTC_CHECK_LT(params_.video.selected_tl, params_.video.num_temporal_layers); | 1128 RTC_CHECK_LT(params_.video.selected_tl, params_.video.num_temporal_layers); |
| 1127 RTC_CHECK_LT(params_.ss.selected_stream, params_.ss.streams.size()); | 1129 RTC_CHECK_LE(params_.ss.selected_stream, params_.ss.streams.size()); |
| 1128 for (const VideoStream& stream : params_.ss.streams) { | 1130 for (const VideoStream& stream : params_.ss.streams) { |
| 1129 RTC_CHECK_GE(stream.min_bitrate_bps, 0); | 1131 RTC_CHECK_GE(stream.min_bitrate_bps, 0); |
| 1130 RTC_CHECK_GE(stream.target_bitrate_bps, stream.min_bitrate_bps); | 1132 RTC_CHECK_GE(stream.target_bitrate_bps, stream.min_bitrate_bps); |
| 1131 RTC_CHECK_GE(stream.max_bitrate_bps, stream.target_bitrate_bps); | 1133 RTC_CHECK_GE(stream.max_bitrate_bps, stream.target_bitrate_bps); |
| 1132 RTC_CHECK_LE(stream.temporal_layer_thresholds_bps.size(), | |
| 1133 params_.video.num_temporal_layers - 1); | |
| 1134 } | 1134 } |
| 1135 // TODO(ivica): Should we check if the sum of all streams/layers is equal to | 1135 // TODO(ivica): Should we check if the sum of all streams/layers is equal to |
| 1136 // the total bitrate? We anyway have to update them in the case bitrate | 1136 // the total bitrate? We anyway have to update them in the case bitrate |
| 1137 // estimator changes the total bitrates. | 1137 // estimator changes the total bitrates. |
| 1138 RTC_CHECK_GE(params_.ss.num_spatial_layers, 1); | 1138 RTC_CHECK_GE(params_.ss.num_spatial_layers, 1); |
| 1139 RTC_CHECK_LE(params_.ss.selected_sl, params_.ss.num_spatial_layers); | 1139 RTC_CHECK_LE(params_.ss.selected_sl, params_.ss.num_spatial_layers); |
| 1140 RTC_CHECK(params_.ss.spatial_layers.empty() || | 1140 RTC_CHECK(params_.ss.spatial_layers.empty() || |
| 1141 params_.ss.spatial_layers.size() == | 1141 params_.ss.spatial_layers.size() == |
| 1142 static_cast<size_t>(params_.ss.num_spatial_layers)); | 1142 static_cast<size_t>(params_.ss.num_spatial_layers)); |
| 1143 if (params_.video.codec == "VP8") { | 1143 if (params_.video.codec == "VP8") { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1184 | 1184 |
| 1185 // Static. | 1185 // Static. |
| 1186 VideoStream VideoQualityTest::DefaultVideoStream(const Params& params) { | 1186 VideoStream VideoQualityTest::DefaultVideoStream(const Params& params) { |
| 1187 VideoStream stream; | 1187 VideoStream stream; |
| 1188 stream.width = params.video.width; | 1188 stream.width = params.video.width; |
| 1189 stream.height = params.video.height; | 1189 stream.height = params.video.height; |
| 1190 stream.max_framerate = params.video.fps; | 1190 stream.max_framerate = params.video.fps; |
| 1191 stream.min_bitrate_bps = params.video.min_bitrate_bps; | 1191 stream.min_bitrate_bps = params.video.min_bitrate_bps; |
| 1192 stream.target_bitrate_bps = params.video.target_bitrate_bps; | 1192 stream.target_bitrate_bps = params.video.target_bitrate_bps; |
| 1193 stream.max_bitrate_bps = params.video.max_bitrate_bps; | 1193 stream.max_bitrate_bps = params.video.max_bitrate_bps; |
| 1194 stream.max_qp = cricket::WebRtcVideoChannel::kDefaultQpMax; | 1194 stream.max_qp = kDefaultMaxQp; |
| 1195 // TODO(sprang): Can we make this less of a hack? | 1195 // TODO(sprang): Can we make this less of a hack? |
| 1196 if (params.video.num_temporal_layers == 2) { | 1196 if (params.video.num_temporal_layers == 2) { |
| 1197 stream.temporal_layer_thresholds_bps.push_back(stream.target_bitrate_bps); | 1197 stream.temporal_layer_thresholds_bps.push_back(stream.target_bitrate_bps); |
| 1198 } else if (params.video.num_temporal_layers == 3) { | 1198 } else if (params.video.num_temporal_layers == 3) { |
| 1199 stream.temporal_layer_thresholds_bps.push_back(stream.max_bitrate_bps / 4); | 1199 stream.temporal_layer_thresholds_bps.push_back(stream.max_bitrate_bps / 4); |
| 1200 stream.temporal_layer_thresholds_bps.push_back(stream.target_bitrate_bps); | 1200 stream.temporal_layer_thresholds_bps.push_back(stream.target_bitrate_bps); |
| 1201 } | 1201 } |
| 1202 return stream; | 1202 return stream; |
| 1203 } | 1203 } |
| 1204 | 1204 |
| 1205 // Static. | 1205 // Static. |
| 1206 VideoStream VideoQualityTest::DefaultThumbnailStream() { | 1206 VideoStream VideoQualityTest::DefaultThumbnailStream() { |
| 1207 VideoStream stream; | 1207 VideoStream stream; |
| 1208 stream.width = 320; | 1208 stream.width = 320; |
| 1209 stream.height = 180; | 1209 stream.height = 180; |
| 1210 stream.max_framerate = 7; | 1210 stream.max_framerate = 7; |
| 1211 stream.min_bitrate_bps = 7500; | 1211 stream.min_bitrate_bps = 7500; |
| 1212 stream.target_bitrate_bps = 37500; | 1212 stream.target_bitrate_bps = 37500; |
| 1213 stream.max_bitrate_bps = 50000; | 1213 stream.max_bitrate_bps = 50000; |
| 1214 stream.max_qp = cricket::WebRtcVideoChannel::kDefaultQpMax; | 1214 stream.max_qp = kDefaultMaxQp; |
| 1215 return stream; | 1215 return stream; |
| 1216 } | 1216 } |
| 1217 | 1217 |
| 1218 // Static. | 1218 // Static. |
| 1219 void VideoQualityTest::FillScalabilitySettings( | 1219 void VideoQualityTest::FillScalabilitySettings( |
| 1220 Params* params, | 1220 Params* params, |
| 1221 const std::vector<std::string>& stream_descriptors, | 1221 const std::vector<std::string>& stream_descriptors, |
| 1222 int num_streams, |
| 1222 size_t selected_stream, | 1223 size_t selected_stream, |
| 1223 int num_spatial_layers, | 1224 int num_spatial_layers, |
| 1224 int selected_sl, | 1225 int selected_sl, |
| 1225 const std::vector<std::string>& sl_descriptors) { | 1226 const std::vector<std::string>& sl_descriptors) { |
| 1226 // Read VideoStream and SpatialLayer elements from a list of comma separated | 1227 if (params->ss.streams.empty() && params->ss.infer_streams) { |
| 1227 // lists. To use a default value for an element, use -1 or leave empty. | 1228 webrtc::VideoEncoderConfig encoder_config; |
| 1228 // Validity checks performed in CheckParams. | 1229 encoder_config.content_type = |
| 1230 params->screenshare.enabled |
| 1231 ? webrtc::VideoEncoderConfig::ContentType::kScreen |
| 1232 : webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo; |
| 1233 encoder_config.max_bitrate_bps = params->video.max_bitrate_bps; |
| 1234 encoder_config.min_transmit_bitrate_bps = params->video.min_transmit_bps; |
| 1235 encoder_config.number_of_streams = num_streams; |
| 1236 encoder_config.spatial_layers = params->ss.spatial_layers; |
| 1237 encoder_config.video_stream_factory = |
| 1238 new rtc::RefCountedObject<cricket::EncoderStreamFactory>( |
| 1239 params->video.codec, kDefaultMaxQp, params->video.fps, |
| 1240 params->screenshare.enabled, true); |
| 1241 params->ss.streams = |
| 1242 encoder_config.video_stream_factory->CreateEncoderStreams( |
| 1243 static_cast<int>(params->video.width), |
| 1244 static_cast<int>(params->video.height), encoder_config); |
| 1245 } else { |
| 1246 // Read VideoStream and SpatialLayer elements from a list of comma separated |
| 1247 // lists. To use a default value for an element, use -1 or leave empty. |
| 1248 // Validity checks performed in CheckParams. |
| 1249 RTC_CHECK(params->ss.streams.empty()); |
| 1250 for (auto descriptor : stream_descriptors) { |
| 1251 if (descriptor.empty()) |
| 1252 continue; |
| 1253 VideoStream stream = VideoQualityTest::DefaultVideoStream(*params); |
| 1254 std::vector<int> v = VideoQualityTest::ParseCSV(descriptor); |
| 1255 if (v[0] != -1) |
| 1256 stream.width = static_cast<size_t>(v[0]); |
| 1257 if (v[1] != -1) |
| 1258 stream.height = static_cast<size_t>(v[1]); |
| 1259 if (v[2] != -1) |
| 1260 stream.max_framerate = v[2]; |
| 1261 if (v[3] != -1) |
| 1262 stream.min_bitrate_bps = v[3]; |
| 1263 if (v[4] != -1) |
| 1264 stream.target_bitrate_bps = v[4]; |
| 1265 if (v[5] != -1) |
| 1266 stream.max_bitrate_bps = v[5]; |
| 1267 if (v.size() > 6 && v[6] != -1) |
| 1268 stream.max_qp = v[6]; |
| 1269 if (v.size() > 7) { |
| 1270 stream.temporal_layer_thresholds_bps.clear(); |
| 1271 stream.temporal_layer_thresholds_bps.insert( |
| 1272 stream.temporal_layer_thresholds_bps.end(), v.begin() + 7, v.end()); |
| 1273 } else { |
| 1274 // Automatic TL thresholds for more than two layers not supported. |
| 1275 RTC_CHECK_LE(params->video.num_temporal_layers, 2); |
| 1276 } |
| 1277 params->ss.streams.push_back(stream); |
| 1278 } |
| 1279 } |
| 1229 | 1280 |
| 1230 RTC_CHECK(params->ss.streams.empty()); | 1281 params->ss.num_spatial_layers = std::max(1, num_spatial_layers); |
| 1231 for (auto descriptor : stream_descriptors) { | |
| 1232 if (descriptor.empty()) | |
| 1233 continue; | |
| 1234 VideoStream stream = VideoQualityTest::DefaultVideoStream(*params); | |
| 1235 std::vector<int> v = VideoQualityTest::ParseCSV(descriptor); | |
| 1236 if (v[0] != -1) | |
| 1237 stream.width = static_cast<size_t>(v[0]); | |
| 1238 if (v[1] != -1) | |
| 1239 stream.height = static_cast<size_t>(v[1]); | |
| 1240 if (v[2] != -1) | |
| 1241 stream.max_framerate = v[2]; | |
| 1242 if (v[3] != -1) | |
| 1243 stream.min_bitrate_bps = v[3]; | |
| 1244 if (v[4] != -1) | |
| 1245 stream.target_bitrate_bps = v[4]; | |
| 1246 if (v[5] != -1) | |
| 1247 stream.max_bitrate_bps = v[5]; | |
| 1248 if (v.size() > 6 && v[6] != -1) | |
| 1249 stream.max_qp = v[6]; | |
| 1250 if (v.size() > 7) { | |
| 1251 stream.temporal_layer_thresholds_bps.clear(); | |
| 1252 stream.temporal_layer_thresholds_bps.insert( | |
| 1253 stream.temporal_layer_thresholds_bps.end(), v.begin() + 7, v.end()); | |
| 1254 } else { | |
| 1255 // Automatic TL thresholds for more than two layers not supported. | |
| 1256 RTC_CHECK_LE(params->video.num_temporal_layers, 2); | |
| 1257 } | |
| 1258 params->ss.streams.push_back(stream); | |
| 1259 } | |
| 1260 params->ss.selected_stream = selected_stream; | 1282 params->ss.selected_stream = selected_stream; |
| 1261 params->ss.infer_streams = false; | |
| 1262 | 1283 |
| 1263 params->ss.num_spatial_layers = num_spatial_layers ? num_spatial_layers : 1; | |
| 1264 params->ss.selected_sl = selected_sl; | 1284 params->ss.selected_sl = selected_sl; |
| 1265 RTC_CHECK(params->ss.spatial_layers.empty()); | 1285 RTC_CHECK(params->ss.spatial_layers.empty()); |
| 1266 for (auto descriptor : sl_descriptors) { | 1286 for (auto descriptor : sl_descriptors) { |
| 1267 if (descriptor.empty()) | 1287 if (descriptor.empty()) |
| 1268 continue; | 1288 continue; |
| 1269 std::vector<int> v = VideoQualityTest::ParseCSV(descriptor); | 1289 std::vector<int> v = VideoQualityTest::ParseCSV(descriptor); |
| 1270 RTC_CHECK_GT(v[2], 0); | 1290 RTC_CHECK_GT(v[2], 0); |
| 1271 | 1291 |
| 1272 SpatialLayer layer; | 1292 SpatialLayer layer; |
| 1273 layer.scaling_factor_num = v[0] == -1 ? 1 : v[0]; | 1293 layer.scaling_factor_num = v[0] == -1 ? 1 : v[0]; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1349 params_.video.fps, params_.screenshare.enabled, true); | 1369 params_.video.fps, params_.screenshare.enabled, true); |
| 1350 } else { | 1370 } else { |
| 1351 video_encoder_config_.video_stream_factory = | 1371 video_encoder_config_.video_stream_factory = |
| 1352 new rtc::RefCountedObject<VideoStreamFactory>(params_.ss.streams); | 1372 new rtc::RefCountedObject<VideoStreamFactory>(params_.ss.streams); |
| 1353 } | 1373 } |
| 1354 | 1374 |
| 1355 video_encoder_config_.spatial_layers = params_.ss.spatial_layers; | 1375 video_encoder_config_.spatial_layers = params_.ss.spatial_layers; |
| 1356 | 1376 |
| 1357 CreateMatchingReceiveConfigs(recv_transport); | 1377 CreateMatchingReceiveConfigs(recv_transport); |
| 1358 | 1378 |
| 1379 const bool decode_all_receive_streams = |
| 1380 params_.ss.selected_stream == params_.ss.streams.size(); |
| 1381 |
| 1359 for (size_t i = 0; i < num_video_streams; ++i) { | 1382 for (size_t i = 0; i < num_video_streams; ++i) { |
| 1360 video_receive_configs_[i].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; | 1383 video_receive_configs_[i].rtp.nack.rtp_history_ms = kNackRtpHistoryMs; |
| 1361 video_receive_configs_[i].rtp.rtx_ssrc = kSendRtxSsrcs[i]; | 1384 video_receive_configs_[i].rtp.rtx_ssrc = kSendRtxSsrcs[i]; |
| 1362 video_receive_configs_[i].rtp.rtx_payload_types[payload_type] = | 1385 video_receive_configs_[i].rtp.rtx_payload_types[payload_type] = |
| 1363 kSendRtxPayloadType; | 1386 kSendRtxPayloadType; |
| 1364 video_receive_configs_[i].rtp.transport_cc = params_.call.send_side_bwe; | 1387 video_receive_configs_[i].rtp.transport_cc = params_.call.send_side_bwe; |
| 1365 video_receive_configs_[i].rtp.remb = !params_.call.send_side_bwe; | 1388 video_receive_configs_[i].rtp.remb = !params_.call.send_side_bwe; |
| 1366 // Enable RTT calculation so NTP time estimator will work. | 1389 // Enable RTT calculation so NTP time estimator will work. |
| 1367 video_receive_configs_[i].rtp.rtcp_xr.receiver_reference_time_report = true; | 1390 video_receive_configs_[i].rtp.rtcp_xr.receiver_reference_time_report = true; |
| 1368 // Force fake decoders on non-selected simulcast streams. | 1391 // Force fake decoders on non-selected simulcast streams. |
| 1369 if (i != params_.ss.selected_stream) { | 1392 if (!decode_all_receive_streams && i != params_.ss.selected_stream) { |
| 1370 VideoReceiveStream::Decoder decoder; | 1393 VideoReceiveStream::Decoder decoder; |
| 1371 decoder.decoder = new test::FakeDecoder(); | 1394 decoder.decoder = new test::FakeDecoder(); |
| 1372 decoder.payload_type = video_send_config_.encoder_settings.payload_type; | 1395 decoder.payload_type = video_send_config_.encoder_settings.payload_type; |
| 1373 decoder.payload_name = video_send_config_.encoder_settings.payload_name; | 1396 decoder.payload_name = video_send_config_.encoder_settings.payload_name; |
| 1374 video_receive_configs_[i].decoders.clear(); | 1397 video_receive_configs_[i].decoders.clear(); |
| 1375 allocated_decoders_.emplace_back(decoder.decoder); | 1398 allocated_decoders_.emplace_back(decoder.decoder); |
| 1376 video_receive_configs_[i].decoders.push_back(decoder); | 1399 video_receive_configs_[i].decoders.push_back(decoder); |
| 1377 } | 1400 } |
| 1378 } | 1401 } |
| 1379 | 1402 |
| 1380 if (params_.video.flexfec) { | 1403 if (params_.video.flexfec) { |
| 1381 // Override send config constructed by CreateSendConfig. | 1404 // Override send config constructed by CreateSendConfig. |
| 1382 video_send_config_.rtp.flexfec.protected_media_ssrcs = { | 1405 if (decode_all_receive_streams) { |
| 1383 kVideoSendSsrcs[params_.ss.selected_stream]}; | 1406 for (uint32_t media_ssrc : video_send_config_.rtp.ssrcs) { |
| 1407 video_send_config_.rtp.flexfec.protected_media_ssrcs.push_back( |
| 1408 media_ssrc); |
| 1409 } |
| 1410 } else { |
| 1411 video_send_config_.rtp.flexfec.protected_media_ssrcs = { |
| 1412 kVideoSendSsrcs[params_.ss.selected_stream]}; |
| 1413 } |
| 1384 | 1414 |
| 1385 // The matching receive config is _not_ created by | 1415 // The matching receive config is _not_ created by |
| 1386 // CreateMatchingReceiveConfigs, since VideoQualityTest is not a BaseTest. | 1416 // CreateMatchingReceiveConfigs, since VideoQualityTest is not a BaseTest. |
| 1387 // Set up the receive config manually instead. | 1417 // Set up the receive config manually instead. |
| 1388 FlexfecReceiveStream::Config flexfec_receive_config(recv_transport); | 1418 FlexfecReceiveStream::Config flexfec_receive_config(recv_transport); |
| 1389 flexfec_receive_config.payload_type = | 1419 flexfec_receive_config.payload_type = |
| 1390 video_send_config_.rtp.flexfec.payload_type; | 1420 video_send_config_.rtp.flexfec.payload_type; |
| 1391 flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc; | 1421 flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc; |
| 1392 flexfec_receive_config.protected_media_ssrcs = | 1422 flexfec_receive_config.protected_media_ssrcs = |
| 1393 video_send_config_.rtp.flexfec.protected_media_ssrcs; | 1423 video_send_config_.rtp.flexfec.protected_media_ssrcs; |
| 1394 flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc; | 1424 flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc; |
| 1395 flexfec_receive_config.transport_cc = params_.call.send_side_bwe; | 1425 flexfec_receive_config.transport_cc = params_.call.send_side_bwe; |
| 1396 if (params_.call.send_side_bwe) { | 1426 if (params_.call.send_side_bwe) { |
| 1397 flexfec_receive_config.rtp_header_extensions.push_back( | 1427 flexfec_receive_config.rtp_header_extensions.push_back( |
| 1398 RtpExtension(RtpExtension::kTransportSequenceNumberUri, | 1428 RtpExtension(RtpExtension::kTransportSequenceNumberUri, |
| 1399 test::kTransportSequenceNumberExtensionId)); | 1429 test::kTransportSequenceNumberExtensionId)); |
| 1400 } else { | 1430 } else { |
| 1401 flexfec_receive_config.rtp_header_extensions.push_back(RtpExtension( | 1431 flexfec_receive_config.rtp_header_extensions.push_back(RtpExtension( |
| 1402 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); | 1432 RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId)); |
| 1403 } | 1433 } |
| 1404 flexfec_receive_configs_.push_back(flexfec_receive_config); | 1434 flexfec_receive_configs_.push_back(flexfec_receive_config); |
| 1405 } | 1435 } |
| 1406 | 1436 |
| 1407 if (params_.video.ulpfec) { | 1437 if (params_.video.ulpfec) { |
| 1408 video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType; | 1438 video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType; |
| 1409 video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; | 1439 video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; |
| 1410 video_send_config_.rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; | 1440 video_send_config_.rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType; |
| 1411 | 1441 |
| 1412 video_receive_configs_[params_.ss.selected_stream] | 1442 if (decode_all_receive_streams) { |
| 1413 .rtp.ulpfec.red_payload_type = | 1443 for (auto it = video_receive_configs_.begin(); |
| 1414 video_send_config_.rtp.ulpfec.red_payload_type; | 1444 it != video_receive_configs_.end(); ++it) { |
| 1415 video_receive_configs_[params_.ss.selected_stream] | 1445 it->rtp.ulpfec.red_payload_type = |
| 1416 .rtp.ulpfec.ulpfec_payload_type = | 1446 video_send_config_.rtp.ulpfec.red_payload_type; |
| 1417 video_send_config_.rtp.ulpfec.ulpfec_payload_type; | 1447 it->rtp.ulpfec.ulpfec_payload_type = |
| 1418 video_receive_configs_[params_.ss.selected_stream] | 1448 video_send_config_.rtp.ulpfec.ulpfec_payload_type; |
| 1419 .rtp.ulpfec.red_rtx_payload_type = | 1449 it->rtp.ulpfec.red_rtx_payload_type = |
| 1420 video_send_config_.rtp.ulpfec.red_rtx_payload_type; | 1450 video_send_config_.rtp.ulpfec.red_rtx_payload_type; |
| 1451 } |
| 1452 } else { |
| 1453 video_receive_configs_[params_.ss.selected_stream] |
| 1454 .rtp.ulpfec.red_payload_type = |
| 1455 video_send_config_.rtp.ulpfec.red_payload_type; |
| 1456 video_receive_configs_[params_.ss.selected_stream] |
| 1457 .rtp.ulpfec.ulpfec_payload_type = |
| 1458 video_send_config_.rtp.ulpfec.ulpfec_payload_type; |
| 1459 video_receive_configs_[params_.ss.selected_stream] |
| 1460 .rtp.ulpfec.red_rtx_payload_type = |
| 1461 video_send_config_.rtp.ulpfec.red_rtx_payload_type; |
| 1462 } |
| 1421 } | 1463 } |
| 1422 } | 1464 } |
| 1423 | 1465 |
| 1424 void VideoQualityTest::SetupThumbnails(Transport* send_transport, | 1466 void VideoQualityTest::SetupThumbnails(Transport* send_transport, |
| 1425 Transport* recv_transport) { | 1467 Transport* recv_transport) { |
| 1426 for (int i = 0; i < params_.num_thumbnails; ++i) { | 1468 for (int i = 0; i < params_.num_thumbnails; ++i) { |
| 1427 thumbnail_encoders_.emplace_back(VP8Encoder::Create()); | 1469 thumbnail_encoders_.emplace_back(VP8Encoder::Create()); |
| 1428 | 1470 |
| 1429 // Thumbnails will be send in the other way: from receiver_call to | 1471 // Thumbnails will be send in the other way: from receiver_call to |
| 1430 // sender_call. | 1472 // sender_call. |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1747 | 1789 |
| 1748 DestroyStreams(); | 1790 DestroyStreams(); |
| 1749 DestroyThumbnailStreams(); | 1791 DestroyThumbnailStreams(); |
| 1750 | 1792 |
| 1751 if (graph_data_output_file) | 1793 if (graph_data_output_file) |
| 1752 fclose(graph_data_output_file); | 1794 fclose(graph_data_output_file); |
| 1753 } | 1795 } |
| 1754 | 1796 |
| 1755 void VideoQualityTest::SetupAudio(int send_channel_id, | 1797 void VideoQualityTest::SetupAudio(int send_channel_id, |
| 1756 int receive_channel_id, | 1798 int receive_channel_id, |
| 1757 Call* call, | |
| 1758 Transport* transport, | 1799 Transport* transport, |
| 1759 AudioReceiveStream** audio_receive_stream) { | 1800 AudioReceiveStream** audio_receive_stream) { |
| 1760 audio_send_config_ = AudioSendStream::Config(transport); | 1801 audio_send_config_ = AudioSendStream::Config(transport); |
| 1761 audio_send_config_.voe_channel_id = send_channel_id; | 1802 audio_send_config_.voe_channel_id = send_channel_id; |
| 1762 audio_send_config_.rtp.ssrc = kAudioSendSsrc; | 1803 audio_send_config_.rtp.ssrc = kAudioSendSsrc; |
| 1763 | 1804 |
| 1764 // Add extension to enable audio send side BWE, and allow audio bit rate | 1805 // Add extension to enable audio send side BWE, and allow audio bit rate |
| 1765 // adaptation. | 1806 // adaptation. |
| 1766 audio_send_config_.rtp.extensions.clear(); | 1807 audio_send_config_.rtp.extensions.clear(); |
| 1767 if (params_.call.send_side_bwe) { | 1808 if (params_.call.send_side_bwe) { |
| 1768 audio_send_config_.rtp.extensions.push_back( | 1809 audio_send_config_.rtp.extensions.push_back( |
| 1769 webrtc::RtpExtension(webrtc::RtpExtension::kTransportSequenceNumberUri, | 1810 webrtc::RtpExtension(webrtc::RtpExtension::kTransportSequenceNumberUri, |
| 1770 test::kTransportSequenceNumberExtensionId)); | 1811 test::kTransportSequenceNumberExtensionId)); |
| 1771 audio_send_config_.min_bitrate_bps = kOpusMinBitrateBps; | 1812 audio_send_config_.min_bitrate_bps = kOpusMinBitrateBps; |
| 1772 audio_send_config_.max_bitrate_bps = kOpusBitrateFbBps; | 1813 audio_send_config_.max_bitrate_bps = kOpusBitrateFbBps; |
| 1773 } | 1814 } |
| 1774 audio_send_config_.send_codec_spec = | 1815 audio_send_config_.send_codec_spec = |
| 1775 rtc::Optional<AudioSendStream::Config::SendCodecSpec>( | 1816 rtc::Optional<AudioSendStream::Config::SendCodecSpec>( |
| 1776 {kAudioSendPayloadType, | 1817 {kAudioSendPayloadType, |
| 1777 {"OPUS", 48000, 2, | 1818 {"OPUS", 48000, 2, |
| 1778 {{"usedtx", (params_.audio.dtx ? "1" : "0")}, | 1819 {{"usedtx", (params_.audio.dtx ? "1" : "0")}, |
| 1779 {"stereo", "1"}}}}); | 1820 {"stereo", "1"}}}}); |
| 1780 audio_send_config_.encoder_factory = encoder_factory_; | 1821 audio_send_config_.encoder_factory = encoder_factory_; |
| 1781 audio_send_stream_ = call->CreateAudioSendStream(audio_send_config_); | 1822 audio_send_stream_ = sender_call_->CreateAudioSendStream(audio_send_config_); |
| 1782 | 1823 |
| 1783 AudioReceiveStream::Config audio_config; | 1824 AudioReceiveStream::Config audio_config; |
| 1784 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; | 1825 audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc; |
| 1785 audio_config.rtcp_send_transport = transport; | 1826 audio_config.rtcp_send_transport = transport; |
| 1786 audio_config.voe_channel_id = receive_channel_id; | 1827 audio_config.voe_channel_id = receive_channel_id; |
| 1787 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; | 1828 audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc; |
| 1788 audio_config.rtp.transport_cc = params_.call.send_side_bwe; | 1829 audio_config.rtp.transport_cc = params_.call.send_side_bwe; |
| 1789 audio_config.rtp.extensions = audio_send_config_.rtp.extensions; | 1830 audio_config.rtp.extensions = audio_send_config_.rtp.extensions; |
| 1790 audio_config.decoder_factory = decoder_factory_; | 1831 audio_config.decoder_factory = decoder_factory_; |
| 1791 audio_config.decoder_map = {{kAudioSendPayloadType, {"OPUS", 48000, 2}}}; | 1832 audio_config.decoder_map = {{kAudioSendPayloadType, {"OPUS", 48000, 2}}}; |
| 1792 if (params_.video.enabled && params_.audio.sync_video) | 1833 if (params_.video.enabled && params_.audio.sync_video) |
| 1793 audio_config.sync_group = kSyncGroup; | 1834 audio_config.sync_group = kSyncGroup; |
| 1794 | 1835 |
| 1795 *audio_receive_stream = call->CreateAudioReceiveStream(audio_config); | 1836 *audio_receive_stream = |
| 1837 receiver_call_->CreateAudioReceiveStream(audio_config); |
| 1796 } | 1838 } |
| 1797 | 1839 |
| 1798 void VideoQualityTest::RunWithRenderers(const Params& params) { | 1840 void VideoQualityTest::RunWithRenderers(const Params& params) { |
| 1799 params_ = params; | 1841 params_ = params; |
| 1800 CheckParams(); | 1842 CheckParams(); |
| 1801 | 1843 |
| 1802 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to | 1844 // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to |
| 1803 // match the full stack tests. | 1845 // match the full stack tests. |
| 1804 Call::Config call_config(event_log_.get()); | 1846 Call::Config call_config(event_log_.get()); |
| 1805 call_config.bitrate_config = params_.call.call_bitrate_config; | 1847 call_config.bitrate_config = params_.call.call_bitrate_config; |
| 1806 | 1848 |
| 1807 ::VoiceEngineState voe; | 1849 ::VoiceEngineState voe; |
| 1808 if (params_.audio.enabled) { | 1850 if (params_.audio.enabled) { |
| 1809 CreateVoiceEngine(&voe, decoder_factory_); | 1851 CreateVoiceEngine(&voe, decoder_factory_); |
| 1810 AudioState::Config audio_state_config; | 1852 AudioState::Config audio_state_config; |
| 1811 audio_state_config.voice_engine = voe.voice_engine; | 1853 audio_state_config.voice_engine = voe.voice_engine; |
| 1812 audio_state_config.audio_mixer = AudioMixerImpl::Create(); | 1854 audio_state_config.audio_mixer = AudioMixerImpl::Create(); |
| 1813 call_config.audio_state = AudioState::Create(audio_state_config); | 1855 call_config.audio_state = AudioState::Create(audio_state_config); |
| 1814 } | 1856 } |
| 1815 | 1857 |
| 1816 std::unique_ptr<Call> call(Call::Create(call_config)); | 1858 CreateCalls(call_config, call_config); |
| 1817 | 1859 |
| 1818 // TODO(minyue): consider if this is a good transport even for audio only | 1860 // TODO(minyue): consider if this is a good transport even for audio only |
| 1819 // calls. | 1861 // calls. |
| 1820 test::LayerFilteringTransport transport( | 1862 test::LayerFilteringTransport send_transport( |
| 1821 params.pipe, call.get(), kPayloadTypeVP8, kPayloadTypeVP9, | 1863 params.pipe, sender_call_.get(), kPayloadTypeVP8, kPayloadTypeVP9, |
| 1822 params.video.selected_tl, params_.ss.selected_sl, payload_type_map_); | 1864 params.video.selected_tl, params_.ss.selected_sl, payload_type_map_); |
| 1823 | 1865 |
| 1866 test::DirectTransport recv_transport(params_.pipe, receiver_call_.get(), |
| 1867 payload_type_map_); |
| 1868 |
| 1824 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at | 1869 // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at |
| 1825 // least share as much code as possible. That way this test would also match | 1870 // least share as much code as possible. That way this test would also match |
| 1826 // the full stack tests better. | 1871 // the full stack tests better. |
| 1827 transport.SetReceiver(call->Receiver()); | 1872 send_transport.SetReceiver(receiver_call_->Receiver()); |
| 1873 recv_transport.SetReceiver(sender_call_->Receiver()); |
| 1828 | 1874 |
| 1829 VideoReceiveStream* video_receive_stream = nullptr; | |
| 1830 FlexfecReceiveStream* flexfec_receive_stream = nullptr; | 1875 FlexfecReceiveStream* flexfec_receive_stream = nullptr; |
| 1831 std::unique_ptr<test::VideoRenderer> local_preview; | 1876 std::unique_ptr<test::VideoRenderer> local_preview; |
| 1832 std::unique_ptr<test::VideoRenderer> loopback_video; | 1877 std::vector<std::unique_ptr<test::VideoRenderer>> loopback_renderers_; |
| 1833 if (params_.video.enabled) { | 1878 if (params_.video.enabled) { |
| 1834 // Create video renderers. | 1879 // Create video renderers. |
| 1835 local_preview.reset(test::VideoRenderer::Create( | 1880 local_preview.reset(test::VideoRenderer::Create( |
| 1836 "Local Preview", params_.video.width, params_.video.height)); | 1881 "Local Preview", params_.video.width, params_.video.height)); |
| 1837 | 1882 |
| 1838 size_t stream_id = params_.ss.selected_stream; | 1883 const size_t selected_stream_id = params_.ss.selected_stream; |
| 1839 std::string title = "Loopback Video"; | 1884 const size_t num_streams = params_.ss.streams.size(); |
| 1840 if (params_.ss.streams.size() > 1) { | 1885 |
| 1841 std::ostringstream s; | 1886 if (selected_stream_id == num_streams) { |
| 1842 s << stream_id; | 1887 for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) { |
| 1843 title += " - Stream #" + s.str(); | 1888 std::ostringstream oss; |
| 1889 oss << "Loopback Video - Stream #" << static_cast<int>(stream_id); |
| 1890 loopback_renderers_.emplace_back(test::VideoRenderer::Create( |
| 1891 oss.str().c_str(), params_.ss.streams[stream_id].width, |
| 1892 params_.ss.streams[stream_id].height)); |
| 1893 } |
| 1894 } else { |
| 1895 loopback_renderers_.emplace_back(test::VideoRenderer::Create( |
| 1896 "Loopback Video", params_.ss.streams[selected_stream_id].width, |
| 1897 params_.ss.streams[selected_stream_id].height)); |
| 1844 } | 1898 } |
| 1845 | 1899 |
| 1846 loopback_video.reset(test::VideoRenderer::Create( | 1900 SetupVideo(&send_transport, &recv_transport); |
| 1847 title.c_str(), params_.ss.streams[stream_id].width, | |
| 1848 params_.ss.streams[stream_id].height)); | |
| 1849 | 1901 |
| 1850 SetupVideo(&transport, &transport); | |
| 1851 video_send_config_.pre_encode_callback = local_preview.get(); | 1902 video_send_config_.pre_encode_callback = local_preview.get(); |
| 1852 video_receive_configs_[stream_id].renderer = loopback_video.get(); | 1903 if (selected_stream_id == num_streams) { |
| 1853 if (params_.audio.enabled && params_.audio.sync_video) | 1904 for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) { |
| 1854 video_receive_configs_[stream_id].sync_group = kSyncGroup; | 1905 video_receive_configs_[stream_id].renderer = |
| 1906 loopback_renderers_[stream_id].get(); |
| 1907 if (params_.audio.enabled && params_.audio.sync_video) |
| 1908 video_receive_configs_[stream_id].sync_group = kSyncGroup; |
| 1909 } |
| 1910 } else { |
| 1911 video_receive_configs_[selected_stream_id].renderer = |
| 1912 loopback_renderers_.back().get(); |
| 1913 if (params_.audio.enabled && params_.audio.sync_video) |
| 1914 video_receive_configs_[selected_stream_id].sync_group = kSyncGroup; |
| 1915 } |
| 1855 | 1916 |
| 1856 if (params_.screenshare.enabled) | 1917 if (params_.screenshare.enabled) |
| 1857 SetupScreenshareOrSVC(); | 1918 SetupScreenshareOrSVC(); |
| 1858 | 1919 |
| 1859 video_send_stream_ = call->CreateVideoSendStream( | 1920 CreateFlexfecStreams(); |
| 1860 video_send_config_.Copy(), video_encoder_config_.Copy()); | 1921 CreateVideoStreams(); |
| 1861 if (params_.video.flexfec) { | 1922 |
| 1862 RTC_DCHECK(!flexfec_receive_configs_.empty()); | |
| 1863 flexfec_receive_stream = | |
| 1864 call->CreateFlexfecReceiveStream(flexfec_receive_configs_[0]); | |
| 1865 } | |
| 1866 video_receive_stream = call->CreateVideoReceiveStream( | |
| 1867 video_receive_configs_[stream_id].Copy()); | |
| 1868 CreateCapturer(); | 1923 CreateCapturer(); |
| 1869 video_send_stream_->SetSource(video_capturer_.get(), | 1924 video_send_stream_->SetSource(video_capturer_.get(), |
| 1870 degradation_preference_); | 1925 degradation_preference_); |
| 1871 } | 1926 } |
| 1872 | 1927 |
| 1873 AudioReceiveStream* audio_receive_stream = nullptr; | 1928 AudioReceiveStream* audio_receive_stream = nullptr; |
| 1874 if (params_.audio.enabled) { | 1929 if (params_.audio.enabled) { |
| 1875 SetupAudio(voe.send_channel_id, voe.receive_channel_id, call.get(), | 1930 SetupAudio(voe.send_channel_id, voe.receive_channel_id, &send_transport, |
| 1876 &transport, &audio_receive_stream); | 1931 &audio_receive_stream); |
| 1877 } | 1932 } |
| 1878 | 1933 |
| 1879 StartEncodedFrameLogs(video_receive_stream); | 1934 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1935 StartEncodedFrameLogs(receive_stream); |
| 1880 StartEncodedFrameLogs(video_send_stream_); | 1936 StartEncodedFrameLogs(video_send_stream_); |
| 1881 | 1937 |
| 1882 // Start sending and receiving video. | 1938 // Start sending and receiving video. |
| 1883 if (params_.video.enabled) { | 1939 if (params_.video.enabled) { |
| 1884 if (flexfec_receive_stream) | 1940 if (flexfec_receive_stream) |
| 1885 flexfec_receive_stream->Start(); | 1941 flexfec_receive_stream->Start(); |
| 1886 video_receive_stream->Start(); | 1942 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1943 receive_stream->Start(); |
| 1887 video_send_stream_->Start(); | 1944 video_send_stream_->Start(); |
| 1888 video_capturer_->Start(); | 1945 video_capturer_->Start(); |
| 1889 } | 1946 } |
| 1890 | 1947 |
| 1891 if (params_.audio.enabled) { | 1948 if (params_.audio.enabled) { |
| 1892 // Start receiving audio. | 1949 // Start receiving audio. |
| 1893 audio_receive_stream->Start(); | 1950 audio_receive_stream->Start(); |
| 1894 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); | 1951 EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id)); |
| 1895 | 1952 |
| 1896 // Start sending audio. | 1953 // Start sending audio. |
| 1897 audio_send_stream_->Start(); | 1954 audio_send_stream_->Start(); |
| 1898 EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id)); | 1955 EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id)); |
| 1899 } | 1956 } |
| 1900 | 1957 |
| 1901 test::PressEnterToContinue(); | 1958 test::PressEnterToContinue(); |
| 1902 | 1959 |
| 1903 if (params_.audio.enabled) { | 1960 if (params_.audio.enabled) { |
| 1904 // Stop sending audio. | 1961 // Stop sending audio. |
| 1905 EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id)); | 1962 EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id)); |
| 1906 audio_send_stream_->Stop(); | 1963 audio_send_stream_->Stop(); |
| 1907 | 1964 |
| 1908 // Stop receiving audio. | 1965 // Stop receiving audio. |
| 1909 EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id)); | 1966 EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id)); |
| 1910 audio_receive_stream->Stop(); | 1967 audio_receive_stream->Stop(); |
| 1911 call->DestroyAudioSendStream(audio_send_stream_); | 1968 sender_call_->DestroyAudioSendStream(audio_send_stream_); |
| 1912 call->DestroyAudioReceiveStream(audio_receive_stream); | 1969 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); |
| 1913 } | 1970 } |
| 1914 | 1971 |
| 1915 // Stop receiving and sending video. | 1972 // Stop receiving and sending video. |
| 1916 if (params_.video.enabled) { | 1973 if (params_.video.enabled) { |
| 1917 video_capturer_->Stop(); | 1974 video_capturer_->Stop(); |
| 1918 video_send_stream_->Stop(); | 1975 video_send_stream_->Stop(); |
| 1919 video_receive_stream->Stop(); | 1976 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1977 receive_stream->Stop(); |
| 1920 if (flexfec_receive_stream) { | 1978 if (flexfec_receive_stream) { |
| 1921 flexfec_receive_stream->Stop(); | 1979 flexfec_receive_stream->Stop(); |
| 1922 call->DestroyFlexfecReceiveStream(flexfec_receive_stream); | 1980 receiver_call_->DestroyFlexfecReceiveStream(flexfec_receive_stream); |
| 1923 } | 1981 } |
| 1924 call->DestroyVideoReceiveStream(video_receive_stream); | 1982 for (VideoReceiveStream* receive_stream : video_receive_streams_) |
| 1925 call->DestroyVideoSendStream(video_send_stream_); | 1983 receiver_call_->DestroyVideoReceiveStream(receive_stream); |
| 1984 sender_call_->DestroyVideoSendStream(video_send_stream_); |
| 1926 } | 1985 } |
| 1927 | 1986 |
| 1928 transport.StopSending(); | 1987 send_transport.StopSending(); |
| 1988 recv_transport.StopSending(); |
| 1989 |
| 1929 if (params_.audio.enabled) | 1990 if (params_.audio.enabled) |
| 1930 DestroyVoiceEngine(&voe); | 1991 DestroyVoiceEngine(&voe); |
| 1931 } | 1992 } |
| 1932 | 1993 |
| 1933 void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) { | 1994 void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) { |
| 1934 if (!params_.video.encoded_frame_base_path.empty()) { | 1995 if (!params_.video.encoded_frame_base_path.empty()) { |
| 1935 std::ostringstream str; | 1996 std::ostringstream str; |
| 1936 str << send_logs_++; | 1997 str << send_logs_++; |
| 1937 std::string prefix = | 1998 std::string prefix = |
| 1938 params_.video.encoded_frame_base_path + "." + str.str() + ".send."; | 1999 params_.video.encoded_frame_base_path + "." + str.str() + ".send."; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1949 if (!params_.video.encoded_frame_base_path.empty()) { | 2010 if (!params_.video.encoded_frame_base_path.empty()) { |
| 1950 std::ostringstream str; | 2011 std::ostringstream str; |
| 1951 str << receive_logs_++; | 2012 str << receive_logs_++; |
| 1952 std::string path = | 2013 std::string path = |
| 1953 params_.video.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; | 2014 params_.video.encoded_frame_base_path + "." + str.str() + ".recv.ivf"; |
| 1954 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), | 2015 stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path), |
| 1955 10000000); | 2016 10000000); |
| 1956 } | 2017 } |
| 1957 } | 2018 } |
| 1958 } // namespace webrtc | 2019 } // namespace webrtc |
| OLD | NEW |