#include "include/dvr/dvr_buffer.h" #include #include #include #include "dvr_internal.h" using namespace android; namespace android { namespace dvr { DvrBuffer* CreateDvrBufferFromIonBuffer( const std::shared_ptr& ion_buffer) { if (!ion_buffer) return nullptr; return new DvrBuffer{std::move(ion_buffer)}; } } // namespace dvr } // namespace android namespace { int ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer, AHardwareBuffer** hardware_buffer) { if (!hardware_buffer || !graphic_buffer) { return -EINVAL; } *hardware_buffer = reinterpret_cast(graphic_buffer); AHardwareBuffer_acquire(*hardware_buffer); return 0; } } // anonymous namespace extern "C" { void dvrWriteBufferCreateEmpty(DvrWriteBuffer** write_buffer) { if (write_buffer) *write_buffer = new DvrWriteBuffer; } void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) { delete write_buffer; } int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) { return write_buffer && write_buffer->write_buffer; } int dvrWriteBufferClear(DvrWriteBuffer* write_buffer) { if (!write_buffer) return -EINVAL; write_buffer->write_buffer = nullptr; return 0; } int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) { if (!write_buffer || !write_buffer->write_buffer) return -EINVAL; return write_buffer->write_buffer->id(); } int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer, AHardwareBuffer** hardware_buffer) { if (!write_buffer || !write_buffer->write_buffer) return -EINVAL; return ConvertToAHardwareBuffer( write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer); } int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd, const void* meta, size_t meta_size_bytes) { if (!write_buffer || !write_buffer->write_buffer) return -EINVAL; pdx::LocalHandle fence(ready_fence_fd); int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes); return result; } int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) { if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd) return -EINVAL; pdx::LocalHandle release_fence; int result = write_buffer->write_buffer->Gain(&release_fence); *release_fence_fd = release_fence.Release(); return result; } int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) { if (!write_buffer || !write_buffer->write_buffer) return -EINVAL; return write_buffer->write_buffer->GainAsync(); } void dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) { if (read_buffer) *read_buffer = new DvrReadBuffer; } void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; } int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) { return read_buffer && read_buffer->read_buffer; } int dvrReadBufferClear(DvrReadBuffer* read_buffer) { if (!read_buffer) return -EINVAL; read_buffer->read_buffer = nullptr; return 0; } int dvrReadBufferGetId(DvrReadBuffer* read_buffer) { if (!read_buffer || !read_buffer->read_buffer) return -EINVAL; return read_buffer->read_buffer->id(); } int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer, AHardwareBuffer** hardware_buffer) { if (!read_buffer || !read_buffer->read_buffer) return -EINVAL; return ConvertToAHardwareBuffer( read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer); } int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd, void* meta, size_t meta_size_bytes) { if (!read_buffer || !read_buffer->read_buffer) return -EINVAL; pdx::LocalHandle ready_fence; int result = read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes); *ready_fence_fd = ready_fence.Release(); return result; } int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) { if (!read_buffer || !read_buffer->read_buffer) return -EINVAL; pdx::LocalHandle fence(release_fence_fd); int result = read_buffer->read_buffer->Release(fence); return result; } int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) { if (!read_buffer || !read_buffer->read_buffer) return -EINVAL; return read_buffer->read_buffer->ReleaseAsync(); } void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; } int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer, AHardwareBuffer** hardware_buffer) { if (!buffer || !buffer->buffer || !hardware_buffer) { return -EINVAL; } return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(), hardware_buffer); } const struct native_handle* dvrWriteBufferGetNativeHandle( DvrWriteBuffer* write_buffer) { if (!write_buffer || !write_buffer->write_buffer) return nullptr; return write_buffer->write_buffer->native_handle(); } const struct native_handle* dvrReadBufferGetNativeHandle( DvrReadBuffer* read_buffer) { if (!read_buffer || !read_buffer->read_buffer) return nullptr; return read_buffer->read_buffer->native_handle(); } const struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) { if (!buffer || !buffer->buffer) return nullptr; return buffer->buffer->handle(); } } // extern "C"