blob: 7dd66659a620f25b6ab2fe5b993a570145ccbed9 [file] [log] [blame]
Jiwen 'Steve' Caibdcee792017-03-22 16:59:53 -07001#include "include/dvr/dvr_buffer.h"
2
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -07003#include <android/hardware_buffer.h>
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07004#include <private/dvr/buffer_hub_client.h>
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -07005#include <ui/GraphicBuffer.h>
6
7using namespace android;
8
9struct DvrWriteBuffer {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070010 std::shared_ptr<dvr::BufferProducer> write_buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070011};
12
13struct DvrReadBuffer {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070014 std::shared_ptr<dvr::BufferConsumer> read_buffer;
15};
16
17struct DvrBuffer {
18 std::shared_ptr<dvr::IonBuffer> buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070019};
20
21namespace android {
22namespace dvr {
23
24DvrWriteBuffer* CreateDvrWriteBufferFromBufferProducer(
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070025 const std::shared_ptr<dvr::BufferProducer>& buffer_producer) {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070026 if (!buffer_producer)
27 return nullptr;
28 return new DvrWriteBuffer{std::move(buffer_producer)};
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070029}
30
31DvrReadBuffer* CreateDvrReadBufferFromBufferConsumer(
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -070032 const std::shared_ptr<dvr::BufferConsumer>& buffer_consumer) {
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070033 if (!buffer_consumer)
34 return nullptr;
35 return new DvrReadBuffer{std::move(buffer_consumer)};
36}
37
38DvrBuffer* CreateDvrBufferFromIonBuffer(
39 const std::shared_ptr<IonBuffer>& ion_buffer) {
40 if (!ion_buffer)
41 return nullptr;
42 return new DvrBuffer{std::move(ion_buffer)};
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070043}
44
45} // namespace dvr
46} // namespace android
47
48namespace {
49
50void InitializeGraphicBuffer(const dvr::BufferHubBuffer* buffer,
51 sp<GraphicBuffer>* graphic_buffer) {
52 *graphic_buffer = sp<GraphicBuffer>(new GraphicBuffer(
53 buffer->width(), buffer->height(), buffer->format(), 1, /* layer count */
54 buffer->usage(), buffer->stride(), buffer->native_handle(),
55 false /* keep ownership */));
56}
57
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070058int ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer,
59 AHardwareBuffer** hardware_buffer) {
60 if (!hardware_buffer || !graphic_buffer) {
61 return -EINVAL;
62 }
63 *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(graphic_buffer);
64 AHardwareBuffer_acquire(*hardware_buffer);
65 return 0;
66}
67
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070068} // anonymous namespace
69
70extern "C" {
71
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070072void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
73 delete write_buffer;
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070074}
75
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070076int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
77 return write_buffer->write_buffer->id();
78}
79
80int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070081 AHardwareBuffer** hardware_buffer) {
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -070082 return ConvertToAHardwareBuffer(
83 write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070084}
85
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070086int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070087 const void* meta, size_t meta_size_bytes) {
88 pdx::LocalHandle fence(ready_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070089 int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070090 return result;
91}
92
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070093int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070094 pdx::LocalHandle release_fence;
Hendrik Wagenaareaa55222017-04-06 10:56:23 -070095 int result = write_buffer->write_buffer->Gain(&release_fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -070096 *release_fence_fd = release_fence.Release();
97 return result;
98}
99
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700100int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
101 return write_buffer->write_buffer->GainAsync();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700102}
103
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700104void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; }
Jiwen 'Steve' Cai2d82ceb2017-03-22 17:26:00 -0700105
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700106int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
107 return read_buffer->read_buffer->id();
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700108}
109
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700110int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700111 AHardwareBuffer** hardware_buffer) {
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700112 return ConvertToAHardwareBuffer(
113 read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700114}
115
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700116int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
117 void* meta, size_t meta_size_bytes) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700118 pdx::LocalHandle ready_fence;
119 int result =
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700120 read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700121 *ready_fence_fd = ready_fence.Release();
122 return result;
123}
124
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700125int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700126 pdx::LocalHandle fence(release_fence_fd);
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700127 int result = read_buffer->read_buffer->Release(fence);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700128 return result;
129}
130
Hendrik Wagenaareaa55222017-04-06 10:56:23 -0700131int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
132 return read_buffer->read_buffer->ReleaseAsync();
133}
134
135void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
136
137int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
138 AHardwareBuffer** hardware_buffer) {
Hendrik Wagenaara5d404d2017-04-18 22:03:09 -0700139 return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
140 hardware_buffer);
Hendrik Wagenaar10e68eb2017-03-15 13:29:02 -0700141}
142
143} // extern "C"