Home | History | Annotate | Download | only in tests
      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 "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