Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1e8bf6f8 authored by Eric (Quic's avatar Eric (Quic Committed by Steve Kondik
Browse files

libstagefright: post video events dynamically

Change-Id: Ie4c1ff727afc7b84db94f48d9d70e5c52dd6f98e
 - calculate amount of time to delay video event after render
   using the formula:
   delay = (us between frames)-(us taken by event)-(lateness)
CRs-Fixed: 434540, 514013
parent daa51b5f
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -76,6 +76,10 @@ static int64_t kLowWaterMarkUs = 2000000ll; // 2secs
static int64_t kHighWaterMarkUs = 5000000ll;  // 5secs
static const size_t kLowWaterMarkBytes = 40000;
static const size_t kHighWaterMarkBytes = 200000;
static const int64_t kInitFrameDurationUs = 16000;
static const int64_t kScheduleLagGapUs = 1000;
static const int64_t kDefaultEventDelayUs = 10000;

#ifdef QCOM_HARDWARE
int AwesomePlayer::mTunnelAliveAP = 0;
#endif
@@ -209,6 +213,7 @@ AwesomePlayer::AwesomePlayer()
      mVideoBuffer(NULL),
      mDecryptHandle(NULL),
      mLastVideoTimeUs(-1),
      mFrameDurationUs(kInitFrameDurationUs),
      mTextDriver(NULL) {
    CHECK_EQ(mClient.connect(), (status_t)OK);

@@ -611,7 +616,7 @@ void AwesomePlayer::reset_l() {

    mBitrate = -1;
    mLastVideoTimeUs = -1;

    mFrameDurationUs = kInitFrameDurationUs;
    {
        Mutex::Autolock autoLock(mStatsLock);
        mStats.mFd = -1;
@@ -1840,6 +1845,8 @@ void AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) {

void AwesomePlayer::onVideoEvent() {
    ATRACE_CALL();
    int64_t eventStartTimeUs = mSystemTimeSource.getRealTimeUs();
    int64_t earlyGapUs = kScheduleLagGapUs; // gap for in case of event scheduling lag
    Mutex::Autolock autoLock(mLock);
    if (!mVideoEventPending) {
        // The event has been cancelled in reset_l() but had already
@@ -1941,7 +1948,11 @@ void AwesomePlayer::onVideoEvent() {

    int64_t timeUs;
    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));

    if ((mLastVideoTimeUs != timeUs)
          && (mLastVideoTimeUs > 0)
          && (mSeeking == NO_SEEK)) {
        mFrameDurationUs = timeUs - mLastVideoTimeUs;
    }
    mLastVideoTimeUs = timeUs;

    if (mSeeking == SEEK_VIDEO_ONLY) {
@@ -2054,8 +2065,10 @@ void AwesomePlayer::onVideoEvent() {
                    Mutex::Autolock autoLock(mStatsLock);
                    ++mStats.mNumVideoFramesDropped;
                }

                postVideoEvent_l();
                int64_t eventDurationUs = mSystemTimeSource.getRealTimeUs() - eventStartTimeUs;
                int64_t delayUs = mFrameDurationUs - eventDurationUs - latenessUs - earlyGapUs;
                delayUs = delayUs > kDefaultEventDelayUs ? kDefaultEventDelayUs : delayUs;
                postVideoEvent_l(delayUs > 0 ? delayUs : 0);
                return;
            }
        }
@@ -2091,8 +2104,10 @@ void AwesomePlayer::onVideoEvent() {
        modifyFlags(SEEK_PREVIEW, CLEAR);
        return;
    }

    postVideoEvent_l();
    int64_t eventDurationUs = mSystemTimeSource.getRealTimeUs() - eventStartTimeUs;
    int64_t delayUs = mFrameDurationUs - eventDurationUs - latenessUs - earlyGapUs;
    delayUs = delayUs > kDefaultEventDelayUs ? kDefaultEventDelayUs : delayUs;
    postVideoEvent_l(delayUs > 0 ? delayUs : 0);
}

void AwesomePlayer::postVideoEvent_l(int64_t delayUs) {
+1 −0
Original line number Diff line number Diff line
@@ -239,6 +239,7 @@ private:
    sp<DecryptHandle> mDecryptHandle;

    int64_t mLastVideoTimeUs;
    int64_t mFrameDurationUs;
    TimedTextDriver *mTextDriver;

    sp<WVMExtractor> mWVMExtractor;