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

Commit 768fc2d6 authored by Chong Zhang's avatar Chong Zhang
Browse files

Make ConsumerProxy hold weak ref to GraphicBufferSource

bug: 130387875
test: atest android.hardware.camera2.cts.RecordingTest#testAbandonedHighSpeedRequest
MediaRecorderTest, EncodeDecodeTest

Change-Id: I6c65bf493f96725d7a78d113fe1b70edd420eb38
parent 019b2fc5
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -282,24 +282,36 @@ private:
};

struct GraphicBufferSource::ConsumerProxy : public BufferQueue::ConsumerListener {
    ConsumerProxy(const sp<GraphicBufferSource> &gbs) : mGbs(gbs) {}
    ConsumerProxy(const wp<GraphicBufferSource> &gbs) : mGbs(gbs) {}

    ~ConsumerProxy() = default;

    void onFrameAvailable(const BufferItem& item) override {
        mGbs->onFrameAvailable(item);
        sp<GraphicBufferSource> gbs = mGbs.promote();
        if (gbs != nullptr) {
            gbs->onFrameAvailable(item);
        }
    }

    void onBuffersReleased() override {
        mGbs->onBuffersReleased();
        sp<GraphicBufferSource> gbs = mGbs.promote();
        if (gbs != nullptr) {
            gbs->onBuffersReleased();
        }
    }

    void onSidebandStreamChanged() override {
        mGbs->onSidebandStreamChanged();
        sp<GraphicBufferSource> gbs = mGbs.promote();
        if (gbs != nullptr) {
            gbs->onSidebandStreamChanged();
        }
    }

private:
    sp<GraphicBufferSource> mGbs;
    // Note that GraphicBufferSource is holding an sp to us, we can't hold
    // an sp back to GraphicBufferSource as the circular dependency will
    // make both immortal.
    wp<GraphicBufferSource> mGbs;
};

GraphicBufferSource::GraphicBufferSource() :