• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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