Home | History | Annotate | Download | only in bufferhubd
      1 #ifndef ANDROID_DVR_BUFFERHUBD_CONSUMER_QUEUE_CHANNEL_H_
      2 #define ANDROID_DVR_BUFFERHUBD_CONSUMER_QUEUE_CHANNEL_H_
      3 
      4 #include "buffer_hub.h"
      5 
      6 #include <private/dvr/bufferhub_rpc.h>
      7 
      8 #include <queue>
      9 
     10 #include "consumer_channel.h"
     11 #include "producer_queue_channel.h"
     12 
     13 namespace android {
     14 namespace dvr {
     15 
     16 class ConsumerQueueChannel : public BufferHubChannel {
     17  public:
     18   using Message = pdx::Message;
     19   using RemoteChannelHandle = pdx::RemoteChannelHandle;
     20 
     21   ConsumerQueueChannel(BufferHubService* service, int buffer_id, int channel_id,
     22                        const std::shared_ptr<Channel>& producer, bool silent);
     23   ~ConsumerQueueChannel() override;
     24 
     25   bool HandleMessage(Message& message) override;
     26   void HandleImpulse(Message& message) override;
     27 
     28   BufferInfo GetBufferInfo() const override;
     29 
     30   // Called by ProdcuerQueueChannel to notify consumer queue that a new
     31   // buffer has been allocated.
     32   void RegisterNewBuffer(
     33       const std::shared_ptr<ProducerChannel>& producer_channel, size_t slot);
     34 
     35   // Called after clients been signaled by service that new buffer has been
     36   // allocated. Clients uses kOpConsumerQueueImportBuffers to import new
     37   // consumer buffers and this handler returns a vector of fd representing
     38   // BufferConsumers that clients can import.
     39   pdx::Status<std::vector<std::pair<RemoteChannelHandle, size_t>>>
     40   OnConsumerQueueImportBuffers(Message& message);
     41 
     42   void OnProducerClosed();
     43 
     44  private:
     45   std::shared_ptr<ProducerQueueChannel> GetProducer() const;
     46 
     47   // Pointer to the prodcuer channel
     48   std::weak_ptr<Channel> producer_;
     49 
     50   // Tracks newly allocated buffer producers along with it's slot number.
     51   std::queue<std::pair<std::weak_ptr<ProducerChannel>, size_t>>
     52       pending_buffer_slots_;
     53 
     54   // Tracks how many buffers have this queue imported.
     55   size_t capacity_;
     56 
     57   // A silent queue does not signal or export buffers. It is only used to spawn
     58   // another consumer queue.
     59   bool silent_;
     60 
     61   ConsumerQueueChannel(const ConsumerQueueChannel&) = delete;
     62   void operator=(const ConsumerQueueChannel&) = delete;
     63 };
     64 
     65 }  // namespace dvr
     66 }  // namespace android
     67 
     68 #endif  // ANDROID_DVR_BUFFERHUBD_CONSUMER_QUEUE_CHANNEL_H_
     69