summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2015-03-03 23:45:01 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-03-03 23:45:02 +0000
commitc33752349705068728b9b6e0cf5ac8f8252947ae (patch)
tree12b21481d0454bb641d0c719d5d3a0139161024e /media
parent7d3f4df0a77e052a7d37de9268aff8c2ed0909cc (diff)
parent799c9682b3776a55d234396aee4a302437150c26 (diff)
downloadframeworks_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.cpp22
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;