summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2014-12-03 11:47:36 -0800
committerAndy Hung <hunga@google.com>2014-12-03 16:13:50 -0800
commit202bce11a7f66f27e6dbb6d154ddc123aa62513d (patch)
tree390b83dacc286717243ba6e3c1173c9e2f01b376 /media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp
parent9a1c8892f6835325db6931529dc74bf98cf0aee8 (diff)
downloadframeworks_av-202bce11a7f66f27e6dbb6d154ddc123aa62513d.zip
frameworks_av-202bce11a7f66f27e6dbb6d154ddc123aa62513d.tar.gz
frameworks_av-202bce11a7f66f27e6dbb6d154ddc123aa62513d.tar.bz2
Fix NuPlayer assertion on failure to create AudioTrack
Under heavy media load or monkey/stress testing, more than 32 AudioTracks may be created or memory resources may be scarce. Remove the assertion on failure to create AudioTrack and signal MEDIA_ERROR. Bug: 17319843 Change-Id: I5d4e200b5f50d800046851a33e035cdc6ff10075
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp
index 4164350..d56fc4d 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoderBase.cpp
@@ -28,8 +28,10 @@
namespace android {
-NuPlayer::DecoderBase::DecoderBase()
- : mRequestInputBuffersPending(false) {
+NuPlayer::DecoderBase::DecoderBase(const sp<AMessage> &notify)
+ : mNotify(notify),
+ mBufferGeneration(0),
+ mRequestInputBuffersPending(false) {
// Every decoder has its own looper because MediaCodec operations
// are blocking, but NuPlayer needs asynchronous operations.
mDecoderLooper = new ALooper;
@@ -180,5 +182,19 @@ void NuPlayer::DecoderBase::onMessageReceived(const sp<AMessage> &msg) {
}
}
+void NuPlayer::DecoderBase::handleError(int32_t err)
+{
+ // We cannot immediately release the codec due to buffers still outstanding
+ // in the renderer. We signal to the player the error so it can shutdown/release the
+ // decoder after flushing and increment the generation to discard unnecessary messages.
+
+ ++mBufferGeneration;
+
+ sp<AMessage> notify = mNotify->dup();
+ notify->setInt32("what", kWhatError);
+ notify->setInt32("err", err);
+ notify->post();
+}
+
} // namespace android