Camera: Fix passing video native handle for 64-bit app
Add new binder calls to pass video native handle so the video native
handle can be passed between 32-bit and 64-bit processes.
Remove problematic code that used IMemory to pass video native
handle because the sizes of VideoNativeMetadata are different in
32-bit and 64-bit processes.
Bug: 28403412
Change-Id: I3341b1812ecc41d61846bb72ca926ecb1674c9ec
diff --git a/camera/ICamera.cpp b/camera/ICamera.cpp
index 37b0a10..0680d7c 100644
--- a/camera/ICamera.cpp
+++ b/camera/ICamera.cpp
@@ -54,6 +54,7 @@
RELEASE_RECORDING_FRAME,
SET_VIDEO_BUFFER_MODE,
SET_VIDEO_BUFFER_TARGET,
+ RELEASE_RECORDING_FRAME_HANDLE,
};
class BpCamera: public BpInterface<ICamera>
@@ -155,21 +156,20 @@
data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
data.writeStrongBinder(IInterface::asBinder(mem));
- native_handle_t *nh = nullptr;
- if (CameraUtils::isNativeHandleMetadata(mem)) {
- VideoNativeHandleMetadata *metadata =
- (VideoNativeHandleMetadata*)(mem->pointer());
- nh = metadata->pHandle;
- data.writeNativeHandle(nh);
- }
-
remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);
+ }
- if (nh) {
- // Close the native handle because camera received a dup copy.
- native_handle_close(nh);
- native_handle_delete(nh);
- }
+ void releaseRecordingFrameHandle(native_handle_t *handle) {
+ ALOGV("releaseRecordingFrameHandle");
+ Parcel data, reply;
+ data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
+ data.writeNativeHandle(handle);
+
+ remote()->transact(RELEASE_RECORDING_FRAME_HANDLE, data, &reply);
+
+ // Close the native handle because camera received a dup copy.
+ native_handle_close(handle);
+ native_handle_delete(handle);
}
status_t setVideoBufferMode(int32_t videoBufferMode)
@@ -368,17 +368,16 @@
ALOGV("RELEASE_RECORDING_FRAME");
CHECK_INTERFACE(ICamera, data, reply);
sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder());
-
- if (CameraUtils::isNativeHandleMetadata(mem)) {
- VideoNativeHandleMetadata *metadata =
- (VideoNativeHandleMetadata*)(mem->pointer());
- metadata->pHandle = data.readNativeHandle();
- // releaseRecordingFrame will be responsble to close the native handle.
- }
-
releaseRecordingFrame(mem);
return NO_ERROR;
} break;
+ case RELEASE_RECORDING_FRAME_HANDLE: {
+ ALOGV("RELEASE_RECORDING_FRAME_HANDLE");
+ CHECK_INTERFACE(ICamera, data, reply);
+ // releaseRecordingFrameHandle will be responsble to close the native handle.
+ releaseRecordingFrameHandle(data.readNativeHandle());
+ return NO_ERROR;
+ } break;
case SET_VIDEO_BUFFER_MODE: {
ALOGV("SET_VIDEO_BUFFER_MODE");
CHECK_INTERFACE(ICamera, data, reply);