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
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 {
// 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);
}
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;
}
case FLUSHING:
{
- setState(
- (mFlags & kFlagIsAsync) ? FLUSHED : STARTED);
+ if (actionCode == ACTION_CODE_FATAL) {
+ setState(UNINITIALIZED);
+ } else {
+ setState(
+ (mFlags & kFlagIsAsync) ? FLUSHED : STARTED);
+ }
break;
}