1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/ion_buffer.h>
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
34fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko#include <log/log.h>
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ATRACE_TAG ATRACE_TAG_GRAPHICS
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <utils/Trace.h>
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <mutex>
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
9cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakanamespace {
10cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka
11cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaconstexpr uint32_t kDefaultGraphicBufferLayerCount = 1;
12cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka
13cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka}  // anonymous namespace
14cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr {
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
18108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik WagenaarIonBuffer::IonBuffer() : IonBuffer(nullptr, 0, 0, 0, 0, 0, 0) {}
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
20cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey TabakaIonBuffer::IonBuffer(uint32_t width, uint32_t height, uint32_t format,
21044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai                     uint64_t usage)
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    : IonBuffer() {
23108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar  Alloc(width, height, kDefaultGraphicBufferLayerCount, format, usage);
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
26cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey TabakaIonBuffer::IonBuffer(buffer_handle_t handle, uint32_t width, uint32_t height,
27044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai                     uint32_t stride, uint32_t format, uint64_t usage)
28108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar    : IonBuffer(handle, width, height, kDefaultGraphicBufferLayerCount, stride,
29108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                format, usage) {}
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
31cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey TabakaIonBuffer::IonBuffer(buffer_handle_t handle, uint32_t width, uint32_t height,
32108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                     uint32_t layer_count, uint32_t stride, uint32_t format,
33108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                     uint64_t usage)
348a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    : buffer_(nullptr) {
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGD_IF(TRACE,
36cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka           "IonBuffer::IonBuffer: handle=%p width=%u height=%u layer_count=%u "
37108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "stride=%u format=%u usage=%" PRIx64,
38108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           handle, width, height, layer_count, stride, format, usage);
398a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  if (handle != 0) {
40108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar    Import(handle, width, height, layer_count, stride, format, usage);
418a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  }
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIonBuffer::~IonBuffer() {
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGD_IF(TRACE,
46cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka           "IonBuffer::~IonBuffer: handle=%p width=%u height=%u stride=%u "
47108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "format=%u usage=%" PRIx64,
48cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka           handle(), width(), height(), stride(), format(), usage());
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  FreeHandle();
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIonBuffer::IonBuffer(IonBuffer&& other) : IonBuffer() {
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  *this = std::move(other);
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoIonBuffer& IonBuffer::operator=(IonBuffer&& other) {
578a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  ALOGD_IF(TRACE, "IonBuffer::operator=: handle_=%p other.handle_=%p", handle(),
588a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus           other.handle());
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (this != &other) {
618a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    buffer_ = other.buffer_;
62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    other.FreeHandle();
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return *this;
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid IonBuffer::FreeHandle() {
688a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  if (buffer_.get()) {
698a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    // GraphicBuffer unregisters and cleans up the handle if needed
708a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    buffer_ = nullptr;
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
74108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaarint IonBuffer::Alloc(uint32_t width, uint32_t height, uint32_t layer_count,
75108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                     uint32_t format, uint64_t usage) {
76044963e1dd0479035b6e5f2c6bd618bde7143710Jiwen 'Steve' Cai  ALOGD_IF(TRACE,
77108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "IonBuffer::Alloc: width=%u height=%u layer_count=%u format=%u "
78108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "usage=%" PRIx64, width, height, layer_count, format, usage);
79cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka
80108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar  sp<GraphicBuffer> buffer =
81108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar      new GraphicBuffer(width, height, format, layer_count, usage);
82cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka  if (buffer->initCheck() != OK) {
83b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    ALOGE("IonBuffer::Aloc: Failed to allocate buffer");
84cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka    return -EINVAL;
85cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka  } else {
86cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka    buffer_ = buffer;
87cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka    return 0;
88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
91cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakavoid IonBuffer::Reset(buffer_handle_t handle, uint32_t width, uint32_t height,
92108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                      uint32_t layer_count, uint32_t stride, uint32_t format,
93108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                      uint64_t usage) {
94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGD_IF(TRACE,
95108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "IonBuffer::Reset: handle=%p width=%u height=%u layer_count=%u "
96108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "stride=%u format=%u usage=%" PRIx64,
97108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           handle, width, height, layer_count, stride, format, usage);
98108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar  Import(handle, width, height, layer_count, stride, format, usage);
99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
101cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaint IonBuffer::Import(buffer_handle_t handle, uint32_t width, uint32_t height,
102108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                      uint32_t layer_count, uint32_t stride, uint32_t format,
103108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                      uint64_t usage) {
104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ATRACE_NAME("IonBuffer::Import1");
105108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar  ALOGD_IF(TRACE,
106108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "IonBuffer::Import: handle=%p width=%u height=%u layer_count=%u "
107108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "stride=%u format=%u usage=%" PRIx64,
108108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           handle, width, height, layer_count, stride, format, usage);
1098a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  FreeHandle();
110108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar  sp<GraphicBuffer> buffer =
111108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar      new GraphicBuffer(handle, GraphicBuffer::TAKE_UNREGISTERED_HANDLE, width,
112108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                        height, format, layer_count, usage, stride);
113cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka  if (buffer->initCheck() != OK) {
114b42f171a5a76985fde2689d90fd6d2d7e4920564Chia-I Wu    ALOGE("IonBuffer::Import: Failed to import buffer");
1158a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    return -EINVAL;
116cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka  } else {
117cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka    buffer_ = buffer;
118cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka    return 0;
119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint IonBuffer::Import(const int* fd_array, int fd_count, const int* int_array,
123cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka                      int int_count, uint32_t width, uint32_t height,
124108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                      uint32_t layer_count, uint32_t stride, uint32_t format,
125108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar                      uint64_t usage) {
126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ATRACE_NAME("IonBuffer::Import2");
127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGD_IF(TRACE,
128cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka           "IonBuffer::Import: fd_count=%d int_count=%d width=%u height=%u "
129108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           "layer_count=%u stride=%u format=%u usage=%" PRIx64,
130108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           fd_count, int_count, width, height, layer_count, stride, format,
131108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar           usage);
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (fd_count < 0 || int_count < 0) {
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("IonBuffer::Import: invalid arguments.");
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -EINVAL;
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  native_handle_t* handle = native_handle_create(fd_count, int_count);
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!handle) {
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("IonBuffer::Import: failed to create new native handle.");
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -ENOMEM;
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Copy fd_array into the first part of handle->data and int_array right
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // after it.
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  memcpy(handle->data, fd_array, sizeof(int) * fd_count);
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  memcpy(handle->data + fd_count, int_array, sizeof(int) * int_count);
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
149108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar  const int ret =
150108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar      Import(handle, width, height, layer_count, stride, format, usage);
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (ret < 0) {
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("IonBuffer::Import: failed to import raw native handle: %s",
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          strerror(-ret));
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    native_handle_close(handle);
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    native_handle_delete(handle);
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return ret;
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint IonBuffer::Duplicate(const IonBuffer* other) {
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!other->handle())
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -EINVAL;
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const int fd_count = other->handle()->numFds;
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  const int int_count = other->handle()->numInts;
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (fd_count < 0 || int_count < 0)
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -EINVAL;
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  native_handle_t* handle = native_handle_create(fd_count, int_count);
172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (!handle) {
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("IonBuffer::Duplicate: Failed to create new native handle.");
174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    return -ENOMEM;
175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Duplicate the file descriptors from the other native handle.
178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  for (int i = 0; i < fd_count; i++)
179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    handle->data[i] = dup(other->handle()->data[i]);
180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Copy the ints after the file descriptors.
182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  memcpy(handle->data + fd_count, other->handle()->data + fd_count,
183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko         sizeof(int) * int_count);
184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
185cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka  const int ret =
186108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar      Import(handle, other->width(), other->height(), other->layer_count(),
187108e84f7e6a9117b66dba000dcf16c6d8c862e16Hendrik Wagenaar             other->stride(), other->format(), other->usage());
188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  if (ret < 0) {
189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    ALOGE("IonBuffer::Duplicate: Failed to import duplicate native handle: %s",
190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          strerror(-ret));
191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    native_handle_close(handle);
192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    native_handle_delete(handle);
193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  }
194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return ret;
196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
198cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaint IonBuffer::Lock(uint32_t usage, int x, int y, int width, int height,
199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                    void** address) {
200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ATRACE_NAME("IonBuffer::Lock");
201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGD_IF(TRACE,
202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           "IonBuffer::Lock: handle=%p usage=%d x=%d y=%d width=%d height=%d "
203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           "address=%p",
2048a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus           handle(), usage, x, y, width, height, address);
205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
206cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka  status_t err =
207cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka      buffer_->lock(usage, Rect(x, y, x + width, y + height), address);
2088a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  if (err != NO_ERROR)
2098a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    return -EINVAL;
2108a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  else
2118a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    return 0;
212e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
213e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
214cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabakaint IonBuffer::LockYUV(uint32_t usage, int x, int y, int width, int height,
215e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                       struct android_ycbcr* yuv) {
216e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ATRACE_NAME("IonBuffer::LockYUV");
217e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGD_IF(TRACE,
218e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           "IonBuffer::Lock: handle=%p usage=%d x=%d y=%d width=%d height=%d",
2198a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus           handle(), usage, x, y, width, height);
220e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
221cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka  status_t err =
222cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka      buffer_->lockYCbCr(usage, Rect(x, y, x + width, y + height), yuv);
2238a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  if (err != NO_ERROR)
2248a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    return -EINVAL;
2258a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  else
2268a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    return 0;
227e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
228e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
229e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint IonBuffer::Unlock() {
230e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ATRACE_NAME("IonBuffer::Unlock");
2318a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  ALOGD_IF(TRACE, "IonBuffer::Unlock: handle=%p", handle());
232e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
2338a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  status_t err = buffer_->unlock();
2348a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  if (err != NO_ERROR)
2358a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    return -EINVAL;
2368a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus  else
2378a71b13127f737a46c55ba94d31ba0262e7cbf8aMark Urbanus    return 0;
238e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
239cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka}  // namespace dvr
240cd52dd9f1b301854b4e1734e3741d9cef8f784b1Corey Tabaka}  // namespace android
241