|
|
|
@ -272,9 +272,6 @@ void MPEG2TSExtractor::init() {
|
|
|
|
|
|
|
|
|
|
off64_t size;
|
|
|
|
|
if (mDataSource->getSize(&size) == OK && (haveAudio || haveVideo)) {
|
|
|
|
|
sp<AnotherPacketSource> impl = haveVideo
|
|
|
|
|
? mParser->getSource(ATSParser::VIDEO)
|
|
|
|
|
: mParser->getSource(ATSParser::AUDIO);
|
|
|
|
|
size_t prevSyncSize = 1;
|
|
|
|
|
int64_t durationUs = -1;
|
|
|
|
|
List<int64_t> durations;
|
|
|
|
@ -308,17 +305,32 @@ void MPEG2TSExtractor::init() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
status_t err;
|
|
|
|
|
int64_t bufferedDurationUs;
|
|
|
|
|
bufferedDurationUs = impl->getBufferedDurationUs(&err);
|
|
|
|
|
if (err == ERROR_END_OF_STREAM) {
|
|
|
|
|
durationUs = bufferedDurationUs;
|
|
|
|
|
|
|
|
|
|
bool found = false;
|
|
|
|
|
for (int i = 0; i < ATSParser::NUM_SOURCE_TYPES; ++i) {
|
|
|
|
|
ATSParser::SourceType type = static_cast<ATSParser::SourceType>(i);
|
|
|
|
|
sp<AnotherPacketSource> impl = mParser->getSource(type);
|
|
|
|
|
if (impl == NULL) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int64_t trackDurationUs = durationUs;
|
|
|
|
|
|
|
|
|
|
status_t err;
|
|
|
|
|
int64_t bufferedDurationUs = impl->getBufferedDurationUs(&err);
|
|
|
|
|
if (err == ERROR_END_OF_STREAM) {
|
|
|
|
|
trackDurationUs = bufferedDurationUs;
|
|
|
|
|
}
|
|
|
|
|
if (trackDurationUs > 0) {
|
|
|
|
|
ALOGV("[SourceType%d] durationUs=%" PRId64 "", type, trackDurationUs);
|
|
|
|
|
const sp<MetaData> meta = impl->getFormat();
|
|
|
|
|
meta->setInt64(kKeyDuration, trackDurationUs);
|
|
|
|
|
impl->setFormat(meta);
|
|
|
|
|
|
|
|
|
|
found = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (durationUs > 0) {
|
|
|
|
|
const sp<MetaData> meta = impl->getFormat();
|
|
|
|
|
meta->setInt64(kKeyDuration, durationUs);
|
|
|
|
|
impl->setFormat(meta);
|
|
|
|
|
} else {
|
|
|
|
|
if (!found) {
|
|
|
|
|
estimateDurationsFromTimesUsAtEnd();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|