Chromium Code Reviews| OLD | NEW |
|---|---|
| 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> | 10 #include <algorithm> |
| 11 #include <list> | 11 #include <list> |
| 12 #include <map> | 12 #include <map> |
| 13 #include <memory> | 13 #include <memory> |
| 14 #include <sstream> | 14 #include <sstream> |
| 15 #include <string> | 15 #include <string> |
| 16 #include <vector> | 16 #include <vector> |
| 17 | 17 |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 19 |
| 20 #include "webrtc/base/checks.h" | 20 #include "webrtc/base/checks.h" |
| 21 #include "webrtc/base/event.h" | 21 #include "webrtc/base/event.h" |
| 22 #include "webrtc/call.h" | 22 #include "webrtc/call.h" |
| 23 #include "webrtc/call/transport_adapter.h" | 23 #include "webrtc/call/transport_adapter.h" |
| 24 #include "webrtc/common_video/include/frame_callback.h" | 24 #include "webrtc/common_video/include/frame_callback.h" |
| 25 #include "webrtc/modules/include/module_common_types.h" | 25 #include "webrtc/modules/include/module_common_types.h" |
| 26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" | 26 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
| 27 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 27 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 28 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | |
| 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" |
| 29 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" | 30 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" |
| 30 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" | 31 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" |
| 31 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" | 32 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" |
| 32 #include "webrtc/modules/video_coding/include/video_coding_defines.h" | 33 #include "webrtc/modules/video_coding/include/video_coding_defines.h" |
| 33 #include "webrtc/system_wrappers/include/metrics.h" | 34 #include "webrtc/system_wrappers/include/metrics.h" |
| 34 #include "webrtc/system_wrappers/include/metrics_default.h" | 35 #include "webrtc/system_wrappers/include/metrics_default.h" |
| 35 #include "webrtc/system_wrappers/include/sleep.h" | 36 #include "webrtc/system_wrappers/include/sleep.h" |
| 36 #include "webrtc/test/call_test.h" | 37 #include "webrtc/test/call_test.h" |
| 37 #include "webrtc/test/direct_transport.h" | 38 #include "webrtc/test/direct_transport.h" |
| (...skipping 2453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2491 | 2492 |
| 2492 private: | 2493 private: |
| 2493 rtc::CriticalSection crit_; | 2494 rtc::CriticalSection crit_; |
| 2494 VideoSendStream* send_stream_; | 2495 VideoSendStream* send_stream_; |
| 2495 uint32_t bitrate_kbps_ GUARDED_BY(crit_); | 2496 uint32_t bitrate_kbps_ GUARDED_BY(crit_); |
| 2496 } test; | 2497 } test; |
| 2497 | 2498 |
| 2498 RunBaseTest(&test); | 2499 RunBaseTest(&test); |
| 2499 } | 2500 } |
| 2500 | 2501 |
| 2502 class MinTransmitBitrateTest : public test::EndToEndTest, | |
|
perkj_webrtc
2016/07/04 07:24:49
Why is this not a VideoSendStream test? What is th
perkj_webrtc
2016/07/04 07:24:49
How about testing padding instead? There are test
sprang_webrtc
2016/07/04 09:08:47
I did that at first, it turned out to flake way to
sprang_webrtc
2016/07/04 09:08:47
I initially had planned to check received padding,
| |
| 2503 public test::FakeEncoder { | |
| 2504 public: | |
| 2505 static const uint32_t kMinTransmitBitrateBps = 400000; | |
| 2506 static const uint32_t kActualEncodeBitrateBps = 40000; | |
| 2507 static const uint32_t kMinFramesToSend = 10; | |
| 2508 | |
| 2509 explicit MinTransmitBitrateTest(bool run_init_phase_without_mtb) | |
|
perkj_webrtc
2016/07/04 07:24:49
bool test_switch_content_type ?
sprang_webrtc
2016/07/04 09:08:47
Done.
| |
| 2510 : EndToEndTest(test::CallTest::kDefaultTimeoutMs), | |
| 2511 FakeEncoder(Clock::GetRealTimeClock()), | |
| 2512 call_(nullptr), | |
| 2513 send_stream_(nullptr), | |
| 2514 frames_sent_(0), | |
| 2515 in_init_phase_(run_init_phase_without_mtb) {} | |
| 2516 | |
| 2517 void OnVideoStreamsCreated( | |
| 2518 VideoSendStream* send_stream, | |
| 2519 const std::vector<VideoReceiveStream*>& receive_streams) override { | |
| 2520 send_stream_ = send_stream; | |
| 2521 } | |
| 2522 | |
| 2523 void ModifyVideoConfigs( | |
| 2524 VideoSendStream::Config* send_config, | |
| 2525 std::vector<VideoReceiveStream::Config>* receive_configs, | |
| 2526 VideoEncoderConfig* encoder_config) override { | |
| 2527 send_config->encoder_settings.encoder = this; | |
| 2528 RTC_DCHECK_EQ(1u, encoder_config->streams.size()); | |
| 2529 encoder_config->streams[0].target_bitrate_bps = kMinTransmitBitrateBps * 2; | |
| 2530 encoder_config->streams[0].max_bitrate_bps = kMinTransmitBitrateBps * 4; | |
| 2531 if (in_init_phase_) { | |
| 2532 encoder_config->min_transmit_bitrate_bps = 0; | |
| 2533 encoder_config->content_type = | |
| 2534 VideoEncoderConfig::ContentType::kRealtimeVideo; | |
| 2535 } else { | |
| 2536 encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps; | |
| 2537 encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen; | |
| 2538 } | |
| 2539 encoder_config_ = *encoder_config; | |
| 2540 } | |
| 2541 | |
| 2542 int32_t SetRates(uint32_t new_target_bitrate, uint32_t framerate) override { | |
| 2543 // Make sure not to trigger on any default zero bitrates. | |
| 2544 if (new_target_bitrate == 0) | |
| 2545 return 0; | |
| 2546 rtc::CritScope lock(&crit_); | |
| 2547 return FakeEncoder::SetRates( | |
| 2548 std::min<uint32_t>(new_target_bitrate, kActualEncodeBitrateBps / 1000), | |
| 2549 framerate); | |
| 2550 } | |
| 2551 | |
| 2552 int32_t Encode(const VideoFrame& input_image, | |
| 2553 const CodecSpecificInfo* codec_specific_info, | |
| 2554 const std::vector<FrameType>* frame_types) override { | |
| 2555 int32_t res = | |
| 2556 FakeEncoder::Encode(input_image, codec_specific_info, frame_types); | |
| 2557 CheckDoneState(); | |
| 2558 return res; | |
| 2559 } | |
| 2560 | |
| 2561 void OnCallsCreated(Call* sender_call, Call* receiver_call) override { | |
| 2562 call_ = sender_call; | |
| 2563 } | |
| 2564 | |
| 2565 void CheckDoneState() { | |
| 2566 rtc::CritScope lock(&crit_); | |
| 2567 | |
| 2568 if (in_init_phase_) | |
| 2569 EXPECT_EQ(0, call_->GetStats().min_transmit_bitrate_bps); | |
| 2570 | |
| 2571 // Wait until at least kMinFramesToSend frames have been encoded, so that | |
| 2572 // we have reliable data. | |
| 2573 if (++frames_sent_ < kMinFramesToSend) | |
| 2574 return; | |
| 2575 | |
| 2576 if (in_init_phase_) { | |
| 2577 // We've sent kMinFramesToSend frames with default configuration, switch | |
| 2578 // to enabling screen content and setting min transmit bitrate. | |
| 2579 frames_sent_ = 0; | |
| 2580 encoder_config_.min_transmit_bitrate_bps = kMinTransmitBitrateBps; | |
| 2581 encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen; | |
| 2582 send_stream_->ReconfigureVideoEncoder(encoder_config_); | |
| 2583 in_init_phase_ = false; | |
| 2584 return; | |
| 2585 } | |
| 2586 | |
| 2587 // Make sure the pacer has been configured with a min transmit bitrate. | |
| 2588 if (call_->GetStats().min_transmit_bitrate_bps > 0) | |
| 2589 observation_complete_.Set(); | |
| 2590 } | |
| 2591 | |
| 2592 void PerformTest() override { | |
| 2593 ASSERT_TRUE(Wait()) << "Timed out waiting for a valid padding bitrate."; | |
| 2594 } | |
| 2595 | |
| 2596 private: | |
| 2597 rtc::CriticalSection crit_; | |
| 2598 Call* call_; | |
| 2599 VideoSendStream* send_stream_; | |
| 2600 VideoEncoderConfig encoder_config_; | |
| 2601 uint32_t frames_sent_ GUARDED_BY(crit_); | |
| 2602 bool in_init_phase_; | |
| 2603 }; | |
| 2604 | |
| 2605 TEST_F(EndToEndTest, RespectsMinTransmitBitrate) { | |
| 2606 MinTransmitBitrateTest test(false); | |
| 2607 RunBaseTest(&test); | |
| 2608 } | |
| 2609 | |
| 2610 TEST_F(EndToEndTest, RespectsMinTransmitBitrateAfterContentSwitch) { | |
| 2611 MinTransmitBitrateTest test(true); | |
| 2612 RunBaseTest(&test); | |
| 2613 } | |
| 2614 | |
| 2501 TEST_F(EndToEndTest, GetStats) { | 2615 TEST_F(EndToEndTest, GetStats) { |
| 2502 static const int kStartBitrateBps = 3000000; | 2616 static const int kStartBitrateBps = 3000000; |
| 2503 static const int kExpectedRenderDelayMs = 20; | 2617 static const int kExpectedRenderDelayMs = 20; |
| 2504 | 2618 |
| 2505 class ReceiveStreamRenderer : public rtc::VideoSinkInterface<VideoFrame> { | 2619 class ReceiveStreamRenderer : public rtc::VideoSinkInterface<VideoFrame> { |
| 2506 public: | 2620 public: |
| 2507 ReceiveStreamRenderer() {} | 2621 ReceiveStreamRenderer() {} |
| 2508 | 2622 |
| 2509 private: | 2623 private: |
| 2510 void OnFrame(const VideoFrame& video_frame) override {} | 2624 void OnFrame(const VideoFrame& video_frame) override {} |
| (...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3558 private: | 3672 private: |
| 3559 bool video_observed_; | 3673 bool video_observed_; |
| 3560 bool audio_observed_; | 3674 bool audio_observed_; |
| 3561 SequenceNumberUnwrapper unwrapper_; | 3675 SequenceNumberUnwrapper unwrapper_; |
| 3562 std::set<int64_t> received_packet_ids_; | 3676 std::set<int64_t> received_packet_ids_; |
| 3563 } test; | 3677 } test; |
| 3564 | 3678 |
| 3565 RunBaseTest(&test); | 3679 RunBaseTest(&test); |
| 3566 } | 3680 } |
| 3567 } // namespace webrtc | 3681 } // namespace webrtc |
| OLD | NEW |