summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2014-09-23 14:59:01 -0700
committerAndy Hung <hunga@google.com>2014-09-24 18:46:49 -0700
commitcf31f1eecf46d599428e115dfee8dd47b76c83fc (patch)
treec28c387f27388abc22a1658f40adf0395afb4262 /media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
parent80ec934ae7d4e3a78af87554fdb77a58f6386ba0 (diff)
downloadframeworks_av-cf31f1eecf46d599428e115dfee8dd47b76c83fc.zip
frameworks_av-cf31f1eecf46d599428e115dfee8dd47b76c83fc.tar.gz
frameworks_av-cf31f1eecf46d599428e115dfee8dd47b76c83fc.tar.bz2
NuPlayer: Fix decoder error handling
Upon error, release MediaCodec after flushing data. Report errors when they occur with ALOGE. Fix onInputBufferFilled mInputBufferIsDequeued check. Bug: 17423087 Bug: 17622642 Change-Id: I316601a19d5ec95cf8e14f5bc0418a05ec423041
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp34
1 files changed, 26 insertions, 8 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
index cdb860c..ed6f674 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
@@ -223,7 +223,11 @@ status_t NuPlayer::Decoder::getInputBuffers(Vector<sp<ABuffer> > *buffers) const
void NuPlayer::Decoder::handleError(int32_t err)
{
- mCodec->release();
+ // 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);
@@ -238,6 +242,8 @@ bool NuPlayer::Decoder::handleAnInputBuffer() {
mComponentName.c_str(), res == OK ? (int)bufferIx : res);
if (res != OK) {
if (res != -EAGAIN) {
+ ALOGE("Failed to dequeue input buffer for %s (err=%d)",
+ mComponentName.c_str(), res);
handleError(res);
}
return false;
@@ -311,7 +317,7 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {
}
}
- mInputBufferIsDequeued.editItemAt(bufferIx) = false;
+
if (buffer == NULL /* includes !hasBuffer */) {
int32_t streamErr = ERROR_END_OF_STREAM;
@@ -329,12 +335,18 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {
0,
0,
MediaCodec::BUFFER_FLAG_EOS);
- if (streamErr == ERROR_END_OF_STREAM && err != OK) {
+ if (err == OK) {
+ mInputBufferIsDequeued.editItemAt(bufferIx) = false;
+ } else if (streamErr == ERROR_END_OF_STREAM) {
streamErr = err;
// err will not be ERROR_END_OF_STREAM
}
if (streamErr != ERROR_END_OF_STREAM) {
+ ALOGE("Stream error for %s (err=%d), EOS %s queued",
+ mComponentName.c_str(),
+ streamErr,
+ err == OK ? "successfully" : "unsuccessfully");
handleError(streamErr);
}
} else {
@@ -364,14 +376,18 @@ void android::NuPlayer::Decoder::onInputBufferFilled(const sp<AMessage> &msg) {
timeUs,
flags);
if (err != OK) {
+ if (mediaBuffer != NULL) {
+ mediaBuffer->release();
+ }
ALOGE("Failed to queue input buffer for %s (err=%d)",
mComponentName.c_str(), err);
handleError(err);
- }
-
- if (mediaBuffer != NULL) {
- CHECK(mMediaBuffers[bufferIx] == NULL);
- mMediaBuffers.editItemAt(bufferIx) = mediaBuffer;
+ } else {
+ mInputBufferIsDequeued.editItemAt(bufferIx) = false;
+ if (mediaBuffer != NULL) {
+ CHECK(mMediaBuffers[bufferIx] == NULL);
+ mMediaBuffers.editItemAt(bufferIx) = mediaBuffer;
+ }
}
}
}
@@ -422,6 +438,8 @@ bool NuPlayer::Decoder::handleAnOutputBuffer() {
return true;
} else if (res != OK) {
if (res != -EAGAIN) {
+ ALOGE("Failed to dequeue output buffer for %s (err=%d)",
+ mComponentName.c_str(), res);
handleError(res);
}
return false;