1bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#include "include/dvr/dvr_buffer.h"
2bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai
3a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar#include <android/hardware_buffer.h>
410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar#include <private/dvr/buffer_hub_client.h>
510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar#include <ui/GraphicBuffer.h>
610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
72251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka#include "dvr_internal.h"
810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
92251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakausing namespace android;
1010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
1110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarnamespace android {
1210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarnamespace dvr {
1310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
14eaa5522feac452703a0836310047d4b15702487dHendrik WagenaarDvrBuffer* CreateDvrBufferFromIonBuffer(
15eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    const std::shared_ptr<IonBuffer>& ion_buffer) {
16eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  if (!ion_buffer)
17eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar    return nullptr;
18eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  return new DvrBuffer{std::move(ion_buffer)};
1910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
2010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
2110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}  // namespace dvr
2210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}  // namespace android
2310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
2410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarnamespace {
2510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
26a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaarint ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer,
27a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar                             AHardwareBuffer** hardware_buffer) {
28a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  if (!hardware_buffer || !graphic_buffer) {
29a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar    return -EINVAL;
30a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  }
31a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(graphic_buffer);
32a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  AHardwareBuffer_acquire(*hardware_buffer);
33a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  return 0;
34a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar}
35a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar
3610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}  // anonymous namespace
3710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
3810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaarextern "C" {
3910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
402251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrWriteBufferCreateEmpty(DvrWriteBuffer** write_buffer) {
412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (write_buffer)
422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    *write_buffer = new DvrWriteBuffer;
432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
442251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
45eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarvoid dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
46eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  delete write_buffer;
47eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar}
4810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
492251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) {
502251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return write_buffer && write_buffer->write_buffer;
512251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrWriteBufferClear(DvrWriteBuffer* write_buffer) {
542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!write_buffer)
552251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
562251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
572251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  write_buffer->write_buffer = nullptr;
582251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
592251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
602251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
61eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!write_buffer || !write_buffer->write_buffer)
632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
642251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
65eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  return write_buffer->write_buffer->id();
6610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
6710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
68eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
6910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar                                     AHardwareBuffer** hardware_buffer) {
702251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!write_buffer || !write_buffer->write_buffer)
712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
73a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  return ConvertToAHardwareBuffer(
74a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar      write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
7510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
7610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
77eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
7810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar                       const void* meta, size_t meta_size_bytes) {
792251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!write_buffer || !write_buffer->write_buffer)
802251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
8210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  pdx::LocalHandle fence(ready_fence_fd);
83eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
8410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  return result;
8510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
8610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
87eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
882251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!write_buffer || !write_buffer->write_buffer || !release_fence_fd)
892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
9110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  pdx::LocalHandle release_fence;
92eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  int result = write_buffer->write_buffer->Gain(&release_fence);
9310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  *release_fence_fd = release_fence.Release();
9410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  return result;
9510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
9610e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
97eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!write_buffer || !write_buffer->write_buffer)
992251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1002251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
101eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  return write_buffer->write_buffer->GainAsync();
10210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
10310e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
1042251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakavoid dvrReadBufferCreateEmpty(DvrReadBuffer** read_buffer) {
1052251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (read_buffer)
1062251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    *read_buffer = new DvrReadBuffer;
1072251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1082251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
109eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarvoid dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; }
1102d82ceb8dc1bc9066bd5ad98ee0926289cb0b7ccJiwen 'Steve' Cai
1112251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrReadBufferIsValid(DvrReadBuffer* read_buffer) {
1122251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return read_buffer && read_buffer->read_buffer;
1132251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1142251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1152251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabakaint dvrReadBufferClear(DvrReadBuffer* read_buffer) {
1162251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!read_buffer)
1172251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1182251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
1192251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  read_buffer->read_buffer = nullptr;
1202251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  return 0;
1212251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka}
1222251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
123eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
1242251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!read_buffer || !read_buffer->read_buffer)
1252251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1262251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
127eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  return read_buffer->read_buffer->id();
12810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
12910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
130eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
13110e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar                                    AHardwareBuffer** hardware_buffer) {
1322251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!read_buffer || !read_buffer->read_buffer)
1332251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1342251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
135a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  return ConvertToAHardwareBuffer(
136a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar      read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
13710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
13810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
139eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
140eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar                         void* meta, size_t meta_size_bytes) {
1412251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!read_buffer || !read_buffer->read_buffer)
1422251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1432251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
14410e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  pdx::LocalHandle ready_fence;
14510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  int result =
146eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar      read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
14710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  *ready_fence_fd = ready_fence.Release();
14810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  return result;
14910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
15010e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
151eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
1522251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!read_buffer || !read_buffer->read_buffer)
1532251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1542251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
15510e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  pdx::LocalHandle fence(release_fence_fd);
156eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  int result = read_buffer->read_buffer->Release(fence);
15710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar  return result;
15810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
15910e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
160eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
1612251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!read_buffer || !read_buffer->read_buffer)
1622251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1632251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
164eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar  return read_buffer->read_buffer->ReleaseAsync();
165eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar}
166eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar
167eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarvoid dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
168eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar
169eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
170eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar                                AHardwareBuffer** hardware_buffer) {
1712251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!buffer || !buffer->buffer || !hardware_buffer) {
1722251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return -EINVAL;
1732251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  }
1742251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
175a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar  return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
176a5d404d8d4f6bb4efa95eaf6d857bc03224606fbHendrik Wagenaar                                  hardware_buffer);
17710e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}
17810e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar
17928b58bfdcce253358120d1554755d71c2226f8fdJohn Batesconst struct native_handle* dvrWriteBufferGetNativeHandle(
18028b58bfdcce253358120d1554755d71c2226f8fdJohn Bates    DvrWriteBuffer* write_buffer) {
1812251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!write_buffer || !write_buffer->write_buffer)
1822251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return nullptr;
1832251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
18428b58bfdcce253358120d1554755d71c2226f8fdJohn Bates  return write_buffer->write_buffer->native_handle();
18528b58bfdcce253358120d1554755d71c2226f8fdJohn Bates}
18628b58bfdcce253358120d1554755d71c2226f8fdJohn Bates
18728b58bfdcce253358120d1554755d71c2226f8fdJohn Batesconst struct native_handle* dvrReadBufferGetNativeHandle(
18828b58bfdcce253358120d1554755d71c2226f8fdJohn Bates    DvrReadBuffer* read_buffer) {
1892251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!read_buffer || !read_buffer->read_buffer)
1902251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return nullptr;
1912251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
19228b58bfdcce253358120d1554755d71c2226f8fdJohn Bates  return read_buffer->read_buffer->native_handle();
19328b58bfdcce253358120d1554755d71c2226f8fdJohn Bates}
19428b58bfdcce253358120d1554755d71c2226f8fdJohn Bates
19528b58bfdcce253358120d1554755d71c2226f8fdJohn Batesconst struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer) {
1962251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka  if (!buffer || !buffer->buffer)
1972251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka    return nullptr;
1982251d822dac2a96aad4184a6fdc2690f0a58af7cCorey Tabaka
19928b58bfdcce253358120d1554755d71c2226f8fdJohn Bates  return buffer->buffer->handle();
20028b58bfdcce253358120d1554755d71c2226f8fdJohn Bates}
20128b58bfdcce253358120d1554755d71c2226f8fdJohn Bates
20210e68eb8aa4db8b6f8cfbf2c3754e2677d7bf848Hendrik Wagenaar}  // extern "C"
203