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

Commit 17005654 authored by Robert Shih's avatar Robert Shih
Browse files

Expose sample duration in MPEG4Extractor.

Bug: 12782113
Change-Id: I75ee361243c5382d9288349c554deb7bed952782
parent 77d4f613
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -3540,7 +3540,7 @@ status_t MPEG4Source::read(

    off64_t offset;
    size_t size;
    uint32_t cts;
    uint32_t cts, stts;
    bool isSyncSample;
    bool newBuffer = false;
    if (mBuffer == NULL) {
@@ -3548,7 +3548,7 @@ status_t MPEG4Source::read(

        status_t err =
            mSampleTable->getMetaDataForSample(
                    mCurrentSampleIndex, &offset, &size, &cts, &isSyncSample);
                    mCurrentSampleIndex, &offset, &size, &cts, &isSyncSample, &stts);

        if (err != OK) {
            return err;
@@ -3579,6 +3579,8 @@ status_t MPEG4Source::read(
            mBuffer->meta_data()->clear();
            mBuffer->meta_data()->setInt64(
                    kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
            mBuffer->meta_data()->setInt64(
                    kKeyDuration, ((int64_t)stts * 1000000) / mTimescale);

            if (targetSampleTimeUs >= 0) {
                mBuffer->meta_data()->setInt64(
@@ -3701,6 +3703,8 @@ status_t MPEG4Source::read(
        mBuffer->meta_data()->clear();
        mBuffer->meta_data()->setInt64(
                kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
        mBuffer->meta_data()->setInt64(
                kKeyDuration, ((int64_t)stts * 1000000) / mTimescale);

        if (targetSampleTimeUs >= 0) {
            mBuffer->meta_data()->setInt64(
@@ -3850,6 +3854,8 @@ status_t MPEG4Source::fragmentedRead(
            mBuffer->set_range(0, size);
            mBuffer->meta_data()->setInt64(
                    kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
            mBuffer->meta_data()->setInt64(
                    kKeyDuration, ((int64_t)smpl->duration * 1000000) / mTimescale);

            if (targetSampleTimeUs >= 0) {
                mBuffer->meta_data()->setInt64(
@@ -3973,6 +3979,8 @@ status_t MPEG4Source::fragmentedRead(

        mBuffer->meta_data()->setInt64(
                kKeyTime, ((int64_t)cts * 1000000) / mTimescale);
        mBuffer->meta_data()->setInt64(
                kKeyDuration, ((int64_t)smpl->duration * 1000000) / mTimescale);

        if (targetSampleTimeUs >= 0) {
            mBuffer->meta_data()->setInt64(
+6 −3
Original line number Diff line number Diff line
@@ -133,7 +133,8 @@ status_t SampleIterator::seekTo(uint32_t sampleIndex) {
    }

    status_t err;
    if ((err = findSampleTime(sampleIndex, &mCurrentSampleTime)) != OK) {
    if ((err = findSampleTimeAndDuration(
            sampleIndex, &mCurrentSampleTime, &mCurrentSampleDuration)) != OK) {
        ALOGE("findSampleTime return error");
        return err;
    }
@@ -285,8 +286,8 @@ status_t SampleIterator::getSampleSizeDirect(
    return OK;
}

status_t SampleIterator::findSampleTime(
        uint32_t sampleIndex, uint32_t *time) {
status_t SampleIterator::findSampleTimeAndDuration(
        uint32_t sampleIndex, uint32_t *time, uint32_t *duration) {
    if (sampleIndex >= mTable->mNumSampleSizes) {
        return ERROR_OUT_OF_RANGE;
    }
@@ -309,6 +310,8 @@ status_t SampleIterator::findSampleTime(

    *time += mTable->getCompositionTimeOffset(sampleIndex);

    *duration = mTTSDuration;

    return OK;
}

+6 −1
Original line number Diff line number Diff line
@@ -778,7 +778,8 @@ status_t SampleTable::getMetaDataForSample(
        off64_t *offset,
        size_t *size,
        uint32_t *compositionTime,
        bool *isSyncSample) {
        bool *isSyncSample,
        uint32_t *sampleDuration) {
    Mutex::Autolock autoLock(mLock);

    status_t err;
@@ -820,6 +821,10 @@ status_t SampleTable::getMetaDataForSample(
        }
    }

    if (sampleDuration) {
        *sampleDuration = mSampleIterator->getSampleDuration();
    }

    return OK;
}

+3 −1
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ struct SampleIterator {
    off64_t getSampleOffset() const { return mCurrentSampleOffset; }
    size_t getSampleSize() const { return mCurrentSampleSize; }
    uint32_t getSampleTime() const { return mCurrentSampleTime; }
    uint32_t getSampleDuration() const { return mCurrentSampleDuration; }

    status_t getSampleSizeDirect(
            uint32_t sampleIndex, size_t *size);
@@ -61,11 +62,12 @@ private:
    off64_t mCurrentSampleOffset;
    size_t mCurrentSampleSize;
    uint32_t mCurrentSampleTime;
    uint32_t mCurrentSampleDuration;

    void reset();
    status_t findChunkRange(uint32_t sampleIndex);
    status_t getChunkOffset(uint32_t chunk, off64_t *offset);
    status_t findSampleTime(uint32_t sampleIndex, uint32_t *time);
    status_t findSampleTimeAndDuration(uint32_t sampleIndex, uint32_t *time, uint32_t *duration);

    SampleIterator(const SampleIterator &);
    SampleIterator &operator=(const SampleIterator &);
+2 −1
Original line number Diff line number Diff line
@@ -66,7 +66,8 @@ public:
            off64_t *offset,
            size_t *size,
            uint32_t *compositionTime,
            bool *isSyncSample = NULL);
            bool *isSyncSample = NULL,
            uint32_t *sampleDuration = NULL);

    enum {
        kFlagBefore,