Merge "Fix pause at end of movie." into jb-dev

This commit is contained in:
Fred Gylys-Colwell
2012-05-31 16:34:29 -07:00
committed by Android (Google) Code Review
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.

View File

@@ -36,6 +36,7 @@ WVMMediaSource::WVMMediaSource(WVSession *session, WVEsSelector esSelector,
mNewSegment(false),
mCryptoInitialized(false),
mGroup(NULL),
mKeyTime(0),
mDts(0),
mPts(0)
{
@@ -264,7 +265,6 @@ status_t WVMMediaSource::read(MediaBuffer **buffer, const ReadOptions *options)
size_t bytesRead;
bool auStart;
size_t offset = 0;
int64_t keyTime;
bool syncFrame;
int retryCount = 0;
@@ -339,9 +339,9 @@ status_t WVMMediaSource::read(MediaBuffer **buffer, const ReadOptions *options)
}
#define PCR_HZ 90000
keyTime = (int64_t)mPts * 1000000 / PCR_HZ;
mKeyTime = (int64_t)mPts * 1000000 / PCR_HZ;
if (seekNextSync && ((keyTime < seekTimeUs) || !syncFrame)) {
if (seekNextSync && ((mKeyTime < seekTimeUs) || !syncFrame)) {
// drop frames up to next sync if requested
usleep(10000);
#ifdef REQUIRE_SECURE_BUFFERS
@@ -381,7 +381,7 @@ status_t WVMMediaSource::read(MediaBuffer **buffer, const ReadOptions *options)
}
mediaBuf->meta_data()->clear();
mediaBuf->meta_data()->setInt64(kKeyTime, keyTime);
mediaBuf->meta_data()->setInt64(kKeyTime, mKeyTime);
mediaBuf->set_range(0, bytesRead + offset);
@@ -415,7 +415,7 @@ status_t WVMMediaSource::read(MediaBuffer **buffer, const ReadOptions *options)
#if 0
ALOGD("[%p] %s packet length=%d kKeyTime=%lld %s\n", mediaBuf,
(mESSelector == WV_EsSelector_Video ? "video" : "audio"),
bytesRead + offset, keyTime, syncFrame ? "sync" : "");
bytesRead + offset, mKeyTime, syncFrame ? "sync" : "");
#endif
*buffer = mediaBuf;

View File

@@ -74,6 +74,8 @@ private:
WVSession *mSession;
int64_t mDuration; // usec.
status_t mSetupStatus;
status_t readMetaData();

View File

@@ -44,6 +44,8 @@ public:
static int sLastError;
int64_t getTime() { return mKeyTime; }; // usec.
#ifdef REQUIRE_SECURE_BUFFERS
class DecryptContext {
public:
@@ -84,6 +86,7 @@ private:
MediaBufferGroup *mGroup;
int64_t mKeyTime;
unsigned long long mDts;
unsigned long long mPts;