1a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai#ifndef ANDROID_DVR_DETACHED_BUFFER_H_
2a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai#define ANDROID_DVR_DETACHED_BUFFER_H_
3a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
4a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai#include <private/dvr/buffer_hub_client.h>
5a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
6a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cainamespace android {
7a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cainamespace dvr {
8a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
9a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Caiclass DetachedBuffer {
10a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai public:
11a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Allocates a standalone DetachedBuffer not associated with any producer
12a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // consumer set.
13a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  static std::unique_ptr<DetachedBuffer> Create(uint32_t width, uint32_t height,
14a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                                                uint32_t layer_count,
15a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                                                uint32_t format, uint64_t usage,
16a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                                                size_t user_metadata_size) {
17a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai    return std::unique_ptr<DetachedBuffer>(new DetachedBuffer(
18a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai        width, height, layer_count, format, usage, user_metadata_size));
19a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  }
20a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
21a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Imports the given channel handle to a DetachedBuffer, taking ownership.
22a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  static std::unique_ptr<DetachedBuffer> Import(
230728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai      pdx::LocalChannelHandle channel_handle) {
24a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai    return std::unique_ptr<DetachedBuffer>(
25a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai        new DetachedBuffer(std::move(channel_handle)));
26a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  }
27a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
28a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  DetachedBuffer(const DetachedBuffer&) = delete;
29a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  void operator=(const DetachedBuffer&) = delete;
30a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
31a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  const sp<GraphicBuffer>& buffer() const { return buffer_.buffer(); }
32a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
33a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  int id() const { return id_; }
340728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai
350728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  // Returns true if the buffer holds an open PDX channels towards bufferhubd.
360728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  bool IsConnected() const { return client_.IsValid(); }
370728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai
380728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  // Returns true if the buffer holds an valid gralloc buffer handle that's
390728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  // availble for the client to read from and/or write into.
400728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  bool IsValid() const { return buffer_.IsValid(); }
410728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai
420728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  // Returns the event mask for all the events that are pending on this buffer
430728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  // (see sys/poll.h for all possible bits).
440728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  pdx::Status<int> GetEventMask(int events) {
450728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai    if (auto* channel = client_.GetChannel()) {
460728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai      return channel->GetEventMask(events);
470728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai    } else {
480728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai      return pdx::ErrorStatus(EINVAL);
490728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai    }
500728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  }
510728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai
520728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  // Polls the fd for |timeout_ms| milliseconds (-1 for infinity).
530728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  int Poll(int timeout_ms);
54a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
55a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Promotes a DetachedBuffer to become a ProducerBuffer. Once promoted the
56a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // DetachedBuffer channel will be closed automatically on successful IPC
57a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // return. Further IPCs towards this channel will return error.
580728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  pdx::Status<pdx::LocalChannelHandle> Promote();
59a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
60a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Takes the underlying graphic buffer out of this DetachedBuffer. This call
61a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // immediately invalidates this DetachedBuffer object and transfers the
62a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // underlying pdx::LocalChannelHandle into the GraphicBuffer.
63a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  sp<GraphicBuffer> TakeGraphicBuffer();
64a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
65a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai private:
66a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  DetachedBuffer(uint32_t width, uint32_t height, uint32_t layer_count,
67a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai                 uint32_t format, uint64_t usage, size_t user_metadata_size);
68a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
690728fa93c12145c2337a0033eb69056520b7bcd8Jiwen 'Steve' Cai  DetachedBuffer(pdx::LocalChannelHandle channel_handle);
70a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
71a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  int ImportGraphicBuffer();
72a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
73a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  // Global id for the buffer that is consistent across processes.
74a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  int id_;
75a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  IonBuffer buffer_;
76a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai  BufferHubClient client_;
77a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai};
78a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
79a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai}  // namespace dvr
80a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai}  // namespace android
81a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai
82a8049a284ecf3eafddbacf5230b0fefe85de8446Jiwen 'Steve' Cai#endif  // ANDROID_DVR_DETACHED_BUFFER_H_
83