diff options
Diffstat (limited to 'media/libstagefright/MPEG4Writer.cpp')
-rw-r--r-- | media/libstagefright/MPEG4Writer.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 7f7ddf7..2f1b6ac 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -321,6 +321,7 @@ private: // Simple validation on the codec specific data status_t checkCodecSpecificData() const; int32_t mRotation; + int32_t mHFRRatio; void updateTrackSizeEstimate(); void addOneStscTableEntry(size_t chunkId, size_t sampleId); @@ -390,7 +391,8 @@ MPEG4Writer::MPEG4Writer(int fd) mStartTimeOffsetMs(-1), mMetaKeys(new AMessage()), mIsVideoHEVC(false), - mIsAudioAMR(false) { + mIsAudioAMR(false), + mHFRRatio(1) { addDeviceMeta(); // Verify mFd is seekable @@ -532,6 +534,8 @@ status_t MPEG4Writer::addSource(const sp<MediaSource> &source) { Track *track = new Track(this, source, 1 + mTracks.size()); mTracks.push_back(track); + mHFRRatio = AVUtils::get()->HFRUtils().getHFRRatio(source->getFormat()); + return OK; } @@ -1029,7 +1033,7 @@ void MPEG4Writer::writeMvhdBox(int64_t durationUs) { writeInt32(0); // version=0, flags=0 writeInt32(now); // creation time writeInt32(now); // modification time - writeInt32(mTimeScale); // mvhd timescale + writeInt32(mTimeScale / mHFRRatio); // mvhd timescale int32_t duration = (durationUs * mTimeScale + 5E5) / 1E6; writeInt32(duration); writeInt32(0x10000); // rate: 1.0 @@ -1477,7 +1481,8 @@ MPEG4Writer::Track::Track( mCodecSpecificDataSize(0), mGotAllCodecSpecificData(false), mReachedEOS(false), - mRotation(0) { + mRotation(0), + mHFRRatio(1) { getCodecSpecificDataFromInputFormatIfPossible(); const char *mime; @@ -1882,6 +1887,8 @@ status_t MPEG4Writer::Track::start(MetaData *params) { pthread_create(&mThread, &attr, ThreadWrapper, this); pthread_attr_destroy(&attr); + mHFRRatio = AVUtils::get()->HFRUtils().getHFRRatio(mMeta); + return OK; } @@ -3069,7 +3076,7 @@ void MPEG4Writer::Track::writeMdhdBox(uint32_t now) { mOwner->writeInt32(0); // version=0, flags=0 mOwner->writeInt32(now); // creation time mOwner->writeInt32(now); // modification time - mOwner->writeInt32(mTimeScale); // media timescale + mOwner->writeInt32(mTimeScale / mHFRRatio); // media timescale int32_t mdhdDuration = (trakDurationUs * mTimeScale + 5E5) / 1E6; mOwner->writeInt32(mdhdDuration); // use media timescale // Language follows the three letter standard ISO-639-2/T |