FrameDropper.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" 1937b2b389139ed638831e49708c947863eef631efRonghua Wu#include <utils/Log.h> 2037b2b389139ed638831e49708c947863eef631efRonghua Wu 2137b2b389139ed638831e49708c947863eef631efRonghua Wu#include "FrameDropper.h" 2237b2b389139ed638831e49708c947863eef631efRonghua Wu 2337b2b389139ed638831e49708c947863eef631efRonghua Wu#include <media/stagefright/foundation/ADebug.h> 2437b2b389139ed638831e49708c947863eef631efRonghua Wu 2537b2b389139ed638831e49708c947863eef631efRonghua Wunamespace android { 2637b2b389139ed638831e49708c947863eef631efRonghua Wu 2737b2b389139ed638831e49708c947863eef631efRonghua Wustatic const int64_t kMaxJitterUs = 2000; 2837b2b389139ed638831e49708c947863eef631efRonghua Wu 2937b2b389139ed638831e49708c947863eef631efRonghua WuFrameDropper::FrameDropper() 3037b2b389139ed638831e49708c947863eef631efRonghua Wu : mDesiredMinTimeUs(-1), 3137b2b389139ed638831e49708c947863eef631efRonghua Wu mMinIntervalUs(0) { 3237b2b389139ed638831e49708c947863eef631efRonghua Wu} 3337b2b389139ed638831e49708c947863eef631efRonghua Wu 3437b2b389139ed638831e49708c947863eef631efRonghua WuFrameDropper::~FrameDropper() { 3537b2b389139ed638831e49708c947863eef631efRonghua Wu} 3637b2b389139ed638831e49708c947863eef631efRonghua Wu 3737b2b389139ed638831e49708c947863eef631efRonghua Wustatus_t FrameDropper::setMaxFrameRate(float maxFrameRate) { 3837b2b389139ed638831e49708c947863eef631efRonghua Wu if (maxFrameRate <= 0) { 3937b2b389139ed638831e49708c947863eef631efRonghua Wu ALOGE("framerate should be positive but got %f.", maxFrameRate); 4037b2b389139ed638831e49708c947863eef631efRonghua Wu return BAD_VALUE; 4137b2b389139ed638831e49708c947863eef631efRonghua Wu } 4237b2b389139ed638831e49708c947863eef631efRonghua Wu mMinIntervalUs = (int64_t) (1000000.0f / maxFrameRate); 4337b2b389139ed638831e49708c947863eef631efRonghua Wu return OK; 4437b2b389139ed638831e49708c947863eef631efRonghua Wu} 4537b2b389139ed638831e49708c947863eef631efRonghua Wu 4637b2b389139ed638831e49708c947863eef631efRonghua Wubool FrameDropper::shouldDrop(int64_t timeUs) { 4737b2b389139ed638831e49708c947863eef631efRonghua Wu if (mMinIntervalUs <= 0) { 4837b2b389139ed638831e49708c947863eef631efRonghua Wu return false; 4937b2b389139ed638831e49708c947863eef631efRonghua Wu } 5037b2b389139ed638831e49708c947863eef631efRonghua Wu 5137b2b389139ed638831e49708c947863eef631efRonghua Wu if (mDesiredMinTimeUs < 0) { 5237b2b389139ed638831e49708c947863eef631efRonghua Wu mDesiredMinTimeUs = timeUs + mMinIntervalUs; 53ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar ALOGV("first frame %lld, next desired frame %lld", 54ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar (long long)timeUs, (long long)mDesiredMinTimeUs); 5537b2b389139ed638831e49708c947863eef631efRonghua Wu return false; 5637b2b389139ed638831e49708c947863eef631efRonghua Wu } 5737b2b389139ed638831e49708c947863eef631efRonghua Wu 5837b2b389139ed638831e49708c947863eef631efRonghua Wu if (timeUs < (mDesiredMinTimeUs - kMaxJitterUs)) { 5937b2b389139ed638831e49708c947863eef631efRonghua Wu ALOGV("drop frame %lld, desired frame %lld, diff %lld", 60ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar (long long)timeUs, (long long)mDesiredMinTimeUs, 61ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar (long long)(mDesiredMinTimeUs - timeUs)); 6237b2b389139ed638831e49708c947863eef631efRonghua Wu return true; 6337b2b389139ed638831e49708c947863eef631efRonghua Wu } 6437b2b389139ed638831e49708c947863eef631efRonghua Wu 6537b2b389139ed638831e49708c947863eef631efRonghua Wu int64_t n = (timeUs - mDesiredMinTimeUs + kMaxJitterUs) / mMinIntervalUs; 6637b2b389139ed638831e49708c947863eef631efRonghua Wu mDesiredMinTimeUs += (n + 1) * mMinIntervalUs; 6737b2b389139ed638831e49708c947863eef631efRonghua Wu ALOGV("keep frame %lld, next desired frame %lld, diff %lld", 68ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar (long long)timeUs, (long long)mDesiredMinTimeUs, 69ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnar (long long)(mDesiredMinTimeUs - timeUs)); 7037b2b389139ed638831e49708c947863eef631efRonghua Wu return false; 7137b2b389139ed638831e49708c947863eef631efRonghua Wu} 7237b2b389139ed638831e49708c947863eef631efRonghua Wu 7337b2b389139ed638831e49708c947863eef631efRonghua Wu} // namespace android 74