blob: 0942b3dbb4835b750911ccbb7b887df1d93a0498 [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 {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -07009 std::shared_ptr<dvr::BufferProducer> write_buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070010};
11
12struct DvrReadBuffer {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070013 std::shared_ptr<dvr::BufferConsumer> read_buffer;
14};
15
16struct DvrBuffer {
17 std::shared_ptr<dvr::IonBuffer> buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070018};
19
20namespace android {
21namespace dvr {
22
23DvrWriteBuffer* CreateDvrWriteBufferFromBufferProducer(
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070024 const std::shared_ptr<dvr::BufferProducer>& buffer_producer) {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070025 if (!buffer_producer)
26 return nullptr;
27 return new DvrWriteBuffer{std::move(buffer_producer)};
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070028}
29
30DvrReadBuffer* CreateDvrReadBufferFromBufferConsumer(
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070031 const std::shared_ptr<dvr::BufferConsumer>& buffer_consumer) {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070032 if (!buffer_consumer)
33 return nullptr;
34 return new DvrReadBuffer{std::move(buffer_consumer)};
35}
36
37DvrBuffer* CreateDvrBufferFromIonBuffer(
38 const std::shared_ptr<IonBuffer>& ion_buffer) {
39 if (!ion_buffer)
40 return nullptr;
41 return new DvrBuffer{std::move(ion_buffer)};
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070042}
43
44} // namespace dvr
45} // namespace android
46
47namespace {
48
49void InitializeGraphicBuffer(const dvr::BufferHubBuffer* buffer,
50 sp<GraphicBuffer>* graphic_buffer) {
51 *graphic_buffer = sp<GraphicBuffer>(new GraphicBuffer(
52 buffer->width(), buffer->height(), buffer->format(), 1, /* layer count */
53 buffer->usage(), buffer->stride(), buffer->native_handle(),
54 false /* keep ownership */));
55}
56
57} // anonymous namespace
58
59extern "C" {
60
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070061void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
62 delete write_buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070063}
64
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070065int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
66 return write_buffer->write_buffer->id();
67}
68
69int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070070 AHardwareBuffer** hardware_buffer) {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070071 *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(
72 write_buffer->write_buffer->buffer()->buffer().get());
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070073 return 0;
74}
75
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070076int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070077 const void* meta, size_t meta_size_bytes) {
78 pdx::LocalHandle fence(ready_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070079 int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070080 return result;
81}
82
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070083int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070084 pdx::LocalHandle release_fence;
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070085 int result = write_buffer->write_buffer->Gain(&release_fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070086 *release_fence_fd = release_fence.Release();
87 return result;
88}
89
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070090int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
91 return write_buffer->write_buffer->GainAsync();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070092}
93
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070094void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; }
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070095
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070096int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
97 return read_buffer->read_buffer->id();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070098}
99
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700100int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700101 AHardwareBuffer** hardware_buffer) {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700102 *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(
103 read_buffer->read_buffer->buffer()->buffer().get());
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700104 return 0;
105}
106
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700107int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
108 void* meta, size_t meta_size_bytes) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700109 pdx::LocalHandle ready_fence;
110 int result =
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700111 read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700112 *ready_fence_fd = ready_fence.Release();
113 return result;
114}
115
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700116int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700117 pdx::LocalHandle fence(release_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700118 int result = read_buffer->read_buffer->Release(fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700119 return result;
120}
121
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700122int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
123 return read_buffer->read_buffer->ReleaseAsync();
124}
125
126void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
127
128int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
129 AHardwareBuffer** hardware_buffer) {
130 if (!hardware_buffer) {
131 return -EINVAL;
132 }
133
134 *hardware_buffer =
135 reinterpret_cast<AHardwareBuffer*>(buffer->buffer->buffer().get());
136 return 0;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700137}
138
139} // extern "C"