blob: 4d9b21536162e34497e98e5aed1ea9bd0270f491 [file] [log] [blame]
Jiwen 'Steve' Caibdcee792017-03-22 16:59:53 -07001#include "include/dvr/dvr_buffer.h"
2
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -07003#include <android/hardware_buffer.h>
Okan Arikan0cb04d32017-05-31 14:25:51 -07004#include <dvr/dvr_shared_buffers.h>
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07005#include <private/dvr/buffer_hub_client.h>
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07006#include <ui/GraphicBuffer.h>
7
Corey Tabaka2251d822017-04-20 16:04:07 -07008#include "dvr_internal.h"
9
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070010using namespace android;
11
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070012namespace android {
13namespace dvr {
14
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070015DvrBuffer* CreateDvrBufferFromIonBuffer(
16 const std::shared_ptr<IonBuffer>& ion_buffer) {
17 if (!ion_buffer)
18 return nullptr;
19 return new DvrBuffer{std::move(ion_buffer)};
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070020}
21
22} // namespace dvr
23} // namespace android
24
25namespace {
26
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070027int ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer,
28 AHardwareBuffer** hardware_buffer) {
29 if (!hardware_buffer || !graphic_buffer) {
30 return -EINVAL;
31 }
32 *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(graphic_buffer);
33 AHardwareBuffer_acquire(*hardware_buffer);
34 return 0;
35}
36
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070037} // anonymous namespace
38
39extern "C" {
40
Corey Tabaka2251d822017-04-20 16:04:07 -070041void dvrWriteBufferCreateEmpty(DvrWriteBuffer** write_buffer) {
42 if (write_buffer)
43 *write_buffer = new DvrWriteBuffer;
44}
45
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070046void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
47 delete write_buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070048}
49
Corey Tabaka2251d822017-04-20 16:04:07 -070050int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) {
51 return write_buffer && write_buffer->write_buffer;
52}
53
54int dvrWriteBufferClear(DvrWriteBuffer* write_buffer) {
55 if (!write_buffer)
56 return -EINVAL;
57
58 write_buffer->write_buffer = nullptr;
59 return 0;
60}
61
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070062int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070063 if (!write_buffer || !write_buffer->write_buffer)
64 return -EINVAL;
65
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070066 return write_buffer->write_buffer->id();
67}
68
69int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070070 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070071 if (!write_buffer || !write_buffer->write_buffer)
72 return -EINVAL;
73
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070074 return ConvertToAHardwareBuffer(
75 write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070076}
77
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070078int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070079 const void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -070080 if (!write_buffer || !write_buffer->write_buffer)
81 return -EINVAL;
82
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070083 pdx::LocalHandle fence(ready_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070084 int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070085 return result;
86}
87
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070088int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -070089 if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd)
90 return -EINVAL;
91
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070092 pdx::LocalHandle release_fence;
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070093 int result = write_buffer->write_buffer->Gain(&release_fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070094 *release_fence_fd = release_fence.Release();
95 return result;
96}
97
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070098int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070099 if (!write_buffer || !write_buffer->write_buffer)
100 return -EINVAL;
101
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700102 return write_buffer->write_buffer->GainAsync();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700103}
104
Corey Tabaka2251d822017-04-20 16:04:07 -0700105void dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) {
106 if (read_buffer)
107 *read_buffer = new DvrReadBuffer;
108}
109
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700110void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; }
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700111
Corey Tabaka2251d822017-04-20 16:04:07 -0700112int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) {
113 return read_buffer && read_buffer->read_buffer;
114}
115
116int dvrReadBufferClear(DvrReadBuffer* read_buffer) {
117 if (!read_buffer)
118 return -EINVAL;
119
120 read_buffer->read_buffer = nullptr;
121 return 0;
122}
123
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700124int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700125 if (!read_buffer || !read_buffer->read_buffer)
126 return -EINVAL;
127
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700128 return read_buffer->read_buffer->id();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700129}
130
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700131int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700132 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700133 if (!read_buffer || !read_buffer->read_buffer)
134 return -EINVAL;
135
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700136 return ConvertToAHardwareBuffer(
137 read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700138}
139
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700140int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
141 void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700142 if (!read_buffer || !read_buffer->read_buffer)
143 return -EINVAL;
144
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700145 pdx::LocalHandle ready_fence;
146 int result =
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700147 read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700148 *ready_fence_fd = ready_fence.Release();
149 return result;
150}
151
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700152int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700153 if (!read_buffer || !read_buffer->read_buffer)
154 return -EINVAL;
155
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700156 pdx::LocalHandle fence(release_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700157 int result = read_buffer->read_buffer->Release(fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700158 return result;
159}
160
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700161int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700162 if (!read_buffer || !read_buffer->read_buffer)
163 return -EINVAL;
164
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700165 return read_buffer->read_buffer->ReleaseAsync();
166}
167
168void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
169
170int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
171 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700172 if (!buffer || !buffer->buffer || !hardware_buffer) {
173 return -EINVAL;
174 }
175
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700176 return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
177 hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700178}
179
Okan Arikan0cb04d32017-05-31 14:25:51 -0700180// Retrieve the shared buffer layout version defined in dvr_shared_buffers.h.
181int dvrBufferGlobalLayoutVersionGet() {
182 return android::dvr::kSharedBufferLayoutVersion;
183}
184
John Bates28b58bf2017-04-18 10:45:23 -0700185const struct native_handle* dvrWriteBufferGetNativeHandle(
186 DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700187 if (!write_buffer || !write_buffer->write_buffer)
188 return nullptr;
189
John Bates28b58bf2017-04-18 10:45:23 -0700190 return write_buffer->write_buffer->native_handle();
191}
192
193const struct native_handle* dvrReadBufferGetNativeHandle(
194 DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700195 if (!read_buffer || !read_buffer->read_buffer)
196 return nullptr;
197
John Bates28b58bf2017-04-18 10:45:23 -0700198 return read_buffer->read_buffer->native_handle();
199}
200
201const struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700202 if (!buffer || !buffer->buffer)
203 return nullptr;
204
John Bates28b58bf2017-04-18 10:45:23 -0700205 return buffer->buffer->handle();
206}
207
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700208} // extern "C"