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 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 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 40 void dvrWriteBufferCreateEmpty(DvrWriteBuffer** write_buffer) { 41 if (write_buffer) 42 *write_buffer = new DvrWriteBuffer; 43 } 44 45 void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) { 46 delete write_buffer; 47 } 48 49 int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) { 50 return write_buffer && write_buffer->write_buffer; 51 } 52 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 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 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 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 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 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 104 void dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) { 105 if (read_buffer) 106 *read_buffer = new DvrReadBuffer; 107 } 108 109 void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; } 110 111 int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) { 112 return read_buffer && read_buffer->read_buffer; 113 } 114 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 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 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 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 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 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 167 void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; } 168 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 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 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 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