| #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_ |