blob: 1a9923444ef2c78b3e61ef438ff226a820147695 [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) {
Jiwen 'Steve' Cai638b7f72017-09-08 11:10:29 -070047 if (write_buffer != nullptr) {
48 ALOGW_IF(
49 write_buffer->slot != -1,
50 "dvrWriteBufferDestroy: Destroying a buffer associated with a valid "
51 "buffer queue slot. This may indicate possible leaks.");
52 delete write_buffer;
53 }
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070054}
55
Corey Tabaka2251d822017-04-20 16:04:07 -070056int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) {
57 return write_buffer && write_buffer->write_buffer;
58}
59
60int dvrWriteBufferClear(DvrWriteBuffer* write_buffer) {
61 if (!write_buffer)
62 return -EINVAL;
63
64 write_buffer->write_buffer = nullptr;
65 return 0;
66}
67
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070068int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070069 if (!write_buffer || !write_buffer->write_buffer)
70 return -EINVAL;
71
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070072 return write_buffer->write_buffer->id();
73}
74
75int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070076 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070077 if (!write_buffer || !write_buffer->write_buffer)
78 return -EINVAL;
79
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070080 return ConvertToAHardwareBuffer(
81 write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070082}
83
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070084int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070085 const void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -070086 if (!write_buffer || !write_buffer->write_buffer)
87 return -EINVAL;
88
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070089 pdx::LocalHandle fence(ready_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070090 int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070091 return result;
92}
93
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070094int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -070095 if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd)
96 return -EINVAL;
97
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070098 pdx::LocalHandle release_fence;
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070099 int result = write_buffer->write_buffer->Gain(&release_fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700100 *release_fence_fd = release_fence.Release();
101 return result;
102}
103
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700104int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700105 if (!write_buffer || !write_buffer->write_buffer)
106 return -EINVAL;
107
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700108 return write_buffer->write_buffer->GainAsync();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700109}
110
Corey Tabaka2251d822017-04-20 16:04:07 -0700111void dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) {
112 if (read_buffer)
113 *read_buffer = new DvrReadBuffer;
114}
115
Jiwen 'Steve' Cai638b7f72017-09-08 11:10:29 -0700116void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) {
117 if (read_buffer != nullptr) {
118 ALOGW_IF(
119 read_buffer->slot != -1,
120 "dvrReadBufferDestroy: Destroying a buffer associated with a valid "
121 "buffer queue slot. This may indicate possible leaks.");
122 delete read_buffer;
123 }
124}
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700125
Corey Tabaka2251d822017-04-20 16:04:07 -0700126int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) {
127 return read_buffer && read_buffer->read_buffer;
128}
129
130int dvrReadBufferClear(DvrReadBuffer* read_buffer) {
131 if (!read_buffer)
132 return -EINVAL;
133
134 read_buffer->read_buffer = nullptr;
135 return 0;
136}
137
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700138int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700139 if (!read_buffer || !read_buffer->read_buffer)
140 return -EINVAL;
141
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700142 return read_buffer->read_buffer->id();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700143}
144
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700145int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700146 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700147 if (!read_buffer || !read_buffer->read_buffer)
148 return -EINVAL;
149
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700150 return ConvertToAHardwareBuffer(
151 read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700152}
153
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700154int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
155 void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700156 if (!read_buffer || !read_buffer->read_buffer)
157 return -EINVAL;
158
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700159 pdx::LocalHandle ready_fence;
160 int result =
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700161 read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700162 *ready_fence_fd = ready_fence.Release();
163 return result;
164}
165
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700166int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700167 if (!read_buffer || !read_buffer->read_buffer)
168 return -EINVAL;
169
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700170 pdx::LocalHandle fence(release_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700171 int result = read_buffer->read_buffer->Release(fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700172 return result;
173}
174
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700175int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700176 if (!read_buffer || !read_buffer->read_buffer)
177 return -EINVAL;
178
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700179 return read_buffer->read_buffer->ReleaseAsync();
180}
181
182void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
183
184int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
185 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700186 if (!buffer || !buffer->buffer || !hardware_buffer) {
187 return -EINVAL;
188 }
189
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700190 return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
191 hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700192}
193
Okan Arikan0cb04d32017-05-31 14:25:51 -0700194// Retrieve the shared buffer layout version defined in dvr_shared_buffers.h.
195int dvrBufferGlobalLayoutVersionGet() {
196 return android::dvr::kSharedBufferLayoutVersion;
197}
198
John Bates28b58bf2017-04-18 10:45:23 -0700199const struct native_handle* dvrWriteBufferGetNativeHandle(
200 DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700201 if (!write_buffer || !write_buffer->write_buffer)
202 return nullptr;
203
John Bates28b58bf2017-04-18 10:45:23 -0700204 return write_buffer->write_buffer->native_handle();
205}
206
207const struct native_handle* dvrReadBufferGetNativeHandle(
208 DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700209 if (!read_buffer || !read_buffer->read_buffer)
210 return nullptr;
211
John Bates28b58bf2017-04-18 10:45:23 -0700212 return read_buffer->read_buffer->native_handle();
213}
214
215const struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700216 if (!buffer || !buffer->buffer)
217 return nullptr;
218
John Bates28b58bf2017-04-18 10:45:23 -0700219 return buffer->buffer->handle();
220}
221
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700222} // extern "C"