|  | #include "include/dvr/dvr_buffer.h" | 
|  |  | 
|  | #include <android/hardware_buffer.h> | 
|  | #include <dvr/dvr_shared_buffers.h> | 
|  | #include <private/dvr/consumer_buffer.h> | 
|  | #include <private/dvr/producer_buffer.h> | 
|  | #include <ui/GraphicBuffer.h> | 
|  |  | 
|  | #include "dvr_internal.h" | 
|  |  | 
|  | using namespace android; | 
|  |  | 
|  | namespace android { | 
|  | namespace dvr { | 
|  |  | 
|  | DvrBuffer* CreateDvrBufferFromIonBuffer( | 
|  | const std::shared_ptr<IonBuffer>& 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<AHardwareBuffer*>(graphic_buffer); | 
|  | AHardwareBuffer_acquire(*hardware_buffer); | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | }  // anonymous namespace | 
|  |  | 
|  | extern "C" { | 
|  |  | 
|  | void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) { | 
|  | if (write_buffer != nullptr) { | 
|  | ALOGW_IF( | 
|  | write_buffer->slot != -1, | 
|  | "dvrWriteBufferDestroy: Destroying a buffer associated with a valid " | 
|  | "buffer queue slot. This may indicate possible leaks, buffer_id=%d.", | 
|  | dvrWriteBufferGetId(write_buffer)); | 
|  | delete write_buffer; | 
|  | } | 
|  | } | 
|  |  | 
|  | int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) { | 
|  | return write_buffer && write_buffer->write_buffer; | 
|  | } | 
|  |  | 
|  | 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); | 
|  | } | 
|  |  | 
|  | void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { | 
|  | if (read_buffer != nullptr) { | 
|  | ALOGW_IF( | 
|  | read_buffer->slot != -1, | 
|  | "dvrReadBufferDestroy: Destroying a buffer associated with a valid " | 
|  | "buffer queue slot. This may indicate possible leaks, buffer_id=%d.", | 
|  | dvrReadBufferGetId(read_buffer)); | 
|  | delete read_buffer; | 
|  | } | 
|  | } | 
|  |  | 
|  | int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) { | 
|  | return read_buffer && read_buffer->read_buffer; | 
|  | } | 
|  |  | 
|  | 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); | 
|  | } | 
|  |  | 
|  | 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); | 
|  | } | 
|  |  | 
|  | // Retrieve the shared buffer layout version defined in dvr_shared_buffers.h. | 
|  | int dvrBufferGlobalLayoutVersionGet() { | 
|  | return android::dvr::kSharedBufferLayoutVersion; | 
|  | } | 
|  |  | 
|  | }  // extern "C" |