summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2011-09-27 09:48:56 -0700
committerEric Laurent <elaurent@google.com>2011-09-27 10:23:38 -0700
commit9968a36f297e299578b4f4726832ac8323a08c6f (patch)
treee01dcf76a5c10b21f48c30fb279173cc037c8a21 /media/libmediaplayerservice
parent2cdbe2f1cf0157bf49913c46cc806169e0f9ecc6 (diff)
downloadframeworks_base-9968a36f297e299578b4f4726832ac8323a08c6f.zip
frameworks_base-9968a36f297e299578b4f4726832ac8323a08c6f.tar.gz
frameworks_base-9968a36f297e299578b4f4726832ac8323a08c6f.tar.bz2
Fix issue 5373048: AudioCache decode errors
When decoding a file for the SoundPool, do not reject the entire file in case of error but return what was decoded so far instead. Change-Id: Iff199a1b6a4c8e064e42a0dfe0704e0ae36a27fd
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 0386d4b..b5eef94 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -52,6 +52,7 @@
#include <media/Metadata.h>
#include <media/AudioTrack.h>
#include <media/MemoryLeakTrackUtil.h>
+#include <media/stagefright/MediaErrors.h>
#include <system/audio.h>
@@ -1132,7 +1133,11 @@ sp<IMemory> MediaPlayerService::decode(const char* url, uint32_t *pSampleRate, i
player->start();
LOGV("wait for playback complete");
- if (cache->wait() != NO_ERROR) goto Exit;
+ cache->wait();
+ // in case of error, return what was successfully decoded.
+ if (cache->size() == 0) {
+ goto Exit;
+ }
mem = new MemoryBase(cache->getHeap(), 0, cache->size());
*pSampleRate = cache->sampleRate();
@@ -1175,7 +1180,11 @@ sp<IMemory> MediaPlayerService::decode(int fd, int64_t offset, int64_t length, u
player->start();
LOGV("wait for playback complete");
- if (cache->wait() != NO_ERROR) goto Exit;
+ cache->wait();
+ // in case of error, return what was successfully decoded.
+ if (cache->size() == 0) {
+ goto Exit;
+ }
mem = new MemoryBase(cache->getHeap(), 0, cache->size());
*pSampleRate = cache->sampleRate();