1bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#include "include/dvr/dvr_buffer.h" 2bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai 3a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar#include <android/hardware_buffer.h> 410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar#include <private/dvr/buffer_hub_client.h> 510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar#include <ui/GraphicBuffer.h> 610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include "dvr_internal.h" 810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing namespace android; 1010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 1110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarnamespace android { 1210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarnamespace dvr { 1310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 14eaa5522feac452703a0836310047d4b15702487dHendrik WagenaarDvrBuffer* CreateDvrBufferFromIonBuffer( 15eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar const std::shared_ptr<IonBuffer>& ion_buffer) { 16eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar if (!ion_buffer) 17eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return nullptr; 18eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return new DvrBuffer{std::move(ion_buffer)}; 1910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 2010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 2110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} // namespace dvr 2210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} // namespace android 2310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 2410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarnamespace { 2510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 26a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaarint ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer, 27a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar AHardwareBuffer** hardware_buffer) { 28a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar if (!hardware_buffer || !graphic_buffer) { 29a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar return -EINVAL; 30a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar } 31a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(graphic_buffer); 32a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar AHardwareBuffer_acquire(*hardware_buffer); 33a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar return 0; 34a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar} 35a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar 3610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} // anonymous namespace 3710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 3810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarextern "C" { 3910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrWriteBufferCreateEmpty(DvrWriteBuffer** write_buffer) { 412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (write_buffer) 422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *write_buffer = new DvrWriteBuffer; 432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 45eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarvoid dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) { 46eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar delete write_buffer; 47eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar} 4810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) { 502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return write_buffer && write_buffer->write_buffer; 512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrWriteBufferClear(DvrWriteBuffer* write_buffer) { 542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!write_buffer) 552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka write_buffer->write_buffer = nullptr; 582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return 0; 592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 61eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) { 622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!write_buffer || !write_buffer->write_buffer) 632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 65eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return write_buffer->write_buffer->id(); 6610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 6710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 68eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer, 6910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar AHardwareBuffer** hardware_buffer) { 702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!write_buffer || !write_buffer->write_buffer) 712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 73a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar return ConvertToAHardwareBuffer( 74a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer); 7510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 7610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 77eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd, 7810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar const void* meta, size_t meta_size_bytes) { 792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!write_buffer || !write_buffer->write_buffer) 802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 8210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar pdx::LocalHandle fence(ready_fence_fd); 83eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes); 8410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar return result; 8510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 8610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 87eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) { 882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd) 892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 9110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar pdx::LocalHandle release_fence; 92eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar int result = write_buffer->write_buffer->Gain(&release_fence); 9310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar *release_fence_fd = release_fence.Release(); 9410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar return result; 9510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 9610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 97eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) { 982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!write_buffer || !write_buffer->write_buffer) 992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 101eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return write_buffer->write_buffer->GainAsync(); 10210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 10310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 1042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) { 1052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (read_buffer) 1062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka *read_buffer = new DvrReadBuffer; 1072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 1082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 109eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarvoid dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; } 1102d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai 1112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrReadBufferIsValid(DvrReadBuffer* read_buffer) { 1122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return read_buffer && read_buffer->read_buffer; 1132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 1142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrReadBufferClear(DvrReadBuffer* read_buffer) { 1162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!read_buffer) 1172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 1192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka read_buffer->read_buffer = nullptr; 1202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return 0; 1212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} 1222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 123eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferGetId(DvrReadBuffer* read_buffer) { 1242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!read_buffer || !read_buffer->read_buffer) 1252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 127eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return read_buffer->read_buffer->id(); 12810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 12910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 130eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer, 13110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar AHardwareBuffer** hardware_buffer) { 1322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!read_buffer || !read_buffer->read_buffer) 1332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 135a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar return ConvertToAHardwareBuffer( 136a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer); 13710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 13810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 139eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd, 140eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar void* meta, size_t meta_size_bytes) { 1412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!read_buffer || !read_buffer->read_buffer) 1422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 14410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar pdx::LocalHandle ready_fence; 14510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar int result = 146eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes); 14710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar *ready_fence_fd = ready_fence.Release(); 14810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar return result; 14910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 15010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 151eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) { 1522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!read_buffer || !read_buffer->read_buffer) 1532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 15510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar pdx::LocalHandle fence(release_fence_fd); 156eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar int result = read_buffer->read_buffer->Release(fence); 15710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar return result; 15810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 15910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 160eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) { 1612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!read_buffer || !read_buffer->read_buffer) 1622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 164eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return read_buffer->read_buffer->ReleaseAsync(); 165eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar} 166eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar 167eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarvoid dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; } 168eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar 169eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrBufferGetAHardwareBuffer(DvrBuffer* buffer, 170eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar AHardwareBuffer** hardware_buffer) { 1712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!buffer || !buffer->buffer || !hardware_buffer) { 1722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return -EINVAL; 1732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka } 1742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 175a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(), 176a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar hardware_buffer); 17710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} 17810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar 17928b58bfdcce253358120d1554755d71c2226f8fdJohn Batesconst struct native_handle* dvrWriteBufferGetNativeHandle( 18028b58bfdcce253358120d1554755d71c2226f8fdJohn Bates DvrWriteBuffer* write_buffer) { 1812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!write_buffer || !write_buffer->write_buffer) 1822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return nullptr; 1832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 18428b58bfdcce253358120d1554755d71c2226f8fdJohn Bates return write_buffer->write_buffer->native_handle(); 18528b58bfdcce253358120d1554755d71c2226f8fdJohn Bates} 18628b58bfdcce253358120d1554755d71c2226f8fdJohn Bates 18728b58bfdcce253358120d1554755d71c2226f8fdJohn Batesconst struct native_handle* dvrReadBufferGetNativeHandle( 18828b58bfdcce253358120d1554755d71c2226f8fdJohn Bates DvrReadBuffer* read_buffer) { 1892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!read_buffer || !read_buffer->read_buffer) 1902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return nullptr; 1912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 19228b58bfdcce253358120d1554755d71c2226f8fdJohn Bates return read_buffer->read_buffer->native_handle(); 19328b58bfdcce253358120d1554755d71c2226f8fdJohn Bates} 19428b58bfdcce253358120d1554755d71c2226f8fdJohn Bates 19528b58bfdcce253358120d1554755d71c2226f8fdJohn Batesconst struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) { 1962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka if (!buffer || !buffer->buffer) 1972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka return nullptr; 1982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 19928b58bfdcce253358120d1554755d71c2226f8fdJohn Bates return buffer->buffer->handle(); 20028b58bfdcce253358120d1554755d71c2226f8fdJohn Bates} 20128b58bfdcce253358120d1554755d71c2226f8fdJohn Bates 20210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar} // extern "C" 203