Fix pause at end of movie.

The function WVMExtractorImpl::getCachedDurationUs returns the cached buffer
size in microseconds, and sets a status to ERROR_END_OF_STREAM at the end of
the movie.  The AwesomePlayer will pause if the cache is too small and the
status is not EOS.  In bug 6277231, the player would pause just before the EOS
marker would have been seen by the Widevine library.

This change checks the current play time against the total movie duration.  If
there is less than 10 seconds left in the movie, the EOS flag is set.

related-to-bug: 6277231

Change-Id: I8dbf60c82c41df485185f85e72452aab0a6a9686
This commit is contained in:
Fred Gylys-Colwell
2012-05-23 14:33:04 -07:00
parent df066c0634
commit 0b7d0f3fe3
4 changed files with 35 additions and 12 deletions

View File

@@ -98,6 +98,7 @@ WVMExtractorImpl::WVMExtractorImpl(sp<DataSource> dataSource)
mUseAdaptiveStreaming(false),
mIsLiveStream(false),
mSession(NULL),
mDuration(0),
mSetupStatus(OK)
{
dataSource->getDrmInfo(sDecryptHandle, &sDrmManagerClient);
@@ -272,13 +273,13 @@ status_t WVMExtractorImpl::readMetaData()
return ERROR_MALFORMED;
}
int64_t duration = (int64_t)(strtod(durationString.c_str(), NULL) * 1000000);
mDuration = (int64_t)(strtod(durationString.c_str(), NULL) * 1000000);
sp<MetaData> audioMetaData = new MetaData();
sp<MetaData> videoMetaData = new MetaData();
audioMetaData->setInt64(kKeyDuration, duration);
videoMetaData->setInt64(kKeyDuration, duration);
audioMetaData->setInt64(kKeyDuration, mDuration);
videoMetaData->setInt64(kKeyDuration, mDuration);
audioMetaData->setInt32(kKeyBitRate, audioBitRate);
videoMetaData->setInt32(kKeyBitRate, videoBitRate);
@@ -505,11 +506,28 @@ int64_t WVMExtractorImpl::getCachedDurationUs(status_t *finalStatus) {
} else if (status != WV_Status_OK) {
*finalStatus = ERROR_IO;
} else {
if (mIsLiveStream)
*finalStatus = ERROR_END_OF_STREAM;
else
*finalStatus = OK;
durationUs = (uint64_t)(secondsBuffered * 1000000LL);
if (mIsLiveStream) {
*finalStatus = ERROR_END_OF_STREAM;
} else {
*finalStatus = OK;
int64_t current_time = 0; // usec.
if (mVideoSource != NULL) {
current_time = mVideoSource->getTime();
} else {
ALOGV("getCachedDurationUs: current_time not yet valid.");
}
// ALOGD("current_time=%.2f, duration %.2f, delta = %.2f, buffered=%.2f",
// current_time/1e6, mDuration/1e6,
// (mDuration - current_time )/1e6, time_buffered);
// If we are less than 10 seconds from end, report we are at the end.
if (mDuration > 0 && mDuration - current_time < 10000000) {
*finalStatus = ERROR_END_OF_STREAM;
}
}
}
// Scale the duration to account for Stagefright's conservative buffering.