summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp9
-rw-r--r--media/libstagefright/AwesomePlayer.cpp42
-rw-r--r--services/camera/libcameraservice/CameraService.cpp1
3 files changed, 37 insertions, 15 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index bcfd83a..f0baf69 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1894,8 +1894,13 @@ void MediaPlayerService::AudioOutput::pause()
void MediaPlayerService::AudioOutput::close()
{
ALOGV("close");
- Mutex::Autolock lock(mLock);
- close_l();
+ sp<AudioTrack> track;
+ {
+ Mutex::Autolock lock(mLock);
+ track = mTrack;
+ close_l(); // clears mTrack
+ }
+ // destruction of the track occurs outside of mutex.
}
void MediaPlayerService::AudioOutput::setVolume(float left, float right)
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 3cd0b0e..15506ef 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -65,6 +65,8 @@
#define USE_SURFACE_ALLOC 1
#define FRAME_DROP_FREQ 0
+#define PROPERTY_OFFLOAD_HIWATERMARK "audio.offload.hiwatermark"
+#define PROPERTY_OFFLOAD_LOWATERMARK "audio.offload.lowatermark"
namespace android {
@@ -72,7 +74,8 @@ static int64_t kLowWaterMarkUs = 2000000ll; // 2secs
static int64_t kHighWaterMarkUs = 5000000ll; // 5secs
static const size_t kLowWaterMarkBytes = 40000;
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
// is destroyed to allow the audio DSP to power down.
static int64_t kOffloadPauseMaxUs = 10000000ll;
@@ -638,6 +641,11 @@ void AwesomePlayer::reset_l() {
mMediaRenderingStartGeneration = 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) {
@@ -728,6 +736,7 @@ void AwesomePlayer::onBufferingUpdate() {
size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
bool eos = (finalStatus != OK);
+ ALOGV("cachedDataRemaining = %zu b, eos=%d", cachedDataRemaining, eos);
if (eos) {
if (finalStatus == ERROR_END_OF_STREAM) {
notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
@@ -738,36 +747,42 @@ void AwesomePlayer::onBufferingUpdate() {
}
} else {
bool eos2;
+ bool knownDuration = false;
int64_t cachedDurationUs;
if (getCachedDuration_l(&cachedDurationUs, &eos2) && mDurationUs > 0) {
+ knownDuration = true;
int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
if (percentage > 100) {
percentage = 100;
}
notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
- } else {
- // We don't know the bitrate/duration of the stream, use absolute size
- // limits to maintain the cache.
+ }
+ if (!knownDuration || mOffloadAudio) {
+ // If we don't know the bitrate/duration of the stream, or are offloading
+ // decode, use absolute size limits to maintain the cache.
+
+ size_t lowWatermark =
+ mOffloadAudio ? kOffloadLowWaterMarkBytes : kLowWaterMarkBytes;
+ size_t highWatermark =
+ mOffloadAudio ? kOffloadHighWaterMarkBytes : kHighWaterMarkBytes;
- if ((mFlags & PLAYING) && !eos
- && (cachedDataRemaining < kLowWaterMarkBytes)) {
- ALOGI("cache is running low (< %zu) , pausing.",
- kLowWaterMarkBytes);
+ if ((mFlags & PLAYING) && !eos && (cachedDataRemaining < lowWatermark)) {
+ ALOGI("cache is running low (< %zu) , pausing.", lowWatermark);
modifyFlags(CACHE_UNDERRUN, SET);
pause_l();
ensureCacheIsFetching_l();
sendCacheStats();
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
- } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
+ } else if (eos || cachedDataRemaining > highWatermark) {
if (mFlags & CACHE_UNDERRUN) {
ALOGI("cache has filled up (> %zu), resuming.",
- kHighWaterMarkBytes);
+ highWatermark);
modifyFlags(CACHE_UNDERRUN, CLEAR);
play_l();
} else if (mFlags & PREPARING) {
ALOGV("cache has filled up (> %zu), prepare is done",
- kHighWaterMarkBytes);
+ highWatermark);
finishAsyncPrepare_l();
}
}
@@ -801,7 +816,7 @@ void AwesomePlayer::onBufferingUpdate() {
int64_t cachedDurationUs;
bool eos;
- if (getCachedDuration_l(&cachedDurationUs, &eos)) {
+ if (!mOffloadAudio && getCachedDuration_l(&cachedDurationUs, &eos)) {
ALOGV("cachedDurationUs = %.2f secs, eos=%d",
cachedDurationUs / 1E6, eos);
@@ -828,7 +843,8 @@ void AwesomePlayer::onBufferingUpdate() {
}
}
- if (mFlags & (PLAYING | PREPARING | CACHE_UNDERRUN)) {
+ if ( ((mFlags & PLAYING) && !eos) ||
+ (mFlags & (PREPARING | CACHE_UNDERRUN)) ) {
postBufferingEvent_l();
}
}
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 7c4594f..a560b93 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -153,6 +153,7 @@ void CameraService::onFirstRef()
ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));
logServiceError("Could not load camera HAL module", err);
mNumberOfCameras = 0;
+ mNumberOfNormalCameras = 0;
return;
}