blob: 8b6dab8538c6b5ebf6148c196a182ca8b2d723b6 [file] [log] [blame]
#ifndef ANDROID_DVR_BUFFERHUBD_DETACHED_BUFFER_CHANNEL_H_
#define ANDROID_DVR_BUFFERHUBD_DETACHED_BUFFER_CHANNEL_H_
#include "buffer_hub.h"
#include <pdx/channel_handle.h>
#include <pdx/file_handle.h>
namespace android {
namespace dvr {
class DetachedBufferChannel : public BufferHubChannel {
public:
~DetachedBufferChannel() override;
template <typename... Args>
static std::unique_ptr<DetachedBufferChannel> Create(Args&&... args) {
auto buffer = std::unique_ptr<DetachedBufferChannel>(
new DetachedBufferChannel(std::forward<Args>(args)...));
return buffer->IsValid() ? std::move(buffer) : nullptr;
}
// Returns whether the object holds a valid graphic buffer.
bool IsValid() const {
return buffer_.IsValid() && metadata_buffer_.IsValid();
}
size_t user_metadata_size() const { return user_metadata_size_; }
// Captures buffer info for use by BufferHubService::DumpState().
BufferInfo GetBufferInfo() const override;
bool HandleMessage(pdx::Message& message) override;
void HandleImpulse(pdx::Message& message) override;
private:
// Creates a detached buffer from existing IonBuffers.
DetachedBufferChannel(BufferHubService* service, int buffer_id,
int channel_id, IonBuffer buffer,
IonBuffer metadata_buffer, size_t user_metadata_size);
// Allocates a new detached buffer.
DetachedBufferChannel(BufferHubService* service, int buffer_id,
uint32_t width, uint32_t height, uint32_t layer_count,
uint32_t format, uint64_t usage,
size_t user_metadata_size);
pdx::Status<BufferDescription<pdx::BorrowedHandle>> OnImport(
pdx::Message& message);
pdx::Status<pdx::RemoteChannelHandle> OnPromote(pdx::Message& message);
// Gralloc buffer handles.
IonBuffer buffer_;
IonBuffer metadata_buffer_;
// Size of user requested metadata.
const size_t user_metadata_size_;
};
} // namespace dvr
} // namespace android
#endif // ANDROID_DVR_BUFFERHUBD_DETACHED_BUFFER_CHANNEL_H_