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

Commit a32764e6 authored by Jim Shargo's avatar Jim Shargo
Browse files

MediaCodec: Migrate away from IGBC

We're no longer supporting client use of IGBP/IGBC. This CL replaces
usage in MediaCodec.cpp with BufferItemConsumer.

BYPASS_IGBP_IGBC_API_REASON=warren buffers

Bug: 393639153
Flag: com.android.graphics.libgui.flags.wb_media_migration
Test: atest MediaCodecTest
Change-Id: I36b6f18f117c6f649063928f958114a8811185d5
parent 28f157f4
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -48,7 +48,10 @@
#include <binder/IMemory.h>
#include <binder/IServiceManager.h>
#include <binder/MemoryDealer.h>
#include <com_android_graphics_libgui_flags.h>
#include <cutils/properties.h>
#include <gui/BufferItem.h>
#include <gui/BufferItemConsumer.h>
#include <gui/BufferQueue.h>
#include <gui/Surface.h>
#include <hidlmemory/FrameworkUtils.h>
@@ -770,6 +773,42 @@ MediaCodec::BufferInfo::BufferInfo() : mOwnedByClient(false) {}

////////////////////////////////////////////////////////////////////////////////

#if COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_MEDIA_MIGRATION)
class MediaCodec::ReleaseSurface {
    public:
        explicit ReleaseSurface(uint64_t usage) {
            std::tie(mConsumer, mSurface) = BufferItemConsumer::create(usage);

            struct FrameAvailableListener : public BufferItemConsumer::FrameAvailableListener {
                FrameAvailableListener(const sp<BufferItemConsumer> &consumer) {
                    mConsumer = consumer;
                }
                void onFrameAvailable(const BufferItem&) override {
                    BufferItem buffer;
                    // consume buffer
                    sp<BufferItemConsumer> consumer = mConsumer.promote();
                    if (consumer != nullptr && consumer->acquireBuffer(&buffer, 0) == NO_ERROR) {
                        consumer->releaseBuffer(buffer.mGraphicBuffer, buffer.mFence);
                    }
                }

                wp<BufferItemConsumer> mConsumer;
            };
            mFrameAvailableListener = sp<FrameAvailableListener>::make(mConsumer);
            mConsumer->setFrameAvailableListener(mFrameAvailableListener);
            mConsumer->setName(String8{"MediaCodec.release"});
        }

        const sp<Surface> &getSurface() {
            return mSurface;
        }

    private:
        sp<BufferItemConsumer> mConsumer;
        sp<Surface> mSurface;
        sp<BufferItemConsumer::FrameAvailableListener> mFrameAvailableListener;
    };
#else
class MediaCodec::ReleaseSurface {
public:
    explicit ReleaseSurface(uint64_t usage) {
@@ -807,6 +846,7 @@ private:
    sp<IGraphicBufferConsumer> mConsumer;
    sp<Surface> mSurface;
};
#endif // COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_MEDIA_MIGRATION)

////////////////////////////////////////////////////////////////////////////////