am 3cd6302b: Merge "Prefill the cache before trying to instantiate the media extractor." into honeycomb

* commit '3cd6302b9e54ff888df5eb47b35d25e7dac1d763':
  Prefill the cache before trying to instantiate the media extractor.
This commit is contained in:
Andreas Huber
2011-01-19 15:24:28 -08:00
committed by Android Git Automerger
2 changed files with 32 additions and 3 deletions

View File

@@ -58,6 +58,8 @@ namespace android {
static int64_t kLowWaterMarkUs = 2000000ll; // 2secs static int64_t kLowWaterMarkUs = 2000000ll; // 2secs
static int64_t kHighWaterMarkUs = 10000000ll; // 10secs static int64_t kHighWaterMarkUs = 10000000ll; // 10secs
static const size_t kLowWaterMarkBytes = 40000;
static const size_t kHighWaterMarkBytes = 200000;
struct AwesomeEvent : public TimedEventQueue::Event { struct AwesomeEvent : public TimedEventQueue::Event {
AwesomeEvent( AwesomeEvent(
@@ -610,9 +612,6 @@ void AwesomePlayer::onBufferingUpdate() {
// We don't know the bitrate of the stream, use absolute size // We don't know the bitrate of the stream, use absolute size
// limits to maintain the cache. // limits to maintain the cache.
const size_t kLowWaterMarkBytes = 40000;
const size_t kHighWaterMarkBytes = 200000;
if ((mFlags & PLAYING) && !eos if ((mFlags & PLAYING) && !eos
&& (cachedDataRemaining < kLowWaterMarkBytes)) { && (cachedDataRemaining < kLowWaterMarkBytes)) {
LOGI("cache is running low (< %d) , pausing.", LOGI("cache is running low (< %d) , pausing.",
@@ -1535,6 +1534,34 @@ status_t AwesomePlayer::finishSetDataSource_l() {
mConnectingDataSource.clear(); mConnectingDataSource.clear();
dataSource = mCachedSource; dataSource = mCachedSource;
// We're going to prefill the cache before trying to instantiate
// the extractor below, as the latter is an operation that otherwise
// could block on the datasource for a significant amount of time.
// During that time we'd be unable to abort the preparation phase
// without this prefill.
mLock.unlock();
for (;;) {
status_t finalStatus;
size_t cachedDataRemaining =
mCachedSource->approxDataRemaining(&finalStatus);
if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes
|| (mFlags & PREPARE_CANCELLED)) {
break;
}
usleep(200000);
}
mLock.lock();
if (mFlags & PREPARE_CANCELLED) {
LOGI("Prepare cancelled while waiting for initial cache fill.");
return UNKNOWN_ERROR;
}
} else if (!strncasecmp(mUri.string(), "httplive://", 11)) { } else if (!strncasecmp(mUri.string(), "httplive://", 11)) {
String8 uri("http://"); String8 uri("http://");
uri.append(mUri.string() + 11); uri.append(mUri.string() + 11);

View File

@@ -14,6 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
//#define LOG_NDEBUG 0
#define LOG_TAG "NuCachedSource2" #define LOG_TAG "NuCachedSource2"
#include <utils/Log.h> #include <utils/Log.h>
@@ -487,4 +488,5 @@ void NuCachedSource2::getDrmInfo(DecryptHandle **handle, DrmManagerClient **clie
String8 NuCachedSource2::getUri() { String8 NuCachedSource2::getUri() {
return mSource->getUri(); return mSource->getUri();
} }
} // namespace android } // namespace android