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

Commit c8e07e48 authored by Andreas Huber's avatar Andreas Huber
Browse files

Properly release any MediaBuffer references associated with the

encoder input buffers on shutdown. This worked fine before for an orderly
shutdown but didn't release all references in case of error.

Change-Id: I0ea3eb26da76fbeb33cadf58d237b0c68a86ac4a
related-to-bug: 7893090
parent 0fd58c97
Loading
Loading
Loading
Loading
+41 −19
Original line number Diff line number Diff line
@@ -67,11 +67,45 @@ Converter::Converter(
    mInitCheck = initEncoder();

    if (mInitCheck != OK) {
        if (mEncoder != NULL) {
        releaseEncoder();
    }
}

static void ReleaseMediaBufferReference(const sp<ABuffer> &accessUnit) {
    void *mbuf;
    if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf)
            && mbuf != NULL) {
        ALOGV("releasing mbuf %p", mbuf);

        accessUnit->meta()->setPointer("mediaBuffer", NULL);

        static_cast<MediaBuffer *>(mbuf)->release();
        mbuf = NULL;
    }
}

void Converter::releaseEncoder() {
    if (mEncoder == NULL) {
        return;
    }

    mEncoder->release();
    mEncoder.clear();

    while (!mInputBufferQueue.empty()) {
        sp<ABuffer> accessUnit = *mInputBufferQueue.begin();
        mInputBufferQueue.erase(mInputBufferQueue.begin());

        ReleaseMediaBufferReference(accessUnit);
    }

    for (size_t i = 0; i < mEncoderInputBuffers.size(); ++i) {
        sp<ABuffer> accessUnit = mEncoderInputBuffers.itemAt(i);
        ReleaseMediaBufferReference(accessUnit);
    }

    mEncoderInputBuffers.clear();
    mEncoderOutputBuffers.clear();
}

Converter::~Converter() {
@@ -274,16 +308,7 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) {
                    sp<ABuffer> accessUnit;
                    CHECK(msg->findBuffer("accessUnit", &accessUnit));

                    void *mbuf;
                    if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf)
                            && mbuf != NULL) {
                        ALOGV("releasing mbuf %p", mbuf);

                        accessUnit->meta()->setPointer("mediaBuffer", NULL);

                        static_cast<MediaBuffer *>(mbuf)->release();
                        mbuf = NULL;
                    }
                    ReleaseMediaBufferReference(accessUnit);
                }
                break;
            }
@@ -385,12 +410,9 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) {

        case kWhatShutdown:
        {
            ALOGI("shutting down encoder");
            ALOGI("shutting down %s encoder", mIsVideo ? "video" : "audio");

            if (mEncoder != NULL) {
                mEncoder->release();
                mEncoder.clear();
            }
            releaseEncoder();

            AString mime;
            CHECK(mInputFormat->findString("mime", &mime));
+1 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ private:
    sp<ABuffer> mPartialAudioAU;

    status_t initEncoder();
    void releaseEncoder();

    status_t feedEncoderInputBuffers();