diff options
author | Chong Zhang <chz@google.com> | 2015-04-03 18:48:27 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-04-03 18:48:28 +0000 |
commit | 002135d149d8604e972d1b353d768f293fbce15f (patch) | |
tree | 2b574bf6a084149bb75975e372b2f0516bf2276c /media/libstagefright/mpeg2ts | |
parent | aa80951a578c1843708227b63456474f99e5e868 (diff) | |
parent | d47dfcb5a2e5901c96fc92662cec7aa30f7f8843 (diff) | |
download | frameworks_av-002135d149d8604e972d1b353d768f293fbce15f.zip frameworks_av-002135d149d8604e972d1b353d768f293fbce15f.tar.gz frameworks_av-002135d149d8604e972d1b353d768f293fbce15f.tar.bz2 |
Merge "HLS: misc bug fixes"
Diffstat (limited to 'media/libstagefright/mpeg2ts')
-rw-r--r-- | media/libstagefright/mpeg2ts/ATSParser.cpp | 31 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/ATSParser.h | 1 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.cpp | 79 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.h | 4 |
4 files changed, 71 insertions, 44 deletions
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp index 01c3dd6..0a868bc 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.cpp +++ b/media/libstagefright/mpeg2ts/ATSParser.cpp @@ -48,7 +48,8 @@ namespace android { static const size_t kTSPacketSize = 188; struct ATSParser::Program : public RefBase { - Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID); + Program(ATSParser *parser, unsigned programNumber, unsigned programMapPID, + int64_t lastRecoveredPTS); bool parsePSISection( unsigned pid, ABitReader *br, status_t *err); @@ -190,13 +191,14 @@ private: //////////////////////////////////////////////////////////////////////////////// ATSParser::Program::Program( - ATSParser *parser, unsigned programNumber, unsigned programMapPID) + ATSParser *parser, unsigned programNumber, unsigned programMapPID, + int64_t lastRecoveredPTS) : mParser(parser), mProgramNumber(programNumber), mProgramMapPID(programMapPID), mFirstPTSValid(false), mFirstPTS(0), - mLastRecoveredPTS(-1ll) { + mLastRecoveredPTS(lastRecoveredPTS) { ALOGV("new program number %u", programNumber); } @@ -1041,6 +1043,7 @@ ATSParser::ATSParser(uint32_t flags) mAbsoluteTimeAnchorUs(-1ll), mTimeOffsetValid(false), mTimeOffsetUs(0ll), + mLastRecoveredPTS(-1ll), mNumTSPacketsParsed(0), mNumPCRs(0) { mPSISections.add(0 /* PID */, new PSISection); @@ -1059,11 +1062,21 @@ status_t ATSParser::feedTSPacket(const void *data, size_t size) { void ATSParser::signalDiscontinuity( DiscontinuityType type, const sp<AMessage> &extra) { int64_t mediaTimeUs; - if ((type & DISCONTINUITY_TIME) - && extra != NULL - && extra->findInt64( - IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { - mAbsoluteTimeAnchorUs = mediaTimeUs; + if ((type & DISCONTINUITY_TIME) && extra != NULL) { + if (extra->findInt64(IStreamListener::kKeyMediaTimeUs, &mediaTimeUs)) { + mAbsoluteTimeAnchorUs = mediaTimeUs; + } + if ((mFlags & TS_TIMESTAMPS_ARE_ABSOLUTE) + && extra->findInt64( + IStreamListener::kKeyRecentMediaTimeUs, &mediaTimeUs)) { + if (mAbsoluteTimeAnchorUs >= 0ll) { + mediaTimeUs -= mAbsoluteTimeAnchorUs; + } + if (mTimeOffsetValid) { + mediaTimeUs -= mTimeOffsetUs; + } + mLastRecoveredPTS = (mediaTimeUs * 9) / 100; + } } else if (type == DISCONTINUITY_ABSOLUTE_TIME) { int64_t timeUs; CHECK(extra->findInt64("timeUs", &timeUs)); @@ -1147,7 +1160,7 @@ void ATSParser::parseProgramAssociationTable(ABitReader *br) { if (!found) { mPrograms.push( - new Program(this, program_number, programMapPID)); + new Program(this, program_number, programMapPID, mLastRecoveredPTS)); } if (mPSISections.indexOfKey(programMapPID) < 0) { diff --git a/media/libstagefright/mpeg2ts/ATSParser.h b/media/libstagefright/mpeg2ts/ATSParser.h index 5c50747..a1405bd 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.h +++ b/media/libstagefright/mpeg2ts/ATSParser.h @@ -118,6 +118,7 @@ private: bool mTimeOffsetValid; int64_t mTimeOffsetUs; + int64_t mLastRecoveredPTS; size_t mNumTSPacketsParsed; diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp index c2f1527..c5bb41b 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -29,6 +29,7 @@ #include <media/stagefright/MediaBuffer.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MetaData.h> +#include <media/stagefright/Utils.h> #include <utils/Vector.h> #include <inttypes.h> @@ -461,6 +462,10 @@ void AnotherPacketSource::enable(bool enable) { mEnabled = enable; } +/* + * returns the sample meta that's delayUs after queue head + * (NULL if such sample is unavailable) + */ sp<AMessage> AnotherPacketSource::getMetaAfterLastDequeued(int64_t delayUs) { Mutex::Autolock autoLock(mLock); int64_t firstUs = -1; @@ -490,19 +495,28 @@ sp<AMessage> AnotherPacketSource::getMetaAfterLastDequeued(int64_t delayUs) { } } } - return mLatestEnqueuedMeta; + return NULL; } -void AnotherPacketSource::trimBuffersAfterTimeUs( - size_t discontinuitySeq, int64_t timeUs) { - ALOGV("trimBuffersAfterTimeUs: discontinuitySeq %zu, timeUs %lld", - discontinuitySeq, (long long)timeUs); +/* + * removes samples with time equal or after meta + */ +void AnotherPacketSource::trimBuffersAfterMeta( + const sp<AMessage> &meta) { + if (meta == NULL) { + ALOGW("trimming with NULL meta, ignoring"); + return; + } Mutex::Autolock autoLock(mLock); if (mBuffers.empty()) { return; } + HLSTime stopTime(meta); + ALOGV("trimBuffersAfterMeta: discontinuitySeq %zu, timeUs %lld", + stopTime.mSeq, (long long)stopTime.mTimeUs); + List<sp<ABuffer> >::iterator it; sp<AMessage> newLatestEnqueuedMeta = NULL; int64_t newLastQueuedTimeUs = 0; @@ -514,20 +528,15 @@ void AnotherPacketSource::trimBuffersAfterTimeUs( newDiscontinuityCount++; continue; } - size_t curDiscontinuitySeq; - int64_t curTimeUs; - CHECK(buffer->meta()->findInt32( - "discontinuitySeq", (int32_t*)&curDiscontinuitySeq)); - CHECK(buffer->meta()->findInt64("timeUs", &curTimeUs)); - if ((curDiscontinuitySeq > discontinuitySeq - || (curDiscontinuitySeq == discontinuitySeq - && curTimeUs >= timeUs))) { - ALOGI("trimming from %lld (inclusive) to end", - (long long)curTimeUs); + + HLSTime curTime(buffer->meta()); + if (!(curTime < stopTime)) { + ALOGV("trimming from %lld (inclusive) to end", + (long long)curTime.mTimeUs); break; } newLatestEnqueuedMeta = buffer->meta(); - newLastQueuedTimeUs = curTimeUs; + newLastQueuedTimeUs = curTime.mTimeUs; } mBuffers.erase(it, mBuffers.end()); mLatestEnqueuedMeta = newLatestEnqueuedMeta; @@ -535,11 +544,20 @@ void AnotherPacketSource::trimBuffersAfterTimeUs( mQueuedDiscontinuityCount = newDiscontinuityCount; } -sp<AMessage> AnotherPacketSource::trimBuffersBeforeTimeUs( - size_t discontinuitySeq, int64_t timeUs) { - ALOGV("trimBuffersBeforeTimeUs: discontinuitySeq %zu, timeUs %lld", - discontinuitySeq, (long long)timeUs); - sp<AMessage> meta; +/* + * removes samples with time equal or before meta; + * returns first sample left in the queue. + * + * (for AVC, if trim happens, the samples left will always start + * at next IDR.) + */ +sp<AMessage> AnotherPacketSource::trimBuffersBeforeMeta( + const sp<AMessage> &meta) { + HLSTime startTime(meta); + ALOGV("trimBuffersBeforeMeta: discontinuitySeq %zu, timeUs %lld", + startTime.mSeq, (long long)startTime.mTimeUs); + + sp<AMessage> firstMeta; Mutex::Autolock autoLock(mLock); if (mBuffers.empty()) { return NULL; @@ -572,24 +590,19 @@ sp<AMessage> AnotherPacketSource::trimBuffersBeforeTimeUs( if (isAvc && !IsIDR(buffer)) { continue; } - size_t curDiscontinuitySeq; - int64_t curTimeUs; - CHECK(buffer->meta()->findInt32( - "discontinuitySeq", (int32_t*)&curDiscontinuitySeq)); - CHECK(buffer->meta()->findInt64("timeUs", &curTimeUs)); - if ((curDiscontinuitySeq > discontinuitySeq - || (curDiscontinuitySeq == discontinuitySeq - && curTimeUs > timeUs))) { - ALOGI("trimming from beginning to %lld (not inclusive)", - (long long)curTimeUs); - meta = buffer->meta(); + + HLSTime curTime(buffer->meta()); + if (startTime < curTime) { + ALOGV("trimming from beginning to %lld (not inclusive)", + (long long)curTime.mTimeUs); + firstMeta = buffer->meta(); break; } } mBuffers.erase(mBuffers.begin(), it); mQueuedDiscontinuityCount -= discontinuityCount; mLatestDequeuedMeta = NULL; - return meta; + return firstMeta; } } // namespace android diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.h b/media/libstagefright/mpeg2ts/AnotherPacketSource.h index e126006..fa7dd6a 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.h +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.h @@ -76,8 +76,8 @@ struct AnotherPacketSource : public MediaSource { sp<AMessage> getLatestDequeuedMeta(); sp<AMessage> getMetaAfterLastDequeued(int64_t delayUs); - void trimBuffersAfterTimeUs(size_t discontinuitySeq, int64_t timeUs); - sp<AMessage> trimBuffersBeforeTimeUs(size_t discontinuitySeq, int64_t timeUs); + void trimBuffersAfterMeta(const sp<AMessage> &meta); + sp<AMessage> trimBuffersBeforeMeta(const sp<AMessage> &meta); protected: virtual ~AnotherPacketSource(); |