blob: 88b649fc6d8357c7c8a6a0fce74a4ebf44a851bb [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 "
Jiwen 'Steve' Caib53da4f2018-04-12 18:05:00 -070051 "buffer queue slot. This may indicate possible leaks, buffer_id=%d.",
52 dvrWriteBufferGetId(write_buffer));
Jiwen 'Steve' Cai638b7f72017-09-08 11:10:29 -070053 delete write_buffer;
54 }
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070055}
56
Corey Tabaka2251d822017-04-20 16:04:07 -070057int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) {
58 return write_buffer && write_buffer->write_buffer;
59}
60
61int dvrWriteBufferClear(DvrWriteBuffer* write_buffer) {
62 if (!write_buffer)
63 return -EINVAL;
64
65 write_buffer->write_buffer = nullptr;
66 return 0;
67}
68
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070069int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070070 if (!write_buffer || !write_buffer->write_buffer)
71 return -EINVAL;
72
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070073 return write_buffer->write_buffer->id();
74}
75
76int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070077 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070078 if (!write_buffer || !write_buffer->write_buffer)
79 return -EINVAL;
80
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070081 return ConvertToAHardwareBuffer(
82 write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070083}
84
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070085int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070086 const void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -070087 if (!write_buffer || !write_buffer->write_buffer)
88 return -EINVAL;
89
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070090 pdx::LocalHandle fence(ready_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070091 int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070092 return result;
93}
94
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070095int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -070096 if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd)
97 return -EINVAL;
98
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070099 pdx::LocalHandle release_fence;
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700100 int result = write_buffer->write_buffer->Gain(&release_fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700101 *release_fence_fd = release_fence.Release();
102 return result;
103}
104
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700105int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700106 if (!write_buffer || !write_buffer->write_buffer)
107 return -EINVAL;
108
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700109 return write_buffer->write_buffer->GainAsync();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700110}
111
Corey Tabaka2251d822017-04-20 16:04:07 -0700112void dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) {
113 if (read_buffer)
114 *read_buffer = new DvrReadBuffer;
115}
116
Jiwen 'Steve' Cai638b7f72017-09-08 11:10:29 -0700117void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) {
118 if (read_buffer != nullptr) {
119 ALOGW_IF(
120 read_buffer->slot != -1,
121 "dvrReadBufferDestroy: Destroying a buffer associated with a valid "
Jiwen 'Steve' Caib53da4f2018-04-12 18:05:00 -0700122 "buffer queue slot. This may indicate possible leaks, buffer_id=%d.",
123 dvrReadBufferGetId(read_buffer));
Jiwen 'Steve' Cai638b7f72017-09-08 11:10:29 -0700124 delete read_buffer;
125 }
126}
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700127
Corey Tabaka2251d822017-04-20 16:04:07 -0700128int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) {
129 return read_buffer && read_buffer->read_buffer;
130}
131
132int dvrReadBufferClear(DvrReadBuffer* read_buffer) {
133 if (!read_buffer)
134 return -EINVAL;
135
136 read_buffer->read_buffer = nullptr;
137 return 0;
138}
139
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700140int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700141 if (!read_buffer || !read_buffer->read_buffer)
142 return -EINVAL;
143
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700144 return read_buffer->read_buffer->id();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700145}
146
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700147int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700148 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700149 if (!read_buffer || !read_buffer->read_buffer)
150 return -EINVAL;
151
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700152 return ConvertToAHardwareBuffer(
153 read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700154}
155
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700156int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
157 void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700158 if (!read_buffer || !read_buffer->read_buffer)
159 return -EINVAL;
160
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700161 pdx::LocalHandle ready_fence;
162 int result =
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700163 read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700164 *ready_fence_fd = ready_fence.Release();
165 return result;
166}
167
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700168int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700169 if (!read_buffer || !read_buffer->read_buffer)
170 return -EINVAL;
171
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700172 pdx::LocalHandle fence(release_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700173 int result = read_buffer->read_buffer->Release(fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700174 return result;
175}
176
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700177int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700178 if (!read_buffer || !read_buffer->read_buffer)
179 return -EINVAL;
180
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700181 return read_buffer->read_buffer->ReleaseAsync();
182}
183
184void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
185
186int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
187 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700188 if (!buffer || !buffer->buffer || !hardware_buffer) {
189 return -EINVAL;
190 }
191
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700192 return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
193 hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700194}
195
Okan Arikan0cb04d32017-05-31 14:25:51 -0700196// Retrieve the shared buffer layout version defined in dvr_shared_buffers.h.
197int dvrBufferGlobalLayoutVersionGet() {
198 return android::dvr::kSharedBufferLayoutVersion;
199}
200
John Bates28b58bf2017-04-18 10:45:23 -0700201const struct native_handle* dvrWriteBufferGetNativeHandle(
202 DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700203 if (!write_buffer || !write_buffer->write_buffer)
204 return nullptr;
205
John Bates28b58bf2017-04-18 10:45:23 -0700206 return write_buffer->write_buffer->native_handle();
207}
208
209const struct native_handle* dvrReadBufferGetNativeHandle(
210 DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700211 if (!read_buffer || !read_buffer->read_buffer)
212 return nullptr;
213
John Bates28b58bf2017-04-18 10:45:23 -0700214 return read_buffer->read_buffer->native_handle();
215}
216
217const struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700218 if (!buffer || !buffer->buffer)
219 return nullptr;
220
John Bates28b58bf2017-04-18 10:45:23 -0700221 return buffer->buffer->handle();
222}
223
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700224} // extern "C"