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