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