| // Copyright 2021 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <string> |
| |
| #include "starboard/android/shared/video_frame_tracker.h" |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace starboard { |
| namespace android { |
| namespace shared { |
| namespace { |
| |
| TEST(VideoFrameTrackerTest, DroppedFrameCountIsCumulative) { |
| VideoFrameTracker video_frame_tracker(100); |
| |
| video_frame_tracker.OnInputBuffer(10000); |
| video_frame_tracker.OnInputBuffer(20000); |
| video_frame_tracker.OnInputBuffer(30000); |
| video_frame_tracker.OnInputBuffer(40000); |
| video_frame_tracker.OnInputBuffer(50000); |
| video_frame_tracker.OnInputBuffer(60000); |
| video_frame_tracker.OnInputBuffer(70000); |
| video_frame_tracker.OnInputBuffer(80000); |
| |
| video_frame_tracker.OnFrameRendered(10000); |
| video_frame_tracker.OnFrameRendered(20000); |
| // Frame with timestamp 30000 was dropped |
| video_frame_tracker.OnFrameRendered(40000); |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 1); |
| video_frame_tracker.OnFrameRendered(50000); |
| // Frame with timestamp 60000 was dropped |
| video_frame_tracker.OnFrameRendered(70000); |
| // Frame with timestamp 80000 is not rendered and not dropped. |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 2); |
| } |
| |
| TEST(VideoFrameTrackerTest, OnlySkewOverMaxAllowedShouldResultInDroppedFrame) { |
| VideoFrameTracker video_frame_tracker(100); |
| |
| video_frame_tracker.OnInputBuffer(100000); |
| video_frame_tracker.OnInputBuffer(200000); |
| video_frame_tracker.OnInputBuffer(300000); |
| video_frame_tracker.OnInputBuffer(400000); |
| video_frame_tracker.OnInputBuffer(500000); |
| video_frame_tracker.OnInputBuffer(600000); |
| |
| video_frame_tracker.OnFrameRendered(104999); // 4999us late -> not dropped |
| video_frame_tracker.OnFrameRendered(195001); // 4999us early -> not dropped |
| video_frame_tracker.OnFrameRendered(300000); |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 0); |
| |
| video_frame_tracker.OnFrameRendered(394999); // 5001us early -> dropped |
| video_frame_tracker.OnFrameRendered(505001); // 5001us late -> dropped |
| video_frame_tracker.OnFrameRendered(600000); |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 2); |
| } |
| |
| TEST(VideoFrameTrackerTest, MultipleFramesDroppedAreReportedCorrectly) { |
| VideoFrameTracker video_frame_tracker(100); |
| |
| video_frame_tracker.OnInputBuffer(10000); |
| video_frame_tracker.OnInputBuffer(20000); |
| video_frame_tracker.OnInputBuffer(30000); |
| video_frame_tracker.OnInputBuffer(40000); |
| video_frame_tracker.OnInputBuffer(50000); |
| video_frame_tracker.OnInputBuffer(60000); |
| video_frame_tracker.OnInputBuffer(70000); |
| video_frame_tracker.OnInputBuffer(80000); |
| video_frame_tracker.OnInputBuffer(90000); |
| |
| video_frame_tracker.OnFrameRendered(10000); |
| video_frame_tracker.OnFrameRendered(20000); |
| // Frame with timestamp 30000 was dropped. |
| video_frame_tracker.OnFrameRendered(40000); |
| // Frames with timestamp 50000, 60000, 70000, 80000 were dropped. |
| video_frame_tracker.OnFrameRendered(90000); |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 5); |
| } |
| |
| TEST(VideoFrameTrackerTest, RenderQueueIsClearedOnSeek) { |
| VideoFrameTracker video_frame_tracker(100); |
| |
| video_frame_tracker.OnInputBuffer(10000); |
| video_frame_tracker.OnInputBuffer(20000); |
| video_frame_tracker.OnInputBuffer(30000); |
| |
| // These frames are not rendered but due to the seek below should not count as |
| // dropped. |
| video_frame_tracker.OnInputBuffer(40000); |
| video_frame_tracker.OnInputBuffer(50000); |
| video_frame_tracker.OnInputBuffer(60000); |
| |
| video_frame_tracker.OnFrameRendered(10000); |
| // Frame with timestamp 20000 was dropped and should be registered. |
| video_frame_tracker.OnFrameRendered(30000); |
| // Frames 40000, 50000, 60000 were never rendered. |
| |
| const int64_t kSeekToTime = 90'000; // 90ms |
| video_frame_tracker.Seek(kSeekToTime); |
| ASSERT_EQ(kSeekToTime, video_frame_tracker.seek_to_time()); |
| |
| video_frame_tracker.OnInputBuffer(90000); |
| video_frame_tracker.OnInputBuffer(100000); |
| video_frame_tracker.OnInputBuffer(110000); |
| video_frame_tracker.OnInputBuffer(120000); |
| |
| video_frame_tracker.OnFrameRendered(90000); |
| video_frame_tracker.OnFrameRendered(100000); |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 1); |
| } |
| |
| TEST(VideoFrameTrackerTest, UnorderedInputFramesAreHandled) { |
| VideoFrameTracker video_frame_tracker(100); |
| |
| // Order of input frames should not matter as long as they are before the |
| // render timestamp. |
| video_frame_tracker.OnInputBuffer(20000); |
| video_frame_tracker.OnInputBuffer(30000); |
| video_frame_tracker.OnInputBuffer(10000); |
| video_frame_tracker.OnInputBuffer(40000); |
| video_frame_tracker.OnInputBuffer(60000); |
| video_frame_tracker.OnInputBuffer(80000); |
| |
| video_frame_tracker.OnFrameRendered(10000); |
| video_frame_tracker.OnFrameRendered(20000); |
| video_frame_tracker.OnFrameRendered(30000); |
| video_frame_tracker.OnFrameRendered(40000); |
| |
| // Add more input frames after the first frames are rendered. |
| video_frame_tracker.OnInputBuffer(50000); |
| video_frame_tracker.OnInputBuffer(70000); |
| video_frame_tracker.OnInputBuffer(90000); |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 0); |
| |
| video_frame_tracker.OnFrameRendered(50000); |
| video_frame_tracker.OnFrameRendered(60000); |
| video_frame_tracker.OnFrameRendered(70000); |
| video_frame_tracker.OnFrameRendered(80000); |
| |
| EXPECT_EQ(video_frame_tracker.UpdateAndGetDroppedFrames(), 0); |
| } |
| |
| } // namespace |
| } // namespace shared |
| } // namespace android |
| } // namespace starboard |