1/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_GUI_BUFFERHUBCONSUMER_H_
18#define ANDROID_GUI_BUFFERHUBCONSUMER_H_
19
20#include <gui/IGraphicBufferConsumer.h>
21#include <private/dvr/buffer_hub_queue_client.h>
22#include <private/dvr/buffer_hub_queue_parcelable.h>
23
24namespace android {
25
26class BufferHubConsumer : public IGraphicBufferConsumer {
27public:
28    // Creates a BufferHubConsumer instance by importing an existing producer queue.
29    static sp<BufferHubConsumer> Create(const std::shared_ptr<dvr::ConsumerQueue>& queue);
30
31    // Creates a BufferHubConsumer instance by importing an existing producer
32    // parcelable. Note that this call takes the ownership of the parcelable
33    // object and is guaranteed to succeed if parcelable object is valid.
34    static sp<BufferHubConsumer> Create(dvr::ConsumerQueueParcelable parcelable);
35
36    // See |IGraphicBufferConsumer::acquireBuffer|
37    status_t acquireBuffer(BufferItem* buffer, nsecs_t presentWhen,
38                           uint64_t maxFrameNumber = 0) override;
39
40    // See |IGraphicBufferConsumer::detachBuffer|
41    status_t detachBuffer(int slot) override;
42
43    // See |IGraphicBufferConsumer::attachBuffer|
44    status_t attachBuffer(int* outSlot, const sp<GraphicBuffer>& buffer) override;
45
46    // See |IGraphicBufferConsumer::releaseBuffer|
47    status_t releaseBuffer(int buf, uint64_t frameNumber, EGLDisplay display, EGLSyncKHR fence,
48                           const sp<Fence>& releaseFence) override;
49
50    // See |IGraphicBufferConsumer::consumerConnect|
51    status_t consumerConnect(const sp<IConsumerListener>& consumer, bool controlledByApp) override;
52
53    // See |IGraphicBufferConsumer::consumerDisconnect|
54    status_t consumerDisconnect() override;
55
56    // See |IGraphicBufferConsumer::getReleasedBuffers|
57    status_t getReleasedBuffers(uint64_t* slotMask) override;
58
59    // See |IGraphicBufferConsumer::setDefaultBufferSize|
60    status_t setDefaultBufferSize(uint32_t w, uint32_t h) override;
61
62    // See |IGraphicBufferConsumer::setMaxBufferCount|
63    status_t setMaxBufferCount(int bufferCount) override;
64
65    // See |IGraphicBufferConsumer::setMaxAcquiredBufferCount|
66    status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) override;
67
68    // See |IGraphicBufferConsumer::setConsumerName|
69    status_t setConsumerName(const String8& name) override;
70
71    // See |IGraphicBufferConsumer::setDefaultBufferFormat|
72    status_t setDefaultBufferFormat(PixelFormat defaultFormat) override;
73
74    // See |IGraphicBufferConsumer::setDefaultBufferDataSpace|
75    status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace) override;
76
77    // See |IGraphicBufferConsumer::setConsumerUsageBits|
78    status_t setConsumerUsageBits(uint64_t usage) override;
79
80    // See |IGraphicBufferConsumer::setConsumerIsProtected|
81    status_t setConsumerIsProtected(bool isProtected) override;
82
83    // See |IGraphicBufferConsumer::setTransformHint|
84    status_t setTransformHint(uint32_t hint) override;
85
86    // See |IGraphicBufferConsumer::getSidebandStream|
87    status_t getSidebandStream(sp<NativeHandle>* outStream) const override;
88
89    // See |IGraphicBufferConsumer::getOccupancyHistory|
90    status_t getOccupancyHistory(bool forceFlush,
91                                 std::vector<OccupancyTracker::Segment>* outHistory) override;
92
93    // See |IGraphicBufferConsumer::discardFreeBuffers|
94    status_t discardFreeBuffers() override;
95
96    // See |IGraphicBufferConsumer::dumpState|
97    status_t dumpState(const String8& prefix, String8* outResult) const override;
98
99    // BufferHubConsumer provides its own logic to cast to a binder object.
100    IBinder* onAsBinder() override;
101
102private:
103    // Private constructor to force use of |Create|.
104    BufferHubConsumer() = default;
105
106    // Concrete implementation backed by BufferHubBuffer.
107    std::shared_ptr<dvr::ConsumerQueue> mQueue;
108};
109
110} // namespace android
111
112#endif // ANDROID_GUI_BUFFERHUBCONSUMER_H_
113