FrameDropper_test.cpp revision ee4e1b1a63758941460ae79a064249d3a5189443
137b2b389139ed638831e49708c947863eef631efRonghua Wu/*
237b2b389139ed638831e49708c947863eef631efRonghua Wu * Copyright (C) 2015 The Android Open Source Project
337b2b389139ed638831e49708c947863eef631efRonghua Wu *
437b2b389139ed638831e49708c947863eef631efRonghua Wu * Licensed under the Apache License, Version 2.0 (the "License");
537b2b389139ed638831e49708c947863eef631efRonghua Wu * you may not use this file except in compliance with the License.
637b2b389139ed638831e49708c947863eef631efRonghua Wu * You may obtain a copy of the License at
737b2b389139ed638831e49708c947863eef631efRonghua Wu *
837b2b389139ed638831e49708c947863eef631efRonghua Wu *      http://www.apache.org/licenses/LICENSE-2.0
937b2b389139ed638831e49708c947863eef631efRonghua Wu *
1037b2b389139ed638831e49708c947863eef631efRonghua Wu * Unless required by applicable law or agreed to in writing, software
1137b2b389139ed638831e49708c947863eef631efRonghua Wu * distributed under the License is distributed on an "AS IS" BASIS,
1237b2b389139ed638831e49708c947863eef631efRonghua Wu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1337b2b389139ed638831e49708c947863eef631efRonghua Wu * See the License for the specific language governing permissions and
1437b2b389139ed638831e49708c947863eef631efRonghua Wu * limitations under the License.
1537b2b389139ed638831e49708c947863eef631efRonghua Wu */
1637b2b389139ed638831e49708c947863eef631efRonghua Wu
1737b2b389139ed638831e49708c947863eef631efRonghua Wu//#define LOG_NDEBUG 0
1837b2b389139ed638831e49708c947863eef631efRonghua Wu#define LOG_TAG "FrameDropper_test"
1937b2b389139ed638831e49708c947863eef631efRonghua Wu#include <utils/Log.h>
2037b2b389139ed638831e49708c947863eef631efRonghua Wu
2137b2b389139ed638831e49708c947863eef631efRonghua Wu#include <gtest/gtest.h>
2237b2b389139ed638831e49708c947863eef631efRonghua Wu
2337b2b389139ed638831e49708c947863eef631efRonghua Wu#include "FrameDropper.h"
2437b2b389139ed638831e49708c947863eef631efRonghua Wu#include <media/stagefright/foundation/ADebug.h>
2537b2b389139ed638831e49708c947863eef631efRonghua Wu
2637b2b389139ed638831e49708c947863eef631efRonghua Wunamespace android {
2737b2b389139ed638831e49708c947863eef631efRonghua Wu
2837b2b389139ed638831e49708c947863eef631efRonghua Wustruct TestFrame {
2937b2b389139ed638831e49708c947863eef631efRonghua Wu  int64_t timeUs;
3037b2b389139ed638831e49708c947863eef631efRonghua Wu  bool shouldDrop;
3137b2b389139ed638831e49708c947863eef631efRonghua Wu};
3237b2b389139ed638831e49708c947863eef631efRonghua Wu
3337b2b389139ed638831e49708c947863eef631efRonghua Wustatic const TestFrame testFrames20Fps[] = {
3437b2b389139ed638831e49708c947863eef631efRonghua Wu    {1000000, false}, {1050000, false}, {1100000, false}, {1150000, false},
3537b2b389139ed638831e49708c947863eef631efRonghua Wu    {1200000, false}, {1250000, false}, {1300000, false}, {1350000, false},
3637b2b389139ed638831e49708c947863eef631efRonghua Wu    {1400000, false}, {1450000, false}, {1500000, false}, {1550000, false},
3737b2b389139ed638831e49708c947863eef631efRonghua Wu    {1600000, false}, {1650000, false}, {1700000, false}, {1750000, false},
3837b2b389139ed638831e49708c947863eef631efRonghua Wu    {1800000, false}, {1850000, false}, {1900000, false}, {1950000, false},
3937b2b389139ed638831e49708c947863eef631efRonghua Wu};
4037b2b389139ed638831e49708c947863eef631efRonghua Wu
4137b2b389139ed638831e49708c947863eef631efRonghua Wustatic const TestFrame testFrames30Fps[] = {
4237b2b389139ed638831e49708c947863eef631efRonghua Wu    {1000000, false}, {1033333, false}, {1066667, false}, {1100000, false},
4337b2b389139ed638831e49708c947863eef631efRonghua Wu    {1133333, false}, {1166667, false}, {1200000, false}, {1233333, false},
4437b2b389139ed638831e49708c947863eef631efRonghua Wu    {1266667, false}, {1300000, false}, {1333333, false}, {1366667, false},
4537b2b389139ed638831e49708c947863eef631efRonghua Wu    {1400000, false}, {1433333, false}, {1466667, false}, {1500000, false},
4637b2b389139ed638831e49708c947863eef631efRonghua Wu    {1533333, false}, {1566667, false}, {1600000, false}, {1633333, false},
4737b2b389139ed638831e49708c947863eef631efRonghua Wu};
4837b2b389139ed638831e49708c947863eef631efRonghua Wu
4937b2b389139ed638831e49708c947863eef631efRonghua Wustatic const TestFrame testFrames40Fps[] = {
5037b2b389139ed638831e49708c947863eef631efRonghua Wu    {1000000, false}, {1025000, true}, {1050000, false}, {1075000, false},
5137b2b389139ed638831e49708c947863eef631efRonghua Wu    {1100000, false}, {1125000, true}, {1150000, false}, {1175000, false},
5237b2b389139ed638831e49708c947863eef631efRonghua Wu    {1200000, false}, {1225000, true}, {1250000, false}, {1275000, false},
5337b2b389139ed638831e49708c947863eef631efRonghua Wu    {1300000, false}, {1325000, true}, {1350000, false}, {1375000, false},
5437b2b389139ed638831e49708c947863eef631efRonghua Wu    {1400000, false}, {1425000, true}, {1450000, false}, {1475000, false},
5537b2b389139ed638831e49708c947863eef631efRonghua Wu};
5637b2b389139ed638831e49708c947863eef631efRonghua Wu
5737b2b389139ed638831e49708c947863eef631efRonghua Wustatic const TestFrame testFrames60Fps[] = {
5837b2b389139ed638831e49708c947863eef631efRonghua Wu    {1000000, false}, {1016667, true}, {1033333, false}, {1050000, true},
5937b2b389139ed638831e49708c947863eef631efRonghua Wu    {1066667, false}, {1083333, true}, {1100000, false}, {1116667, true},
6037b2b389139ed638831e49708c947863eef631efRonghua Wu    {1133333, false}, {1150000, true}, {1166667, false}, {1183333, true},
6137b2b389139ed638831e49708c947863eef631efRonghua Wu    {1200000, false}, {1216667, true}, {1233333, false}, {1250000, true},
6237b2b389139ed638831e49708c947863eef631efRonghua Wu    {1266667, false}, {1283333, true}, {1300000, false}, {1316667, true},
6337b2b389139ed638831e49708c947863eef631efRonghua Wu};
6437b2b389139ed638831e49708c947863eef631efRonghua Wu
6537b2b389139ed638831e49708c947863eef631efRonghua Wustatic const TestFrame testFramesVariableFps[] = {
6637b2b389139ed638831e49708c947863eef631efRonghua Wu    // 40fps
6737b2b389139ed638831e49708c947863eef631efRonghua Wu    {1000000, false}, {1025000, true}, {1050000, false}, {1075000, false},
6837b2b389139ed638831e49708c947863eef631efRonghua Wu    {1100000, false}, {1125000, true}, {1150000, false}, {1175000, false},
6937b2b389139ed638831e49708c947863eef631efRonghua Wu    {1200000, false}, {1225000, true}, {1250000, false}, {1275000, false},
7037b2b389139ed638831e49708c947863eef631efRonghua Wu    {1300000, false}, {1325000, true}, {1350000, false}, {1375000, false},
7137b2b389139ed638831e49708c947863eef631efRonghua Wu    {1400000, false}, {1425000, true}, {1450000, false}, {1475000, false},
7237b2b389139ed638831e49708c947863eef631efRonghua Wu    // a timestamp jump plus switch to 20fps
7337b2b389139ed638831e49708c947863eef631efRonghua Wu    {2000000, false}, {2050000, false}, {2100000, false}, {2150000, false},
7437b2b389139ed638831e49708c947863eef631efRonghua Wu    {2200000, false}, {2250000, false}, {2300000, false}, {2350000, false},
7537b2b389139ed638831e49708c947863eef631efRonghua Wu    {2400000, false}, {2450000, false}, {2500000, false}, {2550000, false},
7637b2b389139ed638831e49708c947863eef631efRonghua Wu    {2600000, false}, {2650000, false}, {2700000, false}, {2750000, false},
7737b2b389139ed638831e49708c947863eef631efRonghua Wu    {2800000, false}, {2850000, false}, {2900000, false}, {2950000, false},
7837b2b389139ed638831e49708c947863eef631efRonghua Wu    // 60fps
7937b2b389139ed638831e49708c947863eef631efRonghua Wu    {2966667, false}, {2983333, true}, {3000000, false}, {3016667, true},
8037b2b389139ed638831e49708c947863eef631efRonghua Wu    {3033333, false}, {3050000, true}, {3066667, false}, {3083333, true},
8137b2b389139ed638831e49708c947863eef631efRonghua Wu    {3100000, false}, {3116667, true}, {3133333, false}, {3150000, true},
8237b2b389139ed638831e49708c947863eef631efRonghua Wu    {3166667, false}, {3183333, true}, {3200000, false}, {3216667, true},
8337b2b389139ed638831e49708c947863eef631efRonghua Wu    {3233333, false}, {3250000, true}, {3266667, false}, {3283333, true},
8437b2b389139ed638831e49708c947863eef631efRonghua Wu};
8537b2b389139ed638831e49708c947863eef631efRonghua Wu
8637b2b389139ed638831e49708c947863eef631efRonghua Wustatic const int kMaxTestJitterUs = 2000;
8737b2b389139ed638831e49708c947863eef631efRonghua Wu// return one of 1000, 0, -1000 as jitter.
8837b2b389139ed638831e49708c947863eef631efRonghua Wustatic int GetJitter(size_t i) {
8937b2b389139ed638831e49708c947863eef631efRonghua Wu    return (1 - (i % 3)) * (kMaxTestJitterUs / 2);
9037b2b389139ed638831e49708c947863eef631efRonghua Wu}
9137b2b389139ed638831e49708c947863eef631efRonghua Wu
9237b2b389139ed638831e49708c947863eef631efRonghua Wuclass FrameDropperTest : public ::testing::Test {
9337b2b389139ed638831e49708c947863eef631efRonghua Wupublic:
9437b2b389139ed638831e49708c947863eef631efRonghua Wu    FrameDropperTest() : mFrameDropper(new FrameDropper()) {
9537b2b389139ed638831e49708c947863eef631efRonghua Wu        EXPECT_EQ(OK, mFrameDropper->setMaxFrameRate(30.0));
9637b2b389139ed638831e49708c947863eef631efRonghua Wu    }
9737b2b389139ed638831e49708c947863eef631efRonghua Wu
9837b2b389139ed638831e49708c947863eef631efRonghua Wuprotected:
9937b2b389139ed638831e49708c947863eef631efRonghua Wu    void RunTest(const TestFrame* frames, size_t size) {
10037b2b389139ed638831e49708c947863eef631efRonghua Wu        for (size_t i = 0; i < size; ++i) {
10137b2b389139ed638831e49708c947863eef631efRonghua Wu            int jitter = GetJitter(i);
10237b2b389139ed638831e49708c947863eef631efRonghua Wu            int64_t testTimeUs = frames[i].timeUs + jitter;
103ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar            printf("time %lld, testTime %lld, jitter %d\n",
104ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar                    (long long)frames[i].timeUs, (long long)testTimeUs, jitter);
10537b2b389139ed638831e49708c947863eef631efRonghua Wu            EXPECT_EQ(frames[i].shouldDrop, mFrameDropper->shouldDrop(testTimeUs));
10637b2b389139ed638831e49708c947863eef631efRonghua Wu        }
10737b2b389139ed638831e49708c947863eef631efRonghua Wu    }
10837b2b389139ed638831e49708c947863eef631efRonghua Wu
10937b2b389139ed638831e49708c947863eef631efRonghua Wu    sp<FrameDropper> mFrameDropper;
11037b2b389139ed638831e49708c947863eef631efRonghua Wu};
11137b2b389139ed638831e49708c947863eef631efRonghua Wu
11237b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, TestInvalidMaxFrameRate) {
11337b2b389139ed638831e49708c947863eef631efRonghua Wu    EXPECT_NE(OK, mFrameDropper->setMaxFrameRate(-1.0));
11437b2b389139ed638831e49708c947863eef631efRonghua Wu    EXPECT_NE(OK, mFrameDropper->setMaxFrameRate(0));
11537b2b389139ed638831e49708c947863eef631efRonghua Wu}
11637b2b389139ed638831e49708c947863eef631efRonghua Wu
11737b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test20Fps) {
11837b2b389139ed638831e49708c947863eef631efRonghua Wu    RunTest(testFrames20Fps, ARRAY_SIZE(testFrames20Fps));
11937b2b389139ed638831e49708c947863eef631efRonghua Wu}
12037b2b389139ed638831e49708c947863eef631efRonghua Wu
12137b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test30Fps) {
12237b2b389139ed638831e49708c947863eef631efRonghua Wu    RunTest(testFrames30Fps, ARRAY_SIZE(testFrames30Fps));
12337b2b389139ed638831e49708c947863eef631efRonghua Wu}
12437b2b389139ed638831e49708c947863eef631efRonghua Wu
12537b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test40Fps) {
12637b2b389139ed638831e49708c947863eef631efRonghua Wu    RunTest(testFrames40Fps, ARRAY_SIZE(testFrames40Fps));
12737b2b389139ed638831e49708c947863eef631efRonghua Wu}
12837b2b389139ed638831e49708c947863eef631efRonghua Wu
12937b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test60Fps) {
13037b2b389139ed638831e49708c947863eef631efRonghua Wu    RunTest(testFrames60Fps, ARRAY_SIZE(testFrames60Fps));
13137b2b389139ed638831e49708c947863eef631efRonghua Wu}
13237b2b389139ed638831e49708c947863eef631efRonghua Wu
13337b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, TestVariableFps) {
13437b2b389139ed638831e49708c947863eef631efRonghua Wu    RunTest(testFramesVariableFps, ARRAY_SIZE(testFramesVariableFps));
13537b2b389139ed638831e49708c947863eef631efRonghua Wu}
13637b2b389139ed638831e49708c947863eef631efRonghua Wu
13737b2b389139ed638831e49708c947863eef631efRonghua Wu} // namespace android
138