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
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index ceedb40..ef4abd4 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -832,24 +832,31 @@
 
                 finishFlushIfPossible();
             } else if (what == Decoder::kWhatError) {
-                ALOGE("Received error from %s decoder, aborting playback.",
-                     audio ? "audio" : "video");
-
                 status_t err;
                 if (!msg->findInt32("err", &err)) {
                     err = UNKNOWN_ERROR;
                 }
-                mRenderer->queueEOS(audio, err);
+                ALOGE("received error from %s decoder %#x", audio ? "audio" : "video", err);
+
+                ALOGI("shutting down %s", audio ? "audio" : "video");
                 if (audio && mFlushingAudio != NONE) {
+                    mRenderer->queueEOS(audio, err);
                     mAudioDecoder.clear();
                     ++mAudioDecoderGeneration;
                     mFlushingAudio = SHUT_DOWN;
-                } else if (!audio && mFlushingVideo != NONE){
+                    finishFlushIfPossible();
+                } else if (!audio && mFlushingVideo != NONE) {
+                    mRenderer->queueEOS(audio, err);
                     mVideoDecoder.clear();
                     ++mVideoDecoderGeneration;
                     mFlushingVideo = SHUT_DOWN;
+                    finishFlushIfPossible();
+                }  else {
+                    mDeferredActions.push_back(
+                            new ShutdownDecoderAction(audio, !audio /* video */));
+                    processDeferredActions();
+                    notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
                 }
-                finishFlushIfPossible();
             } else if (what == Decoder::kWhatDrainThisBuffer) {
                 renderBuffer(audio, msg);
             } else {