12251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#ifndef ANDROID_DVR_DELETER_H_ 22251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#define ANDROID_DVR_DELETER_H_ 32251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 42251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <sys/cdefs.h> 52251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 62251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include <memory> 72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 82251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Header-only C++ helper to delete opaque DVR objects. 92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 102251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__BEGIN_DECLS 112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Use forward declarations to avoid dependency on other headers. 132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrBuffer DvrBuffer; 142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrReadBuffer DvrReadBuffer; 152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrWriteBuffer DvrWriteBuffer; 162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrReadBufferQueue DvrReadBufferQueue; 172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrWriteBufferQueue DvrWriteBufferQueue; 182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrDisplayManager DvrDisplayManager; 192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrSurfaceState DvrSurfaceState; 202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrSurface DvrSurface; 212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrHwcClient DvrHwcClient; 222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrHwcFrame DvrHwcFrame; 232251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatypedef struct DvrVSyncClient DvrVSyncClient; 242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrBufferDestroy(DvrBuffer* buffer); 262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrReadBufferDestroy(DvrReadBuffer* read_buffer); 272251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer); 282251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrReadBufferQueueDestroy(DvrReadBufferQueue* read_queue); 292251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrWriteBufferQueueDestroy(DvrWriteBufferQueue* write_queue); 302251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrDisplayManagerDestroy(DvrDisplayManager* client); 312251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrSurfaceStateDestroy(DvrSurfaceState* surface_state); 322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrSurfaceDestroy(DvrSurface* surface); 332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrHwcClientDestroy(DvrHwcClient* client); 342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrHwcFrameDestroy(DvrHwcFrame* frame); 352251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrVSyncClientDestroy(DvrVSyncClient* client); 362251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 372251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka__END_DECLS 382251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 392251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Avoid errors if this header is included in C code. 402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#if defined(__cplusplus) 412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace android { 432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakanamespace dvr { 442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 452251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Universal DVR object deleter. May be passed to smart pointer types to handle 462251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// deletion of DVR API objects. 472251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakastruct DvrObjectDeleter { 482251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrBuffer* p) { dvrBufferDestroy(p); } 492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrReadBuffer* p) { dvrReadBufferDestroy(p); } 502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrWriteBuffer* p) { dvrWriteBufferDestroy(p); } 512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrReadBufferQueue* p) { dvrReadBufferQueueDestroy(p); } 522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrWriteBufferQueue* p) { dvrWriteBufferQueueDestroy(p); } 532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrDisplayManager* p) { dvrDisplayManagerDestroy(p); } 542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrSurfaceState* p) { dvrSurfaceStateDestroy(p); } 552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrSurface* p) { dvrSurfaceDestroy(p); } 562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrHwcClient* p) { dvrHwcClientDestroy(p); } 572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrHwcFrame* p) { dvrHwcFrameDestroy(p); } 582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka void operator()(DvrVSyncClient* p) { dvrVSyncClientDestroy(p); } 592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}; 602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Helper to define unique pointers for DVR object types. 622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakatemplate <typename T> 632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing MakeUniqueDvrPointer = std::unique_ptr<T, DvrObjectDeleter>; 642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 652251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// Unique pointer types for DVR objects. 662251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrBuffer = MakeUniqueDvrPointer<DvrBuffer>; 672251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrReadBuffer = MakeUniqueDvrPointer<DvrReadBuffer>; 682251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrWriteBuffer = MakeUniqueDvrPointer<DvrWriteBuffer>; 692251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrReadBufferQueue = MakeUniqueDvrPointer<DvrReadBufferQueue>; 702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrWriteBufferQueue = MakeUniqueDvrPointer<DvrWriteBufferQueue>; 712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrDisplayManager = MakeUniqueDvrPointer<DvrDisplayManager>; 722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrSurfaceState = MakeUniqueDvrPointer<DvrSurfaceState>; 732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrSurface = MakeUniqueDvrPointer<DvrSurface>; 742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrHwcClient = MakeUniqueDvrPointer<DvrHwcClient>; 752251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrHwcFrame = MakeUniqueDvrPointer<DvrHwcFrame>; 762251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing UniqueDvrVSyncClient = MakeUniqueDvrPointer<DvrVSyncClient>; 772251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 782251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// TODO(eieio): Add an adapter for std::shared_ptr that injects the deleter into 792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka// the relevant constructors. 802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} // namespace dvr 822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka} // namespace android 832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 842251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#endif // defined(__cplusplus) 852251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka 862251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#endif // ANDROID_DVR_DELETER_H_ 87