diff options
Diffstat (limited to 'media/libstagefright/mpeg2ts/ATSParser.cpp')
-rw-r--r-- | media/libstagefright/mpeg2ts/ATSParser.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp index bcaab9f..7c9b83a 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.cpp +++ b/media/libstagefright/mpeg2ts/ATSParser.cpp @@ -49,6 +49,8 @@ struct ATSParser::Program : public RefBase { unsigned pid, unsigned payload_unit_start_indicator, ABitReader *br); + void signalDiscontinuity(); + sp<MediaSource> getSource(SourceType type); private: @@ -67,6 +69,8 @@ struct ATSParser::Stream : public RefBase { unsigned payload_unit_start_indicator, ABitReader *br); + void signalDiscontinuity(); + sp<MediaSource> getSource(SourceType type); protected: @@ -124,6 +128,12 @@ bool ATSParser::Program::parsePID( return true; } +void ATSParser::Program::signalDiscontinuity() { + for (size_t i = 0; i < mStreams.size(); ++i) { + mStreams.editValueAt(i)->signalDiscontinuity(); + } +} + void ATSParser::Program::parseProgramMap(ABitReader *br) { unsigned table_id = br->getBits(8); LOGV(" table_id = %u", table_id); @@ -271,6 +281,19 @@ void ATSParser::Stream::parse( mBuffer->setRange(0, mBuffer->size() + payloadSizeBits / 8); } +void ATSParser::Stream::signalDiscontinuity() { + LOGV("Stream discontinuity"); + mPayloadStarted = false; + mBuffer->setRange(0, 0); + + mQueue.clear(); + + if (mStreamType == 0x1b && mSource != NULL) { + // Don't signal discontinuities on audio streams. + mSource->queueDiscontinuity(); + } +} + void ATSParser::Stream::parsePES(ABitReader *br) { unsigned packet_startcode_prefix = br->getBits(24); @@ -459,7 +482,10 @@ void ATSParser::Stream::onPayloadData( mSource = new AnotherPacketSource(meta); mSource->queueAccessUnit(accessUnit); } - } else { + } else if (mQueue.getFormat() != NULL) { + // After a discontinuity we invalidate the queue's format + // and won't enqueue any access units to the source until + // the queue has reestablished the new format. mSource->queueAccessUnit(accessUnit); } } @@ -489,6 +515,12 @@ void ATSParser::feedTSPacket(const void *data, size_t size) { parseTS(&br); } +void ATSParser::signalDiscontinuity() { + for (size_t i = 0; i < mPrograms.size(); ++i) { + mPrograms.editItemAt(i)->signalDiscontinuity(); + } +} + void ATSParser::parseProgramAssociationTable(ABitReader *br) { unsigned table_id = br->getBits(8); LOGV(" table_id = %u", table_id); |