Alex Vakulenko | a8a9278 | 2017-01-27 14:41:57 -0800 | [diff] [blame] | 1 | #include "surface_channel.h" |
| 2 | |
| 3 | using android::pdx::BorrowedChannelHandle; |
| 4 | using android::pdx::Message; |
| 5 | using android::pdx::rpc::DispatchRemoteMethod; |
| 6 | |
| 7 | namespace android { |
| 8 | namespace dvr { |
| 9 | |
| 10 | int SurfaceChannel::HandleMessage(Message& message) { |
| 11 | switch (message.GetOp()) { |
| 12 | case DisplayRPC::GetMetadataBuffer::Opcode: |
| 13 | DispatchRemoteMethod<DisplayRPC::GetMetadataBuffer>( |
| 14 | *this, &SurfaceChannel::OnGetMetadataBuffer, message); |
| 15 | break; |
| 16 | } |
| 17 | |
| 18 | return 0; |
| 19 | } |
| 20 | |
| 21 | BorrowedChannelHandle SurfaceChannel::OnGetMetadataBuffer(Message& message) { |
| 22 | if (EnsureMetadataBuffer()) { |
| 23 | return metadata_buffer_->GetChannelHandle().Borrow(); |
| 24 | } else { |
| 25 | REPLY_ERROR_RETURN(message, -ENOMEM, {}); |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | bool SurfaceChannel::EnsureMetadataBuffer() { |
| 30 | if (!metadata_buffer_) { |
| 31 | metadata_buffer_ = |
| 32 | BufferProducer::CreateUncachedBlob(metadata_size()); |
| 33 | if (!metadata_buffer_) { |
| 34 | ALOGE( |
| 35 | "DisplaySurface::EnsureMetadataBuffer: could not allocate metadata " |
| 36 | "buffer"); |
| 37 | return false; |
| 38 | } |
| 39 | } |
| 40 | return true; |
| 41 | } |
| 42 | |
| 43 | } // namespace dvr |
| 44 | } // namespace android |