| Index: webrtc/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc
|
| diff --git a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc
|
| index cbbf1e33ada2859201a5f9b8e56602f1dc5fc89f..8a227a23faf8f3c45267e8ef801e1562eefe90aa 100644
|
| --- a/webrtc/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc
|
| +++ b/webrtc/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc
|
| @@ -37,6 +37,14 @@ const int kFrameRate = 5;
|
| const int kSyncPeriodSeconds = 5;
|
| const int kMaxSyncPeriodSeconds = 10;
|
|
|
| +// Expected flags for corresponding temporal layers.
|
| +const int kTl0Flags = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
|
| + VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF;
|
| +const int kTl1Flags =
|
| + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
|
| +const int kTl1SyncFlags = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF |
|
| + VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
|
| +
|
| class ScreenshareLayerTest : public ::testing::Test {
|
| protected:
|
| ScreenshareLayerTest()
|
| @@ -54,7 +62,7 @@ class ScreenshareLayerTest : public ::testing::Test {
|
| return;
|
| layers_->PopulateCodecSpecific(base_sync, vp8_info, timestamp);
|
| ASSERT_NE(-1, frame_size_);
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
| }
|
|
|
| void ConfigureBitrates() {
|
| @@ -103,7 +111,7 @@ class ScreenshareLayerTest : public ::testing::Test {
|
| timestamp += kTimestampDelta5Fps;
|
| layers_->PopulateCodecSpecific(false, &vp8_info, timestamp);
|
| if (vp8_info.temporalIdx != layer) {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
| } else {
|
| return timestamp;
|
| }
|
| @@ -142,7 +150,7 @@ TEST_F(ScreenshareLayerTest, 1Layer) {
|
| EXPECT_EQ(static_cast<uint8_t>(kNoTemporalIdx), vp8_info.temporalIdx);
|
| EXPECT_FALSE(vp8_info.layerSync);
|
| EXPECT_EQ(kNoTl0PicIdx, vp8_info.tl0PicIdx);
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
| flags = layers_->EncodeFlags(timestamp);
|
| EXPECT_EQ(kSingleLayerFlags, flags);
|
| timestamp += kTimestampDelta5Fps;
|
| @@ -150,7 +158,7 @@ TEST_F(ScreenshareLayerTest, 1Layer) {
|
| EXPECT_EQ(static_cast<uint8_t>(kNoTemporalIdx), vp8_info.temporalIdx);
|
| EXPECT_FALSE(vp8_info.layerSync);
|
| EXPECT_EQ(kNoTl0PicIdx, vp8_info.tl0PicIdx);
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
| }
|
|
|
| TEST_F(ScreenshareLayerTest, 2Layer) {
|
| @@ -160,7 +168,7 @@ TEST_F(ScreenshareLayerTest, 2Layer) {
|
| uint8_t expected_tl0_idx = 0;
|
| CodecSpecificInfoVP8 vp8_info;
|
| EncodeFrame(timestamp, false, &vp8_info, &flags);
|
| - EXPECT_EQ(ScreenshareLayers::kTl0Flags, flags);
|
| + EXPECT_EQ(kTl0Flags, flags);
|
| EXPECT_EQ(0, vp8_info.temporalIdx);
|
| EXPECT_FALSE(vp8_info.layerSync);
|
| ++expected_tl0_idx;
|
| @@ -179,7 +187,7 @@ TEST_F(ScreenshareLayerTest, 2Layer) {
|
| // First frame in TL0.
|
| timestamp += kTimestampDelta5Fps;
|
| EncodeFrame(timestamp, false, &vp8_info, &flags);
|
| - EXPECT_EQ(ScreenshareLayers::kTl0Flags, flags);
|
| + EXPECT_EQ(kTl0Flags, flags);
|
| EXPECT_EQ(0, vp8_info.temporalIdx);
|
| EXPECT_FALSE(vp8_info.layerSync);
|
| ++expected_tl0_idx;
|
| @@ -189,14 +197,14 @@ TEST_F(ScreenshareLayerTest, 2Layer) {
|
| timestamp += kTimestampDelta5Fps;
|
| EncodeFrame(timestamp, false, &vp8_info, &flags);
|
| // First frame is sync frame.
|
| - EXPECT_EQ(ScreenshareLayers::kTl1SyncFlags, flags);
|
| + EXPECT_EQ(kTl1SyncFlags, flags);
|
| EXPECT_EQ(1, vp8_info.temporalIdx);
|
| EXPECT_TRUE(vp8_info.layerSync);
|
| EXPECT_EQ(expected_tl0_idx, vp8_info.tl0PicIdx);
|
|
|
| timestamp += kTimestampDelta5Fps;
|
| EncodeFrame(timestamp, false, &vp8_info, &flags);
|
| - EXPECT_EQ(ScreenshareLayers::kTl1Flags, flags);
|
| + EXPECT_EQ(kTl1Flags, flags);
|
| EXPECT_EQ(1, vp8_info.temporalIdx);
|
| EXPECT_FALSE(vp8_info.layerSync);
|
| EXPECT_EQ(expected_tl0_idx, vp8_info.tl0PicIdx);
|
| @@ -236,9 +244,9 @@ TEST_F(ScreenshareLayerTest, 2LayersSyncAfterTimeout) {
|
|
|
| // Simulate TL1 being at least 8 qp steps better.
|
| if (vp8_info.temporalIdx == 0) {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
| } else {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp - 8);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
|
| }
|
|
|
| if (vp8_info.temporalIdx == 1 && vp8_info.layerSync)
|
| @@ -265,9 +273,9 @@ TEST_F(ScreenshareLayerTest, 2LayersSyncAfterSimilarQP) {
|
|
|
| // Simulate TL1 being at least 8 qp steps better.
|
| if (vp8_info.temporalIdx == 0) {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
| } else {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp - 8);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
|
| }
|
|
|
| if (vp8_info.temporalIdx == 1 && vp8_info.layerSync)
|
| @@ -284,13 +292,13 @@ TEST_F(ScreenshareLayerTest, 2LayersSyncAfterSimilarQP) {
|
|
|
| if (vp8_info.temporalIdx == 0) {
|
| // Bump TL0 to same quality as TL1.
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp - 8);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
|
| bumped_tl0_quality = true;
|
| } else {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp - 8);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
|
| if (bumped_tl0_quality) {
|
| EXPECT_TRUE(vp8_info.layerSync);
|
| - EXPECT_EQ(ScreenshareLayers::kTl1SyncFlags, flags);
|
| + EXPECT_EQ(kTl1SyncFlags, flags);
|
| return;
|
| }
|
| }
|
| @@ -336,7 +344,7 @@ TEST_F(ScreenshareLayerTest, AllFitsLayer0) {
|
| for (int i = 0; i < 50; ++i) {
|
| EncodeFrame(timestamp, false, &vp8_info, &flags);
|
| timestamp += kTimestampDelta5Fps;
|
| - EXPECT_EQ(ScreenshareLayers::kTl0Flags, flags);
|
| + EXPECT_EQ(kTl0Flags, flags);
|
| EXPECT_EQ(0, vp8_info.temporalIdx);
|
| }
|
| }
|
| @@ -425,46 +433,46 @@ TEST_F(ScreenshareLayerTest, EncoderDrop) {
|
| timestamp = SkipUntilTl(0, timestamp);
|
|
|
| // Size 0 indicates dropped frame.
|
| - layers_->FrameEncoded(0, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(0, kDefaultQp);
|
| timestamp += kTimestampDelta5Fps;
|
| EXPECT_FALSE(layers_->UpdateConfiguration(&cfg));
|
| - EXPECT_EQ(ScreenshareLayers::kTl0Flags, layers_->EncodeFlags(timestamp));
|
| + EXPECT_EQ(kTl0Flags, layers_->EncodeFlags(timestamp));
|
| layers_->PopulateCodecSpecific(false, &vp8_info, timestamp);
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
|
|
| timestamp = SkipUntilTl(0, timestamp);
|
| EXPECT_TRUE(layers_->UpdateConfiguration(&cfg));
|
| EXPECT_LT(cfg.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
|
|
| layers_->EncodeFlags(timestamp);
|
| timestamp += kTimestampDelta5Fps;
|
| EXPECT_TRUE(layers_->UpdateConfiguration(&cfg));
|
| layers_->PopulateCodecSpecific(false, &vp8_info, timestamp);
|
| EXPECT_EQ(cfg.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
|
|
| // Next drop in TL1.
|
|
|
| timestamp = SkipUntilTl(1, timestamp);
|
| - layers_->FrameEncoded(0, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(0, kDefaultQp);
|
| timestamp += kTimestampDelta5Fps;
|
| EXPECT_FALSE(layers_->UpdateConfiguration(&cfg));
|
| - EXPECT_EQ(ScreenshareLayers::kTl1Flags, layers_->EncodeFlags(timestamp));
|
| + EXPECT_EQ(kTl1Flags, layers_->EncodeFlags(timestamp));
|
| layers_->PopulateCodecSpecific(false, &vp8_info, timestamp);
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
|
|
| timestamp = SkipUntilTl(1, timestamp);
|
| EXPECT_TRUE(layers_->UpdateConfiguration(&cfg));
|
| EXPECT_LT(cfg.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
|
|
| layers_->EncodeFlags(timestamp);
|
| timestamp += kTimestampDelta5Fps;
|
| EXPECT_TRUE(layers_->UpdateConfiguration(&cfg));
|
| layers_->PopulateCodecSpecific(false, &vp8_info, timestamp);
|
| EXPECT_EQ(cfg.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
|
| - layers_->FrameEncoded(frame_size_, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_, kDefaultQp);
|
| }
|
|
|
| TEST_F(ScreenshareLayerTest, RespectsMaxIntervalBetweenFrames) {
|
| @@ -476,9 +484,8 @@ TEST_F(ScreenshareLayerTest, RespectsMaxIntervalBetweenFrames) {
|
| layers_->OnRatesUpdated(kLowBitrateKbps, kLowBitrateKbps, 5);
|
| layers_->UpdateConfiguration(&cfg);
|
|
|
| - EXPECT_EQ(ScreenshareLayers::kTl0Flags,
|
| - layers_->EncodeFlags(kStartTimestamp));
|
| - layers_->FrameEncoded(kLargeFrameSizeBytes, kStartTimestamp, kDefaultQp);
|
| + EXPECT_EQ(kTl0Flags, layers_->EncodeFlags(kStartTimestamp));
|
| + layers_->FrameEncoded(kLargeFrameSizeBytes, kDefaultQp);
|
|
|
| const uint32_t kTwoSecondsLater =
|
| kStartTimestamp + (ScreenshareLayers::kMaxFrameIntervalMs * 90);
|
| @@ -490,8 +497,7 @@ TEST_F(ScreenshareLayerTest, RespectsMaxIntervalBetweenFrames) {
|
| EXPECT_EQ(-1, layers_->EncodeFlags(kTwoSecondsLater));
|
| // More than two seconds has passed since last frame, one should be emitted
|
| // even if bitrate target is then exceeded.
|
| - EXPECT_EQ(ScreenshareLayers::kTl0Flags,
|
| - layers_->EncodeFlags(kTwoSecondsLater + 90));
|
| + EXPECT_EQ(kTl0Flags, layers_->EncodeFlags(kTwoSecondsLater + 90));
|
| }
|
|
|
| TEST_F(ScreenshareLayerTest, UpdatesHistograms) {
|
| @@ -512,22 +518,21 @@ TEST_F(ScreenshareLayerTest, UpdatesHistograms) {
|
|
|
| if (timestamp >= kTimestampDelta5Fps * 5 && !overshoot && flags != -1) {
|
| // Simulate one overshoot.
|
| - layers_->FrameEncoded(0, timestamp, 0);
|
| + layers_->FrameEncoded(0, 0);
|
| overshoot = true;
|
| flags = layers_->EncodeFlags(timestamp);
|
| }
|
|
|
| - if (flags == ScreenshareLayers::kTl0Flags) {
|
| + if (flags == kTl0Flags) {
|
| if (timestamp >= kTimestampDelta5Fps * 20 && !trigger_drop) {
|
| // Simulate a too large frame, to cause frame drop.
|
| - layers_->FrameEncoded(frame_size_ * 5, timestamp, kTl0Qp);
|
| + layers_->FrameEncoded(frame_size_ * 5, kTl0Qp);
|
| trigger_drop = true;
|
| } else {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kTl0Qp);
|
| + layers_->FrameEncoded(frame_size_, kTl0Qp);
|
| }
|
| - } else if (flags == ScreenshareLayers::kTl1Flags ||
|
| - flags == ScreenshareLayers::kTl1SyncFlags) {
|
| - layers_->FrameEncoded(frame_size_, timestamp, kTl1Qp);
|
| + } else if (flags == kTl1Flags || flags == kTl1SyncFlags) {
|
| + layers_->FrameEncoded(frame_size_, kTl1Qp);
|
| } else if (flags == -1) {
|
| dropped_frame = true;
|
| } else {
|
| @@ -593,7 +598,7 @@ TEST_F(ScreenshareLayerTest, RespectsConfiguredFramerate) {
|
| ++num_discarded_frames;
|
| } else {
|
| size_t frame_size_bytes = kDefaultTl0BitrateKbps * kFrameIntervalsMs / 8;
|
| - layers_->FrameEncoded(frame_size_bytes, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_bytes, kDefaultQp);
|
| }
|
| timestamp += kFrameIntervalsMs * 90;
|
| clock_.AdvanceTimeMilliseconds(kFrameIntervalsMs);
|
| @@ -609,7 +614,7 @@ TEST_F(ScreenshareLayerTest, RespectsConfiguredFramerate) {
|
| ++num_discarded_frames;
|
| } else {
|
| size_t frame_size_bytes = kDefaultTl0BitrateKbps * kFrameIntervalsMs / 8;
|
| - layers_->FrameEncoded(frame_size_bytes, timestamp, kDefaultQp);
|
| + layers_->FrameEncoded(frame_size_bytes, kDefaultQp);
|
| }
|
| timestamp += kFrameIntervalsMs * 90 / 2;
|
| clock_.AdvanceTimeMilliseconds(kFrameIntervalsMs / 2);
|
|
|