blob: 0942b3dbb4835b750911ccbb7b887df1d93a0498 [file] [log] [blame]
#include "include/dvr/dvr_buffer.h"
#include <private/dvr/buffer_hub_client.h>
#include <ui/GraphicBuffer.h>
using namespace android;
struct DvrWriteBuffer {
std::shared_ptr<dvr::BufferProducer> write_buffer;
};
struct DvrReadBuffer {
std::shared_ptr<dvr::BufferConsumer> read_buffer;
};
struct DvrBuffer {
std::shared_ptr<dvr::IonBuffer> buffer;
};
namespace android {
namespace dvr {
DvrWriteBuffer* CreateDvrWriteBufferFromBufferProducer(
const std::shared_ptr<dvr::BufferProducer>& buffer_producer) {
if (!buffer_producer)
return nullptr;
return new DvrWriteBuffer{std::move(buffer_producer)};
}
DvrReadBuffer* CreateDvrReadBufferFromBufferConsumer(
const std::shared_ptr<dvr::BufferConsumer>& buffer_consumer) {
if (!buffer_consumer)
return nullptr;
return new DvrReadBuffer{std::move(buffer_consumer)};
}
DvrBuffer* CreateDvrBufferFromIonBuffer(
const std::shared_ptr<IonBuffer>& ion_buffer) {
if (!ion_buffer)
return nullptr;
return new DvrBuffer{std::move(ion_buffer)};
}
} // namespace dvr
} // namespace android
namespace {
void InitializeGraphicBuffer(const dvr::BufferHubBuffer* buffer,
sp<GraphicBuffer>* graphic_buffer) {
*graphic_buffer = sp<GraphicBuffer>(new GraphicBuffer(
buffer->width(), buffer->height(), buffer->format(), 1, /* layer count */
buffer->usage(), buffer->stride(), buffer->native_handle(),
false /* keep ownership */));
}
} // anonymous namespace
extern "C" {
void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
delete write_buffer;
}
int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
return write_buffer->write_buffer->id();
}
int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
AHardwareBuffer** hardware_buffer) {
*hardware_buffer = reinterpret_cast<AHardwareBuffer*>(
write_buffer->write_buffer->buffer()->buffer().get());
return 0;
}
int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
const void* meta, size_t meta_size_bytes) {
pdx::LocalHandle fence(ready_fence_fd);
int result = write_buffer->write_buffer->Post(fence, meta, meta_size_bytes);
return result;
}
int dvrWriteBufferGain(DvrWriteBuffer* write_buffer, int* release_fence_fd) {
pdx::LocalHandle release_fence;
int result = write_buffer->write_buffer->Gain(&release_fence);
*release_fence_fd = release_fence.Release();
return result;
}
int dvrWriteBufferGainAsync(DvrWriteBuffer* write_buffer) {
return write_buffer->write_buffer->GainAsync();
}
void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) { delete read_buffer; }
int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
return read_buffer->read_buffer->id();
}
int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
AHardwareBuffer** hardware_buffer) {
*hardware_buffer = reinterpret_cast<AHardwareBuffer*>(
read_buffer->read_buffer->buffer()->buffer().get());
return 0;
}
int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
void* meta, size_t meta_size_bytes) {
pdx::LocalHandle ready_fence;
int result =
read_buffer->read_buffer->Acquire(&ready_fence, meta, meta_size_bytes);
*ready_fence_fd = ready_fence.Release();
return result;
}
int dvrReadBufferRelease(DvrReadBuffer* read_buffer, int release_fence_fd) {
pdx::LocalHandle fence(release_fence_fd);
int result = read_buffer->read_buffer->Release(fence);
return result;
}
int dvrReadBufferReleaseAsync(DvrReadBuffer* read_buffer) {
return read_buffer->read_buffer->ReleaseAsync();
}
void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
AHardwareBuffer** hardware_buffer) {
if (!hardware_buffer) {
return -EINVAL;
}
*hardware_buffer =
reinterpret_cast<AHardwareBuffer*>(buffer->buffer->buffer().get());
return 0;
}
} // extern "C"