stagefright: IOMX: pass native handle in sp<NativeHandle>
This clarifies ownership of the native handle
Bug: 28644266
Bug: 27856976
Change-Id: I7a617513d7ac93dd58d74af9469663418735aaf3
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index 61fba35..b1d38b6 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -25,6 +25,7 @@
#include <media/IOMX.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/openmax/OMX_IndexExt.h>
+#include <utils/NativeHandle.h>
namespace android {
@@ -465,7 +466,7 @@
virtual status_t allocateSecureBuffer(
node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer, void **buffer_data, native_handle_t **native_handle) {
+ buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) {
Parcel data, reply;
data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
data.writeInt32((int32_t)node);
@@ -484,7 +485,8 @@
*buffer = (buffer_id)reply.readInt32();
*buffer_data = (void *)reply.readInt64();
if (*buffer_data == NULL) {
- *native_handle = reply.readNativeHandle();
+ *native_handle = NativeHandle::create(
+ reply.readNativeHandle(), true /* ownsHandle */);
} else {
*native_handle = NULL;
}
@@ -1063,7 +1065,7 @@
buffer_id buffer;
void *buffer_data = NULL;
- native_handle_t *native_handle = NULL;
+ sp<NativeHandle> native_handle;
status_t err = allocateSecureBuffer(
node, port_index, size, &buffer, &buffer_data, &native_handle);
reply->writeInt32(err);
@@ -1072,7 +1074,7 @@
reply->writeInt32((int32_t)buffer);
reply->writeInt64((uintptr_t)buffer_data);
if (buffer_data == NULL) {
- reply->writeNativeHandle(native_handle);
+ reply->writeNativeHandle(native_handle == NULL ? NULL : native_handle->handle());
}
}
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index b2b0879..9fa57c8 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -867,7 +867,7 @@
mem.clear();
void *ptr = NULL;
- native_handle_t *native_handle = NULL;
+ sp<NativeHandle> native_handle;
err = mOMX->allocateSecureBuffer(
mNode, portIndex, bufSize, &info.mBufferID,
&ptr, &native_handle);
@@ -880,8 +880,11 @@
// TRICKY2: use native handle as the base of the ABuffer if received one,
// because Widevine source only receives these base addresses.
- info.mData = new ABuffer(ptr != NULL ? ptr : (void *)native_handle, bufSize);
- info.mNativeHandle = NativeHandle::create(native_handle, true /* ownsHandle */);
+ const native_handle_t *native_handle_ptr =
+ native_handle == NULL ? NULL : native_handle->handle();
+ info.mData = new ABuffer(
+ ptr != NULL ? ptr : (void *)native_handle_ptr, bufSize);
+ info.mNativeHandle = native_handle;
info.mCodecData = info.mData;
} else if (mQuirks & requiresAllocateBufferBit) {
err = mOMX->allocateBufferWithBackup(
diff --git a/media/libstagefright/OMXClient.cpp b/media/libstagefright/OMXClient.cpp
index a523d0e..22f0a16 100644
--- a/media/libstagefright/OMXClient.cpp
+++ b/media/libstagefright/OMXClient.cpp
@@ -127,7 +127,7 @@
virtual status_t allocateSecureBuffer(
node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer, void **buffer_data, native_handle_t **native_handle);
+ buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle);
virtual status_t allocateBufferWithBackup(
node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms,
@@ -415,7 +415,7 @@
status_t MuxOMX::allocateSecureBuffer(
node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer, void **buffer_data, native_handle_t **native_handle) {
+ buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) {
return getOMX(node)->allocateSecureBuffer(
node, port_index, size, buffer, buffer_data, native_handle);
}
diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h
index 9726741..c06dc6b 100644
--- a/media/libstagefright/include/OMX.h
+++ b/media/libstagefright/include/OMX.h
@@ -111,7 +111,7 @@
virtual status_t allocateSecureBuffer(
node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer, void **buffer_data, native_handle_t **native_handle);
+ buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle);
virtual status_t allocateBufferWithBackup(
node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms,
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h
index 25c3773..4e6ce38 100644
--- a/media/libstagefright/include/OMXNodeInstance.h
+++ b/media/libstagefright/include/OMXNodeInstance.h
@@ -98,7 +98,7 @@
status_t allocateSecureBuffer(
OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
- void **buffer_data, native_handle_t **native_handle);
+ void **buffer_data, sp<NativeHandle> *native_handle);
status_t allocateBufferWithBackup(
OMX_U32 portIndex, const sp<IMemory> ¶ms,
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 4d89ba1..13a9306 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -533,7 +533,7 @@
status_t OMX::allocateSecureBuffer(
node_id node, OMX_U32 port_index, size_t size,
- buffer_id *buffer, void **buffer_data, native_handle_t **native_handle) {
+ buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) {
OMXNodeInstance *instance = findInstance(node);
if (instance == NULL) {
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 6b7a871..00d2e27 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -36,8 +36,8 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/MediaErrors.h>
-
#include <utils/misc.h>
+#include <utils/NativeHandle.h>
static const OMX_U32 kPortIndexInput = 0;
static const OMX_U32 kPortIndexOutput = 1;
@@ -1009,7 +1009,7 @@
status_t OMXNodeInstance::allocateSecureBuffer(
OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer,
- void **buffer_data, native_handle_t **native_handle) {
+ void **buffer_data, sp<NativeHandle> *native_handle) {
if (buffer == NULL || buffer_data == NULL || native_handle == NULL) {
ALOGE("b/25884056");
return BAD_VALUE;
@@ -1039,7 +1039,8 @@
*buffer = makeBufferID(header);
if (mSecureBufferType[portIndex] == kSecureBufferTypeNativeHandle) {
*buffer_data = NULL;
- *native_handle = (native_handle_t *)header->pBuffer;
+ *native_handle = NativeHandle::create(
+ (native_handle_t *)header->pBuffer, false /* ownsHandle */);
} else {
*buffer_data = header->pBuffer;
*native_handle = NULL;
@@ -1052,7 +1053,8 @@
bufferSource->addCodecBuffer(header);
}
CLOG_BUFFER(allocateSecureBuffer, NEW_BUFFER_FMT(
- *buffer, portIndex, "%zu@%p:%p", size, *buffer_data, *native_handle));
+ *buffer, portIndex, "%zu@%p:%p", size, *buffer_data,
+ *native_handle == NULL ? NULL : (*native_handle)->handle()));
return OK;
}