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

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

Issue 2351633002: Let ViEEncoder handle resolution changes. (Closed)
Patch Set: Fix build on Win Created 4 years, 2 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) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 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 <algorithm> // max 10 #include <algorithm> // max
(...skipping 19 matching lines...) Expand all
30 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h" 30 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
31 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 31 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
32 #include "webrtc/system_wrappers/include/sleep.h" 32 #include "webrtc/system_wrappers/include/sleep.h"
33 #include "webrtc/test/call_test.h" 33 #include "webrtc/test/call_test.h"
34 #include "webrtc/test/configurable_frame_size_encoder.h" 34 #include "webrtc/test/configurable_frame_size_encoder.h"
35 #include "webrtc/test/fake_texture_frame.h" 35 #include "webrtc/test/fake_texture_frame.h"
36 #include "webrtc/test/frame_generator.h" 36 #include "webrtc/test/frame_generator.h"
37 #include "webrtc/test/frame_utils.h" 37 #include "webrtc/test/frame_utils.h"
38 #include "webrtc/test/null_transport.h" 38 #include "webrtc/test/null_transport.h"
39 #include "webrtc/test/testsupport/perf_test.h" 39 #include "webrtc/test/testsupport/perf_test.h"
40
40 #include "webrtc/video/send_statistics_proxy.h" 41 #include "webrtc/video/send_statistics_proxy.h"
41 #include "webrtc/video_frame.h" 42 #include "webrtc/video_frame.h"
42 #include "webrtc/video_send_stream.h" 43 #include "webrtc/video_send_stream.h"
43 44
44 namespace webrtc { 45 namespace webrtc {
45 46
46 enum VideoFormat { kGeneric, kVP8, }; 47 enum VideoFormat { kGeneric, kVP8, };
47 48
48 void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1, 49 void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
49 const std::vector<VideoFrame>& frames2); 50 const std::vector<VideoFrame>& frames2);
(...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 void OnVideoStreamsCreated( 902 void OnVideoStreamsCreated(
902 VideoSendStream* send_stream, 903 VideoSendStream* send_stream,
903 const std::vector<VideoReceiveStream*>& receive_streams) override { 904 const std::vector<VideoReceiveStream*>& receive_streams) override {
904 stream_ = send_stream; 905 stream_ = send_stream;
905 } 906 }
906 907
907 void ModifyVideoConfigs( 908 void ModifyVideoConfigs(
908 VideoSendStream::Config* send_config, 909 VideoSendStream::Config* send_config,
909 std::vector<VideoReceiveStream::Config>* receive_configs, 910 std::vector<VideoReceiveStream::Config>* receive_configs,
910 VideoEncoderConfig* encoder_config) override { 911 VideoEncoderConfig* encoder_config) override {
912 RTC_DCHECK_EQ(1u, encoder_config->number_of_streams);
911 transport_adapter_.reset( 913 transport_adapter_.reset(
912 new internal::TransportAdapter(send_config->send_transport)); 914 new internal::TransportAdapter(send_config->send_transport));
913 transport_adapter_->Enable(); 915 transport_adapter_->Enable();
914 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 916 send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
915 send_config->pre_encode_callback = this; 917 send_config->pre_encode_callback = this;
916 send_config->suspend_below_min_bitrate = true; 918 send_config->suspend_below_min_bitrate = true;
917 int min_bitrate_bps = encoder_config->streams[0].min_bitrate_bps; 919 int min_bitrate_bps =
920 test::DefaultVideoStreamFactory::kDefaultMinBitratePerStream[0];
918 set_low_remb_bps(min_bitrate_bps - 10000); 921 set_low_remb_bps(min_bitrate_bps - 10000);
919 int threshold_window = std::max(min_bitrate_bps / 10, 20000); 922 int threshold_window = std::max(min_bitrate_bps / 10, 20000);
920 ASSERT_GT(encoder_config->streams[0].max_bitrate_bps, 923 ASSERT_GT(encoder_config->max_bitrate_bps,
921 min_bitrate_bps + threshold_window + 5000); 924 min_bitrate_bps + threshold_window + 5000);
922 set_high_remb_bps(min_bitrate_bps + threshold_window + 5000); 925 set_high_remb_bps(min_bitrate_bps + threshold_window + 5000);
923 } 926 }
924 927
925 void PerformTest() override { 928 void PerformTest() override {
926 EXPECT_TRUE(Wait()) << "Timed out during suspend-below-min-bitrate test."; 929 EXPECT_TRUE(Wait()) << "Timed out during suspend-below-min-bitrate test.";
927 } 930 }
928 931
929 enum TestState { 932 enum TestState {
930 kBeforeSuspend, 933 kBeforeSuspend,
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1199 void OnVideoStreamsCreated( 1202 void OnVideoStreamsCreated(
1200 VideoSendStream* send_stream, 1203 VideoSendStream* send_stream,
1201 const std::vector<VideoReceiveStream*>& receive_streams) override { 1204 const std::vector<VideoReceiveStream*>& receive_streams) override {
1202 send_stream_ = send_stream; 1205 send_stream_ = send_stream;
1203 } 1206 }
1204 1207
1205 void ModifyVideoConfigs( 1208 void ModifyVideoConfigs(
1206 VideoSendStream::Config* send_config, 1209 VideoSendStream::Config* send_config,
1207 std::vector<VideoReceiveStream::Config>* receive_configs, 1210 std::vector<VideoReceiveStream::Config>* receive_configs,
1208 VideoEncoderConfig* encoder_config) override { 1211 VideoEncoderConfig* encoder_config) override {
1209 RTC_DCHECK_EQ(1u, encoder_config->streams.size()); 1212 RTC_DCHECK_EQ(1u, encoder_config->number_of_streams);
1210 if (running_without_padding_) { 1213 if (running_without_padding_) {
1211 encoder_config->min_transmit_bitrate_bps = 0; 1214 encoder_config->min_transmit_bitrate_bps = 0;
1212 encoder_config->content_type = 1215 encoder_config->content_type =
1213 VideoEncoderConfig::ContentType::kRealtimeVideo; 1216 VideoEncoderConfig::ContentType::kRealtimeVideo;
1214 } else { 1217 } else {
1215 encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps; 1218 encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps;
1216 encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen; 1219 encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
1217 } 1220 }
1218 encoder_config_ = encoder_config->Copy(); 1221 encoder_config_ = encoder_config->Copy();
1219 } 1222 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrate) { 1270 TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrate) {
1268 MaxPaddingSetTest test(false); 1271 MaxPaddingSetTest test(false);
1269 RunBaseTest(&test); 1272 RunBaseTest(&test);
1270 } 1273 }
1271 1274
1272 TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrateAfterContentSwitch) { 1275 TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrateAfterContentSwitch) {
1273 MaxPaddingSetTest test(true); 1276 MaxPaddingSetTest test(true);
1274 RunBaseTest(&test); 1277 RunBaseTest(&test);
1275 } 1278 }
1276 1279
1280 // This test verifies that new frame sizes reconfigures encoders even though not
1281 // (yet) sending. The purpose of this is to permit encoding as quickly as
1282 // possible once we start sending. Likely the frames being input are from the
1283 // same source that will be sent later, which just means that we're ready
1284 // earlier.
1285 TEST_F(VideoSendStreamTest,
1286 EncoderReconfigureOnResolutionChangeWhenNotSending) {
1287 class EncoderObserver : public test::FakeEncoder {
1288 public:
1289 EncoderObserver()
1290 : FakeEncoder(Clock::GetRealTimeClock()),
1291 expect_resolution_set_(false, false),
1292 expected_width_(0),
1293 expected_height_(0) {}
1294
1295 void WaitForResolution(int width, int height) {
1296 {
1297 rtc::CritScope lock(&crit_);
1298 expected_width_ = width;
1299 expected_height_ = height;
1300 }
1301 EXPECT_TRUE(
1302 expect_resolution_set_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
sprang_webrtc 2016/09/28 15:51:43 Technically, you should verify that you actually w
perkj_webrtc 2016/09/29 15:05:17 rewritten.
1303 }
1304
1305 private:
1306 int32_t InitEncode(const VideoCodec* config,
1307 int32_t number_of_cores,
1308 size_t max_payload_size) override {
1309 rtc::CritScope lock(&crit_);
1310 if (expected_width_ == config->width &&
1311 expected_height_ == config->height)
1312 expect_resolution_set_.Set();
sprang_webrtc 2016/09/28 15:51:43 nit: {}
perkj_webrtc 2016/09/29 15:05:17 rewritten
1313 return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
1314 }
1315
1316 int32_t Encode(const VideoFrame& input_image,
1317 const CodecSpecificInfo* codec_specific_info,
1318 const std::vector<FrameType>* frame_types) override {
1319 ADD_FAILURE()
1320 << "Unexpected Encode call since the send stream is not started";
1321 return 0;
1322 }
1323
1324 rtc::CriticalSection crit_;
1325 rtc::Event expect_resolution_set_;
1326 int expected_width_ GUARDED_BY(&crit_);
1327 int expected_height_ GUARDED_BY(&crit_);
1328 };
1329
1330 CreateSenderCall(Call::Config());
1331 test::NullTransport transport;
1332 CreateSendConfig(1, 0, &transport);
1333 EncoderObserver encoder;
1334 video_send_config_.encoder_settings.encoder = &encoder;
1335 CreateVideoStreams();
1336 CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
1337 kDefaultHeight);
1338 frame_generator_capturer_->Start();
1339
1340 encoder.WaitForResolution(kDefaultWidth, kDefaultHeight);
1341 frame_generator_capturer_->ChangeResolution(kDefaultWidth * 2,
1342 kDefaultHeight * 2);
1343 encoder.WaitForResolution(kDefaultWidth * 2, kDefaultHeight * 2);
1344 DestroyStreams();
1345 }
1346
1277 TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) { 1347 TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
1278 class StartBitrateObserver : public test::FakeEncoder { 1348 class StartBitrateObserver : public test::FakeEncoder {
1279 public: 1349 public:
1280 StartBitrateObserver() 1350 StartBitrateObserver()
1281 : FakeEncoder(Clock::GetRealTimeClock()), 1351 : FakeEncoder(Clock::GetRealTimeClock()),
1282 start_bitrate_changed_(false, false), 1352 start_bitrate_changed_(false, false),
1283 start_bitrate_kbps_(0) {} 1353 start_bitrate_kbps_(0) {}
1284 int32_t InitEncode(const VideoCodec* config, 1354 int32_t InitEncode(const VideoCodec* config,
1285 int32_t number_of_cores, 1355 int32_t number_of_cores,
1286 size_t max_payload_size) override { 1356 size_t max_payload_size) override {
(...skipping 25 matching lines...) Expand all
1312 rtc::Event start_bitrate_changed_; 1382 rtc::Event start_bitrate_changed_;
1313 int start_bitrate_kbps_ GUARDED_BY(crit_); 1383 int start_bitrate_kbps_ GUARDED_BY(crit_);
1314 }; 1384 };
1315 1385
1316 CreateSenderCall(Call::Config()); 1386 CreateSenderCall(Call::Config());
1317 1387
1318 test::NullTransport transport; 1388 test::NullTransport transport;
1319 CreateSendConfig(1, 0, &transport); 1389 CreateSendConfig(1, 0, &transport);
1320 1390
1321 Call::Config::BitrateConfig bitrate_config; 1391 Call::Config::BitrateConfig bitrate_config;
1322 bitrate_config.start_bitrate_bps = 1392 bitrate_config.start_bitrate_bps = 2 * video_encoder_config_.max_bitrate_bps;
1323 2 * video_encoder_config_.streams[0].max_bitrate_bps;
1324 sender_call_->SetBitrateConfig(bitrate_config); 1393 sender_call_->SetBitrateConfig(bitrate_config);
1325 1394
1326 StartBitrateObserver encoder; 1395 StartBitrateObserver encoder;
1327 video_send_config_.encoder_settings.encoder = &encoder; 1396 video_send_config_.encoder_settings.encoder = &encoder;
1397 // Since this test does not use a capturer, set |internal_source| = true.
1398 // Encoder configuration is otherwise updated on the next video frame.
1399 video_send_config_.encoder_settings.internal_source = true;
1328 1400
1329 CreateVideoStreams(); 1401 CreateVideoStreams();
1330 1402
1331 EXPECT_TRUE(encoder.WaitForStartBitrate()); 1403 EXPECT_TRUE(encoder.WaitForStartBitrate());
1332 EXPECT_EQ(video_encoder_config_.streams[0].max_bitrate_bps / 1000, 1404 EXPECT_EQ(video_encoder_config_.max_bitrate_bps / 1000,
1333 encoder.GetStartBitrateKbps()); 1405 encoder.GetStartBitrateKbps());
1334 1406
1335 video_encoder_config_.streams[0].max_bitrate_bps = 1407 video_encoder_config_.max_bitrate_bps = 2 * bitrate_config.start_bitrate_bps;
1336 2 * bitrate_config.start_bitrate_bps;
1337 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy()); 1408 video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy());
1338 1409
1339 // New bitrate should be reconfigured above the previous max. As there's no 1410 // New bitrate should be reconfigured above the previous max. As there's no
1340 // network connection this shouldn't be flaky, as no bitrate should've been 1411 // network connection this shouldn't be flaky, as no bitrate should've been
1341 // reported in between. 1412 // reported in between.
1342 EXPECT_TRUE(encoder.WaitForStartBitrate()); 1413 EXPECT_TRUE(encoder.WaitForStartBitrate());
1343 EXPECT_EQ(bitrate_config.start_bitrate_bps / 1000, 1414 EXPECT_EQ(bitrate_config.start_bitrate_bps / 1000,
1344 encoder.GetStartBitrateKbps()); 1415 encoder.GetStartBitrateKbps());
1345 1416
1346 DestroyStreams(); 1417 DestroyStreams();
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 1523
1453 test::NullTransport transport; 1524 test::NullTransport transport;
1454 CreateSendConfig(1, 0, &transport); 1525 CreateSendConfig(1, 0, &transport);
1455 FrameObserver observer; 1526 FrameObserver observer;
1456 video_send_config_.pre_encode_callback = &observer; 1527 video_send_config_.pre_encode_callback = &observer;
1457 CreateVideoStreams(); 1528 CreateVideoStreams();
1458 1529
1459 // Prepare five input frames. Send ordinary VideoFrame and texture frames 1530 // Prepare five input frames. Send ordinary VideoFrame and texture frames
1460 // alternatively. 1531 // alternatively.
1461 std::vector<VideoFrame> input_frames; 1532 std::vector<VideoFrame> input_frames;
1462 int width = static_cast<int>(video_encoder_config_.streams[0].width); 1533 int width = 168;
1463 int height = static_cast<int>(video_encoder_config_.streams[0].height); 1534 int height = 132;
1535
1464 test::FakeNativeHandle* handle1 = new test::FakeNativeHandle(); 1536 test::FakeNativeHandle* handle1 = new test::FakeNativeHandle();
1465 test::FakeNativeHandle* handle2 = new test::FakeNativeHandle(); 1537 test::FakeNativeHandle* handle2 = new test::FakeNativeHandle();
1466 test::FakeNativeHandle* handle3 = new test::FakeNativeHandle(); 1538 test::FakeNativeHandle* handle3 = new test::FakeNativeHandle();
1467 input_frames.push_back(test::FakeNativeHandle::CreateFrame( 1539 input_frames.push_back(test::FakeNativeHandle::CreateFrame(
1468 handle1, width, height, 1, 1, kVideoRotation_0)); 1540 handle1, width, height, 1, 1, kVideoRotation_0));
1469 input_frames.push_back(test::FakeNativeHandle::CreateFrame( 1541 input_frames.push_back(test::FakeNativeHandle::CreateFrame(
1470 handle2, width, height, 2, 2, kVideoRotation_0)); 1542 handle2, width, height, 2, 2, kVideoRotation_0));
1471 input_frames.push_back(CreateVideoFrame(width, height, 3)); 1543 input_frames.push_back(CreateVideoFrame(width, height, 3));
1472 input_frames.push_back(CreateVideoFrame(width, height, 4)); 1544 input_frames.push_back(CreateVideoFrame(width, height, 4));
1473 input_frames.push_back(test::FakeNativeHandle::CreateFrame( 1545 input_frames.push_back(test::FakeNativeHandle::CreateFrame(
1474 handle3, width, height, 5, 5, kVideoRotation_0)); 1546 handle3, width, height, 5, 5, kVideoRotation_0));
1475 1547
1476 video_send_stream_->Start(); 1548 video_send_stream_->Start();
1477 test::FrameForwarder forwarder; 1549 test::FrameForwarder forwarder;
1478 video_send_stream_->SetSource(&forwarder); 1550 video_send_stream_->SetSource(&forwarder);
1479 for (size_t i = 0; i < input_frames.size(); i++) { 1551 for (size_t i = 0; i < input_frames.size(); i++) {
1480 forwarder.IncomingCapturedFrame(input_frames[i]); 1552 forwarder.IncomingCapturedFrame(input_frames[i]);
1481 // Do not send the next frame too fast, so the frame dropper won't drop it.
1482 if (i < input_frames.size() - 1)
1483 SleepMs(1000 / video_encoder_config_.streams[0].max_framerate);
1484 // Wait until the output frame is received before sending the next input 1553 // Wait until the output frame is received before sending the next input
1485 // frame. Or the previous input frame may be replaced without delivering. 1554 // frame. Or the previous input frame may be replaced without delivering.
1486 observer.WaitOutputFrame(); 1555 observer.WaitOutputFrame();
1487 } 1556 }
1488 video_send_stream_->Stop(); 1557 video_send_stream_->Stop();
1489 video_send_stream_->SetSource(nullptr); 1558 video_send_stream_->SetSource(nullptr);
1490 1559
1491 // Test if the input and output frames are the same. render_time_ms and 1560 // Test if the input and output frames are the same. render_time_ms and
1492 // timestamp are not compared because capturer sets those values. 1561 // timestamp are not compared because capturer sets those values.
1493 ExpectEqualFramesVector(input_frames, observer.output_frames()); 1562 ExpectEqualFramesVector(input_frames, observer.output_frames());
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 void ModifyVideoConfigs( 1669 void ModifyVideoConfigs(
1601 VideoSendStream::Config* send_config, 1670 VideoSendStream::Config* send_config,
1602 std::vector<VideoReceiveStream::Config>* receive_configs, 1671 std::vector<VideoReceiveStream::Config>* receive_configs,
1603 VideoEncoderConfig* encoder_config) override { 1672 VideoEncoderConfig* encoder_config) override {
1604 send_config->encoder_settings.encoder = this; 1673 send_config->encoder_settings.encoder = this;
1605 encoder_config_ = encoder_config->Copy(); 1674 encoder_config_ = encoder_config->Copy();
1606 } 1675 }
1607 1676
1608 void PerformTest() override { 1677 void PerformTest() override {
1609 EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode."; 1678 EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode.";
1610 EXPECT_EQ(0u, num_releases()); 1679 // Expect |num_releases| == 1 since the encoder has been reconfigured
1680 // once when the first frame is encoded. Not until at that point is the
1681 // frame size known and the encoder can be properly initialized.
1682 EXPECT_EQ(1u, num_releases());
1611 stream_->ReconfigureVideoEncoder(std::move(encoder_config_)); 1683 stream_->ReconfigureVideoEncoder(std::move(encoder_config_));
1612 EXPECT_EQ(0u, num_releases()); 1684 EXPECT_EQ(1u, num_releases());
1613 stream_->Stop(); 1685 stream_->Stop();
1614 // Encoder should not be released before destroying the VideoSendStream. 1686 // Encoder should not be released before destroying the VideoSendStream.
1615 EXPECT_FALSE(IsReleased()); 1687 EXPECT_FALSE(IsReleased());
1616 EXPECT_TRUE(IsReadyForEncode()); 1688 EXPECT_TRUE(IsReadyForEncode());
1617 stream_->Start(); 1689 stream_->Start();
1618 // Sanity check, make sure we still encode frames with this encoder. 1690 // Sanity check, make sure we still encode frames with this encoder.
1619 EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode."; 1691 EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode.";
1620 } 1692 }
1621 1693
1622 rtc::CriticalSection crit_; 1694 rtc::CriticalSection crit_;
1623 VideoSendStream* stream_; 1695 VideoSendStream* stream_;
1624 bool initialized_ GUARDED_BY(crit_); 1696 bool initialized_ GUARDED_BY(crit_);
1625 bool callback_registered_ GUARDED_BY(crit_); 1697 bool callback_registered_ GUARDED_BY(crit_);
1626 size_t num_releases_ GUARDED_BY(crit_); 1698 size_t num_releases_ GUARDED_BY(crit_);
1627 bool released_ GUARDED_BY(crit_); 1699 bool released_ GUARDED_BY(crit_);
1628 VideoEncoderConfig encoder_config_; 1700 VideoEncoderConfig encoder_config_;
1629 } test_encoder; 1701 } test_encoder;
1630 1702
1631 RunBaseTest(&test_encoder); 1703 RunBaseTest(&test_encoder);
1632 1704
1633 EXPECT_TRUE(test_encoder.IsReleased()); 1705 EXPECT_TRUE(test_encoder.IsReleased());
1634 EXPECT_EQ(1u, test_encoder.num_releases()); 1706 EXPECT_EQ(2u, test_encoder.num_releases());
1635 } 1707 }
1636 1708
1637 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) { 1709 TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) {
1638 class VideoCodecConfigObserver : public test::SendTest, 1710 class VideoCodecConfigObserver : public test::SendTest,
1639 public test::FakeEncoder { 1711 public test::FakeEncoder {
1640 public: 1712 public:
1641 VideoCodecConfigObserver() 1713 VideoCodecConfigObserver()
1642 : SendTest(kDefaultTimeoutMs), 1714 : SendTest(kDefaultTimeoutMs),
1643 FakeEncoder(Clock::GetRealTimeClock()), 1715 FakeEncoder(Clock::GetRealTimeClock()),
1644 init_encode_event_(false, false), 1716 init_encode_event_(false, false),
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1707 FakeEncoder(Clock::GetRealTimeClock()), 1779 FakeEncoder(Clock::GetRealTimeClock()),
1708 video_codec_type_(video_codec_type), 1780 video_codec_type_(video_codec_type),
1709 codec_name_(codec_name), 1781 codec_name_(codec_name),
1710 init_encode_event_(false, false), 1782 init_encode_event_(false, false),
1711 num_initializations_(0), 1783 num_initializations_(0),
1712 stream_(nullptr) { 1784 stream_(nullptr) {
1713 memset(&encoder_settings_, 0, sizeof(encoder_settings_)); 1785 memset(&encoder_settings_, 0, sizeof(encoder_settings_));
1714 } 1786 }
1715 1787
1716 private: 1788 private:
1789 class VideoStreamFactory
1790 : public VideoEncoderConfig::VideoStreamFactoryInterface {
1791 public:
1792 VideoStreamFactory() {}
1793
1794 private:
1795 std::vector<VideoStream> CreateEncoderStreams(
1796 int width,
1797 int height,
1798 const VideoEncoderConfig& encoder_config) override {
1799 std::vector<VideoStream> streams =
1800 test::CreateVideoStreams(width, height, encoder_config);
1801 for (size_t i = 0; i < streams.size(); ++i) {
1802 streams[i].temporal_layer_thresholds_bps.resize(
1803 kVideoCodecConfigObserverNumberOfTemporalLayers - 1);
1804 }
1805 return streams;
1806 }
1807 };
1808
1717 void ModifyVideoConfigs( 1809 void ModifyVideoConfigs(
1718 VideoSendStream::Config* send_config, 1810 VideoSendStream::Config* send_config,
1719 std::vector<VideoReceiveStream::Config>* receive_configs, 1811 std::vector<VideoReceiveStream::Config>* receive_configs,
1720 VideoEncoderConfig* encoder_config) override { 1812 VideoEncoderConfig* encoder_config) override {
1721 send_config->encoder_settings.encoder = this; 1813 send_config->encoder_settings.encoder = this;
1722 send_config->encoder_settings.payload_name = codec_name_; 1814 send_config->encoder_settings.payload_name = codec_name_;
1723 1815
1724 for (size_t i = 0; i < encoder_config->streams.size(); ++i) {
1725 encoder_config->streams[i].temporal_layer_thresholds_bps.resize(
1726 kVideoCodecConfigObserverNumberOfTemporalLayers - 1);
1727 }
1728
1729 encoder_config->encoder_specific_settings = GetEncoderSpecificSettings(); 1816 encoder_config->encoder_specific_settings = GetEncoderSpecificSettings();
1817 encoder_config->video_stream_factory =
1818 new rtc::RefCountedObject<VideoStreamFactory>();
1730 encoder_config_ = encoder_config->Copy(); 1819 encoder_config_ = encoder_config->Copy();
1731 } 1820 }
1732 1821
1733 void OnVideoStreamsCreated( 1822 void OnVideoStreamsCreated(
1734 VideoSendStream* send_stream, 1823 VideoSendStream* send_stream,
1735 const std::vector<VideoReceiveStream*>& receive_streams) override { 1824 const std::vector<VideoReceiveStream*>& receive_streams) override {
1736 stream_ = send_stream; 1825 stream_ = send_stream;
1737 } 1826 }
1738 1827
1739 int32_t InitEncode(const VideoCodec* config, 1828 int32_t InitEncode(const VideoCodec* config,
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 rtc::CriticalSection crit_; 2004 rtc::CriticalSection crit_;
1916 size_t rtp_packets_sent_ GUARDED_BY(&crit_); 2005 size_t rtp_packets_sent_ GUARDED_BY(&crit_);
1917 size_t media_bytes_sent_ GUARDED_BY(&crit_); 2006 size_t media_bytes_sent_ GUARDED_BY(&crit_);
1918 } test; 2007 } test;
1919 2008
1920 RunBaseTest(&test); 2009 RunBaseTest(&test);
1921 } 2010 }
1922 2011
1923 TEST_F(VideoSendStreamTest, TranslatesTwoLayerScreencastToTargetBitrate) { 2012 TEST_F(VideoSendStreamTest, TranslatesTwoLayerScreencastToTargetBitrate) {
1924 static const int kScreencastTargetBitrateKbps = 200; 2013 static const int kScreencastTargetBitrateKbps = 200;
2014
2015 class VideoStreamFactory
2016 : public VideoEncoderConfig::VideoStreamFactoryInterface {
2017 public:
2018 VideoStreamFactory() {}
2019
2020 private:
2021 std::vector<VideoStream> CreateEncoderStreams(
2022 int width,
2023 int height,
2024 const VideoEncoderConfig& encoder_config) override {
2025 std::vector<VideoStream> streams =
2026 test::CreateVideoStreams(width, height, encoder_config);
2027 EXPECT_TRUE(streams[0].temporal_layer_thresholds_bps.empty());
2028 streams[0].temporal_layer_thresholds_bps.push_back(
2029 kScreencastTargetBitrateKbps * 1000);
2030 return streams;
2031 }
2032 };
2033
1925 class ScreencastTargetBitrateTest : public test::SendTest, 2034 class ScreencastTargetBitrateTest : public test::SendTest,
1926 public test::FakeEncoder { 2035 public test::FakeEncoder {
1927 public: 2036 public:
1928 ScreencastTargetBitrateTest() 2037 ScreencastTargetBitrateTest()
1929 : SendTest(kDefaultTimeoutMs), 2038 : SendTest(kDefaultTimeoutMs),
1930 test::FakeEncoder(Clock::GetRealTimeClock()) {} 2039 test::FakeEncoder(Clock::GetRealTimeClock()) {}
1931 2040
1932 private: 2041 private:
1933 int32_t InitEncode(const VideoCodec* config, 2042 int32_t InitEncode(const VideoCodec* config,
1934 int32_t number_of_cores, 2043 int32_t number_of_cores,
1935 size_t max_payload_size) override { 2044 size_t max_payload_size) override {
1936 EXPECT_EQ(static_cast<unsigned int>(kScreencastTargetBitrateKbps), 2045 EXPECT_EQ(static_cast<unsigned int>(kScreencastTargetBitrateKbps),
1937 config->targetBitrate); 2046 config->targetBitrate);
1938 observation_complete_.Set(); 2047 observation_complete_.Set();
1939 return test::FakeEncoder::InitEncode( 2048 return test::FakeEncoder::InitEncode(
1940 config, number_of_cores, max_payload_size); 2049 config, number_of_cores, max_payload_size);
1941 } 2050 }
1942 void ModifyVideoConfigs( 2051 void ModifyVideoConfigs(
1943 VideoSendStream::Config* send_config, 2052 VideoSendStream::Config* send_config,
1944 std::vector<VideoReceiveStream::Config>* receive_configs, 2053 std::vector<VideoReceiveStream::Config>* receive_configs,
1945 VideoEncoderConfig* encoder_config) override { 2054 VideoEncoderConfig* encoder_config) override {
1946 send_config->encoder_settings.encoder = this; 2055 send_config->encoder_settings.encoder = this;
1947 EXPECT_EQ(1u, encoder_config->streams.size()); 2056 EXPECT_EQ(1u, encoder_config->number_of_streams);
1948 EXPECT_TRUE( 2057 encoder_config->video_stream_factory =
1949 encoder_config->streams[0].temporal_layer_thresholds_bps.empty()); 2058 new rtc::RefCountedObject<VideoStreamFactory>();
1950 encoder_config->streams[0].temporal_layer_thresholds_bps.push_back(
1951 kScreencastTargetBitrateKbps * 1000);
1952 encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen; 2059 encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
1953 } 2060 }
1954 2061
1955 void PerformTest() override { 2062 void PerformTest() override {
1956 EXPECT_TRUE(Wait()) 2063 EXPECT_TRUE(Wait())
1957 << "Timed out while waiting for the encoder to be initialized."; 2064 << "Timed out while waiting for the encoder to be initialized.";
1958 } 2065 }
1959 } test; 2066 } test;
1960 2067
1961 RunBaseTest(&test); 2068 RunBaseTest(&test);
(...skipping 20 matching lines...) Expand all
1982 num_initializations_(0), 2089 num_initializations_(0),
1983 call_(nullptr), 2090 call_(nullptr),
1984 send_stream_(nullptr) {} 2091 send_stream_(nullptr) {}
1985 2092
1986 private: 2093 private:
1987 int32_t InitEncode(const VideoCodec* codecSettings, 2094 int32_t InitEncode(const VideoCodec* codecSettings,
1988 int32_t numberOfCores, 2095 int32_t numberOfCores,
1989 size_t maxPayloadSize) override { 2096 size_t maxPayloadSize) override {
1990 EXPECT_GE(codecSettings->startBitrate, codecSettings->minBitrate); 2097 EXPECT_GE(codecSettings->startBitrate, codecSettings->minBitrate);
1991 EXPECT_LE(codecSettings->startBitrate, codecSettings->maxBitrate); 2098 EXPECT_LE(codecSettings->startBitrate, codecSettings->maxBitrate);
1992 if (num_initializations_ == 0) { 2099 // First reinitialization happens due to that the frame size is updated.
2100 if (num_initializations_ == 0 || num_initializations_ == 1) {
1993 EXPECT_EQ(static_cast<unsigned int>(kMinBitrateKbps), 2101 EXPECT_EQ(static_cast<unsigned int>(kMinBitrateKbps),
1994 codecSettings->minBitrate); 2102 codecSettings->minBitrate);
1995 EXPECT_EQ(static_cast<unsigned int>(kStartBitrateKbps), 2103 EXPECT_EQ(static_cast<unsigned int>(kStartBitrateKbps),
1996 codecSettings->startBitrate); 2104 codecSettings->startBitrate);
1997 EXPECT_EQ(static_cast<unsigned int>(kMaxBitrateKbps), 2105 EXPECT_EQ(static_cast<unsigned int>(kMaxBitrateKbps),
1998 codecSettings->maxBitrate); 2106 codecSettings->maxBitrate);
1999 observation_complete_.Set(); 2107 observation_complete_.Set();
2000 } else if (num_initializations_ == 1) { 2108 } else if (num_initializations_ == 2) {
2001 EXPECT_EQ(static_cast<unsigned int>(kLowerMaxBitrateKbps), 2109 EXPECT_EQ(static_cast<unsigned int>(kLowerMaxBitrateKbps),
2002 codecSettings->maxBitrate); 2110 codecSettings->maxBitrate);
2003 // The start bitrate should be kept (-1) and capped to the max bitrate. 2111 // The start bitrate should be kept (-1) and capped to the max bitrate.
2004 // Since this is not an end-to-end call no receiver should have been 2112 // Since this is not an end-to-end call no receiver should have been
2005 // returning a REMB that could lower this estimate. 2113 // returning a REMB that could lower this estimate.
2006 EXPECT_EQ(codecSettings->startBitrate, codecSettings->maxBitrate); 2114 EXPECT_EQ(codecSettings->startBitrate, codecSettings->maxBitrate);
2007 } else if (num_initializations_ == 2) { 2115 } else if (num_initializations_ == 3) {
2008 EXPECT_EQ(static_cast<unsigned int>(kIncreasedMaxBitrateKbps), 2116 EXPECT_EQ(static_cast<unsigned int>(kIncreasedMaxBitrateKbps),
2009 codecSettings->maxBitrate); 2117 codecSettings->maxBitrate);
2010 // The start bitrate will be whatever the rate BitRateController 2118 // The start bitrate will be whatever the rate BitRateController
2011 // has currently configured but in the span of the set max and min 2119 // has currently configured but in the span of the set max and min
2012 // bitrate. 2120 // bitrate.
2013 } 2121 }
2014 ++num_initializations_; 2122 ++num_initializations_;
2015 init_encode_event_.Set(); 2123 init_encode_event_.Set();
2016 return FakeEncoder::InitEncode(codecSettings, numberOfCores, 2124 return FakeEncoder::InitEncode(codecSettings, numberOfCores,
2017 maxPayloadSize); 2125 maxPayloadSize);
2018 } 2126 }
2019 2127
2020 int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override { 2128 int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override {
2021 { 2129 {
2022 rtc::CritScope lock(&crit_); 2130 rtc::CritScope lock(&crit_);
2131 if (target_bitrate_ == newBitRate) {
2132 return FakeEncoder::SetRates(newBitRate, frameRate);
2133 }
2023 target_bitrate_ = newBitRate; 2134 target_bitrate_ = newBitRate;
2024 } 2135 }
2025 bitrate_changed_event_.Set(); 2136 bitrate_changed_event_.Set();
2026 return FakeEncoder::SetRates(newBitRate, frameRate); 2137 return FakeEncoder::SetRates(newBitRate, frameRate);
2027 } 2138 }
2028 2139
2029 void WaitForSetRates(uint32_t expected_bitrate) { 2140 void WaitForSetRates(uint32_t expected_bitrate) {
2030 EXPECT_TRUE( 2141 EXPECT_TRUE(
2031 bitrate_changed_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs)) 2142 bitrate_changed_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs))
2032 << "Timed out while waiting encoder rate to be set."; 2143 << "Timed out while waiting encoder rate to be set.";
2033 rtc::CritScope lock(&crit_); 2144 rtc::CritScope lock(&crit_);
2034 EXPECT_EQ(expected_bitrate, target_bitrate_); 2145 EXPECT_EQ(expected_bitrate, target_bitrate_);
2035 } 2146 }
2036 2147
2037 Call::Config GetSenderCallConfig() override { 2148 Call::Config GetSenderCallConfig() override {
2038 Call::Config config; 2149 Call::Config config;
2039 config.bitrate_config.min_bitrate_bps = kMinBitrateKbps * 1000; 2150 config.bitrate_config.min_bitrate_bps = kMinBitrateKbps * 1000;
2040 config.bitrate_config.start_bitrate_bps = kStartBitrateKbps * 1000; 2151 config.bitrate_config.start_bitrate_bps = kStartBitrateKbps * 1000;
2041 config.bitrate_config.max_bitrate_bps = kMaxBitrateKbps * 1000; 2152 config.bitrate_config.max_bitrate_bps = kMaxBitrateKbps * 1000;
2042 return config; 2153 return config;
2043 } 2154 }
2044 2155
2156 class VideoStreamFactory
2157 : public VideoEncoderConfig::VideoStreamFactoryInterface {
2158 public:
2159 explicit VideoStreamFactory(int min_bitrate_bps)
2160 : min_bitrate_bps_(min_bitrate_bps) {}
2161
2162 private:
2163 std::vector<VideoStream> CreateEncoderStreams(
2164 int width,
2165 int height,
2166 const VideoEncoderConfig& encoder_config) override {
2167 std::vector<VideoStream> streams =
2168 test::CreateVideoStreams(width, height, encoder_config);
2169 streams[0].min_bitrate_bps = min_bitrate_bps_;
2170 return streams;
2171 }
2172
2173 const int min_bitrate_bps_;
2174 };
2175
2045 void ModifyVideoConfigs( 2176 void ModifyVideoConfigs(
2046 VideoSendStream::Config* send_config, 2177 VideoSendStream::Config* send_config,
2047 std::vector<VideoReceiveStream::Config>* receive_configs, 2178 std::vector<VideoReceiveStream::Config>* receive_configs,
2048 VideoEncoderConfig* encoder_config) override { 2179 VideoEncoderConfig* encoder_config) override {
2049 send_config->encoder_settings.encoder = this; 2180 send_config->encoder_settings.encoder = this;
2050 // Set bitrates lower/higher than min/max to make sure they are properly 2181 // Set bitrates lower/higher than min/max to make sure they are properly
2051 // capped. 2182 // capped.
2052 encoder_config->streams.front().min_bitrate_bps = kMinBitrateKbps * 1000; 2183 encoder_config->max_bitrate_bps = kMaxBitrateKbps * 1000;
2053 encoder_config->streams.front().max_bitrate_bps = kMaxBitrateKbps * 1000; 2184 // Create a new StreamFactory to be able to set
2185 // |VideoStream.min_bitrate_bps|.
2186 encoder_config->video_stream_factory =
2187 new rtc::RefCountedObject<VideoStreamFactory>(kMinBitrateKbps * 1000);
2054 encoder_config_ = encoder_config->Copy(); 2188 encoder_config_ = encoder_config->Copy();
2055 } 2189 }
2056 2190
2057 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { 2191 void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
2058 call_ = sender_call; 2192 call_ = sender_call;
2059 } 2193 }
2060 2194
2061 void OnVideoStreamsCreated( 2195 void OnVideoStreamsCreated(
2062 VideoSendStream* send_stream, 2196 VideoSendStream* send_stream,
2063 const std::vector<VideoReceiveStream*>& receive_streams) override { 2197 const std::vector<VideoReceiveStream*>& receive_streams) override {
2064 send_stream_ = send_stream; 2198 send_stream_ = send_stream;
2065 } 2199 }
2066 2200
2067 void PerformTest() override { 2201 void PerformTest() override {
2068 ASSERT_TRUE( 2202 ASSERT_TRUE(
2069 init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs)) 2203 init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs))
2070 << "Timed out while waiting for encoder to be configured."; 2204 << "Timed out while waiting for encoder to be configured.";
2071 WaitForSetRates(kStartBitrateKbps); 2205 WaitForSetRates(kStartBitrateKbps);
2072 Call::Config::BitrateConfig bitrate_config; 2206 Call::Config::BitrateConfig bitrate_config;
2073 bitrate_config.start_bitrate_bps = kIncreasedStartBitrateKbps * 1000; 2207 bitrate_config.start_bitrate_bps = kIncreasedStartBitrateKbps * 1000;
2074 bitrate_config.max_bitrate_bps = kIncreasedMaxBitrateKbps * 1000; 2208 bitrate_config.max_bitrate_bps = kIncreasedMaxBitrateKbps * 1000;
2075 call_->SetBitrateConfig(bitrate_config); 2209 call_->SetBitrateConfig(bitrate_config);
2076 // Encoder rate is capped by EncoderConfig max_bitrate_bps. 2210 // Encoder rate is capped by EncoderConfig max_bitrate_bps.
2077 WaitForSetRates(kMaxBitrateKbps); 2211 WaitForSetRates(kMaxBitrateKbps);
2078 2212 encoder_config_.max_bitrate_bps = kLowerMaxBitrateKbps * 1000;
2079 encoder_config_.streams[0].min_bitrate_bps = 0;
2080 encoder_config_.streams[0].max_bitrate_bps = kLowerMaxBitrateKbps * 1000;
2081 send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy()); 2213 send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
2082 ASSERT_TRUE( 2214 ASSERT_TRUE(
2083 init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs)); 2215 init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
2084 EXPECT_EQ(2, num_initializations_) 2216 EXPECT_EQ(2, num_initializations_)
2085 << "Encoder should have been reconfigured with the new value."; 2217 << "Encoder should have been reconfigured with the new value.";
2086 WaitForSetRates(kLowerMaxBitrateKbps); 2218 WaitForSetRates(kLowerMaxBitrateKbps);
2087 2219
2088 encoder_config_.streams[0].target_bitrate_bps = 2220 encoder_config_.max_bitrate_bps = kIncreasedMaxBitrateKbps * 1000;
2089 encoder_config_.streams[0].min_bitrate_bps;
2090 encoder_config_.streams[0].max_bitrate_bps =
2091 kIncreasedMaxBitrateKbps * 1000;
2092 send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy()); 2221 send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
2093 ASSERT_TRUE( 2222 ASSERT_TRUE(
2094 init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs)); 2223 init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
2095 EXPECT_EQ(3, num_initializations_) 2224 EXPECT_EQ(3, num_initializations_)
2096 << "Encoder should have been reconfigured with the new value."; 2225 << "Encoder should have been reconfigured with the new value.";
2097 // Expected target bitrate is the start bitrate set in the call to 2226 // Expected target bitrate is the start bitrate set in the call to
2098 // call_->SetBitrateConfig. 2227 // call_->SetBitrateConfig.
2099 WaitForSetRates(kIncreasedStartBitrateKbps); 2228 WaitForSetRates(kIncreasedStartBitrateKbps);
2100 } 2229 }
2101 2230
2102 rtc::Event init_encode_event_; 2231 rtc::Event init_encode_event_;
2103 rtc::Event bitrate_changed_event_; 2232 rtc::Event bitrate_changed_event_;
2104 rtc::CriticalSection crit_; 2233 rtc::CriticalSection crit_;
2105 uint32_t target_bitrate_ GUARDED_BY(&crit_); 2234 uint32_t target_bitrate_ GUARDED_BY(&crit_);
2235
2106 int num_initializations_; 2236 int num_initializations_;
2107 webrtc::Call* call_; 2237 webrtc::Call* call_;
2108 webrtc::VideoSendStream* send_stream_; 2238 webrtc::VideoSendStream* send_stream_;
2109 webrtc::VideoEncoderConfig encoder_config_; 2239 webrtc::VideoEncoderConfig encoder_config_;
2110 } test; 2240 } test;
2111 2241
2112 RunBaseTest(&test); 2242 RunBaseTest(&test);
2113 } 2243 }
2114 2244
2115 TEST_F(VideoSendStreamTest, ReportsSentResolution) { 2245 TEST_F(VideoSendStreamTest, ReportsSentResolution) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2151 } 2281 }
2152 2282
2153 observation_complete_.Set(); 2283 observation_complete_.Set();
2154 return 0; 2284 return 0;
2155 } 2285 }
2156 void ModifyVideoConfigs( 2286 void ModifyVideoConfigs(
2157 VideoSendStream::Config* send_config, 2287 VideoSendStream::Config* send_config,
2158 std::vector<VideoReceiveStream::Config>* receive_configs, 2288 std::vector<VideoReceiveStream::Config>* receive_configs,
2159 VideoEncoderConfig* encoder_config) override { 2289 VideoEncoderConfig* encoder_config) override {
2160 send_config->encoder_settings.encoder = this; 2290 send_config->encoder_settings.encoder = this;
2161 EXPECT_EQ(kNumStreams, encoder_config->streams.size()); 2291 EXPECT_EQ(kNumStreams, encoder_config->number_of_streams);
2162 } 2292 }
2163 2293
2164 size_t GetNumVideoStreams() const override { return kNumStreams; } 2294 size_t GetNumVideoStreams() const override { return kNumStreams; }
2165 2295
2166 void PerformTest() override { 2296 void PerformTest() override {
2167 EXPECT_TRUE(Wait()) 2297 EXPECT_TRUE(Wait())
2168 << "Timed out while waiting for the encoder to send one frame."; 2298 << "Timed out while waiting for the encoder to send one frame.";
2169 VideoSendStream::Stats stats = send_stream_->GetStats(); 2299 VideoSendStream::Stats stats = send_stream_->GetStats();
2170 2300
2171 for (size_t i = 0; i < kNumStreams; ++i) { 2301 for (size_t i = 0; i < kNumStreams; ++i) {
(...skipping 21 matching lines...) Expand all
2193 } 2323 }
2194 2324
2195 #if !defined(RTC_DISABLE_VP9) 2325 #if !defined(RTC_DISABLE_VP9)
2196 class Vp9HeaderObserver : public test::SendTest { 2326 class Vp9HeaderObserver : public test::SendTest {
2197 public: 2327 public:
2198 Vp9HeaderObserver() 2328 Vp9HeaderObserver()
2199 : SendTest(VideoSendStreamTest::kLongTimeoutMs), 2329 : SendTest(VideoSendStreamTest::kLongTimeoutMs),
2200 vp9_encoder_(VP9Encoder::Create()), 2330 vp9_encoder_(VP9Encoder::Create()),
2201 vp9_settings_(VideoEncoder::GetDefaultVp9Settings()), 2331 vp9_settings_(VideoEncoder::GetDefaultVp9Settings()),
2202 packets_sent_(0), 2332 packets_sent_(0),
2203 frames_sent_(0) {} 2333 frames_sent_(0),
2334 expected_width_(0),
2335 expected_height_(0) {}
2204 2336
2205 virtual void ModifyVideoConfigsHook( 2337 virtual void ModifyVideoConfigsHook(
2206 VideoSendStream::Config* send_config, 2338 VideoSendStream::Config* send_config,
2207 std::vector<VideoReceiveStream::Config>* receive_configs, 2339 std::vector<VideoReceiveStream::Config>* receive_configs,
2208 VideoEncoderConfig* encoder_config) {} 2340 VideoEncoderConfig* encoder_config) {}
2209 2341
2210 virtual void InspectHeader(const RTPVideoHeaderVP9& vp9) = 0; 2342 virtual void InspectHeader(const RTPVideoHeaderVP9& vp9) = 0;
2211 2343
2212 private: 2344 private:
2213 const int kVp9PayloadType = 105; 2345 const int kVp9PayloadType = 105;
2214 2346
2347 class VideoStreamFactory
2348 : public VideoEncoderConfig::VideoStreamFactoryInterface {
2349 public:
2350 explicit VideoStreamFactory(size_t number_of_temporal_layers)
2351 : number_of_temporal_layers_(number_of_temporal_layers) {}
2352
2353 private:
2354 std::vector<VideoStream> CreateEncoderStreams(
2355 int width,
2356 int height,
2357 const VideoEncoderConfig& encoder_config) override {
2358 std::vector<VideoStream> streams =
2359 test::CreateVideoStreams(width, height, encoder_config);
2360 streams[0].temporal_layer_thresholds_bps.resize(
2361 number_of_temporal_layers_ - 1);
2362 return streams;
2363 }
2364
2365 const size_t number_of_temporal_layers_;
2366 };
2367
2215 void ModifyVideoConfigs( 2368 void ModifyVideoConfigs(
2216 VideoSendStream::Config* send_config, 2369 VideoSendStream::Config* send_config,
2217 std::vector<VideoReceiveStream::Config>* receive_configs, 2370 std::vector<VideoReceiveStream::Config>* receive_configs,
2218 VideoEncoderConfig* encoder_config) override { 2371 VideoEncoderConfig* encoder_config) override {
2219 send_config->encoder_settings.encoder = vp9_encoder_.get(); 2372 send_config->encoder_settings.encoder = vp9_encoder_.get();
2220 send_config->encoder_settings.payload_name = "VP9"; 2373 send_config->encoder_settings.payload_name = "VP9";
2221 send_config->encoder_settings.payload_type = kVp9PayloadType; 2374 send_config->encoder_settings.payload_type = kVp9PayloadType;
2222 ModifyVideoConfigsHook(send_config, receive_configs, encoder_config); 2375 ModifyVideoConfigsHook(send_config, receive_configs, encoder_config);
2223 encoder_config->encoder_specific_settings = new rtc::RefCountedObject< 2376 encoder_config->encoder_specific_settings = new rtc::RefCountedObject<
2224 VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings_); 2377 VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings_);
2225 EXPECT_EQ(1u, encoder_config->streams.size()); 2378 EXPECT_EQ(1u, encoder_config->number_of_streams);
2226 encoder_config->streams[0].temporal_layer_thresholds_bps.resize( 2379 encoder_config->video_stream_factory =
2227 vp9_settings_.numberOfTemporalLayers - 1); 2380 new rtc::RefCountedObject<VideoStreamFactory>(
2381 vp9_settings_.numberOfTemporalLayers);
2228 encoder_config_ = encoder_config->Copy(); 2382 encoder_config_ = encoder_config->Copy();
2229 } 2383 }
2230 2384
2385 void ModifyVideoCaptureStartResolution(int* width,
2386 int* height,
2387 int* frame_rate) override {
2388 expected_width_ = *width;
2389 expected_height_ = *height;
2390 }
2391
2231 void PerformTest() override { 2392 void PerformTest() override {
2232 EXPECT_TRUE(Wait()) << "Test timed out waiting for VP9 packet, num frames " 2393 EXPECT_TRUE(Wait()) << "Test timed out waiting for VP9 packet, num frames "
2233 << frames_sent_; 2394 << frames_sent_;
2234 } 2395 }
2235 2396
2236 Action OnSendRtp(const uint8_t* packet, size_t length) override { 2397 Action OnSendRtp(const uint8_t* packet, size_t length) override {
2237 RTPHeader header; 2398 RTPHeader header;
2238 EXPECT_TRUE(parser_->Parse(packet, length, &header)); 2399 EXPECT_TRUE(parser_->Parse(packet, length, &header));
2239 2400
2240 EXPECT_EQ(kVp9PayloadType, header.payloadType); 2401 EXPECT_EQ(kVp9PayloadType, header.payloadType);
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
2410 // +-+-+-+-+-+-+-+-+ 2571 // +-+-+-+-+-+-+-+-+
2411 // N_G: | T |U| R |-|-| N_G times 2572 // N_G: | T |U| R |-|-| N_G times
2412 // +-+-+-+-+-+-+-+-+ 2573 // +-+-+-+-+-+-+-+-+
2413 // | P_DIFF | R times 2574 // | P_DIFF | R times
2414 // +-+-+-+-+-+-+-+-+ 2575 // +-+-+-+-+-+-+-+-+
2415 void VerifySsData(const RTPVideoHeaderVP9& vp9) const { 2576 void VerifySsData(const RTPVideoHeaderVP9& vp9) const {
2416 EXPECT_TRUE(vp9.ss_data_available); // V 2577 EXPECT_TRUE(vp9.ss_data_available); // V
2417 EXPECT_EQ(vp9_settings_.numberOfSpatialLayers, // N_S + 1 2578 EXPECT_EQ(vp9_settings_.numberOfSpatialLayers, // N_S + 1
2418 vp9.num_spatial_layers); 2579 vp9.num_spatial_layers);
2419 EXPECT_TRUE(vp9.spatial_layer_resolution_present); // Y:1 2580 EXPECT_TRUE(vp9.spatial_layer_resolution_present); // Y:1
2420 size_t expected_width = encoder_config_.streams[0].width; 2581 int expected_width = expected_width_;
2421 size_t expected_height = encoder_config_.streams[0].height; 2582 int expected_height = expected_height_;
2422 for (int i = static_cast<int>(vp9.num_spatial_layers) - 1; i >= 0; --i) { 2583 for (int i = static_cast<int>(vp9.num_spatial_layers) - 1; i >= 0; --i) {
2423 EXPECT_EQ(expected_width, vp9.width[i]); // WIDTH 2584 EXPECT_EQ(expected_width, vp9.width[i]); // WIDTH
2424 EXPECT_EQ(expected_height, vp9.height[i]); // HEIGHT 2585 EXPECT_EQ(expected_height, vp9.height[i]); // HEIGHT
2425 expected_width /= 2; 2586 expected_width /= 2;
2426 expected_height /= 2; 2587 expected_height /= 2;
2427 } 2588 }
2428 } 2589 }
2429 2590
2430 void CompareConsecutiveFrames(const RTPHeader& header, 2591 void CompareConsecutiveFrames(const RTPHeader& header,
2431 const RTPVideoHeader& video) const { 2592 const RTPVideoHeader& video) const {
(...skipping 23 matching lines...) Expand all
2455 VerifyTl0Idx(vp9); 2616 VerifyTl0Idx(vp9);
2456 } 2617 }
2457 2618
2458 std::unique_ptr<VP9Encoder> vp9_encoder_; 2619 std::unique_ptr<VP9Encoder> vp9_encoder_;
2459 VideoCodecVP9 vp9_settings_; 2620 VideoCodecVP9 vp9_settings_;
2460 webrtc::VideoEncoderConfig encoder_config_; 2621 webrtc::VideoEncoderConfig encoder_config_;
2461 RTPHeader last_header_; 2622 RTPHeader last_header_;
2462 RTPVideoHeaderVP9 last_vp9_; 2623 RTPVideoHeaderVP9 last_vp9_;
2463 size_t packets_sent_; 2624 size_t packets_sent_;
2464 size_t frames_sent_; 2625 size_t frames_sent_;
2626 int expected_width_;
2627 int expected_height_;
2465 }; 2628 };
2466 2629
2467 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl1SLayers) { 2630 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl1SLayers) {
2468 const uint8_t kNumTemporalLayers = 1; 2631 const uint8_t kNumTemporalLayers = 1;
2469 const uint8_t kNumSpatialLayers = 1; 2632 const uint8_t kNumSpatialLayers = 1;
2470 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers); 2633 TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
2471 } 2634 }
2472 2635
2473 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl1SLayers) { 2636 TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl1SLayers) {
2474 const uint8_t kNumTemporalLayers = 2; 2637 const uint8_t kNumTemporalLayers = 2;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2556 static const int kHeight = 4; 2719 static const int kHeight = 4;
2557 class NonFlexibleModeResolution : public Vp9HeaderObserver { 2720 class NonFlexibleModeResolution : public Vp9HeaderObserver {
2558 void ModifyVideoConfigsHook( 2721 void ModifyVideoConfigsHook(
2559 VideoSendStream::Config* send_config, 2722 VideoSendStream::Config* send_config,
2560 std::vector<VideoReceiveStream::Config>* receive_configs, 2723 std::vector<VideoReceiveStream::Config>* receive_configs,
2561 VideoEncoderConfig* encoder_config) override { 2724 VideoEncoderConfig* encoder_config) override {
2562 vp9_settings_.flexibleMode = false; 2725 vp9_settings_.flexibleMode = false;
2563 vp9_settings_.numberOfTemporalLayers = 1; 2726 vp9_settings_.numberOfTemporalLayers = 1;
2564 vp9_settings_.numberOfSpatialLayers = 1; 2727 vp9_settings_.numberOfSpatialLayers = 1;
2565 2728
2566 EXPECT_EQ(1u, encoder_config->streams.size()); 2729 EXPECT_EQ(1u, encoder_config->number_of_streams);
2567 encoder_config->streams[0].width = kWidth;
2568 encoder_config->streams[0].height = kHeight;
2569 } 2730 }
2570 2731
2571 void InspectHeader(const RTPVideoHeaderVP9& vp9_header) override { 2732 void InspectHeader(const RTPVideoHeaderVP9& vp9_header) override {
2572 if (frames_sent_ > kNumFramesToSend) 2733 if (frames_sent_ > kNumFramesToSend)
2573 observation_complete_.Set(); 2734 observation_complete_.Set();
2574 } 2735 }
2736
2737 void ModifyVideoCaptureStartResolution(int* width,
2738 int* height,
2739 int* frame_rate) override {
2740 expected_width_ = kWidth;
2741 expected_height_ = kHeight;
2742 *width = kWidth;
2743 *height = kHeight;
2744 }
2575 } test; 2745 } test;
2576 2746
2577 RunBaseTest(&test); 2747 RunBaseTest(&test);
2578 } 2748 }
2579 2749
2580 TEST_F(VideoSendStreamTest, Vp9FlexModeRefCount) { 2750 TEST_F(VideoSendStreamTest, Vp9FlexModeRefCount) {
2581 class FlexibleMode : public Vp9HeaderObserver { 2751 class FlexibleMode : public Vp9HeaderObserver {
2582 void ModifyVideoConfigsHook( 2752 void ModifyVideoConfigsHook(
2583 VideoSendStream::Config* send_config, 2753 VideoSendStream::Config* send_config,
2584 std::vector<VideoReceiveStream::Config>* receive_configs, 2754 std::vector<VideoReceiveStream::Config>* receive_configs,
(...skipping 12 matching lines...) Expand all
2597 observation_complete_.Set(); 2767 observation_complete_.Set();
2598 } 2768 }
2599 } 2769 }
2600 } test; 2770 } test;
2601 2771
2602 RunBaseTest(&test); 2772 RunBaseTest(&test);
2603 } 2773 }
2604 #endif // !defined(RTC_DISABLE_VP9) 2774 #endif // !defined(RTC_DISABLE_VP9)
2605 2775
2606 } // namespace webrtc 2776 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698