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