diff --git a/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp index 7bed94dcad7..379a5bf17f5 100644 --- a/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/frameworks/av/media/libstagefright/MPEG4Extractor.cpp @@ -2774,6 +2774,14 @@ status_t MPEG4Source::parseTrackFragmentHeader(off64_t offset, off64_t size) { mTrackFragmentHeaderInfo.mFlags = flags; mTrackFragmentHeaderInfo.mTrackID = mLastParsedTrackId; + + mTrackFragmentHeaderInfo.mBaseDataOffset = 0; + mTrackFragmentHeaderInfo.mSampleDescriptionIndex = 0; + mTrackFragmentHeaderInfo.mDefaultSampleDuration = 0; + mTrackFragmentHeaderInfo.mDefaultSampleSize = 0; + mTrackFragmentHeaderInfo.mDefaultSampleFlags = 0; + mTrackFragmentHeaderInfo.mDataOffset = 0; + offset += 8; size -= 8; @@ -3130,6 +3138,7 @@ status_t MPEG4Source::read( off64_t offset; size_t size; uint32_t cts; + uint32_t duration; bool isSyncSample; bool newBuffer = false; if (mBuffer == NULL) { @@ -3137,7 +3146,8 @@ status_t MPEG4Source::read( status_t err = mSampleTable->getMetaDataForSample( - mCurrentSampleIndex, &offset, &size, &cts, &isSyncSample); + mCurrentSampleIndex, &offset, &size, &cts, &duration, + &isSyncSample); if (err != OK) { return err; @@ -3169,6 +3179,8 @@ status_t MPEG4Source::read( mBuffer->meta_data()->setInt64(kKey64BitFileOffset, offset); mBuffer->meta_data()->setInt64( kKeyTime, ((int64_t)cts * 1000000) / mTimescale); + mBuffer->meta_data()->setInt64( + kKeyDuration, ((int64_t)duration * 1000000) / mTimescale); if (targetSampleTimeUs >= 0) { mBuffer->meta_data()->setInt64( @@ -3292,6 +3304,8 @@ status_t MPEG4Source::read( mBuffer->meta_data()->setInt64(kKey64BitFileOffset, offset); mBuffer->meta_data()->setInt64( kKeyTime, ((int64_t)cts * 1000000) / mTimescale); + mBuffer->meta_data()->setInt64( + kKeyDuration, ((int64_t)duration * 1000000) / mTimescale); if (targetSampleTimeUs >= 0) { mBuffer->meta_data()->setInt64( @@ -3365,6 +3379,7 @@ status_t MPEG4Source::fragmentedRead( off64_t offset = 0; size_t size; uint32_t cts = 0; + uint32_t duration = 0; bool isSyncSample = false; bool newBuffer = false; if (mBuffer == NULL) { @@ -3399,6 +3414,7 @@ status_t MPEG4Source::fragmentedRead( offset = smpl->offset; size = smpl->size; cts = mCurrentTime; + duration = smpl->duration; mCurrentTime += smpl->duration; isSyncSample = (mCurrentSampleIndex == 0); // XXX @@ -3443,6 +3459,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)duration * 1000000) / mTimescale); if (targetSampleTimeUs >= 0) { mBuffer->meta_data()->setInt64( @@ -3566,6 +3584,8 @@ status_t MPEG4Source::fragmentedRead( mBuffer->meta_data()->setInt64( kKeyTime, ((int64_t)cts * 1000000) / mTimescale); + mBuffer->meta_data()->setInt64( + kKeyDuration, ((int64_t)duration * 1000000) / mTimescale); if (targetSampleTimeUs >= 0) { mBuffer->meta_data()->setInt64( diff --git a/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp b/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp index 767393a13c3..c374eaef0e8 100644 --- a/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp +++ b/media/libstagefright/frameworks/av/media/libstagefright/SampleIterator.cpp @@ -139,6 +139,18 @@ status_t SampleIterator::seekTo(uint32_t sampleIndex) { return err; } + if (sampleIndex + 1 == mTable->mNumSampleSizes) { + mCurrentSampleDuration = 0; + } + else { + uint32_t nextSampleTime; + if ((err = findSampleTime(sampleIndex + 1, &nextSampleTime)) != OK ) { + ALOGE("findSampleTime return error"); + return err; + } + mCurrentSampleDuration = nextSampleTime - mCurrentSampleTime; + } + mCurrentSampleIndex = sampleIndex; mInitialized = true; diff --git a/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp b/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp index d2099dff110..4b185326e9f 100644 --- a/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp +++ b/media/libstagefright/frameworks/av/media/libstagefright/SampleTable.cpp @@ -779,6 +779,7 @@ status_t SampleTable::getMetaDataForSample( off64_t *offset, size_t *size, uint32_t *compositionTime, + uint32_t *duration, bool *isSyncSample) { Mutex::Autolock autoLock(mLock); @@ -799,6 +800,10 @@ status_t SampleTable::getMetaDataForSample( *compositionTime = mSampleIterator->getSampleTime(); } + if (duration) { + *duration = mSampleIterator->getSampleDuration(); + } + if (isSyncSample) { *isSyncSample = false; if (mSyncSampleOffset < 0) { diff --git a/media/libstagefright/frameworks/av/media/libstagefright/include/SampleIterator.h b/media/libstagefright/frameworks/av/media/libstagefright/include/SampleIterator.h index a4d52feba0c..7e8526d4a84 100644 --- a/media/libstagefright/frameworks/av/media/libstagefright/include/SampleIterator.h +++ b/media/libstagefright/frameworks/av/media/libstagefright/include/SampleIterator.h @@ -33,6 +33,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); @@ -64,6 +65,7 @@ private: off64_t mCurrentSampleOffset; size_t mCurrentSampleSize; uint32_t mCurrentSampleTime; + uint32_t mCurrentSampleDuration; void reset(); status_t findChunkRange(uint32_t sampleIndex); diff --git a/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h b/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h index 2a8207769dd..7434c4e9b56 100644 --- a/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h +++ b/media/libstagefright/frameworks/av/media/libstagefright/include/SampleTable.h @@ -66,6 +66,7 @@ public: off64_t *offset, size_t *size, uint32_t *compositionTime, + uint32_t *duration = NULL, bool *isSyncSample = NULL); enum {