FrameDropper.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"
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;
5337b2b389139ed638831e49708c947863eef631efRonghua Wu        ALOGV("first frame %lld, next desired frame %lld", timeUs, mDesiredMinTimeUs);
5437b2b389139ed638831e49708c947863eef631efRonghua Wu        return false;
5537b2b389139ed638831e49708c947863eef631efRonghua Wu    }
5637b2b389139ed638831e49708c947863eef631efRonghua Wu
5737b2b389139ed638831e49708c947863eef631efRonghua Wu    if (timeUs < (mDesiredMinTimeUs - kMaxJitterUs)) {
5837b2b389139ed638831e49708c947863eef631efRonghua Wu        ALOGV("drop frame %lld, desired frame %lld, diff %lld",
5937b2b389139ed638831e49708c947863eef631efRonghua Wu                timeUs, mDesiredMinTimeUs, mDesiredMinTimeUs - timeUs);
6037b2b389139ed638831e49708c947863eef631efRonghua Wu        return true;
6137b2b389139ed638831e49708c947863eef631efRonghua Wu    }
6237b2b389139ed638831e49708c947863eef631efRonghua Wu
6337b2b389139ed638831e49708c947863eef631efRonghua Wu    int64_t n = (timeUs - mDesiredMinTimeUs + kMaxJitterUs) / mMinIntervalUs;
6437b2b389139ed638831e49708c947863eef631efRonghua Wu    mDesiredMinTimeUs += (n + 1) * mMinIntervalUs;
6537b2b389139ed638831e49708c947863eef631efRonghua Wu    ALOGV("keep frame %lld, next desired frame %lld, diff %lld",
6637b2b389139ed638831e49708c947863eef631efRonghua Wu            timeUs, mDesiredMinTimeUs, mDesiredMinTimeUs - timeUs);
6737b2b389139ed638831e49708c947863eef631efRonghua Wu    return false;
6837b2b389139ed638831e49708c947863eef631efRonghua Wu}
6937b2b389139ed638831e49708c947863eef631efRonghua Wu
7037b2b389139ed638831e49708c947863eef631efRonghua Wu}  // namespace android
71