#ifndef ANDROID_DVR_BUFFERHUBD_CONSUMER_QUEUE_CHANNEL_H_ #define ANDROID_DVR_BUFFERHUBD_CONSUMER_QUEUE_CHANNEL_H_ #include "buffer_hub.h" #include <private/dvr/bufferhub_rpc.h> #include <queue> #include "consumer_channel.h" #include "producer_queue_channel.h" namespace android { namespace dvr { class ConsumerQueueChannel : public BufferHubChannel { public: using Message = pdx::Message; using RemoteChannelHandle = pdx::RemoteChannelHandle; ConsumerQueueChannel(BufferHubService* service, int buffer_id, int channel_id, const std::shared_ptr<Channel>& producer, bool silent); ~ConsumerQueueChannel() override; bool HandleMessage(Message& message) override; void HandleImpulse(Message& message) override; BufferInfo GetBufferInfo() const override; // Called by ProdcuerQueueChannel to notify consumer queue that a new // buffer has been allocated. void RegisterNewBuffer( const std::shared_ptr<ProducerChannel>& producer_channel, size_t slot); // Called after clients been signaled by service that new buffer has been // allocated. Clients uses kOpConsumerQueueImportBuffers to import new // consumer buffers and this handler returns a vector of fd representing // BufferConsumers that clients can import. pdx::Status<std::vector<std::pair<RemoteChannelHandle, size_t>>> OnConsumerQueueImportBuffers(Message& message); void OnProducerClosed(); private: std::shared_ptr<ProducerQueueChannel> GetProducer() const; // Pointer to the prodcuer channel std::weak_ptr<Channel> producer_; // Tracks newly allocated buffer producers along with it's slot number. std::queue<std::pair<std::weak_ptr<ProducerChannel>, size_t>> pending_buffer_slots_; // Tracks how many buffers have this queue imported. size_t capacity_; // A silent queue does not signal or export buffers. It is only used to spawn // another consumer queue. bool silent_; ConsumerQueueChannel(const ConsumerQueueChannel&) = delete; void operator=(const ConsumerQueueChannel&) = delete; }; } // namespace dvr } // namespace android #endif // ANDROID_DVR_BUFFERHUBD_CONSUMER_QUEUE_CHANNEL_H_