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

Commit 2041913a authored by Jiwen 'Steve' Cai's avatar Jiwen 'Steve' Cai
Browse files

BufferQueue: plumbing mConsumerIsProtected

This replaces current logic in BufferQueue that uses
GRALLOC_USAGE_PROTECTED to indicate whether an ANativeWindow is capable
of handling hardware protected gralloc buffers. Current logic is
problematic as it enforces producer to use protected buffer no matter
whether producer side is capable of writing into a protected buffer.

This new solution, however, introduces a new NATIVE_WINDOW_* flag that
consumer can set on IGraphicBufferConsumer to indicate its capacity,
which can then be queried by producer via Surface::query (or
IGraphicBufferProducer::query).

When consumer is capable of reading protected buffer (e.g. a protected
GL context), the producer can generate either a protected or unprotected
buffer.

When consumer is not capable of reading protected buffer, the producer
should only generate unprotected buffer.

Bug: 35726763
Test: videoplayer-nodrm-protected.apk and videoplayer-drm-protected.apk
both works.

Change-Id: I1bf6814c9f1f81f9e04f0e89646b0733ff1a4758
parent 8e20f172
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -129,6 +129,12 @@ public:
    // enumerated in gralloc.h, e.g. GRALLOC_USAGE_HW_RENDER; the default is 0.
    // enumerated in gralloc.h, e.g. GRALLOC_USAGE_HW_RENDER; the default is 0.
    virtual status_t setConsumerUsageBits(uint32_t usage);
    virtual status_t setConsumerUsageBits(uint32_t usage);


    // setConsumerIsProtected will turn on an internal bit that indicates whether
    // the consumer can handle protected gralloc buffers (i.e. with
    // GRALLOC_USAGE_PROTECTED set). IGraphicBufferProducer can query this
    // capability using NATIVE_WINDOW_CONSUMER_IS_PROTECTED.
    virtual status_t setConsumerIsProtected(bool isProtected);

    // setTransformHint bakes in rotation to buffers so overlays can be used.
    // setTransformHint bakes in rotation to buffers so overlays can be used.
    // The values are enumerated in window.h, e.g.
    // The values are enumerated in window.h, e.g.
    // NATIVE_WINDOW_TRANSFORM_ROT_90.  The default is 0 (no transform).
    // NATIVE_WINDOW_TRANSFORM_ROT_90.  The default is 0 (no transform).
+4 −0
Original line number Original line Diff line number Diff line
@@ -172,6 +172,10 @@ private:
    // GraphicBuffers.
    // GraphicBuffers.
    uint32_t mConsumerUsageBits;
    uint32_t mConsumerUsageBits;


    // mConsumerIsProtected indicates the consumer is ready to handle protected
    // buffer.
    bool mConsumerIsProtected;

    // mConnectedApi indicates the producer API that is currently connected
    // mConnectedApi indicates the producer API that is currently connected
    // to this BufferQueue. It defaults to NO_CONNECTED_API, and gets updated
    // to this BufferQueue. It defaults to NO_CONNECTED_API, and gets updated
    // by the connect and disconnect methods.
    // by the connect and disconnect methods.
+6 −0
Original line number Original line Diff line number Diff line
@@ -243,6 +243,12 @@ public:
    // Return of a value other than NO_ERROR means an unknown error has occurred.
    // Return of a value other than NO_ERROR means an unknown error has occurred.
    virtual status_t setConsumerUsageBits(uint32_t usage) = 0;
    virtual status_t setConsumerUsageBits(uint32_t usage) = 0;


    // setConsumerIsProtected will turn on an internal bit that indicates whether
    // the consumer can handle protected gralloc buffers (i.e. with
    // GRALLOC_USAGE_PROTECTED set). IGraphicBufferProducer can query this
    // capability using NATIVE_WINDOW_CONSUMER_IS_PROTECTED.
    virtual status_t setConsumerIsProtected(bool isProtected) = 0;

    // setTransformHint bakes in rotation to buffers so overlays can be used. The values are
    // setTransformHint bakes in rotation to buffers so overlays can be used. The values are
    // enumerated in window.h, e.g. NATIVE_WINDOW_TRANSFORM_ROT_90. The default is 0
    // enumerated in window.h, e.g. NATIVE_WINDOW_TRANSFORM_ROT_90. The default is 0
    // (no transform).
    // (no transform).
+8 −0
Original line number Original line Diff line number Diff line
@@ -709,6 +709,14 @@ status_t BufferQueueConsumer::setConsumerUsageBits(uint32_t usage) {
    return NO_ERROR;
    return NO_ERROR;
}
}


status_t BufferQueueConsumer::setConsumerIsProtected(bool isProtected) {
    ATRACE_CALL();
    BQ_LOGV("setConsumerIsProtected: %s", isProtected ? "true" : "false");
    Mutex::Autolock lock(mCore->mMutex);
    mCore->mConsumerIsProtected = isProtected;
    return NO_ERROR;
}

status_t BufferQueueConsumer::setTransformHint(uint32_t hint) {
status_t BufferQueueConsumer::setTransformHint(uint32_t hint) {
    ATRACE_CALL();
    ATRACE_CALL();
    BQ_LOGV("setTransformHint: %#x", hint);
    BQ_LOGV("setTransformHint: %#x", hint);
+1 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,7 @@ BufferQueueCore::BufferQueueCore() :
    mConsumerName(getUniqueName()),
    mConsumerName(getUniqueName()),
    mConsumerListener(),
    mConsumerListener(),
    mConsumerUsageBits(0),
    mConsumerUsageBits(0),
    mConsumerIsProtected(false),
    mConnectedApi(NO_CONNECTED_API),
    mConnectedApi(NO_CONNECTED_API),
    mLinkedToDeath(),
    mLinkedToDeath(),
    mConnectedProducerListener(),
    mConnectedProducerListener(),
Loading