blob: 82469b81bf652587ca302ff144ea917b4317eeb6 [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>
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07004#include <private/dvr/buffer_hub_client.h>
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07005#include <ui/GraphicBuffer.h>
6
Corey Tabaka2251d822017-04-20 16:04:07 -07007#include "dvr_internal.h"
8
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07009using namespace android;
10
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070011namespace android {
12namespace dvr {
13
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070014DvrBuffer* CreateDvrBufferFromIonBuffer(
15 const std::shared_ptr<IonBuffer>& ion_buffer) {
16 if (!ion_buffer)
17 return nullptr;
18 return new DvrBuffer{std::move(ion_buffer)};
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070019}
20
21} // namespace dvr
22} // namespace android
23
24namespace {
25
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070026int ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer,
27 AHardwareBuffer** hardware_buffer) {
28 if (!hardware_buffer || !graphic_buffer) {
29 return -EINVAL;
30 }
31 *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(graphic_buffer);
32 AHardwareBuffer_acquire(*hardware_buffer);
33 return 0;
34}
35
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070036} // anonymous namespace
37
38extern "C" {
39
Corey Tabaka2251d822017-04-20 16:04:07 -070040void dvrWriteBufferCreateEmpty(DvrWriteBuffer** write_buffer) {
41 if (write_buffer)
42 *write_buffer = new DvrWriteBuffer;
43}
44
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070045void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
46 delete write_buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070047}
48
Corey Tabaka2251d822017-04-20 16:04:07 -070049int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) {
50 return write_buffer && write_buffer->write_buffer;
51}
52
53int dvrWriteBufferClear(DvrWriteBuffer* write_buffer) {
54 if (!write_buffer)
55 return -EINVAL;
56
57 write_buffer->write_buffer = nullptr;
58 return 0;
59}
60
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070061int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070062 if (!write_buffer || !write_buffer->write_buffer)
63 return -EINVAL;
64
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070065 return write_buffer->write_buffer->id();
66}
67
68int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070069 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070070 if (!write_buffer || !write_buffer->write_buffer)
71 return -EINVAL;
72
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070073 return ConvertToAHardwareBuffer(
74 write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070075}
76
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070077int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070078 const void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -070079 if (!write_buffer || !write_buffer->write_buffer)
80 return -EINVAL;
81
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070082 pdx::LocalHandle fence(ready_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070083 int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070084 return result;
85}
86
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070087int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -070088 if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd)
89 return -EINVAL;
90
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070091 pdx::LocalHandle release_fence;
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070092 int result = write_buffer->write_buffer->Gain(&release_fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070093 *release_fence_fd = release_fence.Release();
94 return result;
95}
96
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070097int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -070098 if (!write_buffer || !write_buffer->write_buffer)
99 return -EINVAL;
100
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700101 return write_buffer->write_buffer->GainAsync();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700102}
103
Corey Tabaka2251d822017-04-20 16:04:07 -0700104void dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) {
105 if (read_buffer)
106 *read_buffer = new DvrReadBuffer;
107}
108
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700109void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; }
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700110
Corey Tabaka2251d822017-04-20 16:04:07 -0700111int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) {
112 return read_buffer && read_buffer->read_buffer;
113}
114
115int dvrReadBufferClear(DvrReadBuffer* read_buffer) {
116 if (!read_buffer)
117 return -EINVAL;
118
119 read_buffer->read_buffer = nullptr;
120 return 0;
121}
122
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700123int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700124 if (!read_buffer || !read_buffer->read_buffer)
125 return -EINVAL;
126
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700127 return read_buffer->read_buffer->id();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700128}
129
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700130int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700131 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700132 if (!read_buffer || !read_buffer->read_buffer)
133 return -EINVAL;
134
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700135 return ConvertToAHardwareBuffer(
136 read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700137}
138
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700139int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
140 void* meta, size_t meta_size_bytes) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700141 if (!read_buffer || !read_buffer->read_buffer)
142 return -EINVAL;
143
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700144 pdx::LocalHandle ready_fence;
145 int result =
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700146 read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700147 *ready_fence_fd = ready_fence.Release();
148 return result;
149}
150
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700151int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700152 if (!read_buffer || !read_buffer->read_buffer)
153 return -EINVAL;
154
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700155 pdx::LocalHandle fence(release_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700156 int result = read_buffer->read_buffer->Release(fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700157 return result;
158}
159
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700160int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700161 if (!read_buffer || !read_buffer->read_buffer)
162 return -EINVAL;
163
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700164 return read_buffer->read_buffer->ReleaseAsync();
165}
166
167void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
168
169int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
170 AHardwareBuffer** hardware_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700171 if (!buffer || !buffer->buffer || !hardware_buffer) {
172 return -EINVAL;
173 }
174
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700175 return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
176 hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700177}
178
John Bates28b58bf2017-04-18 10:45:23 -0700179const struct native_handle* dvrWriteBufferGetNativeHandle(
180 DvrWriteBuffer* write_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700181 if (!write_buffer || !write_buffer->write_buffer)
182 return nullptr;
183
John Bates28b58bf2017-04-18 10:45:23 -0700184 return write_buffer->write_buffer->native_handle();
185}
186
187const struct native_handle* dvrReadBufferGetNativeHandle(
188 DvrReadBuffer* read_buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700189 if (!read_buffer || !read_buffer->read_buffer)
190 return nullptr;
191
John Bates28b58bf2017-04-18 10:45:23 -0700192 return read_buffer->read_buffer->native_handle();
193}
194
195const struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) {
Corey Tabaka2251d822017-04-20 16:04:07 -0700196 if (!buffer || !buffer->buffer)
197 return nullptr;
198
John Bates28b58bf2017-04-18 10:45:23 -0700199 return buffer->buffer->handle();
200}
201
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700202} // extern "C"