• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_
2 #define ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_
3 
4 #include "buffer_hub.h"
5 
6 #include <pdx/rpc/buffer_wrapper.h>
7 #include <private/dvr/bufferhub_rpc.h>
8 
9 namespace android {
10 namespace dvr {
11 
12 // Consumer channels are attached to a Producer channel
13 class ConsumerChannel : public BufferHubChannel {
14  public:
15   using Channel = pdx::Channel;
16   using Message = pdx::Message;
17 
18   ConsumerChannel(BufferHubService* service, int buffer_id, int channel_id,
19                   const std::shared_ptr<Channel> producer);
20   ~ConsumerChannel() override;
21 
22   bool HandleMessage(Message& message) override;
23   void HandleImpulse(Message& message) override;
24 
25   BufferInfo GetBufferInfo() const override;
26 
27   bool OnProducerPosted();
28   void OnProducerClosed();
29 
30  private:
31   using MetaData = pdx::rpc::BufferWrapper<std::uint8_t*>;
32 
33   std::shared_ptr<ProducerChannel> GetProducer() const;
34 
35   pdx::Status<std::pair<BorrowedFence, MetaData>> OnConsumerAcquire(
36       Message& message, std::size_t metadata_size);
37   pdx::Status<void> OnConsumerRelease(Message& message,
38                                       LocalFence release_fence);
39   pdx::Status<void> OnConsumerSetIgnore(Message& message, bool ignore);
40 
41   bool handled_;  // True if we have processed RELEASE.
42   bool ignored_;  // True if we are ignoring events.
43   std::weak_ptr<Channel> producer_;
44 
45   ConsumerChannel(const ConsumerChannel&) = delete;
46   void operator=(const ConsumerChannel&) = delete;
47 };
48 
49 }  // namespace dvr
50 }  // namespace android
51 
52 #endif  // ANDROID_DVR_BUFFERHUBD_CONSUMER_CHANNEL_H_
53