Bug 1433062 - Unit test VP8TrackEncoder with longer-than-default keyframe interval. r?bryce draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Thu, 25 Jan 2018 16:20:16 +0100
changeset 737999 2d6080508f61856df5ec3cc65b5ec6508f9dc108
parent 737998 d3385311f04d742424852929a6742caf3b8b7dcd
child 738000 26a45777644877ad3752b64f4d864a2cdc1aa91b
push id96822
push userbmo:apehrson@mozilla.com
push dateThu, 25 Jan 2018 15:27:12 +0000
reviewersbryce
bugs1433062
milestone59.0a1
Bug 1433062 - Unit test VP8TrackEncoder with longer-than-default keyframe interval. r?bryce MozReview-Commit-ID: I8cYJooILlS
dom/media/gtest/TestVideoTrackEncoder.cpp
--- a/dom/media/gtest/TestVideoTrackEncoder.cpp
+++ b/dom/media/gtest/TestVideoTrackEncoder.cpp
@@ -1046,16 +1046,105 @@ TEST(VP8VideoTrackEncoder, ShortKeyFrame
   EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 200UL, frames[4]->GetDuration());
   EXPECT_EQ(EncodedFrame::VP8_P_FRAME, frames[4]->GetFrameType());
 
   // [1100ms, 1200ms)
   EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 100UL, frames[5]->GetDuration());
   EXPECT_EQ(EncodedFrame::VP8_I_FRAME, frames[5]->GetFrameType());
 }
 
+// Test that an encoding with a defined key frame interval encodes keyframes
+// as expected. Long here means longer than the default (1s).
+TEST(VP8VideoTrackEncoder, LongKeyFrameInterval)
+{
+  TestVP8TrackEncoder encoder;
+
+  // Give the encoder a keyframe interval of 2000ms.
+  // Pass frames at 0, 600ms, 900ms, 1100ms, 1900ms, 2100ms
+  // Expected keys: ^                ^^^^^^          ^^^^^^
+  YUVBufferGenerator generator;
+  generator.Init(mozilla::gfx::IntSize(640, 480));
+  TimeStamp now = TimeStamp::Now();
+  VideoSegment segment;
+  segment.AppendFrame(generator.GenerateI420Image(),
+                      mozilla::StreamTime(VIDEO_TRACK_RATE / 1000 * 600), // 600ms
+                      generator.GetSize(),
+                      PRINCIPAL_HANDLE_NONE,
+                      false,
+                      now);
+  segment.AppendFrame(generator.GenerateI420Image(),
+                      mozilla::StreamTime(VIDEO_TRACK_RATE / 1000 * 300), // 300ms
+                      generator.GetSize(),
+                      PRINCIPAL_HANDLE_NONE,
+                      false,
+                      now + TimeDuration::FromMilliseconds(600));
+  segment.AppendFrame(generator.GenerateI420Image(),
+                      mozilla::StreamTime(VIDEO_TRACK_RATE / 1000 * 200), // 200ms
+                      generator.GetSize(),
+                      PRINCIPAL_HANDLE_NONE,
+                      false,
+                      now + TimeDuration::FromMilliseconds(900));
+  segment.AppendFrame(generator.GenerateI420Image(),
+                      mozilla::StreamTime(VIDEO_TRACK_RATE / 1000 * 800), // 800ms
+                      generator.GetSize(),
+                      PRINCIPAL_HANDLE_NONE,
+                      false,
+                      now + TimeDuration::FromMilliseconds(1100));
+  segment.AppendFrame(generator.GenerateI420Image(),
+                      mozilla::StreamTime(VIDEO_TRACK_RATE / 1000 * 200), // 200ms
+                      generator.GetSize(),
+                      PRINCIPAL_HANDLE_NONE,
+                      false,
+                      now + TimeDuration::FromMilliseconds(1900));
+  segment.AppendFrame(generator.GenerateI420Image(),
+                      mozilla::StreamTime(VIDEO_TRACK_RATE / 1000 * 100), // 100ms
+                      generator.GetSize(),
+                      PRINCIPAL_HANDLE_NONE,
+                      false,
+                      now + TimeDuration::FromMilliseconds(2100));
+
+  encoder.SetKeyFrameInterval(2000);
+  encoder.SetStartOffset(0);
+  encoder.AppendVideoSegment(Move(segment));
+  encoder.AdvanceCurrentTime(VIDEO_TRACK_RATE / 10 * 22); // 2200ms
+  encoder.NotifyEndOfStream();
+
+  EncodedFrameContainer container;
+  ASSERT_TRUE(NS_SUCCEEDED(encoder.GetEncodedTrack(container)));
+
+  EXPECT_TRUE(encoder.IsEncodingComplete());
+
+  const nsTArray<RefPtr<EncodedFrame>>& frames = container.GetEncodedFrames();
+  ASSERT_EQ(6UL, frames.Length());
+
+  // [0, 600ms)
+  EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 600UL, frames[0]->GetDuration());
+  EXPECT_EQ(EncodedFrame::VP8_I_FRAME, frames[0]->GetFrameType());
+
+  // [600ms, 900ms)
+  EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 300UL, frames[1]->GetDuration());
+  EXPECT_EQ(EncodedFrame::VP8_P_FRAME, frames[1]->GetFrameType());
+
+  // [900ms, 1100ms)
+  EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 200UL, frames[2]->GetDuration());
+  EXPECT_EQ(EncodedFrame::VP8_P_FRAME, frames[2]->GetFrameType());
+
+  // [1100ms, 1900ms)
+  EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 800UL, frames[3]->GetDuration());
+  EXPECT_EQ(EncodedFrame::VP8_I_FRAME, frames[3]->GetFrameType());
+
+  // [1900ms, 2100ms)
+  EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 200UL, frames[4]->GetDuration());
+  EXPECT_EQ(EncodedFrame::VP8_P_FRAME, frames[4]->GetFrameType());
+
+  // [2100ms, 2200ms)
+  EXPECT_EQ(PR_USEC_PER_SEC / 1000 * 100UL, frames[5]->GetDuration());
+  EXPECT_EQ(EncodedFrame::VP8_I_FRAME, frames[5]->GetFrameType());
+}
+
 // EOS test
 TEST(VP8VideoTrackEncoder, EncodeComplete)
 {
   TestVP8TrackEncoder encoder;
 
   // track end notification.
   encoder.NotifyEndOfStream();