You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
3.4 KiB
122 lines
3.4 KiB
#include "include/dvr/dvr_buffer.h"
|
|
|
|
#include <android/hardware_buffer.h>
|
|
#include <dvr/dvr_shared_buffers.h>
|
|
#include <private/dvr/consumer_buffer.h>
|
|
#include <private/dvr/producer_buffer.h>
|
|
#include <ui/GraphicBuffer.h>
|
|
|
|
#include "dvr_internal.h"
|
|
|
|
using namespace android;
|
|
|
|
namespace android {
|
|
namespace dvr {
|
|
|
|
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 {
|
|
|
|
int ConvertToAHardwareBuffer(GraphicBuffer* graphic_buffer,
|
|
AHardwareBuffer** hardware_buffer) {
|
|
if (!hardware_buffer || !graphic_buffer) {
|
|
return -EINVAL;
|
|
}
|
|
*hardware_buffer = reinterpret_cast<AHardwareBuffer*>(graphic_buffer);
|
|
AHardwareBuffer_acquire(*hardware_buffer);
|
|
return 0;
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
extern "C" {
|
|
|
|
void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer) {
|
|
if (write_buffer != nullptr) {
|
|
ALOGW_IF(
|
|
write_buffer->slot != -1,
|
|
"dvrWriteBufferDestroy: Destroying a buffer associated with a valid "
|
|
"buffer queue slot. This may indicate possible leaks, buffer_id=%d.",
|
|
dvrWriteBufferGetId(write_buffer));
|
|
delete write_buffer;
|
|
}
|
|
}
|
|
|
|
int dvrWriteBufferIsValid(DvrWriteBuffer* write_buffer) {
|
|
return write_buffer && write_buffer->write_buffer;
|
|
}
|
|
|
|
int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer) {
|
|
if (!write_buffer || !write_buffer->write_buffer)
|
|
return -EINVAL;
|
|
|
|
return write_buffer->write_buffer->id();
|
|
}
|
|
|
|
int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
|
|
AHardwareBuffer** hardware_buffer) {
|
|
if (!write_buffer || !write_buffer->write_buffer)
|
|
return -EINVAL;
|
|
|
|
return ConvertToAHardwareBuffer(
|
|
write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
|
|
}
|
|
|
|
void dvrReadBufferDestroy(DvrReadBuffer* read_buffer) {
|
|
if (read_buffer != nullptr) {
|
|
ALOGW_IF(
|
|
read_buffer->slot != -1,
|
|
"dvrReadBufferDestroy: Destroying a buffer associated with a valid "
|
|
"buffer queue slot. This may indicate possible leaks, buffer_id=%d.",
|
|
dvrReadBufferGetId(read_buffer));
|
|
delete read_buffer;
|
|
}
|
|
}
|
|
|
|
int dvrReadBufferIsValid(DvrReadBuffer* read_buffer) {
|
|
return read_buffer && read_buffer->read_buffer;
|
|
}
|
|
|
|
int dvrReadBufferGetId(DvrReadBuffer* read_buffer) {
|
|
if (!read_buffer || !read_buffer->read_buffer)
|
|
return -EINVAL;
|
|
|
|
return read_buffer->read_buffer->id();
|
|
}
|
|
|
|
int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
|
|
AHardwareBuffer** hardware_buffer) {
|
|
if (!read_buffer || !read_buffer->read_buffer)
|
|
return -EINVAL;
|
|
|
|
return ConvertToAHardwareBuffer(
|
|
read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
|
|
}
|
|
|
|
void dvrBufferDestroy(DvrBuffer* buffer) { delete buffer; }
|
|
|
|
int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
|
|
AHardwareBuffer** hardware_buffer) {
|
|
if (!buffer || !buffer->buffer || !hardware_buffer) {
|
|
return -EINVAL;
|
|
}
|
|
|
|
return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
|
|
hardware_buffer);
|
|
}
|
|
|
|
// Retrieve the shared buffer layout version defined in dvr_shared_buffers.h.
|
|
int dvrBufferGlobalLayoutVersionGet() {
|
|
return android::dvr::kSharedBufferLayoutVersion;
|
|
}
|
|
|
|
} // extern "C"
|