Loading media/libstagefright/AwesomePlayer.cpp +27 −12 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,8 @@ #define USE_SURFACE_ALLOC 1 #define USE_SURFACE_ALLOC 1 #define FRAME_DROP_FREQ 0 #define FRAME_DROP_FREQ 0 #define PROPERTY_OFFLOAD_HIWATERMARK "audio.offload.hiwatermark" #define PROPERTY_OFFLOAD_LOWATERMARK "audio.offload.lowatermark" namespace android { namespace android { Loading @@ -72,7 +74,8 @@ static int64_t kLowWaterMarkUs = 2000000ll; // 2secs static int64_t kHighWaterMarkUs = 5000000ll; // 5secs static int64_t kHighWaterMarkUs = 5000000ll; // 5secs static const size_t kLowWaterMarkBytes = 40000; static const size_t kLowWaterMarkBytes = 40000; static const size_t kHighWaterMarkBytes = 200000; static const size_t kHighWaterMarkBytes = 200000; static size_t kOffloadLowWaterMarkBytes = kLowWaterMarkBytes; static size_t kOffloadHighWaterMarkBytes = kHighWaterMarkBytes; // maximum time in paused state when offloading audio decompression. When elapsed, the AudioPlayer // maximum time in paused state when offloading audio decompression. When elapsed, the AudioPlayer // is destroyed to allow the audio DSP to power down. // is destroyed to allow the audio DSP to power down. static int64_t kOffloadPauseMaxUs = 10000000ll; static int64_t kOffloadPauseMaxUs = 10000000ll; Loading Loading @@ -640,6 +643,11 @@ void AwesomePlayer::reset_l() { mMediaRenderingStartGeneration = 0; mMediaRenderingStartGeneration = 0; mStartGeneration = 0; mStartGeneration = 0; kOffloadLowWaterMarkBytes = property_get_int32(PROPERTY_OFFLOAD_LOWATERMARK, kLowWaterMarkBytes); kOffloadHighWaterMarkBytes = property_get_int32(PROPERTY_OFFLOAD_HIWATERMARK, kHighWaterMarkBytes); } } void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { Loading Loading @@ -730,6 +738,7 @@ void AwesomePlayer::onBufferingUpdate() { size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); bool eos = (finalStatus != OK); bool eos = (finalStatus != OK); ALOGV("cachedDataRemaining = %zu b, eos=%d", cachedDataRemaining, eos); if (eos) { if (eos) { if (finalStatus == ERROR_END_OF_STREAM) { if (finalStatus == ERROR_END_OF_STREAM) { notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); Loading @@ -740,36 +749,42 @@ void AwesomePlayer::onBufferingUpdate() { } } } else { } else { bool eos2; bool eos2; bool knownDuration = false; int64_t cachedDurationUs; int64_t cachedDurationUs; if (getCachedDuration_l(&cachedDurationUs, &eos2) && mDurationUs > 0) { if (getCachedDuration_l(&cachedDurationUs, &eos2) && mDurationUs > 0) { knownDuration = true; int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; if (percentage > 100) { if (percentage > 100) { percentage = 100; percentage = 100; } } notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); } else { } // We don't know the bitrate/duration of the stream, use absolute size if (!knownDuration || mOffloadAudio) { // limits to maintain the cache. // If we don't know the bitrate/duration of the stream, or are offloading // decode, use absolute size limits to maintain the cache. if ((mFlags & PLAYING) && !eos size_t lowWatermark = && (cachedDataRemaining < kLowWaterMarkBytes)) { mOffloadAudio ? kOffloadLowWaterMarkBytes : kLowWaterMarkBytes; ALOGI("cache is running low (< %zu) , pausing.", size_t highWatermark = kLowWaterMarkBytes); mOffloadAudio ? kOffloadHighWaterMarkBytes : kHighWaterMarkBytes; if ((mFlags & PLAYING) && !eos && (cachedDataRemaining < lowWatermark)) { ALOGI("cache is running low (< %zu) , pausing.", lowWatermark); modifyFlags(CACHE_UNDERRUN, SET); modifyFlags(CACHE_UNDERRUN, SET); pause_l(); pause_l(); ensureCacheIsFetching_l(); ensureCacheIsFetching_l(); sendCacheStats(); sendCacheStats(); notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { } else if (eos || cachedDataRemaining > highWatermark) { if (mFlags & CACHE_UNDERRUN) { if (mFlags & CACHE_UNDERRUN) { ALOGI("cache has filled up (> %zu), resuming.", ALOGI("cache has filled up (> %zu), resuming.", kHighWaterMarkBytes); highWatermark); modifyFlags(CACHE_UNDERRUN, CLEAR); modifyFlags(CACHE_UNDERRUN, CLEAR); play_l(); play_l(); } else if (mFlags & PREPARING) { } else if (mFlags & PREPARING) { ALOGV("cache has filled up (> %zu), prepare is done", ALOGV("cache has filled up (> %zu), prepare is done", kHighWaterMarkBytes); highWatermark); finishAsyncPrepare_l(); finishAsyncPrepare_l(); } } } } Loading Loading @@ -803,7 +818,7 @@ void AwesomePlayer::onBufferingUpdate() { int64_t cachedDurationUs; int64_t cachedDurationUs; bool eos; bool eos; if (getCachedDuration_l(&cachedDurationUs, &eos)) { if (!mOffloadAudio && getCachedDuration_l(&cachedDurationUs, &eos)) { ALOGV("cachedDurationUs = %.2f secs, eos=%d", ALOGV("cachedDurationUs = %.2f secs, eos=%d", cachedDurationUs / 1E6, eos); cachedDurationUs / 1E6, eos); Loading Loading
media/libstagefright/AwesomePlayer.cpp +27 −12 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,8 @@ #define USE_SURFACE_ALLOC 1 #define USE_SURFACE_ALLOC 1 #define FRAME_DROP_FREQ 0 #define FRAME_DROP_FREQ 0 #define PROPERTY_OFFLOAD_HIWATERMARK "audio.offload.hiwatermark" #define PROPERTY_OFFLOAD_LOWATERMARK "audio.offload.lowatermark" namespace android { namespace android { Loading @@ -72,7 +74,8 @@ static int64_t kLowWaterMarkUs = 2000000ll; // 2secs static int64_t kHighWaterMarkUs = 5000000ll; // 5secs static int64_t kHighWaterMarkUs = 5000000ll; // 5secs static const size_t kLowWaterMarkBytes = 40000; static const size_t kLowWaterMarkBytes = 40000; static const size_t kHighWaterMarkBytes = 200000; static const size_t kHighWaterMarkBytes = 200000; static size_t kOffloadLowWaterMarkBytes = kLowWaterMarkBytes; static size_t kOffloadHighWaterMarkBytes = kHighWaterMarkBytes; // maximum time in paused state when offloading audio decompression. When elapsed, the AudioPlayer // maximum time in paused state when offloading audio decompression. When elapsed, the AudioPlayer // is destroyed to allow the audio DSP to power down. // is destroyed to allow the audio DSP to power down. static int64_t kOffloadPauseMaxUs = 10000000ll; static int64_t kOffloadPauseMaxUs = 10000000ll; Loading Loading @@ -640,6 +643,11 @@ void AwesomePlayer::reset_l() { mMediaRenderingStartGeneration = 0; mMediaRenderingStartGeneration = 0; mStartGeneration = 0; mStartGeneration = 0; kOffloadLowWaterMarkBytes = property_get_int32(PROPERTY_OFFLOAD_LOWATERMARK, kLowWaterMarkBytes); kOffloadHighWaterMarkBytes = property_get_int32(PROPERTY_OFFLOAD_HIWATERMARK, kHighWaterMarkBytes); } } void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { void AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) { Loading Loading @@ -730,6 +738,7 @@ void AwesomePlayer::onBufferingUpdate() { size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); bool eos = (finalStatus != OK); bool eos = (finalStatus != OK); ALOGV("cachedDataRemaining = %zu b, eos=%d", cachedDataRemaining, eos); if (eos) { if (eos) { if (finalStatus == ERROR_END_OF_STREAM) { if (finalStatus == ERROR_END_OF_STREAM) { notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); notifyListener_l(MEDIA_BUFFERING_UPDATE, 100); Loading @@ -740,36 +749,42 @@ void AwesomePlayer::onBufferingUpdate() { } } } else { } else { bool eos2; bool eos2; bool knownDuration = false; int64_t cachedDurationUs; int64_t cachedDurationUs; if (getCachedDuration_l(&cachedDurationUs, &eos2) && mDurationUs > 0) { if (getCachedDuration_l(&cachedDurationUs, &eos2) && mDurationUs > 0) { knownDuration = true; int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; int percentage = 100.0 * (double)cachedDurationUs / mDurationUs; if (percentage > 100) { if (percentage > 100) { percentage = 100; percentage = 100; } } notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage); } else { } // We don't know the bitrate/duration of the stream, use absolute size if (!knownDuration || mOffloadAudio) { // limits to maintain the cache. // If we don't know the bitrate/duration of the stream, or are offloading // decode, use absolute size limits to maintain the cache. if ((mFlags & PLAYING) && !eos size_t lowWatermark = && (cachedDataRemaining < kLowWaterMarkBytes)) { mOffloadAudio ? kOffloadLowWaterMarkBytes : kLowWaterMarkBytes; ALOGI("cache is running low (< %zu) , pausing.", size_t highWatermark = kLowWaterMarkBytes); mOffloadAudio ? kOffloadHighWaterMarkBytes : kHighWaterMarkBytes; if ((mFlags & PLAYING) && !eos && (cachedDataRemaining < lowWatermark)) { ALOGI("cache is running low (< %zu) , pausing.", lowWatermark); modifyFlags(CACHE_UNDERRUN, SET); modifyFlags(CACHE_UNDERRUN, SET); pause_l(); pause_l(); ensureCacheIsFetching_l(); ensureCacheIsFetching_l(); sendCacheStats(); sendCacheStats(); notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START); } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) { } else if (eos || cachedDataRemaining > highWatermark) { if (mFlags & CACHE_UNDERRUN) { if (mFlags & CACHE_UNDERRUN) { ALOGI("cache has filled up (> %zu), resuming.", ALOGI("cache has filled up (> %zu), resuming.", kHighWaterMarkBytes); highWatermark); modifyFlags(CACHE_UNDERRUN, CLEAR); modifyFlags(CACHE_UNDERRUN, CLEAR); play_l(); play_l(); } else if (mFlags & PREPARING) { } else if (mFlags & PREPARING) { ALOGV("cache has filled up (> %zu), prepare is done", ALOGV("cache has filled up (> %zu), prepare is done", kHighWaterMarkBytes); highWatermark); finishAsyncPrepare_l(); finishAsyncPrepare_l(); } } } } Loading Loading @@ -803,7 +818,7 @@ void AwesomePlayer::onBufferingUpdate() { int64_t cachedDurationUs; int64_t cachedDurationUs; bool eos; bool eos; if (getCachedDuration_l(&cachedDurationUs, &eos)) { if (!mOffloadAudio && getCachedDuration_l(&cachedDurationUs, &eos)) { ALOGV("cachedDurationUs = %.2f secs, eos=%d", ALOGV("cachedDurationUs = %.2f secs, eos=%d", cachedDurationUs / 1E6, eos); cachedDurationUs / 1E6, eos); Loading