1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/buffer_hub_client.h> 2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 34fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko#include <log/log.h> 4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <poll.h> 5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ATRACE_TAG ATRACE_TAG_GRAPHICS 6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <utils/Trace.h> 7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <mutex> 9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/default_transport/client_channel.h> 11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/default_transport/client_channel_factory.h> 12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include "include/private/dvr/bufferhub_rpc.h" 14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::LocalHandle; 16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::LocalChannelHandle; 17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::rpc::WrapBuffer; 18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::Status; 19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android { 21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr { 22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferHubBuffer::BufferHubBuffer(LocalChannelHandle channel_handle) 24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : Client{pdx::default_transport::ClientChannel::Create( 25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::move(channel_handle))}, 26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko id_(-1) {} 27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferHubBuffer::BufferHubBuffer(const std::string& endpoint_path) 28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : Client{pdx::default_transport::ClientChannelFactory::Create( 29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko endpoint_path)}, 30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko id_(-1) {} 31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferHubBuffer::~BufferHubBuffer() {} 33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoStatus<LocalChannelHandle> BufferHubBuffer::CreateConsumer() { 35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Status<LocalChannelHandle> status = 36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko InvokeRemoteMethod<BufferHubRPC::NewConsumer>(); 37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE_IF(!status, 38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferHub::CreateConsumer: Failed to create consumer channel: %s", 39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return status; 41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferHubBuffer::ImportBuffer() { 44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferHubBuffer::ImportBuffer"); 45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 464d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar Status<NativeBufferHandle<LocalHandle>> status = 474d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar InvokeRemoteMethod<BufferHubRPC::GetBuffer>(); 48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 494d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar ALOGE("BufferHubBuffer::ImportBuffer: Failed to get buffer: %s", 50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -status.error(); 52108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar } else if (status.get().id() < 0) { 53108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar ALOGE("BufferHubBuffer::ImportBuffer: Received an invalid id!"); 54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -EIO; 55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 574d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar auto buffer_handle = status.take(); 58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 594d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar // Stash the buffer id to replace the value in id_. 604d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar const int new_id = buffer_handle.id(); 61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 624d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar // Import the buffer. 634d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar IonBuffer ion_buffer; 644d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar ALOGD_IF( 654d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar TRACE, "BufferHubBuffer::ImportBuffer: id=%d FdCount=%zu IntCount=%zu", 664d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar buffer_handle.id(), buffer_handle.FdCount(), buffer_handle.IntCount()); 67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 684d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar const int ret = buffer_handle.Import(&ion_buffer); 694d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar if (ret < 0) 704d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar return ret; 71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 724d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar // If the import succeeds, replace the previous buffer and id. 734d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar buffer_ = std::move(ion_buffer); 74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko id_ = new_id; 75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferHubBuffer::Poll(int timeout_ms) { 79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferHubBuffer::Poll"); 80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko pollfd p = {event_fd(), POLLIN, 0}; 81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return poll(&p, 1, timeout_ms); 82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferHubBuffer::Lock(int usage, int x, int y, int width, int height, 854d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar void** address) { 864d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar return buffer_.Lock(usage, x, y, width, height, address); 87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 894d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaarint BufferHubBuffer::Unlock() { return buffer_.Unlock(); } 90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferHubBuffer::GetBlobReadWritePointer(size_t size, void** addr) { 92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int width = static_cast<int>(size); 93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int height = 1; 944720c9db1fd7777af57fd25e375cd8a3e72ea305Hendrik Wagenaar int ret = Lock(usage(), 0, 0, width, height, addr); 95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret == 0) 96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Unlock(); 97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ret; 98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferHubBuffer::GetBlobReadOnlyPointer(size_t size, void** addr) { 1014720c9db1fd7777af57fd25e375cd8a3e72ea305Hendrik Wagenaar return GetBlobReadWritePointer(size, addr); 102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 10410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarvoid BufferHubBuffer::GetBlobFds(int* fds, size_t* fds_count, 10510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar size_t max_fds_count) const { 10610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar size_t numFds = static_cast<size_t>(native_handle()->numFds); 10710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar *fds_count = std::min(max_fds_count, numFds); 10810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar std::copy(native_handle()->data, native_handle()->data + *fds_count, fds); 10910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 11010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferConsumer::BufferConsumer(LocalChannelHandle channel) 112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(std::move(channel)) { 113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = ImportBuffer(); 114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("BufferConsumer::BufferConsumer: Failed to import buffer: %s", 116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko strerror(-ret)); 117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(ret); 118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostd::unique_ptr<BufferConsumer> BufferConsumer::Import( 122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalChannelHandle channel) { 123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferConsumer::Import"); 124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, "BufferConsumer::Import: channel=%d", channel.value()); 125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return BufferConsumer::Create(std::move(channel)); 126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostd::unique_ptr<BufferConsumer> BufferConsumer::Import( 129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Status<LocalChannelHandle> status) { 130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return Import(status ? status.take() 131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : LocalChannelHandle{nullptr, -status.error()}); 132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferConsumer::Acquire(LocalHandle* ready_fence) { 135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return Acquire(ready_fence, nullptr, 0); 136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferConsumer::Acquire(LocalHandle* ready_fence, void* meta, 139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko size_t meta_size_bytes) { 140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferConsumer::Acquire"); 141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalFence fence; 142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto return_value = 143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko std::make_pair(std::ref(fence), WrapBuffer(meta, meta_size_bytes)); 144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethodInPlace<BufferHubRPC::ConsumerAcquire>( 145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko &return_value, meta_size_bytes); 146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (status && ready_fence) 147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *ready_fence = fence.take(); 148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return status ? 0 : -status.error(); 149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferConsumer::Release(const LocalHandle& release_fence) { 152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferConsumer::Release"); 153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ReturnStatusOrError(InvokeRemoteMethod<BufferHubRPC::ConsumerRelease>( 154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BorrowedFence(release_fence.Borrow()))); 155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferConsumer::ReleaseAsync() { 158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferConsumer::ReleaseAsync"); 159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ReturnStatusOrError( 160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko SendImpulse(BufferHubRPC::ConsumerRelease::Opcode)); 161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferConsumer::Discard() { return Release(LocalHandle()); } 164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferConsumer::SetIgnore(bool ignore) { 166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ReturnStatusOrError( 167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko InvokeRemoteMethod<BufferHubRPC::ConsumerSetIgnore>(ignore)); 168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 170cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey TabakaBufferProducer::BufferProducer(uint32_t width, uint32_t height, uint32_t format, 1714d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint32_t usage, size_t metadata_size) 1724d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar : BufferProducer(width, height, format, usage, usage, metadata_size) {} 173ec971362bc651d8c98febb8399981877da859c14Corey Tabaka 174ec971362bc651d8c98febb8399981877da859c14Corey TabakaBufferProducer::BufferProducer(uint32_t width, uint32_t height, uint32_t format, 175ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint64_t producer_usage, uint64_t consumer_usage, 1764d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar size_t metadata_size) 177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(BufferHubRPC::kClientPath) { 178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::BufferProducer"); 179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 180cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka "BufferProducer::BufferProducer: fd=%d width=%u height=%u format=%u " 181ec971362bc651d8c98febb8399981877da859c14Corey Tabaka "producer_usage=%" PRIx64 " consumer_usage=%" PRIx64 1824d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar " metadata_size=%zu", 183ec971362bc651d8c98febb8399981877da859c14Corey Tabaka event_fd(), width, height, format, producer_usage, consumer_usage, 1844d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar metadata_size); 185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 186ec971362bc651d8c98febb8399981877da859c14Corey Tabaka // (b/37881101) Deprecate producer/consumer usage 187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<BufferHubRPC::CreateBuffer>( 1884d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar width, height, format, (producer_usage | consumer_usage), metadata_size); 189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to create producer buffer: %s", 192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(-status.error()); 194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return; 195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = ImportBuffer(); 198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to import producer buffer: %s", 201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko strerror(-ret)); 202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(ret); 203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 206e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferProducer::BufferProducer(const std::string& name, int user_id, 207cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka int group_id, uint32_t width, uint32_t height, 208ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint32_t format, uint32_t usage, 2094d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar size_t meta_size_bytes) 210ec971362bc651d8c98febb8399981877da859c14Corey Tabaka : BufferProducer(name, user_id, group_id, width, height, format, usage, 2114d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar usage, meta_size_bytes) {} 212ec971362bc651d8c98febb8399981877da859c14Corey Tabaka 213ec971362bc651d8c98febb8399981877da859c14Corey TabakaBufferProducer::BufferProducer(const std::string& name, int user_id, 214ec971362bc651d8c98febb8399981877da859c14Corey Tabaka int group_id, uint32_t width, uint32_t height, 215ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint32_t format, uint64_t producer_usage, 2164d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar uint64_t consumer_usage, size_t meta_size_bytes) 217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(BufferHubRPC::kClientPath) { 218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::BufferProducer"); 219e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: fd=%d name=%s user_id=%d " 221ec971362bc651d8c98febb8399981877da859c14Corey Tabaka "group_id=%d width=%u height=%u format=%u producer_usage=%" PRIx64 2224d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar " consumer_usage=%" PRIx64 " meta_size_bytes=%zu", 223e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko event_fd(), name.c_str(), user_id, group_id, width, height, format, 2244d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar producer_usage, consumer_usage, meta_size_bytes); 225e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 226ec971362bc651d8c98febb8399981877da859c14Corey Tabaka // (b/37881101) Deprecate producer/consumer usage 227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<BufferHubRPC::CreatePersistentBuffer>( 228ec971362bc651d8c98febb8399981877da859c14Corey Tabaka name, user_id, group_id, width, height, format, 2294d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar (producer_usage | consumer_usage), meta_size_bytes); 230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 231e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to create/get persistent " 233e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "buffer \"%s\": %s", 234e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko name.c_str(), status.GetErrorMessage().c_str()); 235e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(-status.error()); 236e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return; 237e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 239e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = ImportBuffer(); 240e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 241e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 242e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to import producer buffer " 243e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "\"%s\": %s", 244e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko name.c_str(), strerror(-ret)); 245e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(ret); 246e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 247e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 248e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 249ec971362bc651d8c98febb8399981877da859c14Corey TabakaBufferProducer::BufferProducer(uint32_t usage, size_t size) 250ec971362bc651d8c98febb8399981877da859c14Corey Tabaka : BufferProducer(usage, usage, size) {} 251ec971362bc651d8c98febb8399981877da859c14Corey Tabaka 252ec971362bc651d8c98febb8399981877da859c14Corey TabakaBufferProducer::BufferProducer(uint64_t producer_usage, uint64_t consumer_usage, 253ec971362bc651d8c98febb8399981877da859c14Corey Tabaka size_t size) 254e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(BufferHubRPC::kClientPath) { 255e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::BufferProducer"); 256ec971362bc651d8c98febb8399981877da859c14Corey Tabaka ALOGD_IF(TRACE, 257ec971362bc651d8c98febb8399981877da859c14Corey Tabaka "BufferProducer::BufferProducer: producer_usage=%" PRIx64 258ec971362bc651d8c98febb8399981877da859c14Corey Tabaka " consumer_usage=%" PRIx64 " size=%zu", 259ec971362bc651d8c98febb8399981877da859c14Corey Tabaka producer_usage, consumer_usage, size); 260e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int width = static_cast<int>(size); 261e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int height = 1; 262e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int format = HAL_PIXEL_FORMAT_BLOB; 263e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const size_t meta_size_bytes = 0; 2640057fddc71d1c3c3de8f9d0bd45a51bb293bfa3cJiwen 'Steve' Cai 265ec971362bc651d8c98febb8399981877da859c14Corey Tabaka // (b/37881101) Deprecate producer/consumer usage 266e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<BufferHubRPC::CreateBuffer>( 2674d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar width, height, format, (producer_usage | consumer_usage), 2684d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar meta_size_bytes); 269e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 270e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE("BufferProducer::BufferProducer: Failed to create blob: %s", 271e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko status.GetErrorMessage().c_str()); 272e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(-status.error()); 273e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return; 274e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 275e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 276e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = ImportBuffer(); 277e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 278e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 279e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to import producer buffer: %s", 280e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko strerror(-ret)); 281e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(ret); 282e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 283e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 284e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 285e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferProducer::BufferProducer(const std::string& name, int user_id, 286ec971362bc651d8c98febb8399981877da859c14Corey Tabaka int group_id, uint32_t usage, size_t size) 287ec971362bc651d8c98febb8399981877da859c14Corey Tabaka : BufferProducer(name, user_id, group_id, usage, usage, size) {} 288ec971362bc651d8c98febb8399981877da859c14Corey Tabaka 289ec971362bc651d8c98febb8399981877da859c14Corey TabakaBufferProducer::BufferProducer(const std::string& name, int user_id, 290ec971362bc651d8c98febb8399981877da859c14Corey Tabaka int group_id, uint64_t producer_usage, 291ec971362bc651d8c98febb8399981877da859c14Corey Tabaka uint64_t consumer_usage, size_t size) 292e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(BufferHubRPC::kClientPath) { 293e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::BufferProducer"); 294e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, 295e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: name=%s user_id=%d group=%d " 296ec971362bc651d8c98febb8399981877da859c14Corey Tabaka "producer_usage=%" PRIx64 " consumer_usage=%" PRIx64 " size=%zu", 297ec971362bc651d8c98febb8399981877da859c14Corey Tabaka name.c_str(), user_id, group_id, producer_usage, consumer_usage, 298ec971362bc651d8c98febb8399981877da859c14Corey Tabaka size); 299e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int width = static_cast<int>(size); 300e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int height = 1; 301e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int format = HAL_PIXEL_FORMAT_BLOB; 302e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const size_t meta_size_bytes = 0; 3030057fddc71d1c3c3de8f9d0bd45a51bb293bfa3cJiwen 'Steve' Cai 304ec971362bc651d8c98febb8399981877da859c14Corey Tabaka // (b/37881101) Deprecate producer/consumer usage 305e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<BufferHubRPC::CreatePersistentBuffer>( 306ec971362bc651d8c98febb8399981877da859c14Corey Tabaka name, user_id, group_id, width, height, format, 3074d3590f3fd0fd65f4e8758d3228de9f55cf135d0Hendrik Wagenaar (producer_usage | consumer_usage), meta_size_bytes); 308e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 309e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 310e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to create persistent " 311e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "buffer \"%s\": %s", 312e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko name.c_str(), status.GetErrorMessage().c_str()); 313e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(-status.error()); 314e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return; 315e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 316e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 317e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = ImportBuffer(); 318e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 319e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 320e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to import producer buffer " 321e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "\"%s\": %s", 322e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko name.c_str(), strerror(-ret)); 323e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(ret); 324e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 325e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 326e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 327e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferProducer::BufferProducer(const std::string& name) 328e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(BufferHubRPC::kClientPath) { 329e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::BufferProducer"); 330e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, "BufferProducer::BufferProducer: name=%s", name.c_str()); 331e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 332e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<BufferHubRPC::GetPersistentBuffer>(name); 333e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) { 334e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 335e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to get producer buffer by name " 336e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "\"%s\": %s", 337e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko name.c_str(), status.GetErrorMessage().c_str()); 338e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(-status.error()); 339e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return; 340e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 341e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 342e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = ImportBuffer(); 343e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 344e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 345e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to import producer buffer " 346e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "\"%s\": %s", 347e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko name.c_str(), strerror(-ret)); 348e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(ret); 349e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 350e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 351e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 352e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoBufferProducer::BufferProducer(LocalChannelHandle channel) 353e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : BASE(std::move(channel)) { 354e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko const int ret = ImportBuffer(); 355e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (ret < 0) { 356e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGE( 357e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko "BufferProducer::BufferProducer: Failed to import producer buffer: %s", 358e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko strerror(-ret)); 359e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Close(ret); 360e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko } 361e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 362e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 363e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferProducer::Post(const LocalHandle& ready_fence, const void* meta, 364e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko size_t meta_size_bytes) { 365e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::Post"); 366e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ReturnStatusOrError(InvokeRemoteMethod<BufferHubRPC::ProducerPost>( 367e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko BorrowedFence(ready_fence.Borrow()), WrapBuffer(meta, meta_size_bytes))); 368e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 369e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 370e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferProducer::Gain(LocalHandle* release_fence) { 371e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::Gain"); 372e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko auto status = InvokeRemoteMethod<BufferHubRPC::ProducerGain>(); 373e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (!status) 374e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return -status.error(); 375e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko if (release_fence) 376e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko *release_fence = status.take().take(); 377e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return 0; 378e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 379e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 380e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferProducer::GainAsync() { 381e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::GainAsync"); 382e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ReturnStatusOrError(SendImpulse(BufferHubRPC::ProducerGain::Opcode)); 383e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 384e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 385e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostd::unique_ptr<BufferProducer> BufferProducer::Import( 386e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko LocalChannelHandle channel) { 387e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ALOGD_IF(TRACE, "BufferProducer::Import: channel=%d", channel.value()); 388e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return BufferProducer::Create(std::move(channel)); 389e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 390e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 391e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostd::unique_ptr<BufferProducer> BufferProducer::Import( 392e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko Status<LocalChannelHandle> status) { 393e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return Import(status ? status.take() 394e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko : LocalChannelHandle{nullptr, -status.error()}); 395e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 396e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 397e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferProducer::MakePersistent(const std::string& name, int user_id, 398e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko int group_id) { 399e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::MakePersistent"); 400e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ReturnStatusOrError( 401e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko InvokeRemoteMethod<BufferHubRPC::ProducerMakePersistent>(name, user_id, 402e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko group_id)); 403e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 404e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 405e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint BufferProducer::RemovePersistence() { 406e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko ATRACE_NAME("BufferProducer::RemovePersistence"); 407e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko return ReturnStatusOrError( 408e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko InvokeRemoteMethod<BufferHubRPC::ProducerRemovePersistence>()); 409e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} 410e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko 411e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace dvr 412e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} // namespace android 413