Merge "DVRBuffer functions should acquire AHardwareBuffer" into oc-dev
diff --git a/libs/vr/libdvr/dvr_buffer.cpp b/libs/vr/libdvr/dvr_buffer.cpp
index e7fdb91..28820e7 100644
--- a/libs/vr/libdvr/dvr_buffer.cpp
+++ b/libs/vr/libdvr/dvr_buffer.cpp
@@ -1,5 +1,6 @@
#include "include/dvr/dvr_buffer.h"
+#include <android/hardware_buffer.h>
#include <private/dvr/buffer_hub_client.h>
#include <ui/GraphicBuffer.h>
@@ -54,6 +55,16 @@
false /* keep ownership */));
}
+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" {
@@ -68,9 +79,8 @@
int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
AHardwareBuffer** hardware_buffer) {
- *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(
- write_buffer->write_buffer->buffer()->buffer().get());
- return 0;
+ return ConvertToAHardwareBuffer(
+ write_buffer->write_buffer->buffer()->buffer().get(), hardware_buffer);
}
int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
@@ -99,9 +109,8 @@
int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
AHardwareBuffer** hardware_buffer) {
- *hardware_buffer = reinterpret_cast<AHardwareBuffer*>(
- read_buffer->read_buffer->buffer()->buffer().get());
- return 0;
+ return ConvertToAHardwareBuffer(
+ read_buffer->read_buffer->buffer()->buffer().get(), hardware_buffer);
}
int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
@@ -127,13 +136,8 @@
int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
AHardwareBuffer** hardware_buffer) {
- if (!hardware_buffer) {
- return -EINVAL;
- }
-
- *hardware_buffer =
- reinterpret_cast<AHardwareBuffer*>(buffer->buffer->buffer().get());
- return 0;
+ return ConvertToAHardwareBuffer(buffer->buffer->buffer().get(),
+ hardware_buffer);
}
const struct native_handle* dvrWriteBufferGetNativeHandle(
diff --git a/libs/vr/libdvr/include/dvr/dvr_buffer.h b/libs/vr/libdvr/include/dvr/dvr_buffer.h
index b2cf0d7..3e8357c 100644
--- a/libs/vr/libdvr/include/dvr/dvr_buffer.h
+++ b/libs/vr/libdvr/include/dvr/dvr_buffer.h
@@ -18,6 +18,7 @@
// Write buffer
void dvrWriteBufferDestroy(DvrWriteBuffer* write_buffer);
int dvrWriteBufferGetId(DvrWriteBuffer* write_buffer);
+// Caller must call AHardwareBuffer_release on hardware_buffer.
int dvrWriteBufferGetAHardwareBuffer(DvrWriteBuffer* write_buffer,
AHardwareBuffer** hardware_buffer);
int dvrWriteBufferPost(DvrWriteBuffer* write_buffer, int ready_fence_fd,
@@ -30,6 +31,7 @@
// Read buffer
void dvrReadBufferDestroy(DvrReadBuffer* read_buffer);
int dvrReadBufferGetId(DvrReadBuffer* read_buffer);
+// Caller must call AHardwareBuffer_release on hardware_buffer.
int dvrReadBufferGetAHardwareBuffer(DvrReadBuffer* read_buffer,
AHardwareBuffer** hardware_buffer);
int dvrReadBufferAcquire(DvrReadBuffer* read_buffer, int* ready_fence_fd,
@@ -41,6 +43,7 @@
// Buffer
void dvrBufferDestroy(DvrBuffer* buffer);
+// Caller must call AHardwareBuffer_release on hardware_buffer.
int dvrBufferGetAHardwareBuffer(DvrBuffer* buffer,
AHardwareBuffer** hardware_buffer);
const struct native_handle* dvrBufferGetNativeHandle(DvrBuffer* buffer);
diff --git a/libs/vr/libdvr/tests/dvr_named_buffer-test.cpp b/libs/vr/libdvr/tests/dvr_named_buffer-test.cpp
index 52531a9..2866f47 100644
--- a/libs/vr/libdvr/tests/dvr_named_buffer-test.cpp
+++ b/libs/vr/libdvr/tests/dvr_named_buffer-test.cpp
@@ -42,11 +42,12 @@
AHardwareBuffer* hardware_buffer1 = nullptr;
int e1 = dvrBufferGetAHardwareBuffer(buffer1, &hardware_buffer1);
ASSERT_EQ(0, e1);
+ ASSERT_NE(nullptr, hardware_buffer1);
AHardwareBuffer* hardware_buffer2 = nullptr;
int e2 = dvrBufferGetAHardwareBuffer(buffer2, &hardware_buffer2);
ASSERT_EQ(0, e2);
- ASSERT_NE(nullptr, hardware_buffer1);
+ ASSERT_NE(nullptr, hardware_buffer2);
AHardwareBuffer_Desc desc1 = {};
AHardwareBuffer_describe(hardware_buffer1, &desc1);
@@ -88,6 +89,10 @@
ASSERT_EQ(desc3.usage1, 0u);
dvrBufferDestroy(buffer3);
+
+ AHardwareBuffer_release(hardware_buffer1);
+ AHardwareBuffer_release(hardware_buffer2);
+ AHardwareBuffer_release(hardware_buffer3);
}
TEST_F(DvrNamedBufferTest, TestMultipleNamedBuffers) {
@@ -141,6 +146,7 @@
ASSERT_EQ(desc.usage0, AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE);
dvrBufferDestroy(setup_buffer);
+ AHardwareBuffer_release(hardware_buffer);
}