Jiwen 'Steve' Cai | bdcee79 | 2017-03-22 16:59:53 -0700 | [diff] [blame] | 1 | #include "include/dvr/dvr_buffer.h" |
| 2 | |
Hendrik Wagenaar | a5d404d | 2017-04-18 22:03:09 -0700 | [diff] [blame^] | 3 | #include <android/hardware_buffer.h> |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 4 | #include <private/dvr/buffer_hub_client.h> |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 5 | #include <ui/GraphicBuffer.h> |
| 6 | |
| 7 | using namespace android; |
| 8 | |
| 9 | struct DvrWriteBuffer { |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 10 | std::shared_ptr<dvr::BufferProducer> write_buffer; |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 11 | }; |
| 12 | |
| 13 | struct DvrReadBuffer { |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 14 | std::shared_ptr<dvr::BufferConsumer> read_buffer; |
| 15 | }; |
| 16 | |
| 17 | struct DvrBuffer { |
| 18 | std::shared_ptr<dvr::IonBuffer> buffer; |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 19 | }; |
| 20 | |
| 21 | namespace android { |
| 22 | namespace dvr { |
| 23 | |
| 24 | DvrWriteBuffer* CreateDvrWriteBufferFromBufferProducer( |
Jiwen 'Steve' Cai | 2d82ceb | 2017-03-22 17:26:00 -0700 | [diff] [blame] | 25 | const std::shared_ptr<dvr::BufferProducer>& buffer_producer) { |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 26 | if (!buffer_producer) |
| 27 | return nullptr; |
| 28 | return new DvrWriteBuffer{std::move(buffer_producer)}; |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | DvrReadBuffer* CreateDvrReadBufferFromBufferConsumer( |
Jiwen 'Steve' Cai | 2d82ceb | 2017-03-22 17:26:00 -0700 | [diff] [blame] | 32 | const std::shared_ptr<dvr::BufferConsumer>& buffer_consumer) { |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 33 | if (!buffer_consumer) |
| 34 | return nullptr; |
| 35 | return new DvrReadBuffer{std::move(buffer_consumer)}; |
| 36 | } |
| 37 | |
| 38 | DvrBuffer* 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 Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 43 | } |
| 44 | |
| 45 | } // namespace dvr |
| 46 | } // namespace android |
| 47 | |
| 48 | namespace { |
| 49 | |
| 50 | void 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 Wagenaar | a5d404d | 2017-04-18 22:03:09 -0700 | [diff] [blame^] | 58 | int 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 Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 68 | } // anonymous namespace |
| 69 | |
| 70 | extern "C" { |
| 71 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 72 | void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) { |
| 73 | delete write_buffer; |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 74 | } |
| 75 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 76 | int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) { |
| 77 | return write_buffer->write_buffer->id(); |
| 78 | } |
| 79 | |
| 80 | int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer, |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 81 | AHardwareBuffer** hardware_buffer) { |
Hendrik Wagenaar | a5d404d | 2017-04-18 22:03:09 -0700 | [diff] [blame^] | 82 | return ConvertToAHardwareBuffer( |
| 83 | write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 84 | } |
| 85 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 86 | int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd, |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 87 | const void* meta, size_t meta_size_bytes) { |
| 88 | pdx::LocalHandle fence(ready_fence_fd); |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 89 | int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 90 | return result; |
| 91 | } |
| 92 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 93 | int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) { |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 94 | pdx::LocalHandle release_fence; |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 95 | int result = write_buffer->write_buffer->Gain(&release_fence); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 96 | *release_fence_fd = release_fence.Release(); |
| 97 | return result; |
| 98 | } |
| 99 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 100 | int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) { |
| 101 | return write_buffer->write_buffer->GainAsync(); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 102 | } |
| 103 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 104 | void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; } |
Jiwen 'Steve' Cai | 2d82ceb | 2017-03-22 17:26:00 -0700 | [diff] [blame] | 105 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 106 | int dvrReadBufferGetId(DvrReadBuffer* read_buffer) { |
| 107 | return read_buffer->read_buffer->id(); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 108 | } |
| 109 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 110 | int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer, |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 111 | AHardwareBuffer** hardware_buffer) { |
Hendrik Wagenaar | a5d404d | 2017-04-18 22:03:09 -0700 | [diff] [blame^] | 112 | return ConvertToAHardwareBuffer( |
| 113 | read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 114 | } |
| 115 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 116 | int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd, |
| 117 | void* meta, size_t meta_size_bytes) { |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 118 | pdx::LocalHandle ready_fence; |
| 119 | int result = |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 120 | read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 121 | *ready_fence_fd = ready_fence.Release(); |
| 122 | return result; |
| 123 | } |
| 124 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 125 | int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) { |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 126 | pdx::LocalHandle fence(release_fence_fd); |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 127 | int result = read_buffer->read_buffer->Release(fence); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 128 | return result; |
| 129 | } |
| 130 | |
Hendrik Wagenaar | eaa5522 | 2017-04-06 10:56:23 -0700 | [diff] [blame] | 131 | int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) { |
| 132 | return read_buffer->read_buffer->ReleaseAsync(); |
| 133 | } |
| 134 | |
| 135 | void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; } |
| 136 | |
| 137 | int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer, |
| 138 | AHardwareBuffer** hardware_buffer) { |
Hendrik Wagenaar | a5d404d | 2017-04-18 22:03:09 -0700 | [diff] [blame^] | 139 | return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(), |
| 140 | hardware_buffer); |
Hendrik Wagenaar | 10e68eb | 2017-03-15 13:29:02 -0700 | [diff] [blame] | 141 | } |
| 142 | |
| 143 | } // extern "C" |