Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52dfbee9 authored by Praveen Chavan's avatar Praveen Chavan Committed by Lajos Molnar
Browse files

Stagefright: MediaCodec: shutdown allocated codec on error

If MediaCodec sees a fatal error and transitions to
UNINITIALIZED state, The codec may still be alive (with an
exception of 'mediaserver-died' error).
Handle Shutdown of the codec during release().

Bug: 17784012
Bug: 18033275

Change-Id: I891e036499d9b440a57f77fb735a5ba4da9a6e43
parent 7de5ac1f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -205,6 +205,7 @@ private:
        kFlagIsEncoder                  = 256,
        kFlagGatherCodecSpecificData    = 512,
        kFlagIsAsync                    = 1024,
        kFlagIsComponentAllocated       = 2048,
    };

    struct BufferInfo {
+6 −2
Original line number Diff line number Diff line
@@ -738,6 +738,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                            err, actionCode, mState);
                    if (err == DEAD_OBJECT) {
                        mFlags |= kFlagSawMediaServerDie;
                        mFlags &= ~kFlagIsComponentAllocated;
                    }

                    bool sendErrorResponse = true;
@@ -863,6 +864,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                {
                    CHECK_EQ(mState, INITIALIZING);
                    setState(INITIALIZED);
                    mFlags |= kFlagIsComponentAllocated;

                    CHECK(msg->findString("componentName", &mComponentName));

@@ -1136,6 +1138,7 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                        setState(UNINITIALIZED);
                        mComponentName.clear();
                    }
                    mFlags &= ~kFlagIsComponentAllocated;

                    (new AMessage)->postReply(mReplyID);
                    break;
@@ -1336,9 +1339,10 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
            uint32_t replyID;
            CHECK(msg->senderAwaitsResponse(&replyID));

            if (mState != INITIALIZED
            if (!(mFlags & kFlagIsComponentAllocated) && mState != INITIALIZED
                    && mState != CONFIGURED && !isExecuting()) {
                // We may be in "UNINITIALIZED" state already without the
                // We may be in "UNINITIALIZED" state already and
                // also shutdown the encoder/decoder without the
                // client being aware of this if media server died while
                // we were being stopped. The client would assume that
                // after stop() returned, it would be safe to call release()