1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 //#define LOG_NDEBUG 0 18 #define LOG_TAG "FrameDropper_test" 19 #include <utils/Log.h> 20 21 #include <gtest/gtest.h> 22 23 #include <media/stagefright/omx/FrameDropper.h> 24 #include <media/stagefright/foundation/ADebug.h> 25 26 namespace android { 27 28 struct TestFrame { 29 int64_t timeUs; 30 bool shouldDrop; 31 }; 32 33 static const TestFrame testFrames20Fps[] = { 34 {1000000, false}, {1050000, false}, {1100000, false}, {1150000, false}, 35 {1200000, false}, {1250000, false}, {1300000, false}, {1350000, false}, 36 {1400000, false}, {1450000, false}, {1500000, false}, {1550000, false}, 37 {1600000, false}, {1650000, false}, {1700000, false}, {1750000, false}, 38 {1800000, false}, {1850000, false}, {1900000, false}, {1950000, false}, 39 }; 40 41 static const TestFrame testFrames30Fps[] = { 42 {1000000, false}, {1033333, false}, {1066667, false}, {1100000, false}, 43 {1133333, false}, {1166667, false}, {1200000, false}, {1233333, false}, 44 {1266667, false}, {1300000, false}, {1333333, false}, {1366667, false}, 45 {1400000, false}, {1433333, false}, {1466667, false}, {1500000, false}, 46 {1533333, false}, {1566667, false}, {1600000, false}, {1633333, false}, 47 }; 48 49 static const TestFrame testFrames40Fps[] = { 50 {1000000, false}, {1025000, true}, {1050000, false}, {1075000, false}, 51 {1100000, false}, {1125000, true}, {1150000, false}, {1175000, false}, 52 {1200000, false}, {1225000, true}, {1250000, false}, {1275000, false}, 53 {1300000, false}, {1325000, true}, {1350000, false}, {1375000, false}, 54 {1400000, false}, {1425000, true}, {1450000, false}, {1475000, false}, 55 }; 56 57 static const TestFrame testFrames60Fps[] = { 58 {1000000, false}, {1016667, true}, {1033333, false}, {1050000, true}, 59 {1066667, false}, {1083333, true}, {1100000, false}, {1116667, true}, 60 {1133333, false}, {1150000, true}, {1166667, false}, {1183333, true}, 61 {1200000, false}, {1216667, true}, {1233333, false}, {1250000, true}, 62 {1266667, false}, {1283333, true}, {1300000, false}, {1316667, true}, 63 }; 64 65 static const TestFrame testFramesVariableFps[] = { 66 // 40fps 67 {1000000, false}, {1025000, true}, {1050000, false}, {1075000, false}, 68 {1100000, false}, {1125000, true}, {1150000, false}, {1175000, false}, 69 {1200000, false}, {1225000, true}, {1250000, false}, {1275000, false}, 70 {1300000, false}, {1325000, true}, {1350000, false}, {1375000, false}, 71 {1400000, false}, {1425000, true}, {1450000, false}, {1475000, false}, 72 // a timestamp jump plus switch to 20fps 73 {2000000, false}, {2050000, false}, {2100000, false}, {2150000, false}, 74 {2200000, false}, {2250000, false}, {2300000, false}, {2350000, false}, 75 {2400000, false}, {2450000, false}, {2500000, false}, {2550000, false}, 76 {2600000, false}, {2650000, false}, {2700000, false}, {2750000, false}, 77 {2800000, false}, {2850000, false}, {2900000, false}, {2950000, false}, 78 // 60fps 79 {2966667, false}, {2983333, true}, {3000000, false}, {3016667, true}, 80 {3033333, false}, {3050000, true}, {3066667, false}, {3083333, true}, 81 {3100000, false}, {3116667, true}, {3133333, false}, {3150000, true}, 82 {3166667, false}, {3183333, true}, {3200000, false}, {3216667, true}, 83 {3233333, false}, {3250000, true}, {3266667, false}, {3283333, true}, 84 }; 85 86 static const int kMaxTestJitterUs = 2000; 87 // return one of 1000, 0, -1000 as jitter. 88 static int GetJitter(size_t i) { 89 return (1 - (i % 3)) * (kMaxTestJitterUs / 2); 90 } 91 92 class FrameDropperTest : public ::testing::Test { 93 public: 94 FrameDropperTest() : mFrameDropper(new FrameDropper()) { 95 EXPECT_EQ(OK, mFrameDropper->setMaxFrameRate(30.0)); 96 } 97 98 protected: 99 void RunTest(const TestFrame* frames, size_t size) { 100 for (size_t i = 0; i < size; ++i) { 101 int jitter = GetJitter(i); 102 int64_t testTimeUs = frames[i].timeUs + jitter; 103 printf("time %lld, testTime %lld, jitter %d\n", 104 (long long)frames[i].timeUs, (long long)testTimeUs, jitter); 105 EXPECT_EQ(frames[i].shouldDrop, mFrameDropper->shouldDrop(testTimeUs)); 106 } 107 } 108 109 sp<FrameDropper> mFrameDropper; 110 }; 111 112 TEST_F(FrameDropperTest, TestInvalidMaxFrameRate) { 113 EXPECT_NE(OK, mFrameDropper->setMaxFrameRate(-1.0)); 114 EXPECT_NE(OK, mFrameDropper->setMaxFrameRate(0)); 115 } 116 117 TEST_F(FrameDropperTest, Test20Fps) { 118 RunTest(testFrames20Fps, ARRAY_SIZE(testFrames20Fps)); 119 } 120 121 TEST_F(FrameDropperTest, Test30Fps) { 122 RunTest(testFrames30Fps, ARRAY_SIZE(testFrames30Fps)); 123 } 124 125 TEST_F(FrameDropperTest, Test40Fps) { 126 RunTest(testFrames40Fps, ARRAY_SIZE(testFrames40Fps)); 127 } 128 129 TEST_F(FrameDropperTest, Test60Fps) { 130 RunTest(testFrames60Fps, ARRAY_SIZE(testFrames60Fps)); 131 } 132 133 TEST_F(FrameDropperTest, TestVariableFps) { 134 RunTest(testFramesVariableFps, ARRAY_SIZE(testFramesVariableFps)); 135 } 136 137 } // namespace android 138