summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/mpeg2ts
diff options
context:
space:
mode:
authorChong Zhang <chz@google.com>2015-04-03 18:48:27 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-04-03 18:48:28 +0000
commit002135d149d8604e972d1b353d768f293fbce15f (patch)
tree2b574bf6a084149bb75975e372b2f0516bf2276c /media/libstagefright/mpeg2ts
parentaa80951a578c1843708227b63456474f99e5e868 (diff)
parentd47dfcb5a2e5901c96fc92662cec7aa30f7f8843 (diff)
downloadframeworks_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.cpp31
-rw-r--r--media/libstagefright/mpeg2ts/ATSParser.h1
-rw-r--r--media/libstagefright/mpeg2ts/AnotherPacketSource.cpp79
-rw-r--r--media/libstagefright/mpeg2ts/AnotherPacketSource.h4
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();