summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/RTSPSource.cpp
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/RTSPSource.cpp
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/RTSPSource.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/RTSPSource.cpp39
1 files changed, 39 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;
}