OSDN Git Service

handle error during flush in MediaPlayer.reset()
authorMarco Nelissen <marcone@google.com>
Mon, 18 Aug 2014 23:13:03 +0000 (16:13 -0700)
committerLajos Molnar <lajos@google.com>
Wed, 20 Aug 2014 01:48:35 +0000 (01:48 +0000)
If there was an error during the flush phase of a reset, then the
reset would never complete. We now make sure the MediaCodec moves
to the right state in this case, and that NuPlayer cleans up and
resumes the rest of the reset after a failed flush.

Bug: 16955082
Change-Id: Ied61136871a9fcdffcc80647fa2bba64a926ac2a

media/libmediaplayerservice/nuplayer/NuPlayer.cpp
media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp
media/libstagefright/MediaCodec.cpp

index 5e7ecfa..818155c 100644 (file)
@@ -782,6 +782,14 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                     err = UNKNOWN_ERROR;
                 }
                 mRenderer->queueEOS(audio, err);
+                if (audio && mFlushingAudio != NONE) {
+                    mAudioDecoder.clear();
+                    mFlushingAudio = SHUT_DOWN;
+                } else if (!audio && mFlushingVideo != NONE){
+                    mVideoDecoder.clear();
+                    mFlushingVideo = SHUT_DOWN;
+                }
+                finishFlushIfPossible();
             } else if (what == Decoder::kWhatDrainThisBuffer) {
                 renderBuffer(audio, msg);
             } else {
index 8fce2f4..60c645a 100644 (file)
@@ -44,11 +44,11 @@ NuPlayer::Decoder::Decoder(
     // Every decoder has its own looper because MediaCodec operations
     // are blocking, but NuPlayer needs asynchronous operations.
     mDecoderLooper = new ALooper;
-    mDecoderLooper->setName("NuPlayerDecoder");
+    mDecoderLooper->setName("NPDecoder");
     mDecoderLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
 
     mCodecLooper = new ALooper;
-    mCodecLooper->setName("NuPlayerDecoder-MC");
+    mCodecLooper->setName("NPDecoder-CL");
     mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
 }
 
index 42691b9..1181c2b 100644 (file)
@@ -716,7 +716,8 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                     CHECK(msg->findInt32("err", &err));
                     CHECK(msg->findInt32("actionCode", &actionCode));
 
-                    ALOGE("Codec reported err %#x, actionCode %d", err, actionCode);
+                    ALOGE("Codec reported err %#x, actionCode %d, while in state %d",
+                            err, actionCode, mState);
                     if (err == DEAD_OBJECT) {
                         mFlags |= kFlagSawMediaServerDie;
                     }
@@ -767,8 +768,12 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
 
                         case FLUSHING:
                         {
-                            setState(
-                                    (mFlags & kFlagIsAsync) ? FLUSHED : STARTED);
+                            if (actionCode == ACTION_CODE_FATAL) {
+                                setState(UNINITIALIZED);
+                            } else {
+                                setState(
+                                        (mFlags & kFlagIsAsync) ? FLUSHED : STARTED);
+                            }
                             break;
                         }