19a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai/*
29a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * Copyright 2018 The Android Open Source Project
39a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai *
49a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * Licensed under the Apache License, Version 2.0 (the "License");
59a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * you may not use this file except in compliance with the License.
69a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * You may obtain a copy of the License at
79a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai *
89a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai *      http://www.apache.org/licenses/LICENSE-2.0
99a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai *
109a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * Unless required by applicable law or agreed to in writing, software
119a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * distributed under the License is distributed on an "AS IS" BASIS,
129a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * See the License for the specific language governing permissions and
149a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai * limitations under the License.
159a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai */
169a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
170f950843530825907f8311b199b01c32899c2c92Jiwen 'Steve' Cai#ifndef ANDROID_GUI_BUFFERHUBPRODUCER_H_
180f950843530825907f8311b199b01c32899c2c92Jiwen 'Steve' Cai#define ANDROID_GUI_BUFFERHUBPRODUCER_H_
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
200f950843530825907f8311b199b01c32899c2c92Jiwen 'Steve' Cai#include <gui/BufferSlot.h>
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <gui/IGraphicBufferProducer.h>
22d6cb17f84067ac0374ac28ef65f2e862c8cbb167Jiwen 'Steve' Cai#include <private/dvr/buffer_hub_queue_client.h>
235afb74036103e20bf2ca50aaf621bbb085a50ad5Jiwen 'Steve' Cai#include <private/dvr/buffer_hub_queue_parcelable.h>
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
27c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiclass BufferHubProducer : public IGraphicBufferProducer {
289a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Caipublic:
299a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    static constexpr int kNoConnectedApi = -1;
309a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
319a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // TODO(b/36187402) The actual implementation of BufferHubQueue's consumer
329a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // side logic doesn't limit the number of buffer it can acquire
339a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // simultaneously. We need a way for consumer logic to configure and enforce
349a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // that.
359a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    static constexpr int kDefaultUndequeuedBuffers = 1;
369a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
379a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Creates a BufferHubProducer instance by importing an existing prodcuer
389a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // queue.
399a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    static sp<BufferHubProducer> Create(const std::shared_ptr<dvr::ProducerQueue>& producer);
409a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
419a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Creates a BufferHubProducer instance by importing an existing prodcuer
429a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // parcelable. Note that this call takes the ownership of the parcelable
439a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // object and is guaranteed to succeed if parcelable object is valid.
449a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    static sp<BufferHubProducer> Create(dvr::ProducerQueueParcelable parcelable);
459a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
469a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::requestBuffer|
479a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override;
489a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
499a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // For the BufferHub based implementation. All buffers in the queue are
509a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // allowed to be dequeued from the consumer side. It call always returns
519a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // 0 for |NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS| query. Thus setting
529a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // |max_dequeued_buffers| here can be considered the same as setting queue
539a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // capacity.
549a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    //
559a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::setMaxDequeuedBufferCount| for more info
569a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t setMaxDequeuedBufferCount(int max_dequeued_buffers) override;
579a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
589a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::setAsyncMode|
599a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t setAsyncMode(bool async) override;
609a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
619a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::dequeueBuffer|
629a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t dequeueBuffer(int* out_slot, sp<Fence>* out_fence, uint32_t width, uint32_t height,
639a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai                           PixelFormat format, uint64_t usage, uint64_t* outBufferAge,
649a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai                           FrameEventHistoryDelta* outTimestamps) override;
659a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
669a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::detachBuffer|
679a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t detachBuffer(int slot) override;
689a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
699a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::detachNextBuffer|
709a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t detachNextBuffer(sp<GraphicBuffer>* out_buffer, sp<Fence>* out_fence) override;
719a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
729a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::attachBuffer|
739a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t attachBuffer(int* out_slot, const sp<GraphicBuffer>& buffer) override;
749a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
759a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::queueBuffer|
769a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t queueBuffer(int slot, const QueueBufferInput& input,
779a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai                         QueueBufferOutput* output) override;
789a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
799a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::cancelBuffer|
809a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t cancelBuffer(int slot, const sp<Fence>& fence) override;
819a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
829a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::query|
839a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t query(int what, int* out_value) override;
849a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
859a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::connect|
869a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t connect(const sp<IProducerListener>& listener, int api,
879a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai                     bool producer_controlled_by_app, QueueBufferOutput* output) override;
88d6cb17f84067ac0374ac28ef65f2e862c8cbb167Jiwen 'Steve' Cai
899a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::disconnect|
909a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t disconnect(int api, DisconnectMode mode = DisconnectMode::Api) override;
91d6cb17f84067ac0374ac28ef65f2e862c8cbb167Jiwen 'Steve' Cai
929a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::setSidebandStream|
939a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t setSidebandStream(const sp<NativeHandle>& stream) override;
94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
959a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::allocateBuffers|
969a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    void allocateBuffers(uint32_t width, uint32_t height, PixelFormat format,
979a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai                         uint64_t usage) override;
985afb74036103e20bf2ca50aaf621bbb085a50ad5Jiwen 'Steve' Cai
999a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::allowAllocation|
1009a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t allowAllocation(bool allow) override;
1019a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1029a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::setGenerationNumber|
1039a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t setGenerationNumber(uint32_t generation_number) override;
1049a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1059a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::getConsumerName|
1069a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    String8 getConsumerName() const override;
1079a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1089a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::setSharedBufferMode|
1099a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t setSharedBufferMode(bool shared_buffer_mode) override;
1109a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1119a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::setAutoRefresh|
1129a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t setAutoRefresh(bool auto_refresh) override;
1139a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1149a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::setDequeueTimeout|
1159a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t setDequeueTimeout(nsecs_t timeout) override;
1169a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1179a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::getLastQueuedBuffer|
1189a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t getLastQueuedBuffer(sp<GraphicBuffer>* out_buffer, sp<Fence>* out_fence,
1199a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai                                 float out_transform_matrix[16]) override;
1209a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1219a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::getFrameTimestamps|
1229a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    void getFrameTimestamps(FrameEventHistoryDelta* /*outDelta*/) override;
1239a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1249a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::getUniqueId|
1259a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t getUniqueId(uint64_t* out_id) const override;
1269a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1279a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // See |IGraphicBufferProducer::getConsumerUsage|
1289a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t getConsumerUsage(uint64_t* out_usage) const override;
1299a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1309a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Takes out the current producer as a binder parcelable object. Note that the
1319a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // producer must be disconnected to be exportable. After successful export,
1329a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // the producer queue can no longer be connected again. Returns NO_ERROR when
1339a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // takeout is successful and out_parcelable will hold the new parcelable
1349a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // object. Also note that out_parcelable cannot be NULL and must points to an
1359a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // invalid parcelable.
1369a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t TakeAsParcelable(dvr::ProducerQueueParcelable* out_parcelable);
1379a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
138c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    IBinder* onAsBinder() override;
139c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
140c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Caiprotected:
141c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    // See |IGraphicBufferProducer::exportToParcel|
142c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    status_t exportToParcel(Parcel* parcel) override;
143c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
1449a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Caiprivate:
1459a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    using LocalHandle = pdx::LocalHandle;
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1479a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Private constructor to force use of |Create|.
1489a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    BufferHubProducer() {}
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1509a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    static uint64_t genUniqueId() {
1519a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        static std::atomic<uint32_t> counter{0};
1529a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        static uint64_t id = static_cast<uint64_t>(getpid()) << 32;
1539a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        return id | counter++;
1549a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    }
1559a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
1569a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Allocate new buffer through BufferHub and add it into |queue_| for
1579a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // bookkeeping.
1589a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t AllocateBuffer(uint32_t width, uint32_t height, uint32_t layer_count,
1599a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai                            PixelFormat format, uint64_t usage);
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1619a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Remove a buffer via BufferHubRPC.
1629a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t RemoveBuffer(size_t slot);
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1649a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Free all buffers which are owned by the prodcuer. Note that if graphic
1659a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // buffers are acquired by the consumer, we can't .
1669a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    status_t FreeAllBuffers();
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1689a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Concreate implementation backed by BufferHubBuffer.
1699a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    std::shared_ptr<dvr::ProducerQueue> queue_;
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1719a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Mutex for thread safety.
1729a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    std::mutex mutex_;
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1749a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Connect client API, should be one of the NATIVE_WINDOW_API_* flags.
1759a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    int connected_api_{kNoConnectedApi};
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1779a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // |max_buffer_count_| sets the capacity of the underlying buffer queue.
1789a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    int32_t max_buffer_count_{dvr::BufferHubQueue::kMaxQueueCapacity};
179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1809a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // |max_dequeued_buffer_count_| set the maximum number of buffers that can
1819a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // be dequeued at the same momment.
1829a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    int32_t max_dequeued_buffer_count_{1};
183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1849a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // Sets how long dequeueBuffer or attachBuffer will block if a buffer or
1859a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // slot is not yet available. The timeout is stored in milliseconds.
1869a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    int dequeue_timeout_ms_{dvr::BufferHubQueue::kNoTimeOut};
187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
1889a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // |generation_number_| stores the current generation number of the attached
1899a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // producer. Any attempt to attach a buffer with a different generation
1909a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // number will fail.
1919a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // TOOD(b/38137191) Currently not used as we don't support
1929a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // IGraphicBufferProducer::detachBuffer.
1939a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    uint32_t generation_number_{0};
194d6cb17f84067ac0374ac28ef65f2e862c8cbb167Jiwen 'Steve' Cai
1959a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // |buffers_| stores the buffers that have been dequeued from
1969a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // |dvr::BufferHubQueue|, It is initialized to invalid buffers, and gets
1979a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // filled in with the result of |Dequeue|.
1989a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // TODO(jwcai) The buffer allocated to a slot will also be replaced if the
1999a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // requested buffer usage or geometry differs from that of the buffer
2009a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // allocated to a slot.
2019a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    struct BufferHubSlot : public BufferSlot {
2029a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        BufferHubSlot() : mBufferProducer(nullptr), mIsReallocating(false) {}
2039a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        // BufferSlot comes from android framework, using m prefix to comply with
2049a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        // the name convention with the reset of data fields from BufferSlot.
2059a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        std::shared_ptr<dvr::BufferProducer> mBufferProducer;
2069a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai        bool mIsReallocating;
2079a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    };
2089a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    BufferHubSlot buffers_[dvr::BufferHubQueue::kMaxQueueCapacity];
2099a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai
2109a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    // A uniqueId used by IGraphicBufferProducer interface.
2119a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai    const uint64_t unique_id_{genUniqueId()};
212c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai
213c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    // A pending parcelable object which keeps the bufferhub channel alive.
214c90a77f1e5b42d8fcf336d2b9bd2259280814df2Jiwen 'Steve' Cai    dvr::ProducerQueueParcelable pending_producer_parcelable_;
215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2179a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai} // namespace android
218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2199a6ddf78e1920a0f467bd38de1835746c6f4c3caJiwen 'Steve' Cai#endif // ANDROID_GUI_BUFFERHUBPRODUCER_H_
220