diff options
author | Chong Zhang <chz@google.com> | 2015-03-03 23:45:01 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-03-03 23:45:02 +0000 |
commit | c33752349705068728b9b6e0cf5ac8f8252947ae (patch) | |
tree | 12b21481d0454bb641d0c719d5d3a0139161024e /media | |
parent | 7d3f4df0a77e052a7d37de9268aff8c2ed0909cc (diff) | |
parent | 799c9682b3776a55d234396aee4a302437150c26 (diff) | |
download | frameworks_av-c33752349705068728b9b6e0cf5ac8f8252947ae.zip frameworks_av-c33752349705068728b9b6e0cf5ac8f8252947ae.tar.gz frameworks_av-c33752349705068728b9b6e0cf5ac8f8252947ae.tar.bz2 |
Merge "handle mpeg2ts PTS wraparound"
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/mpeg2ts/ATSParser.cpp | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp index 482ccff..934e2e5 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.cpp +++ b/media/libstagefright/mpeg2ts/ATSParser.cpp @@ -92,8 +92,10 @@ private: KeyedVector<unsigned, sp<Stream> > mStreams; bool mFirstPTSValid; uint64_t mFirstPTS; + int64_t mLastRecoveredPTS; status_t parseProgramMap(ABitReader *br); + int64_t recoverPTS(uint64_t PTS_33bit); DISALLOW_EVIL_CONSTRUCTORS(Program); }; @@ -182,7 +184,8 @@ ATSParser::Program::Program( mProgramNumber(programNumber), mProgramMapPID(programMapPID), mFirstPTSValid(false), - mFirstPTS(0) { + mFirstPTS(0), + mLastRecoveredPTS(0) { ALOGV("new program number %u", programNumber); } @@ -425,6 +428,21 @@ status_t ATSParser::Program::parseProgramMap(ABitReader *br) { return OK; } +int64_t ATSParser::Program::recoverPTS(uint64_t PTS_33bit) { + // We only have the lower 33-bit of the PTS. It could overflow within a + // reasonable amount of time. To handle the wrap-around, use fancy math + // to get an extended PTS that is within [-0xffffffff, 0xffffffff] + // of the latest recovered PTS. + mLastRecoveredPTS = static_cast<int64_t>( + ((mLastRecoveredPTS - PTS_33bit + 0x100000000ll) + & 0xfffffffe00000000ull) | PTS_33bit); + + // We start from 0, but recovered PTS could be slightly below 0. + // Clamp it to 0 as rest of the pipeline doesn't take negative pts. + // (eg. video is read first and starts at 0, but audio starts at 0xfffffff0) + return mLastRecoveredPTS < 0ll ? 0ll : mLastRecoveredPTS; +} + sp<MediaSource> ATSParser::Program::getSource(SourceType type) { size_t index = (type == AUDIO) ? 0 : 0; @@ -455,6 +473,8 @@ bool ATSParser::Program::hasSource(SourceType type) const { } int64_t ATSParser::Program::convertPTSToTimestamp(uint64_t PTS) { + PTS = recoverPTS(PTS); + if (!(mParser->mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE)) { if (!mFirstPTSValid) { mFirstPTSValid = true; |