summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-05-17 14:18:50 -0700
committerAndreas Huber <andih@google.com>2012-05-17 14:18:50 -0700
commitbfd4d0d9fe0033abf3f55b94f30f6a58846a875e (patch)
tree9b8a16246cce7e86b6dcc4e5af147d264d4eb4b9 /media/libmediaplayerservice/nuplayer
parentcd28dc10d49c359566c69d48a29a6f0d3eefa6d9 (diff)
downloadframeworks_av-bfd4d0d9fe0033abf3f55b94f30f6a58846a875e.zip
frameworks_av-bfd4d0d9fe0033abf3f55b94f30f6a58846a875e.tar.gz
frameworks_av-bfd4d0d9fe0033abf3f55b94f30f6a58846a875e.tar.bz2
Buffer at least 2 secs worth of data at startup of after a seek before
resuming starting RTSP playback. Change-Id: I060c6c7fd627ab7ebd5c095ddcfdb4cc0f637aad related-to-bug: 6364126
Diffstat (limited to 'media/libmediaplayerservice/nuplayer')
-rw-r--r--media/libmediaplayerservice/nuplayer/RTSPSource.cpp39
-rw-r--r--media/libmediaplayerservice/nuplayer/RTSPSource.h3
2 files changed, 42 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
index 4c65b65..a138be8 100644
--- a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
@@ -39,6 +39,7 @@ NuPlayer::RTSPSource::RTSPSource(
mState(DISCONNECTED),
mFinalResult(OK),
mDisconnectReplyID(0),
+ mStartingUp(true),
mSeekGeneration(0) {
if (headers) {
mExtraHeaders = *headers;
@@ -104,8 +105,45 @@ sp<MetaData> NuPlayer::RTSPSource::getFormat(bool audio) {
return source->getFormat();
}
+bool NuPlayer::RTSPSource::haveSufficientDataOnAllTracks() {
+ // We're going to buffer at least 2 secs worth data on all tracks before
+ // starting playback (both at startup and after a seek).
+
+ static const int64_t kMinDurationUs = 2000000ll;
+
+ status_t err;
+ int64_t durationUs;
+ if (mAudioTrack != NULL
+ && (durationUs = mAudioTrack->getBufferedDurationUs(&err))
+ < kMinDurationUs
+ && err == OK) {
+ ALOGV("audio track doesn't have enough data yet. (%.2f secs buffered)",
+ durationUs / 1E6);
+ return false;
+ }
+
+ if (mVideoTrack != NULL
+ && (durationUs = mVideoTrack->getBufferedDurationUs(&err))
+ < kMinDurationUs
+ && err == OK) {
+ ALOGV("video track doesn't have enough data yet. (%.2f secs buffered)",
+ durationUs / 1E6);
+ return false;
+ }
+
+ return true;
+}
+
status_t NuPlayer::RTSPSource::dequeueAccessUnit(
bool audio, sp<ABuffer> *accessUnit) {
+ if (mStartingUp) {
+ if (!haveSufficientDataOnAllTracks()) {
+ return -EWOULDBLOCK;
+ }
+
+ mStartingUp = false;
+ }
+
sp<AnotherPacketSource> source = getSource(audio);
if (source == NULL) {
@@ -209,6 +247,7 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) {
case MyHandler::kWhatSeekDone:
{
mState = CONNECTED;
+ mStartingUp = true;
break;
}
diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.h b/media/libmediaplayerservice/nuplayer/RTSPSource.h
index 59d06ad..e11e304 100644
--- a/media/libmediaplayerservice/nuplayer/RTSPSource.h
+++ b/media/libmediaplayerservice/nuplayer/RTSPSource.h
@@ -88,6 +88,7 @@ private:
State mState;
status_t mFinalResult;
uint32_t mDisconnectReplyID;
+ bool mStartingUp;
sp<ALooper> mLooper;
sp<AHandlerReflector<RTSPSource> > mReflector;
@@ -107,6 +108,8 @@ private:
void performSeek(int64_t seekTimeUs);
+ bool haveSufficientDataOnAllTracks();
+
DISALLOW_EVIL_CONSTRUCTORS(RTSPSource);
};