blob: 150e399cddb72c070de61feef370186c7be7d72a [file] [log] [blame]
Alex Vakulenkoe4eec202017-01-27 14:41:04 -08001#ifndef ANDROID_DVR_BUFFERHUBD_BUFFER_HUB_H_
2#define ANDROID_DVR_BUFFERHUBD_BUFFER_HUB_H_
3
4#include <memory>
5#include <string>
6#include <unordered_map>
7
8#include <hardware/gralloc.h>
9#include <pdx/service.h>
Corey Tabaka1db8a5d2017-03-22 02:12:52 -070010#include <private/dvr/bufferhub_rpc.h>
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080011
12namespace android {
13namespace dvr {
14
15class BufferHubService;
16class ConsumerChannel;
17class ProducerChannel;
18class ConsumerQueueChannel;
19class ProducerQueueChannel;
20
21class BufferHubChannel : public pdx::Channel {
22 public:
23 enum ChannelType {
24 kProducerType,
25 kConsumerType,
26 kProducerQueueType,
27 kConsumerQueueType,
28 };
29
30 enum : int { kDetachedId = -1 };
31
32 BufferHubChannel(BufferHubService* service, int buffer_id, int channel_id,
33 ChannelType channel_type)
34 : service_(service),
35 buffer_id_(buffer_id),
36 channel_id_(channel_id),
37 channel_type_(channel_type) {}
38 virtual ~BufferHubChannel() {}
39
40 virtual bool HandleMessage(pdx::Message& message) = 0;
41 virtual void HandleImpulse(pdx::Message& message) = 0;
42
43 // Captures buffer info for use by BufferHubService::DumpState().
44 struct BufferInfo {
45 // Common data field shared by BufferProducer and ProducerQueue.
46 int id = -1;
47 int type = -1;
48 size_t consumer_count = 0;
49
50 // Data field for buffer producer.
51 int width = 0;
52 int height = 0;
53 int format = 0;
54 int usage = 0;
55 size_t slice_count = 0;
56 std::string name;
57
58 // Data filed for producer queue.
59 size_t capacity = 0;
60 int usage_set_mask = 0;
61 int usage_clear_mask = 0;
62 int usage_deny_set_mask = 0;
63 int usage_deny_clear_mask = 0;
64
65 BufferInfo(int id, size_t consumer_count, int width, int height, int format,
66 int usage, size_t slice_count, const std::string& name)
67 : id(id),
68 type(kProducerType),
69 consumer_count(consumer_count),
70 width(width),
71 height(height),
72 format(format),
73 usage(usage),
74 slice_count(slice_count),
75 name(name) {}
76
Corey Tabaka1db8a5d2017-03-22 02:12:52 -070077 BufferInfo(int id, size_t consumer_count, size_t capacity,
78 int usage_set_mask, int usage_clear_mask,
79 int usage_deny_set_mask, int usage_deny_clear_mask)
Alex Vakulenkoe4eec202017-01-27 14:41:04 -080080 : id(id),
81 type(kProducerQueueType),
82 consumer_count(consumer_count),
83 capacity(capacity),
84 usage_set_mask(usage_set_mask),
85 usage_clear_mask(usage_clear_mask),
86 usage_deny_set_mask(usage_deny_set_mask),
87 usage_deny_clear_mask(usage_deny_clear_mask) {}
88
89 BufferInfo() {}
90 };
91
92 // Returns the buffer info for this buffer.
93 virtual BufferInfo GetBufferInfo() const = 0;
94
95 // Signal the client fd that an ownership change occurred using POLLIN.
96 void SignalAvailable();
97
98 // Clear the ownership change event.
99 void ClearAvailable();
100
101 // Signal hangup event.
102 void Hangup();
103
104 BufferHubService* service() const { return service_; }
105 ChannelType channel_type() const { return channel_type_; }
106 int buffer_id() const { return buffer_id_; }
107
108 int channel_id() const { return channel_id_; }
109 bool IsDetached() const { return channel_id_ == kDetachedId; }
110
111 void Detach() {
112 if (channel_type_ == kProducerType)
113 channel_id_ = kDetachedId;
114 }
115 void Attach(int channel_id) {
116 if (channel_type_ == kProducerType && channel_id_ == kDetachedId)
117 channel_id_ = channel_id;
118 }
119
120 private:
121 BufferHubService* service_;
122
123 // Static id of the buffer for logging and informational purposes. This id
124 // does not change for the life of the buffer.
125 // TODO(eieio): Consider using an id allocator instead of the originating
126 // channel id; channel ids wrap after 2^31 ids, but this is not a problem in
127 // general because channel ids are not used for any lookup in this service.
128 int buffer_id_;
129
130 // The channel id of the buffer. This may change for a persistent producer
131 // buffer if it is detached and re-attached to another channel.
132 int channel_id_;
133
134 ChannelType channel_type_;
135
136 BufferHubChannel(const BufferHubChannel&) = delete;
137 void operator=(const BufferHubChannel&) = delete;
138};
139
140class BufferHubService : public pdx::ServiceBase<BufferHubService> {
141 public:
142 BufferHubService();
143 ~BufferHubService() override;
144
Alex Vakulenkof0a7bd02017-03-31 18:06:19 -0700145 pdx::Status<void> HandleMessage(pdx::Message& message) override;
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800146 void HandleImpulse(pdx::Message& message) override;
147
148 void OnChannelClose(pdx::Message& message,
149 const std::shared_ptr<pdx::Channel>& channel) override;
150
151 bool IsInitialized() const override;
152 std::string DumpState(size_t max_length) override;
153
154 bool AddNamedBuffer(const std::string& name,
155 const std::shared_ptr<ProducerChannel>& buffer);
156 std::shared_ptr<ProducerChannel> GetNamedBuffer(const std::string& name);
157 bool RemoveNamedBuffer(const ProducerChannel& buffer);
158
159 private:
160 friend BASE;
161
162 std::unordered_map<std::string, std::shared_ptr<ProducerChannel>>
163 named_buffers_;
164
165 int OnCreateBuffer(pdx::Message& message, int width, int height, int format,
166 int usage, size_t meta_size_bytes, size_t slice_count);
167 int OnCreatePersistentBuffer(pdx::Message& message, const std::string& name,
168 int user_id, int group_id, int width, int height,
169 int format, int usage, size_t meta_size_bytes,
170 size_t slice_count);
171 int OnGetPersistentBuffer(pdx::Message& message, const std::string& name);
Corey Tabaka1db8a5d2017-03-22 02:12:52 -0700172 pdx::Status<QueueInfo> OnCreateProducerQueue(
173 pdx::Message& message, size_t meta_size_bytes, int usage_set_mask,
174 int usage_clear_mask, int usage_deny_set_mask, int usage_deny_clear_mask);
Alex Vakulenkoe4eec202017-01-27 14:41:04 -0800175
176 BufferHubService(const BufferHubService&) = delete;
177 void operator=(const BufferHubService&) = delete;
178};
179
180} // namespace dvr
181} // namespace android
182
183#endif // ANDROID_DVR_BUFFERHUBD_BUFFER_HUB_H_