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

Commit bb64e554 authored by James Dong's avatar James Dong Committed by Android Git Automerger
Browse files

am 7ed7668b: Merge "Calculate audio media drift time from AudioSource" into gingerbread

Merge commit '7ed7668b' into gingerbread-plus-aosp

* commit '7ed7668b':
  Calculate audio media drift time from AudioSource
parents 31103928 7ed7668b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ private:
    int64_t mPrevSampleTimeUs;
    int64_t mTotalLostFrames;
    int64_t mPrevLostBytes;
    int64_t mInitialReadTimeUs;

    MediaBufferGroup *mGroup;

+1 −1
Original line number Diff line number Diff line
@@ -132,7 +132,7 @@ private:
    // Adjust other track media clock (presumably wall clock)
    // based on audio track media clock with the drift time.
    int64_t mDriftTimeUs;
    void addDriftTimeUs(int64_t driftTimeUs);
    void setDriftTimeUs(int64_t driftTimeUs);
    int64_t getDriftTimeUs();

    void lock();
+1 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ enum {
    kKeyTime              = 'time',  // int64_t (usecs)
    kKeyNTPTime           = 'ntpT',  // uint64_t (ntp-timestamp)
    kKeyTargetTime        = 'tarT',  // int64_t (usecs)
    kKeyDriftTime         = 'dftT',  // int64_t (usecs)
    kKeyDuration          = 'dura',  // int64_t (usecs)
    kKeyColorFormat       = 'colf',
    kKeyPlatformPrivate   = 'priv',  // pointer
+12 −3
Original line number Diff line number Diff line
@@ -84,6 +84,7 @@ status_t AudioSource::start(MetaData *params) {

    mTrackMaxAmplitude = false;
    mMaxAmplitude = 0;
    mInitialReadTimeUs = 0;
    mStartTimeUs = 0;
    int64_t startTimeUs;
    if (params && params->findInt64(kKeyTime, &startTimeUs)) {
@@ -210,6 +211,7 @@ status_t AudioSource::read(
        return NO_INIT;
    }

    int64_t readTimeUs = systemTime() / 1000;
    *out = NULL;

    MediaBuffer *buffer;
@@ -223,9 +225,10 @@ status_t AudioSource::read(


        if (numFramesRecorded == 0 && mPrevSampleTimeUs == 0) {
            mInitialReadTimeUs = readTimeUs;
            // Initial delay
            if (mStartTimeUs > 0) {
                mStartTimeUs = systemTime() / 1000 - mStartTimeUs;
                mStartTimeUs = readTimeUs - mStartTimeUs;
            } else {
                // Assume latency is constant.
                mStartTimeUs += mRecord->latency() * 1000;
@@ -271,7 +274,10 @@ status_t AudioSource::read(
            }
            memset(buffer->data(), 0, numLostBytes);
            buffer->set_range(0, numLostBytes);
            buffer->meta_data()->setInt64(kKeyTime, mPrevSampleTimeUs);
            if (numFramesRecorded == 0) {
                buffer->meta_data()->setInt64(kKeyTime, mStartTimeUs);
            }
            buffer->meta_data()->setInt64(kKeyDriftTime, readTimeUs - mInitialReadTimeUs);
            mPrevSampleTimeUs = timestampUs;
            *out = buffer;
            return OK;
@@ -309,7 +315,10 @@ status_t AudioSource::read(
            trackMaxAmplitude((int16_t *) buffer->data(), n >> 1);
        }

        buffer->meta_data()->setInt64(kKeyTime, mPrevSampleTimeUs);
        if (numFramesRecorded == 0) {
            buffer->meta_data()->setInt64(kKeyTime, mStartTimeUs);
        }
        buffer->meta_data()->setInt64(kKeyDriftTime, readTimeUs - mInitialReadTimeUs);
        CHECK(timestampUs > mPrevSampleTimeUs);
        mPrevSampleTimeUs = timestampUs;
        LOGV("initial delay: %lld, sample rate: %d, timestamp: %lld",
+9 −20
Original line number Diff line number Diff line
@@ -1430,9 +1430,6 @@ status_t MPEG4Writer::Track::threadEntry() {
    int64_t previousPausedDurationUs = 0;
    int64_t timestampUs;

    int64_t wallClockTimeUs = 0;
    int64_t lastWallClockTimeUs = 0;

    sp<MetaData> meta_data;
    bool collectStats = collectStatisticalData();

@@ -1542,14 +1539,15 @@ status_t MPEG4Writer::Track::threadEntry() {
            // of neighboring samples. This in turn helps reduce the track header size,
            // especially, the number of entries in the "stts" box.
            if (mNumSamples > 1) {
                int64_t durationUs = timestampUs + mOwner->getDriftTimeUs() - lastTimestampUs;
                int64_t currDriftTimeUs = mOwner->getDriftTimeUs();
                int64_t durationUs = timestampUs + currDriftTimeUs - lastTimestampUs;
                int64_t diffUs = (durationUs > lastDurationUs)
                            ? durationUs - lastDurationUs
                            : lastDurationUs - durationUs;
                if (diffUs <= 5000) {  // XXX: Magic number 5ms
                    timestampUs = lastTimestampUs + lastDurationUs;
                } else {
                    timestampUs += mOwner->getDriftTimeUs();
                    timestampUs += currDriftTimeUs;
                }
            }
        }
@@ -1557,12 +1555,6 @@ status_t MPEG4Writer::Track::threadEntry() {
        if (mNumSamples > 1) {
            if (timestampUs <= lastTimestampUs) {
                LOGW("Frame arrives too late!");
#if 0
                // Drop the late frame.
                copy->release();
                copy = NULL;
                continue;
#else
                // Don't drop the late frame, since dropping a frame may cause
                // problems later during playback

@@ -1573,7 +1565,6 @@ status_t MPEG4Writer::Track::threadEntry() {
                } else {
                    timestampUs = lastTimestampUs + (1000000LL + (mTimeScale >> 1)) / mTimeScale;
                }
#endif
            }
        }

@@ -1613,12 +1604,10 @@ status_t MPEG4Writer::Track::threadEntry() {
        lastDurationTicks = currDurationTicks;
        lastTimestampUs = timestampUs;
        if (mIsRealTimeRecording && mIsAudio) {
            wallClockTimeUs = systemTime() / 1000;
            int64_t wallClockDurationUs = wallClockTimeUs - lastWallClockTimeUs;
            if (mNumSamples > 2) {
                mOwner->addDriftTimeUs(lastDurationUs - wallClockDurationUs);
            int64_t driftTimeUs = 0;
            if (meta_data->findInt64(kKeyDriftTime, &driftTimeUs)) {
                mOwner->setDriftTimeUs(driftTimeUs);
            }
            lastWallClockTimeUs = wallClockTimeUs;
        }

        if (isSync != 0) {
@@ -1851,10 +1840,10 @@ void MPEG4Writer::Track::logStatisticalData(bool isAudio) {
    }
}

void MPEG4Writer::addDriftTimeUs(int64_t driftTimeUs) {
    LOGV("addDriftTimeUs: %lld us", driftTimeUs);
void MPEG4Writer::setDriftTimeUs(int64_t driftTimeUs) {
    LOGV("setDriftTimeUs: %lld us", driftTimeUs);
    Mutex::Autolock autolock(mLock);
    mDriftTimeUs += driftTimeUs;
    mDriftTimeUs = driftTimeUs;
}

int64_t MPEG4Writer::getDriftTimeUs() {
Loading