blob: 6d0b50227145ff1e62e5188422616e8722c17bc5 [file] [log] [blame]
#ifndef ANDROID_DVR_DETACHED_BUFFER_H_
#define ANDROID_DVR_DETACHED_BUFFER_H_
#include <private/dvr/buffer_hub_client.h>
namespace android {
namespace dvr {
class DetachedBuffer {
public:
// Allocates a standalone DetachedBuffer not associated with any producer
// consumer set.
static std::unique_ptr<DetachedBuffer> Create(uint32_t width, uint32_t height,
uint32_t layer_count,
uint32_t format, uint64_t usage,
size_t user_metadata_size) {
return std::unique_ptr<DetachedBuffer>(new DetachedBuffer(
width, height, layer_count, format, usage, user_metadata_size));
}
// Imports the given channel handle to a DetachedBuffer, taking ownership.
static std::unique_ptr<DetachedBuffer> Import(
pdx::LocalChannelHandle channel_handle) {
return std::unique_ptr<DetachedBuffer>(
new DetachedBuffer(std::move(channel_handle)));
}
DetachedBuffer(const DetachedBuffer&) = delete;
void operator=(const DetachedBuffer&) = delete;
const sp<GraphicBuffer>& buffer() const { return buffer_.buffer(); }
int id() const { return id_; }
// Returns true if the buffer holds an open PDX channels towards bufferhubd.
bool IsConnected() const { return client_.IsValid(); }
// Returns true if the buffer holds an valid gralloc buffer handle that's
// availble for the client to read from and/or write into.
bool IsValid() const { return buffer_.IsValid(); }
// Returns the event mask for all the events that are pending on this buffer
// (see sys/poll.h for all possible bits).
pdx::Status<int> GetEventMask(int events) {
if (auto* channel = client_.GetChannel()) {
return channel->GetEventMask(events);
} else {
return pdx::ErrorStatus(EINVAL);
}
}
// Polls the fd for |timeout_ms| milliseconds (-1 for infinity).
int Poll(int timeout_ms);
// Promotes a DetachedBuffer to become a ProducerBuffer. Once promoted the
// DetachedBuffer channel will be closed automatically on successful IPC
// return. Further IPCs towards this channel will return error.
pdx::Status<pdx::LocalChannelHandle> Promote();
// Takes the underlying graphic buffer out of this DetachedBuffer. This call
// immediately invalidates this DetachedBuffer object and transfers the
// underlying pdx::LocalChannelHandle into the GraphicBuffer.
sp<GraphicBuffer> TakeGraphicBuffer();
private:
DetachedBuffer(uint32_t width, uint32_t height, uint32_t layer_count,
uint32_t format, uint64_t usage, size_t user_metadata_size);
DetachedBuffer(pdx::LocalChannelHandle channel_handle);
int ImportGraphicBuffer();
// Global id for the buffer that is consistent across processes.
int id_;
IonBuffer buffer_;
BufferHubClient client_;
};
} // namespace dvr
} // namespace android
#endif // ANDROID_DVR_DETACHED_BUFFER_H_