blob: 25128a653f387f01d3e6c2983b70e876037868ba [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 {
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -07009 std::shared_ptr<dvr::BufferProducer> write_buffer_;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070010 sp<GraphicBuffer> graphic_buffer_;
11};
12
13struct DvrReadBuffer {
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070014 std::shared_ptr<dvr::BufferConsumer> read_buffer_;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070015 sp<GraphicBuffer> graphic_buffer_;
16};
17
18namespace android {
19namespace dvr {
20
21DvrWriteBuffer* CreateDvrWriteBufferFromBufferProducer(
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070022 const std::shared_ptr<dvr::BufferProducer>& buffer_producer) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070023 DvrWriteBuffer* write_buffer = new DvrWriteBuffer;
24 write_buffer->write_buffer_ = std::move(buffer_producer);
25 return write_buffer;
26}
27
28DvrReadBuffer* CreateDvrReadBufferFromBufferConsumer(
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070029 const std::shared_ptr<dvr::BufferConsumer>& buffer_consumer) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070030 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
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070089void dvrReadBufferDestroy(DvrReadBuffer* client) { delete client; }
90
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070091void dvrReadBufferGetBlobFds(DvrReadBuffer* client, int* fds, size_t* fds_count,
92 size_t max_fds_count) {
93 client->read_buffer_->GetBlobFds(fds, fds_count, max_fds_count);
94}
95
96int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* client,
97 AHardwareBuffer** hardware_buffer) {
98 if (!client->graphic_buffer_.get()) {
99 InitializeGraphicBuffer(client->read_buffer_.get(),
100 &client->graphic_buffer_);
101 }
102 *hardware_buffer =
103 reinterpret_cast<AHardwareBuffer*>(client->graphic_buffer_.get());
104 return 0;
105}
106
107int dvrReadBufferAcquire(DvrReadBuffer* client, int* ready_fence_fd, void* meta,
108 size_t meta_size_bytes) {
109 pdx::LocalHandle ready_fence;
110 int result =
111 client->read_buffer_->Acquire(&ready_fence, meta, meta_size_bytes);
112 *ready_fence_fd = ready_fence.Release();
113 return result;
114}
115
116int dvrReadBufferRelease(DvrReadBuffer* client, int release_fence_fd) {
117 pdx::LocalHandle fence(release_fence_fd);
118 int result = client->read_buffer_->Release(fence);
119 fence.Release();
120 return result;
121}
122
123int dvrReadBufferReleaseAsync(DvrReadBuffer* client) {
124 return client->read_buffer_->ReleaseAsync();
125}
126
127} // extern "C"