blob: 3eb611f1f440d61f9652cb8390d2bacfde321ccc [file] [log] [blame]
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07001#include <private/dvr/buffer_hub_client.h>
2#include <private/dvr/dvr_buffer.h>
3#include <ui/GraphicBuffer.h>
4
5using namespace android;
6
7struct DvrWriteBuffer {
8 std::unique_ptr<dvr::BufferProducer> write_buffer_;
9 sp<GraphicBuffer> graphic_buffer_;
10};
11
12struct DvrReadBuffer {
13 std::unique_ptr<dvr::BufferConsumer> read_buffer_;
14 sp<GraphicBuffer> graphic_buffer_;
15};
16
17namespace android {
18namespace dvr {
19
20DvrWriteBuffer* CreateDvrWriteBufferFromBufferProducer(
21 std::unique_ptr<dvr::BufferProducer> buffer_producer) {
22 DvrWriteBuffer* write_buffer = new DvrWriteBuffer;
23 write_buffer->write_buffer_ = std::move(buffer_producer);
24 return write_buffer;
25}
26
27DvrReadBuffer* CreateDvrReadBufferFromBufferConsumer(
28 std::unique_ptr<dvr::BufferConsumer> buffer_consumer) {
29 DvrReadBuffer* read_buffer = new DvrReadBuffer;
30 read_buffer->read_buffer_ = std::move(buffer_consumer);
31 return read_buffer;
32}
33
34} // namespace dvr
35} // namespace android
36
37namespace {
38
39void InitializeGraphicBuffer(const dvr::BufferHubBuffer* buffer,
40 sp<GraphicBuffer>* graphic_buffer) {
41 *graphic_buffer = sp<GraphicBuffer>(new GraphicBuffer(
42 buffer->width(), buffer->height(), buffer->format(), 1, /* layer count */
43 buffer->usage(), buffer->stride(), buffer->native_handle(),
44 false /* keep ownership */));
45}
46
47} // anonymous namespace
48
49extern "C" {
50
51void dvrWriteBufferDestroy(DvrWriteBuffer* client) { delete client; }
52
53void dvrWriteBufferGetBlobFds(DvrWriteBuffer* client, int* fds,
54 size_t* fds_count, size_t max_fds_count) {
55 client->write_buffer_->GetBlobFds(fds, fds_count, max_fds_count);
56}
57
58int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* client,
59 AHardwareBuffer** hardware_buffer) {
60 if (!client->graphic_buffer_.get()) {
61 InitializeGraphicBuffer(client->write_buffer_.get(),
62 &client->graphic_buffer_);
63 }
64 *hardware_buffer =
65 reinterpret_cast<AHardwareBuffer*>(client->graphic_buffer_.get());
66 return 0;
67}
68
69int dvrWriteBufferPost(DvrWriteBuffer* client, int ready_fence_fd,
70 const void* meta, size_t meta_size_bytes) {
71 pdx::LocalHandle fence(ready_fence_fd);
72 int result = client->write_buffer_->Post(fence, meta, meta_size_bytes);
73 fence.Release();
74 return result;
75}
76
77int dvrWriteBufferGain(DvrWriteBuffer* client, int* release_fence_fd) {
78 pdx::LocalHandle release_fence;
79 int result = client->write_buffer_->Gain(&release_fence);
80 *release_fence_fd = release_fence.Release();
81 return result;
82}
83
84int dvrWriteBufferGainAsync(DvrWriteBuffer* client) {
85 return client->write_buffer_->GainAsync();
86}
87
88void dvrReadBufferGetBlobFds(DvrReadBuffer* client, int* fds, size_t* fds_count,
89 size_t max_fds_count) {
90 client->read_buffer_->GetBlobFds(fds, fds_count, max_fds_count);
91}
92
93int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* client,
94 AHardwareBuffer** hardware_buffer) {
95 if (!client->graphic_buffer_.get()) {
96 InitializeGraphicBuffer(client->read_buffer_.get(),
97 &client->graphic_buffer_);
98 }
99 *hardware_buffer =
100 reinterpret_cast<AHardwareBuffer*>(client->graphic_buffer_.get());
101 return 0;
102}
103
104int dvrReadBufferAcquire(DvrReadBuffer* client, int* ready_fence_fd, void* meta,
105 size_t meta_size_bytes) {
106 pdx::LocalHandle ready_fence;
107 int result =
108 client->read_buffer_->Acquire(&ready_fence, meta, meta_size_bytes);
109 *ready_fence_fd = ready_fence.Release();
110 return result;
111}
112
113int dvrReadBufferRelease(DvrReadBuffer* client, int release_fence_fd) {
114 pdx::LocalHandle fence(release_fence_fd);
115 int result = client->read_buffer_->Release(fence);
116 fence.Release();
117 return result;
118}
119
120int dvrReadBufferReleaseAsync(DvrReadBuffer* client) {
121 return client->read_buffer_->ReleaseAsync();
122}
123
124} // extern "C"