1 #include "include/dvr/dvr_buffer.h"
2
3 #include <android/hardware_buffer.h>
4 #include <private/dvr/buffer_hub_client.h>
5 #include <ui/GraphicBuffer.h>
6
7 #include "dvr_internal.h"
8
9 using namespace android;
10
11 namespace android {
12 namespace dvr {
13
CreateDvrBufferFromIonBuffer(const std::shared_ptr<IonBuffer> & ion_buffer)14 DvrBuffer* CreateDvrBufferFromIonBuffer(
15 const std::shared_ptr<IonBuffer>& ion_buffer) {
16 if (!ion_buffer)
17 return nullptr;
18 return new DvrBuffer{std::move(ion_buffer)};
19 }
20
21 } // namespace dvr
22 } // namespace android
23
24 namespace {
25
ConvertToAHardwareBuffer(GraphicBuffer * graphic_buffer,AHardwareBuffer ** hardware_buffer)26 int 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
36 } // anonymous namespace
37
38 extern "C" {
39
dvrWriteBufferCreateEmpty(DvrWriteBuffer ** write_buffer)40 void dvrWriteBufferCreateEmpty(DvrWriteBuffer** write_buffer) {
41 if (write_buffer)
42 *write_buffer = new DvrWriteBuffer;
43 }
44
dvrWriteBufferDestroy(DvrWriteBuffer * write_buffer)45 void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
46 delete write_buffer;
47 }
48
dvrWriteBufferIsValid(DvrWriteBuffer * write_buffer)49 int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) {
50 return write_buffer && write_buffer->write_buffer;
51 }
52
dvrWriteBufferClear(DvrWriteBuffer * write_buffer)53 int dvrWriteBufferClear(DvrWriteBuffer* write_buffer) {
54 if (!write_buffer)
55 return -EINVAL;
56
57 write_buffer->write_buffer = nullptr;
58 return 0;
59 }
60
dvrWriteBufferGetId(DvrWriteBuffer * write_buffer)61 int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
62 if (!write_buffer || !write_buffer->write_buffer)
63 return -EINVAL;
64
65 return write_buffer->write_buffer->id();
66 }
67
dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer * write_buffer,AHardwareBuffer ** hardware_buffer)68 int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
69 AHardwareBuffer** hardware_buffer) {
70 if (!write_buffer || !write_buffer->write_buffer)
71 return -EINVAL;
72
73 return ConvertToAHardwareBuffer(
74 write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
75 }
76
dvrWriteBufferPost(DvrWriteBuffer * write_buffer,int ready_fence_fd,const void * meta,size_t meta_size_bytes)77 int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
78 const void* meta, size_t meta_size_bytes) {
79 if (!write_buffer || !write_buffer->write_buffer)
80 return -EINVAL;
81
82 pdx::LocalHandle fence(ready_fence_fd);
83 int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
84 return result;
85 }
86
dvrWriteBufferGain(DvrWriteBuffer * write_buffer,int * release_fence_fd)87 int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
88 if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd)
89 return -EINVAL;
90
91 pdx::LocalHandle release_fence;
92 int result = write_buffer->write_buffer->Gain(&release_fence);
93 *release_fence_fd = release_fence.Release();
94 return result;
95 }
96
dvrWriteBufferGainAsync(DvrWriteBuffer * write_buffer)97 int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
98 if (!write_buffer || !write_buffer->write_buffer)
99 return -EINVAL;
100
101 return write_buffer->write_buffer->GainAsync();
102 }
103
dvrReadBufferCreateEmpty(DvrReadBuffer ** read_buffer)104 void dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) {
105 if (read_buffer)
106 *read_buffer = new DvrReadBuffer;
107 }
108
dvrReadBufferDestroy(DvrReadBuffer * read_buffer)109 void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; }
110
dvrReadBufferIsValid(DvrReadBuffer * read_buffer)111 int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) {
112 return read_buffer && read_buffer->read_buffer;
113 }
114
dvrReadBufferClear(DvrReadBuffer * read_buffer)115 int dvrReadBufferClear(DvrReadBuffer* read_buffer) {
116 if (!read_buffer)
117 return -EINVAL;
118
119 read_buffer->read_buffer = nullptr;
120 return 0;
121 }
122
dvrReadBufferGetId(DvrReadBuffer * read_buffer)123 int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
124 if (!read_buffer || !read_buffer->read_buffer)
125 return -EINVAL;
126
127 return read_buffer->read_buffer->id();
128 }
129
dvrReadBufferGetAHardwareBuffer(DvrReadBuffer * read_buffer,AHardwareBuffer ** hardware_buffer)130 int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
131 AHardwareBuffer** hardware_buffer) {
132 if (!read_buffer || !read_buffer->read_buffer)
133 return -EINVAL;
134
135 return ConvertToAHardwareBuffer(
136 read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
137 }
138
dvrReadBufferAcquire(DvrReadBuffer * read_buffer,int * ready_fence_fd,void * meta,size_t meta_size_bytes)139 int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
140 void* meta, size_t meta_size_bytes) {
141 if (!read_buffer || !read_buffer->read_buffer)
142 return -EINVAL;
143
144 pdx::LocalHandle ready_fence;
145 int result =
146 read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
147 *ready_fence_fd = ready_fence.Release();
148 return result;
149 }
150
dvrReadBufferRelease(DvrReadBuffer * read_buffer,int release_fence_fd)151 int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
152 if (!read_buffer || !read_buffer->read_buffer)
153 return -EINVAL;
154
155 pdx::LocalHandle fence(release_fence_fd);
156 int result = read_buffer->read_buffer->Release(fence);
157 return result;
158 }
159
dvrReadBufferReleaseAsync(DvrReadBuffer * read_buffer)160 int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
161 if (!read_buffer || !read_buffer->read_buffer)
162 return -EINVAL;
163
164 return read_buffer->read_buffer->ReleaseAsync();
165 }
166
dvrBufferDestroy(DvrBuffer * buffer)167 void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
168
dvrBufferGetAHardwareBuffer(DvrBuffer * buffer,AHardwareBuffer ** hardware_buffer)169 int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
170 AHardwareBuffer** hardware_buffer) {
171 if (!buffer || !buffer->buffer || !hardware_buffer) {
172 return -EINVAL;
173 }
174
175 return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
176 hardware_buffer);
177 }
178
dvrWriteBufferGetNativeHandle(DvrWriteBuffer * write_buffer)179 const struct native_handle* dvrWriteBufferGetNativeHandle(
180 DvrWriteBuffer* write_buffer) {
181 if (!write_buffer || !write_buffer->write_buffer)
182 return nullptr;
183
184 return write_buffer->write_buffer->native_handle();
185 }
186
dvrReadBufferGetNativeHandle(DvrReadBuffer * read_buffer)187 const struct native_handle* dvrReadBufferGetNativeHandle(
188 DvrReadBuffer* read_buffer) {
189 if (!read_buffer || !read_buffer->read_buffer)
190 return nullptr;
191
192 return read_buffer->read_buffer->native_handle();
193 }
194
dvrBufferGetNativeHandle(DvrBuffer * buffer)195 const struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) {
196 if (!buffer || !buffer->buffer)
197 return nullptr;
198
199 return buffer->buffer->handle();
200 }
201
202 } // extern "C"
203