summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorWonsik Kim <wonsik@google.com>2015-06-01 01:55:56 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2015-06-01 01:55:59 +0000
commit11804f5ca4ebd3527e7cc3bcc529e8358a519f8e (patch)
treef90239a4217acc4220a359626fc2dfe614f879db /media
parent305a12e403d3ae7e12df0d9218c152f9bb423af0 (diff)
parent3d83a2089f7000180a1a3ff5a9d376efe92f596c (diff)
downloadframeworks_av-11804f5ca4ebd3527e7cc3bcc529e8358a519f8e.zip
frameworks_av-11804f5ca4ebd3527e7cc3bcc529e8358a519f8e.tar.gz
frameworks_av-11804f5ca4ebd3527e7cc3bcc529e8358a519f8e.tar.bz2
Merge "mpeg2ts: revise duration estimation logic" into mnc-dev
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp26
1 files changed, 16 insertions, 10 deletions
diff --git a/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp b/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
index e0ee87b..aae3e9f 100644
--- a/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
+++ b/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp
@@ -194,18 +194,19 @@ void MPEG2TSExtractor::init() {
ATSParser::VIDEO).get()
: (AnotherPacketSource *)mParser->getSource(
ATSParser::AUDIO).get();
- int64_t prevBufferedDurationUs = 0;
+ size_t prevSyncSize = 1;
int64_t durationUs = -1;
List<int64_t> durations;
// Estimate duration --- stabilize until you get <500ms deviation.
- while (feedMore() == OK && ALooper::GetNowUs() - startTime <= 2000000ll) {
- status_t err;
- int64_t bufferedDurationUs = impl->getBufferedDurationUs(&err);
- if (err != OK) {
- break;
- }
- if (bufferedDurationUs != prevBufferedDurationUs) {
- durationUs = size * bufferedDurationUs / mOffset;
+ while (feedMore() == OK
+ && ALooper::GetNowUs() - startTime <= 2000000ll) {
+ if (mSeekSyncPoints->size() > prevSyncSize) {
+ prevSyncSize = mSeekSyncPoints->size();
+ int64_t diffUs = mSeekSyncPoints->keyAt(prevSyncSize - 1)
+ - mSeekSyncPoints->keyAt(0);
+ off64_t diffOffset = mSeekSyncPoints->valueAt(prevSyncSize - 1)
+ - mSeekSyncPoints->valueAt(0);
+ durationUs = size * diffUs / diffOffset;
durations.push_back(durationUs);
if (durations.size() > 5) {
durations.erase(durations.begin());
@@ -225,9 +226,14 @@ void MPEG2TSExtractor::init() {
break;
}
}
- prevBufferedDurationUs = bufferedDurationUs;
}
}
+ status_t err;
+ int64_t bufferedDurationUs;
+ bufferedDurationUs = impl->getBufferedDurationUs(&err);
+ if (err == ERROR_END_OF_STREAM) {
+ durationUs = bufferedDurationUs;
+ }
if (durationUs > 0) {
const sp<MetaData> meta = impl->getFormat();
meta->setInt64(kKeyDuration, durationUs);