summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-09-01 15:05:28 -0700
committerAndreas Huber <andih@google.com>2010-09-01 15:05:28 -0700
commitc9e894872c298b25fe9d74e68aa1e7287a541ac3 (patch)
tree3b5eba501373e765f359e83e3102af109b0ccd1a
parentbcbe5af62aad9d1ef64f799fcde58ac9a8adace8 (diff)
downloadframeworks_av-c9e894872c298b25fe9d74e68aa1e7287a541ac3.zip
frameworks_av-c9e894872c298b25fe9d74e68aa1e7287a541ac3.tar.gz
frameworks_av-c9e894872c298b25fe9d74e68aa1e7287a541ac3.tar.bz2
Better support for buffered streaming of rtsp content, if buffer drops below a certain threshold we will temporarily pause playback until we have sufficient data.
Change-Id: Ice8564e902e48c89c9c00f6651c5504b3c41fcad related-to-bug: 2556656
-rw-r--r--media/libstagefright/AwesomePlayer.cpp31
-rw-r--r--media/libstagefright/include/ARTSPController.h1
-rw-r--r--media/libstagefright/rtsp/APacketSource.cpp23
-rw-r--r--media/libstagefright/rtsp/APacketSource.h2
-rw-r--r--media/libstagefright/rtsp/ARTSPController.cpp22
5 files changed, 77 insertions, 2 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index ef543d9..2681dc3 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -457,6 +457,33 @@ void AwesomePlayer::onBufferingUpdate() {
}
mBufferingEventPending = false;
+ int kLowWaterMarkSecs = 2;
+ int kHighWaterMarkSecs = 10;
+
+ if (mRTSPController != NULL) {
+ bool eos;
+ int64_t queueDurationUs = mRTSPController->getQueueDurationUs(&eos);
+
+ LOGV("queueDurationUs = %.2f secs", queueDurationUs / 1E6);
+
+ if ((mFlags & PLAYING) && !eos
+ && (queueDurationUs < kLowWaterMarkSecs * 1000000ll)) {
+ LOGI("rtsp cache is running low, pausing.");
+ mFlags |= CACHE_UNDERRUN;
+ pause_l();
+ notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
+ } else if ((mFlags & CACHE_UNDERRUN)
+ && (eos || queueDurationUs > kHighWaterMarkSecs * 1000000ll)) {
+ LOGI("rtsp cache has filled up, resuming.");
+ mFlags &= ~CACHE_UNDERRUN;
+ play_l();
+ notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
+ }
+
+ postBufferingEvent_l();
+ return;
+ }
+
if (mCachedSource == NULL) {
return;
}
@@ -484,8 +511,8 @@ void AwesomePlayer::onBufferingUpdate() {
notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
- lowWatermark = 2 * bitrate / 8; // 2 secs
- highWatermark = 10 * bitrate / 8; // 10 secs
+ lowWatermark = kLowWaterMarkSecs * bitrate / 8;
+ highWatermark = kHighWaterMarkSecs * bitrate / 8;
}
}
diff --git a/media/libstagefright/include/ARTSPController.h b/media/libstagefright/include/ARTSPController.h
index 7016880..300d8f7 100644
--- a/media/libstagefright/include/ARTSPController.h
+++ b/media/libstagefright/include/ARTSPController.h
@@ -42,6 +42,7 @@ struct ARTSPController : public MediaExtractor {
size_t index, uint32_t flags);
int64_t getNormalPlayTimeUs();
+ int64_t getQueueDurationUs(bool *eos);
void onMessageReceived(const sp<AMessage> &msg);
diff --git a/media/libstagefright/rtsp/APacketSource.cpp b/media/libstagefright/rtsp/APacketSource.cpp
index 75b4571..b63798f 100644
--- a/media/libstagefright/rtsp/APacketSource.cpp
+++ b/media/libstagefright/rtsp/APacketSource.cpp
@@ -746,4 +746,27 @@ void APacketSource::setNormalPlayTimeMapping(
mNormalPlayTimeBaseUs = normalPlayTimeUs;
}
+int64_t APacketSource::getQueueDurationUs(bool *eos) {
+ Mutex::Autolock autoLock(mLock);
+
+ *eos = (mEOSResult != OK);
+
+ if (mBuffers.size() < 2) {
+ return 0;
+ }
+
+ const sp<ABuffer> first = *mBuffers.begin();
+ const sp<ABuffer> last = *--mBuffers.end();
+
+ int64_t firstTimeUs;
+ CHECK(first->meta()->findInt64("timeUs", &firstTimeUs));
+
+ int64_t lastTimeUs;
+ CHECK(last->meta()->findInt64("timeUs", &lastTimeUs));
+
+ CHECK_GE(lastTimeUs, firstTimeUs);
+
+ return lastTimeUs - firstTimeUs;
+}
+
} // namespace android
diff --git a/media/libstagefright/rtsp/APacketSource.h b/media/libstagefright/rtsp/APacketSource.h
index 3833ab1..076ddc4 100644
--- a/media/libstagefright/rtsp/APacketSource.h
+++ b/media/libstagefright/rtsp/APacketSource.h
@@ -50,6 +50,8 @@ struct APacketSource : public MediaSource {
void setNormalPlayTimeMapping(
uint32_t rtpTime, int64_t normalPlayTimeUs);
+ int64_t getQueueDurationUs(bool *eos);
+
protected:
virtual ~APacketSource();
diff --git a/media/libstagefright/rtsp/ARTSPController.cpp b/media/libstagefright/rtsp/ARTSPController.cpp
index a89946b..4c53639 100644
--- a/media/libstagefright/rtsp/ARTSPController.cpp
+++ b/media/libstagefright/rtsp/ARTSPController.cpp
@@ -143,4 +143,26 @@ int64_t ARTSPController::getNormalPlayTimeUs() {
return mHandler->getNormalPlayTimeUs();
}
+int64_t ARTSPController::getQueueDurationUs(bool *eos) {
+ *eos = true;
+
+ int64_t minQueuedDurationUs = 0;
+ for (size_t i = 0; i < mHandler->countTracks(); ++i) {
+ sp<APacketSource> source = mHandler->getPacketSource(i);
+
+ bool newEOS;
+ int64_t queuedDurationUs = source->getQueueDurationUs(&newEOS);
+
+ if (!newEOS) {
+ *eos = false;
+ }
+
+ if (i == 0 || queuedDurationUs < minQueuedDurationUs) {
+ minQueuedDurationUs = queuedDurationUs;
+ }
+ }
+
+ return minQueuedDurationUs;
+}
+
} // namespace android