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