blob: 5b1a7e0c76e3b3f26c1b005d3840c3a6ef23db1d [file] [log] [blame]
#ifndef ANDROID_DVR_BUFFER_HUB_QUEUE_PRODUCER_H_
#define ANDROID_DVR_BUFFER_HUB_QUEUE_PRODUCER_H_
#include <private/dvr/buffer_hub_queue_core.h>
#include <gui/IGraphicBufferProducer.h>
namespace android {
namespace dvr {
class BufferHubQueueProducer : public IGraphicBufferProducer {
public:
BufferHubQueueProducer(const std::shared_ptr<BufferHubQueueCore>& core);
// See |IGraphicBufferProducer::requestBuffer|
status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override;
// For the BufferHub based implementation. All buffers in the queue are
// allowed to be dequeued from the consumer side. It call always returns
// 0 for |NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS| query. Thus setting
// |max_dequeued_buffers| here can be considered the same as setting queue
// capacity.
//
// See |IGraphicBufferProducer::setMaxDequeuedBufferCount| for more info
status_t setMaxDequeuedBufferCount(int max_dequeued_buffers) override;
// See |IGraphicBufferProducer::setAsyncMode|
status_t setAsyncMode(bool async) override;
// See |IGraphicBufferProducer::dequeueBuffer|
status_t dequeueBuffer(int* out_slot, sp<Fence>* out_fence, uint32_t width,
uint32_t height, PixelFormat format,
uint32_t usage,
FrameEventHistoryDelta* outTimestamps) override;
// See |IGraphicBufferProducer::detachBuffer|
status_t detachBuffer(int slot) override;
// See |IGraphicBufferProducer::detachNextBuffer|
status_t detachNextBuffer(sp<GraphicBuffer>* out_buffer,
sp<Fence>* out_fence) override;
// See |IGraphicBufferProducer::attachBuffer|
status_t attachBuffer(int* out_slot, const sp<GraphicBuffer>& buffer) override;
// See |IGraphicBufferProducer::queueBuffer|
status_t queueBuffer(int slot, const QueueBufferInput& input,
QueueBufferOutput* output) override;
// See |IGraphicBufferProducer::cancelBuffer|
status_t cancelBuffer(int slot, const sp<Fence>& fence) override;
// See |IGraphicBufferProducer::query|
status_t query(int what, int* out_value) override;
// See |IGraphicBufferProducer::connect|
status_t connect(const sp<IProducerListener>& listener, int api,
bool producer_controlled_by_app,
QueueBufferOutput* output) override;
// See |IGraphicBufferProducer::disconnect|
status_t disconnect(int api, DisconnectMode mode = DisconnectMode::Api) override;
// See |IGraphicBufferProducer::setSidebandStream|
status_t setSidebandStream(const sp<NativeHandle>& stream) override;
// See |IGraphicBufferProducer::allocateBuffers|
void allocateBuffers(uint32_t width, uint32_t height, PixelFormat format,
uint32_t usage) override;
// See |IGraphicBufferProducer::allowAllocation|
status_t allowAllocation(bool allow) override;
// See |IGraphicBufferProducer::setGenerationNumber|
status_t setGenerationNumber(uint32_t generation_number) override;
// See |IGraphicBufferProducer::getConsumerName|
String8 getConsumerName() const override;
// See |IGraphicBufferProducer::setSharedBufferMode|
status_t setSharedBufferMode(bool shared_buffer_mode) override;
// See |IGraphicBufferProducer::setAutoRefresh|
status_t setAutoRefresh(bool auto_refresh) override;
// See |IGraphicBufferProducer::setDequeueTimeout|
status_t setDequeueTimeout(nsecs_t timeout) override;
// See |IGraphicBufferProducer::getLastQueuedBuffer|
status_t getLastQueuedBuffer(sp<GraphicBuffer>* out_buffer,
sp<Fence>* out_fence,
float out_transform_matrix[16]) override;
// See |IGraphicBufferProducer::getFrameTimestamps|
void getFrameTimestamps(FrameEventHistoryDelta* /*outDelta*/) override;
// See |IGraphicBufferProducer::getUniqueId|
status_t getUniqueId(uint64_t* out_id) const override;
protected:
IBinder* onAsBinder() override;
private:
using LocalHandle = pdx::LocalHandle;
static constexpr int kInvalidBufferCount = -1;
// |core_| holds the actually buffer slots.
std::shared_ptr<BufferHubQueueCore> core_;
// |req_buffer_count_| sets the capacity of the underlying buffer queue.
int32_t req_buffer_count_;
};
} // namespace dvr
} // namespace android
#endif // ANDROID_DVR_BUFFER_HUB_QUEUE_PRODUCER_H_