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