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

Commit 960423d4 authored by Jamie Gennis's avatar Jamie Gennis Committed by Android (Google) Code Review
Browse files

Merge "Fix a MediaBuffer leak in Stagefright."

parents 0f46c6f4 f0c5c1e8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -241,6 +241,8 @@ private:
    status_t freeBuffersOnPort(
            OMX_U32 portIndex, bool onlyThoseWeOwn = false);

    status_t freeBuffer(OMX_U32 portIndex, size_t bufIndex);

    void drainInputBuffer(IOMX::buffer_id buffer);
    void fillOutputBuffer(IOMX::buffer_id buffer);
    void drainInputBuffer(BufferInfo *info);
+29 −34
Original line number Diff line number Diff line
@@ -1901,11 +1901,8 @@ void OMXCodec::on_message(const omx_message &msg) {
            if (mPortStatus[kPortIndexInput] == DISABLING) {
                CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);

                status_t err =
                    mOMX->freeBuffer(mNode, kPortIndexInput, buffer);
                status_t err = freeBuffer(kPortIndexInput, i);
                CHECK_EQ(err, OK);

                buffers->removeAt(i);
            } else if (mState != ERROR
                    && mPortStatus[kPortIndexInput] != SHUTTING_DOWN) {
                CHECK_EQ(mPortStatus[kPortIndexInput], ENABLED);
@@ -1945,20 +1942,9 @@ void OMXCodec::on_message(const omx_message &msg) {
            if (mPortStatus[kPortIndexOutput] == DISABLING) {
                CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);

                status_t err =
                    mOMX->freeBuffer(mNode, kPortIndexOutput, buffer);
                status_t err = freeBuffer(kPortIndexOutput, i);
                CHECK_EQ(err, OK);

                // Cancel the buffer if it belongs to an ANativeWindow.
                if (info->mMediaBuffer != NULL) {
                    sp<GraphicBuffer> graphicBuffer = info->mMediaBuffer->graphicBuffer();
                    if (!info->mOwnedByNativeWindow && graphicBuffer != 0) {
                        cancelBufferToNativeWindow(info);
                        // Ignore any errors
                    }
                }

                buffers->removeAt(i);
#if 0
            } else if (mPortStatus[kPortIndexOutput] == ENABLED
                       && (flags & OMX_BUFFERFLAG_EOS)) {
@@ -2436,14 +2422,27 @@ status_t OMXCodec::freeBuffersOnPort(

        CODEC_LOGV("freeing buffer %p on port %ld", info->mBuffer, portIndex);

        status_t err =
            mOMX->freeBuffer(mNode, portIndex, info->mBuffer);
        status_t err = freeBuffer(portIndex, i);

        if (err != OK) {
            stickyErr = err;
        }

        if (info->mMediaBuffer != NULL) {
    }

    CHECK(onlyThoseWeOwn || buffers->isEmpty());

    return stickyErr;
}

status_t OMXCodec::freeBuffer(OMX_U32 portIndex, size_t bufIndex) {
    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];

    BufferInfo *info = &buffers->editItemAt(bufIndex);

    status_t err = mOMX->freeBuffer(mNode, portIndex, info->mBuffer);

    if (err == OK && info->mMediaBuffer != NULL) {
        info->mMediaBuffer->setObserver(NULL);

        // Make sure nobody but us owns this buffer at this point.
@@ -2452,21 +2451,17 @@ status_t OMXCodec::freeBuffersOnPort(
        // Cancel the buffer if it belongs to an ANativeWindow.
        sp<GraphicBuffer> graphicBuffer = info->mMediaBuffer->graphicBuffer();
        if (!info->mOwnedByNativeWindow && graphicBuffer != 0) {
                status_t err = cancelBufferToNativeWindow(info);
                if (err != OK) {
                  stickyErr = err;
                }
            err = cancelBufferToNativeWindow(info);
        }

        info->mMediaBuffer->release();
    }

        buffers->removeAt(i);
    if (err == OK) {
        buffers->removeAt(bufIndex);
    }

    CHECK(onlyThoseWeOwn || buffers->isEmpty());

    return stickyErr;
    return err;
}

void OMXCodec::onPortSettingsChanged(OMX_U32 portIndex) {