aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDemon000 <demonsingur@gmail.com>2017-10-05 06:55:29 +0300
committerdd3boh <dade.garberi@gmail.com>2017-10-31 12:34:43 +0100
commit52d8adf7ce684b0fa4e3af85799e983d1d3ae34c (patch)
tree0102599b4a0f92c24794e39e9edec49d435ac94b
parenta5a24347421901ca766d5e4aa173d327c6efd4c0 (diff)
CameraWrapper: close native handles
Android camera framework expects camera HAL to release native handles in case of video buffer. Old camera HALs don't release native handles internally, causing video recording to freeze after ~30s. This workaround is the equivalent of https://review.lineageos.org/#/c/165102/ Change-Id: Ie9e9abdede3dccada9e5002725a157f4960643e9
-rw-r--r--camera-wrapper/Android.mk2
-rw-r--r--camera-wrapper/CameraWrapper.cpp9
2 files changed, 10 insertions, 1 deletions
diff --git a/camera-wrapper/Android.mk b/camera-wrapper/Android.mk
index bf6dccf..f26719d 100644
--- a/camera-wrapper/Android.mk
+++ b/camera-wrapper/Android.mk
@@ -20,6 +20,7 @@ include $(CLEAR_VARS)
LOCAL_C_INCLUDES := \
framework/native/include \
+ frameworks/native/include/media/openmax \
system/media/camera/include
LOCAL_SRC_FILES := \
@@ -33,6 +34,7 @@ LOCAL_SHARED_LIBRARIES := \
libhidltransport \
libsensor \
libutils \
+ libcutils \
android.hidl.token@1.0-utils
LOCAL_STATIC_LIBRARIES := \
diff --git a/camera-wrapper/CameraWrapper.cpp b/camera-wrapper/CameraWrapper.cpp
index 8551d25..5bd67ce 100644
--- a/camera-wrapper/CameraWrapper.cpp
+++ b/camera-wrapper/CameraWrapper.cpp
@@ -25,7 +25,7 @@
#define LOG_TAG "CameraWrapper"
#include <cutils/log.h>
-
+#include <cutils/native_handle.h>
#include <utils/threads.h>
#include <utils/String8.h>
#include <sensor/SensorManager.h>
@@ -33,6 +33,7 @@
#include <hardware/camera.h>
#include <camera/Camera.h>
#include <camera/CameraParameters.h>
+#include <media/hardware/HardwareAPI.h> // For VideoNativeHandleMetadata
using namespace android;
@@ -292,10 +293,16 @@ static void camera_release_recording_frame(struct camera_device *device,
if (!device)
return;
+ VideoNativeHandleMetadata* md = (VideoNativeHandleMetadata*) opaque;
+ native_handle_t* nh = md->pHandle;
+
ALOGV("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device,
(uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
VENDOR_CALL(device, release_recording_frame, opaque);
+
+ native_handle_close(nh);
+ native_handle_delete(nh);
}
static int camera_auto_focus(struct camera_device *device)