Merge "Handle audio presentation switching in AC-4 TS"
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index cf93fcf..590131e 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -121,6 +121,8 @@
ATSParser *mParser;
unsigned mProgramNumber;
unsigned mProgramMapPID;
+ uint32_t mPMTVersion;
+ uint32_t mPMT_CRC;
KeyedVector<unsigned, sp<Stream> > mStreams;
bool mFirstPTSValid;
uint64_t mFirstPTS;
@@ -143,6 +145,9 @@
unsigned typeExt() const { return mStreamTypeExt; }
unsigned pid() const { return mElementaryPID; }
void setPID(unsigned pid) { mElementaryPID = pid; }
+ void setAudioPresentations(AudioPresentationCollection audioPresentations) {
+ mAudioPresentations = audioPresentations;
+ }
void setCasInfo(
int32_t systemId,
@@ -293,6 +298,8 @@
: mParser(parser),
mProgramNumber(programNumber),
mProgramMapPID(programMapPID),
+ mPMTVersion(0xffffffff),
+ mPMT_CRC(0xffffffff),
mFirstPTSValid(false),
mFirstPTS(0),
mLastRecoveredPTS(lastRecoveredPTS) {
@@ -480,7 +487,13 @@
MY_LOGV(" program_number = %u", br->getBits(16));
MY_LOGV(" reserved = %u", br->getBits(2));
- MY_LOGV(" version_number = %u", br->getBits(5));
+ bool audioPresentationsChanged = false;
+ unsigned pmtVersion = br->getBits(5);
+ if (pmtVersion != mPMTVersion) {
+ audioPresentationsChanged = true;
+ mPMTVersion = pmtVersion;
+ }
+ MY_LOGV(" version_number = %u", pmtVersion);
MY_LOGV(" current_next_indicator = %u", br->getBits(1));
MY_LOGV(" section_number = %u", br->getBits(8));
MY_LOGV(" last_section_number = %u", br->getBits(8));
@@ -661,7 +674,12 @@
if (infoBytesRemaining != 0) {
ALOGW("Section data remains unconsumed");
}
- MY_LOGV(" CRC = 0x%08x", br->getBits(32));
+ unsigned crc = br->getBits(32);
+ if (crc != mPMT_CRC) {
+ audioPresentationsChanged = true;
+ mPMT_CRC = crc;
+ }
+ MY_LOGV(" CRC = 0x%08x", crc);
bool PIDsChanged = false;
for (size_t i = 0; i < infos.size(); ++i) {
@@ -722,6 +740,10 @@
isAddingScrambledStream |= info.mCADescriptor.mSystemID >= 0;
mStreams.add(info.mPID, stream);
}
+ else if (index >= 0 && mStreams.editValueAt(index)->isAudio()
+ && audioPresentationsChanged) {
+ mStreams.editValueAt(index)->setAudioPresentations(info.mAudioPresentations);
+ }
}
if (isAddingScrambledStream) {
@@ -1732,6 +1754,7 @@
mSource->setFormat(mQueue->getFormat());
}
mSource->queueAccessUnit(accessUnit);
+ mSource->convertAudioPresentationInfoToMetadata(mAudioPresentations);
}
// Every access unit has a pesStartOffset queued in |mPesStartOffsets|.