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