1 #include "include/dvr/dvr_buffer.h" 2 3 #include <android/hardware_buffer.h> 4 #include <dvr/dvr_shared_buffers.h> 5 #include <private/dvr/buffer_hub_client.h> 6 #include <ui/GraphicBuffer.h> 7 8 #include "dvr_internal.h" 9 10 using namespace android; 11 12 namespace android { 13 namespace dvr { 14 15 DvrBuffer* CreateDvrBufferFromIonBuffer( 16 const std::shared_ptr<IonBuffer>& ion_buffer) { 17 if (!ion_buffer) 18 return nullptr; 19 return new DvrBuffer{std::move(ion_buffer)}; 20 } 21 22 } // namespace dvr 23 } // namespace android 24 25 namespace { 26 27 int ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer, 28 AHardwareBuffer** hardware_buffer) { 29 if (!hardware_buffer || !graphic_buffer) { 30 return -EINVAL; 31 } 32 *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(graphic_buffer); 33 AHardwareBuffer_acquire(*hardware_buffer); 34 return 0; 35 } 36 37 } // anonymous namespace 38 39 extern "C" { 40 41 void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) { 42 if (write_buffer != nullptr) { 43 ALOGW_IF( 44 write_buffer->slot != -1, 45 "dvrWriteBufferDestroy: Destroying a buffer associated with a valid " 46 "buffer queue slot. This may indicate possible leaks, buffer_id=%d.", 47 dvrWriteBufferGetId(write_buffer)); 48 delete write_buffer; 49 } 50 } 51 52 int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) { 53 return write_buffer && write_buffer->write_buffer; 54 } 55 56 int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) { 57 if (!write_buffer || !write_buffer->write_buffer) 58 return -EINVAL; 59 60 return write_buffer->write_buffer->id(); 61 } 62 63 int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer, 64 AHardwareBuffer** hardware_buffer) { 65 if (!write_buffer || !write_buffer->write_buffer) 66 return -EINVAL; 67 68 return ConvertToAHardwareBuffer( 69 write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer); 70 } 71 72 void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { 73 if (read_buffer != nullptr) { 74 ALOGW_IF( 75 read_buffer->slot != -1, 76 "dvrReadBufferDestroy: Destroying a buffer associated with a valid " 77 "buffer queue slot. This may indicate possible leaks, buffer_id=%d.", 78 dvrReadBufferGetId(read_buffer)); 79 delete read_buffer; 80 } 81 } 82 83 int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) { 84 return read_buffer && read_buffer->read_buffer; 85 } 86 87 int dvrReadBufferGetId(DvrReadBuffer* read_buffer) { 88 if (!read_buffer || !read_buffer->read_buffer) 89 return -EINVAL; 90 91 return read_buffer->read_buffer->id(); 92 } 93 94 int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer, 95 AHardwareBuffer** hardware_buffer) { 96 if (!read_buffer || !read_buffer->read_buffer) 97 return -EINVAL; 98 99 return ConvertToAHardwareBuffer( 100 read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer); 101 } 102 103 void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; } 104 105 int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer, 106 AHardwareBuffer** hardware_buffer) { 107 if (!buffer || !buffer->buffer || !hardware_buffer) { 108 return -EINVAL; 109 } 110 111 return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(), 112 hardware_buffer); 113 } 114 115 // Retrieve the shared buffer layout version defined in dvr_shared_buffers.h. 116 int dvrBufferGlobalLayoutVersionGet() { 117 return android::dvr::kSharedBufferLayoutVersion; 118 } 119 120 } // extern "C" 121