FrameDropper_test.cpp revision 37b2b389139ed638831e49708c947863eef631ef
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; 10337b2b389139ed638831e49708c947863eef631efRonghua Wu printf("time %lld, testTime %lld, jitter %d\n", frames[i].timeUs, testTimeUs, jitter); 10437b2b389139ed638831e49708c947863eef631efRonghua Wu EXPECT_EQ(frames[i].shouldDrop, mFrameDropper->shouldDrop(testTimeUs)); 10537b2b389139ed638831e49708c947863eef631efRonghua Wu } 10637b2b389139ed638831e49708c947863eef631efRonghua Wu } 10737b2b389139ed638831e49708c947863eef631efRonghua Wu 10837b2b389139ed638831e49708c947863eef631efRonghua Wu sp<FrameDropper> mFrameDropper; 10937b2b389139ed638831e49708c947863eef631efRonghua Wu}; 11037b2b389139ed638831e49708c947863eef631efRonghua Wu 11137b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, TestInvalidMaxFrameRate) { 11237b2b389139ed638831e49708c947863eef631efRonghua Wu EXPECT_NE(OK, mFrameDropper->setMaxFrameRate(-1.0)); 11337b2b389139ed638831e49708c947863eef631efRonghua Wu EXPECT_NE(OK, mFrameDropper->setMaxFrameRate(0)); 11437b2b389139ed638831e49708c947863eef631efRonghua Wu} 11537b2b389139ed638831e49708c947863eef631efRonghua Wu 11637b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test20Fps) { 11737b2b389139ed638831e49708c947863eef631efRonghua Wu RunTest(testFrames20Fps, ARRAY_SIZE(testFrames20Fps)); 11837b2b389139ed638831e49708c947863eef631efRonghua Wu} 11937b2b389139ed638831e49708c947863eef631efRonghua Wu 12037b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test30Fps) { 12137b2b389139ed638831e49708c947863eef631efRonghua Wu RunTest(testFrames30Fps, ARRAY_SIZE(testFrames30Fps)); 12237b2b389139ed638831e49708c947863eef631efRonghua Wu} 12337b2b389139ed638831e49708c947863eef631efRonghua Wu 12437b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test40Fps) { 12537b2b389139ed638831e49708c947863eef631efRonghua Wu RunTest(testFrames40Fps, ARRAY_SIZE(testFrames40Fps)); 12637b2b389139ed638831e49708c947863eef631efRonghua Wu} 12737b2b389139ed638831e49708c947863eef631efRonghua Wu 12837b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, Test60Fps) { 12937b2b389139ed638831e49708c947863eef631efRonghua Wu RunTest(testFrames60Fps, ARRAY_SIZE(testFrames60Fps)); 13037b2b389139ed638831e49708c947863eef631efRonghua Wu} 13137b2b389139ed638831e49708c947863eef631efRonghua Wu 13237b2b389139ed638831e49708c947863eef631efRonghua WuTEST_F(FrameDropperTest, TestVariableFps) { 13337b2b389139ed638831e49708c947863eef631efRonghua Wu RunTest(testFramesVariableFps, ARRAY_SIZE(testFramesVariableFps)); 13437b2b389139ed638831e49708c947863eef631efRonghua Wu} 13537b2b389139ed638831e49708c947863eef631efRonghua Wu 13637b2b389139ed638831e49708c947863eef631efRonghua Wu} // namespace android 137