diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e0dd85..52a83be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,7 @@ set(BUILD_CATEGORY "ALL" CACHE STRING "Build Category") set(TOP_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) include_directories(${TOP_DIRECTORY}/include) +include_directories(${TOP_DIRECTORY}/common/memory) # Check whether MMM color format header is present. include(CheckIncludeFile) @@ -79,6 +80,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DLE_CAMERA") endif() include_directories(${TOP_DIRECTORY}/include) +include_directories(${TOP_DIRECTORY}/common/memory) # === Common libs === if (NOT HAVE_BINDER_H) diff --git a/common/camera-meta/qmmf_camera_metadata.cpp b/common/camera-meta/qmmf_camera_metadata.cpp index d7270d9..9ab1285 100644 --- a/common/camera-meta/qmmf_camera_metadata.cpp +++ b/common/camera-meta/qmmf_camera_metadata.cpp @@ -108,7 +108,8 @@ void CameraMetadata_libCameraMetadataClose() __attribute__ ((destructor (101))); void CameraMetadata_libCameraMetadataOpen() { if (NULL == CameraMetadata::libcamera_metadata_handle) { std::string lib_name = - Target::GetLibName(std::string(kCameraMetaDataLibName), "1"); + Target::GetLibName(std::string(kCameraMetaDataLibName), + std::string(kCameraMetaDataLibVersion)); CameraMetadata::libcamera_metadata_handle = dlopen(lib_name.c_str(), RTLD_LAZY); diff --git a/common/camera-meta/qmmf_vendor_tag_descriptor.cpp b/common/camera-meta/qmmf_vendor_tag_descriptor.cpp index b14f857..c320c1d 100644 --- a/common/camera-meta/qmmf_vendor_tag_descriptor.cpp +++ b/common/camera-meta/qmmf_vendor_tag_descriptor.cpp @@ -73,7 +73,8 @@ void VendorTagDescriptor_libCameraMetadataClose() __attribute__ ((destructor (10 void VendorTagDescriptor_libCameraMetadataOpen() { if (NULL == VendorTagDescriptor::libcamera_metadata_handle) { std::string lib_name = - Target::GetLibName(std::string(kCameraMetaDataLibName), "1"); + Target::GetLibName(std::string(kCameraMetaDataLibName), + std::string(kCameraMetaDataLibVersion)); VendorTagDescriptor::libcamera_metadata_handle = dlopen(lib_name.c_str(), RTLD_LAZY); diff --git a/common/cameraadaptor/CMakeLists.txt b/common/cameraadaptor/CMakeLists.txt index e2f7532..c51de73 100644 --- a/common/cameraadaptor/CMakeLists.txt +++ b/common/cameraadaptor/CMakeLists.txt @@ -2,10 +2,15 @@ project(qmmf_camera_adaptor_${PLATFORM} VERSION 1.0) find_package(PkgConfig REQUIRED) +if (NOT HAVE_BINDER_H) pkg_check_modules(QMMF_PROTO REQUIRED qmmf_proto) +endif() +if (NOT HAVE_ANDROID_UTILS) pkg_check_modules(QMMF_CONFIG REQUIRED qmmf_config) +endif() + pkg_check_modules(QMMF_UTILS REQUIRED qmmf_utils) diff --git a/common/cameraadaptor/gtest/qmmf_camera_adaptor_gtest.cc b/common/cameraadaptor/gtest/qmmf_camera_adaptor_gtest.cc index 9253957..69b1962 100644 --- a/common/cameraadaptor/gtest/qmmf_camera_adaptor_gtest.cc +++ b/common/cameraadaptor/gtest/qmmf_camera_adaptor_gtest.cc @@ -369,6 +369,7 @@ int32_t Camera3Gtest::StartSreaming(MemAllocFlags usage, uint32_t width, } memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = width; @@ -659,6 +660,7 @@ TEST_F(Camera3Gtest, Video1080pManualExposure) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -787,6 +789,7 @@ TEST_F(Camera3Gtest, Video1080pSceneControl) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -870,6 +873,7 @@ TEST_F(Camera3Gtest, Video1080pEVcontrol) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -959,6 +963,7 @@ TEST_F(Camera3Gtest, Video1080pExposureModes) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -1038,6 +1043,7 @@ TEST_F(Camera3Gtest, Video1080pExposureMeteringModes) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -1119,6 +1125,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshotHDR) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -1132,6 +1139,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshotHDR) { previewRequest.streamIds.push_back(previewStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 3; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = 4000; @@ -1208,6 +1216,7 @@ TEST_F(Camera3Gtest, ZSLStream12Mp) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 4; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 4000; @@ -1265,6 +1274,7 @@ TEST_F(Camera3Gtest, FlushZSL) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 4; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 4000; @@ -1310,6 +1320,7 @@ TEST_F(Camera3Gtest, Preview1080pSnapshot12Mp) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -1322,6 +1333,7 @@ TEST_F(Camera3Gtest, Preview1080pSnapshot12Mp) { previewRequest.streamIds.push_back(previewStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = 4000; @@ -1390,6 +1402,7 @@ TEST_F(Camera3Gtest, UpdateExposureDuringPreviewVGA) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 640; @@ -1457,7 +1470,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshot4kSaturation) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); - + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -1471,6 +1484,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshot4kSaturation) { videoRequest.streamIds.push_back(videoStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = 3840; @@ -1546,7 +1560,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshot4kISO) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); - + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -1560,6 +1574,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshot4kISO) { videoRequest.streamIds.push_back(videoStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = 3840; @@ -1649,7 +1664,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshot4kWNR) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); - + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -1663,6 +1678,7 @@ TEST_F(Camera3Gtest, Video1080pSnapshot4kWNR) { videoRequest.streamIds.push_back(videoStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = 3840; @@ -1743,6 +1759,7 @@ TEST_F(Camera3Gtest, Video4KLiveSnapshot4K) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 3840; @@ -1756,6 +1773,7 @@ TEST_F(Camera3Gtest, Video4KLiveSnapshot4K) { videoRequest.streamIds.push_back(videoStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = 3840; @@ -1815,6 +1833,7 @@ TEST_F(Camera3Gtest, Video4KPlus180pLiveSnapshot4KYUVPreview1080p) { // 4K video stream memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 3840; @@ -1850,6 +1869,7 @@ TEST_F(Camera3Gtest, Video4KPlus180pLiveSnapshot4KYUVPreview1080p) { // 4K YUV snapshot memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 3840; @@ -1939,6 +1959,7 @@ TEST_F(Camera3Gtest, Video1080pAFR) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2013,6 +2034,7 @@ TEST_F(Camera3Gtest, Video1080pSharpness) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2059,6 +2081,7 @@ TEST_F(Camera3Gtest, Video1080pSharpness) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2121,6 +2144,7 @@ TEST_F(Camera3Gtest, Video1080pZoom) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2186,6 +2210,7 @@ TEST_F(Camera3Gtest, Video1080pThreeStreams) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2246,6 +2271,7 @@ TEST_F(Camera3Gtest, ThreeVideo1080Plus180pPreview1080pLiveSnapshot4KYUV) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2288,6 +2314,7 @@ TEST_F(Camera3Gtest, ThreeVideo1080Plus180pPreview1080pLiveSnapshot4KYUV) { // 4K YUV snapshot memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 3840; @@ -2356,6 +2383,7 @@ TEST_F(Camera3Gtest, DynamicDeleteVideo1080p) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2434,6 +2462,7 @@ TEST_F(Camera3Gtest, DynamicReconfigureVideo1080p) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 1920; @@ -2539,6 +2568,7 @@ TEST_F(Camera3Gtest, InvalidRequest) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -2573,6 +2603,7 @@ TEST_F(Camera3Gtest, PrepareTeardownPreview) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -2667,6 +2698,7 @@ TEST_F(Camera3Gtest, HFRVideo1080p60FPS) { ASSERT_EQ(0, ret); memset(&stream_params, 0, sizeof(stream_params)); + stream_params.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; stream_params.bufferCount = HFR_BUFFER_COUNT; stream_params.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; stream_params.width = stream_width; @@ -2779,6 +2811,7 @@ TEST_F(Camera3Gtest, HFRVideo720p120FPS) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = HFR_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = streamWidth; @@ -2851,6 +2884,7 @@ TEST_F(Camera3Gtest, ReprocessYUVToYUV) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -2863,6 +2897,7 @@ TEST_F(Camera3Gtest, ReprocessYUVToYUV) { previewRequest.streamIds.push_back(previewStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = yuvSize[0]; @@ -2889,6 +2924,7 @@ TEST_F(Camera3Gtest, ReprocessYUVToYUV) { reprocessRequest.streamIds.push_back(inputStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_YCbCr_420_888; streamParams.width = yuvSize[0]; @@ -2973,6 +3009,7 @@ TEST_F(Camera3Gtest, ReprocessRAWToYUV1080p) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -2985,6 +3022,7 @@ TEST_F(Camera3Gtest, ReprocessRAWToYUV1080p) { previewRequest.streamIds.push_back(previewStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_RAW10; streamParams.width = rawSize[0]; @@ -3011,6 +3049,7 @@ TEST_F(Camera3Gtest, ReprocessRAWToYUV1080p) { reprocessRequest.streamIds.push_back(inputStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_YCbCr_420_888; streamParams.width = 1920; @@ -3097,6 +3136,7 @@ TEST_F(Camera3Gtest, ReprocessZSL12MpToYUV4K) { ASSERT_EQ(0, ret); memset(&stream_params, 0, sizeof(stream_params)); + stream_params.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; stream_params.bufferCount = STREAM_BUFFER_COUNT; stream_params.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; stream_params.width = zsl_width; @@ -3124,6 +3164,7 @@ TEST_F(Camera3Gtest, ReprocessZSL12MpToYUV4K) { reprocess_request.streamIds.push_back(input_stream_id); memset(&stream_params, 0, sizeof(stream_params)); + stream_params.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; stream_params.bufferCount = 1; stream_params.format = HAL_PIXEL_FORMAT_YCbCr_420_888; stream_params.width = yuv_width; @@ -3210,6 +3251,7 @@ TEST_F(Camera3Gtest, RAW16Bit) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -3222,6 +3264,7 @@ TEST_F(Camera3Gtest, RAW16Bit) { previewRequest.streamIds.push_back(previewStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_RAW16; streamParams.width = rawSize[0]; @@ -3284,6 +3327,7 @@ TEST_F(Camera3Gtest, SnapshotBurstBracketing) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -3296,6 +3340,7 @@ TEST_F(Camera3Gtest, SnapshotBurstBracketing) { previewRequest.streamIds.push_back(previewStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = PREVIEW_WIDTH; @@ -3380,6 +3425,7 @@ TEST_F(Camera3Gtest, SnapshotAndRAW16Bit) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; @@ -3392,6 +3438,7 @@ TEST_F(Camera3Gtest, SnapshotAndRAW16Bit) { previewRequest.streamIds.push_back(previewStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_RAW16; streamParams.width = rawSize[0]; @@ -3404,6 +3451,7 @@ TEST_F(Camera3Gtest, SnapshotAndRAW16Bit) { rawRequest.streamIds.push_back(rawStreamId); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = 1; streamParams.format = HAL_PIXEL_FORMAT_BLOB; streamParams.width = PREVIEW_WIDTH; @@ -3465,6 +3513,7 @@ TEST_F(Camera3Gtest, ExposureLockVGA) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 640; @@ -3531,6 +3580,7 @@ TEST_F(Camera3Gtest, AwbLockVGA) { ASSERT_EQ(0, ret); memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = 640; diff --git a/common/cameraadaptor/gtest/qmmf_dual_camera_adaptor_gtest.cc b/common/cameraadaptor/gtest/qmmf_dual_camera_adaptor_gtest.cc index 848acf9..0e334be 100644 --- a/common/cameraadaptor/gtest/qmmf_dual_camera_adaptor_gtest.cc +++ b/common/cameraadaptor/gtest/qmmf_dual_camera_adaptor_gtest.cc @@ -195,6 +195,7 @@ int32_t DualCamera3Gtest::StartStreaming(CameraContext &ctx, uint32_t width, } memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = BUFFER_COUNT; streamParams.format = format; streamParams.width = width; diff --git a/common/cameraadaptor/qmmf_camera3_device_client.cc b/common/cameraadaptor/qmmf_camera3_device_client.cc index 05324e7..87d6eec 100644 --- a/common/cameraadaptor/qmmf_camera3_device_client.cc +++ b/common/cameraadaptor/qmmf_camera3_device_client.cc @@ -137,6 +137,7 @@ Camera3DeviceClient::Camera3DeviceClient(CameraClientCallbacks clientCb) vendor_tag_ops_{}, is_camera_device_available_ (true), cam_opmode_ (0), + enableProviderExtension_(false), session_metadata_ (CameraMetadata(128, 128)) { QMMF_GET_LOG_LEVEL(); camera3_callback_ops::notify = ¬ifyFromHal; @@ -319,6 +320,30 @@ int32_t Camera3DeviceClient::OpenCamera(uint32_t idx) { goto exit; } + // check the status of EnableProviderExtension + { + uint32_t tag_enable = 0; + QMMF_DEBUG("%s: Enter EnableProviderExtension", __func__); + std::shared_ptr vTags = + VendorTagDescriptor::getGlobalVendorTagDescriptor(); + + if (vTags.get() != NULL) { + CameraMetadata::getTagFromName( + "org.quic.camera.extensionProvider.EnableProviderExtension", + vTags.get(), &tag_enable); + + if (tag_enable > 0) { + camera_metadata_entry_t entry = device_info_.find(tag_enable); + if (entry.count > 0) { + enableProviderExtension_ = entry.data.u8[0]; + QMMF_DEBUG("%s: EnableProviderExtension = %d", + __func__, enableProviderExtension_); + } + } + } + QMMF_DEBUG("%s: Exit EnableProviderExtension", __func__); + } + { camera_metadata_entry partialResultsCount = device_info_.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT); @@ -1582,7 +1607,7 @@ void Camera3DeviceClient::SendCaptureResult( // pickframe node will be held on EISv3 module for several seconds at most // so frame sequence passed by camx will be out of order, - if (!CAM_OPMODE_IS_FRAMESELECTION(cam_opmode_)) { + if (!CAM_OPMODE_IS_FRAMESELECTION(cam_opmode_) && !enableProviderExtension_) { if (resultExtras.input) { if (frameNumber < next_result_input_frame_number_) { SET_ERR( @@ -2383,9 +2408,15 @@ void Camera3DeviceClient::deviceStatusChange( if (new_status == CAMERA_DEVICE_STATUS_NOT_PRESENT) { ctx->UpdateCameraStatus(false); QMMF_WARN ("%s: Camera with id (%d) is not present", __func__, camera_id); + if (nullptr != ctx->client_cb_.deviceStatusCb) { + ctx->client_cb_.deviceStatusCb(camera_id, false); + } } else if (new_status == CAMERA_DEVICE_STATUS_PRESENT) { ctx->UpdateCameraStatus(true); QMMF_DEBUG ("%s: Camera with id (%d) is present", __func__, camera_id); + if (nullptr != ctx->client_cb_.deviceStatusCb) { + ctx->client_cb_.deviceStatusCb(camera_id, true); + } } } diff --git a/common/cameraadaptor/qmmf_camera3_device_client.h b/common/cameraadaptor/qmmf_camera3_device_client.h index 3ae2472..4f22520 100644 --- a/common/cameraadaptor/qmmf_camera3_device_client.h +++ b/common/cameraadaptor/qmmf_camera3_device_client.h @@ -302,6 +302,7 @@ class Camera3DeviceClient : public ICameraDeviceClient, bool is_hfr_supported_; bool is_raw_only_; bool hfr_mode_enabled_; + bool enableProviderExtension_; int8_t super_frames_; uint32_t cam_feature_flags_; uint32_t fps_sensormode_index_; diff --git a/common/cameraadaptor/qmmf_camera3_smooth_zoom.cc b/common/cameraadaptor/qmmf_camera3_smooth_zoom.cc index 4461c3f..2330e67 100644 --- a/common/cameraadaptor/qmmf_camera3_smooth_zoom.cc +++ b/common/cameraadaptor/qmmf_camera3_smooth_zoom.cc @@ -37,11 +37,7 @@ #include #include -#ifdef HAVE_ANDROID_UTILS -#include -#else #include "common/config/qmmf_config.h" -#endif #include #include #include "recorder/src/service/qmmf_recorder_common.h" diff --git a/common/cameraadaptor/qmmf_camera3_stream.cc b/common/cameraadaptor/qmmf_camera3_stream.cc index 4794ee9..3755271 100644 --- a/common/cameraadaptor/qmmf_camera3_stream.cc +++ b/common/cameraadaptor/qmmf_camera3_stream.cc @@ -1116,7 +1116,9 @@ int32_t Camera3Stream::GetBufferLocked(camera3_stream_buffer *streamBuffer) { Colorimetry colorimetry = Colorimetry::kBT601; #if defined(CAMX_ANDROID_API) && (CAMX_ANDROID_API >= 31) - if (hdrmode_ == 0) { + if (hdrmode_ == ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD && + data_space_ == HAL_DATASPACE_UNKNOWN && + color_space_ == -1) { colorimetry = Colorimetry::kBT601; } else if (hdrmode_ == ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HLG10) { colorimetry = Colorimetry::kBT2100HLGFULL; diff --git a/common/cameraadaptor/qmmf_camera3_utils.cc b/common/cameraadaptor/qmmf_camera3_utils.cc index dcdaaac..18612a6 100644 --- a/common/cameraadaptor/qmmf_camera3_utils.cc +++ b/common/cameraadaptor/qmmf_camera3_utils.cc @@ -87,7 +87,8 @@ CameraModule::CameraModule() : status_(-1) {} int32_t CameraModule::LoadHwGetModule(HwGetModuleFn *out_fn) { std::string lib_name = - Target::GetLibName(std::string(kCameraHardwareLibName), "1"); + Target::GetLibName(std::string(kCameraHardwareLibName), + std::string(kCameraHardwareLibVersion)); handle_ = dlopen(lib_name.c_str(), RTLD_NOW); if (!handle_) { diff --git a/common/cameraadaptor/qmmf_camera3_utils.h b/common/cameraadaptor/qmmf_camera3_utils.h index 13e9398..7a3a0a9 100644 --- a/common/cameraadaptor/qmmf_camera3_utils.h +++ b/common/cameraadaptor/qmmf_camera3_utils.h @@ -74,7 +74,13 @@ namespace qmmf { +#ifdef HAVE_ANDROID_UTILS +inline const char* kCameraHardwareLibName = "libhardware"; +inline const char* kCameraHardwareLibVersion = "0"; +#else inline const char* kCameraHardwareLibName = "libcamx_hardware"; +inline const char* kCameraHardwareLibVersion = "1"; +#endif using HwGetModuleFn = int (*)(const char* id, const struct hw_module_t** module_out); namespace cameraadaptor { diff --git a/common/cameraadaptor/test/camera_factory_test.cc b/common/cameraadaptor/test/camera_factory_test.cc index 5000c92..b5f55a6 100644 --- a/common/cameraadaptor/test/camera_factory_test.cc +++ b/common/cameraadaptor/test/camera_factory_test.cc @@ -124,6 +124,7 @@ int32_t Camera::PowerOn() { } memset(&streamParams, 0, sizeof(streamParams)); + streamParams.hdrmode = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; streamParams.bufferCount = STREAM_BUFFER_COUNT; streamParams.format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; streamParams.width = PREVIEW_WIDTH; diff --git a/common/config/qmmf_config.h b/common/config/qmmf_config.h index 4933247..066bcd8 100644 --- a/common/config/qmmf_config.h +++ b/common/config/qmmf_config.h @@ -35,12 +35,20 @@ class Property { template static T Get(std::string property, T default_value) { T value = default_value; +#ifdef HAVE_ANDROID_UTILS + char prop_val[PROPERTY_VALUE_MAX]; +#else char prop_val[QMMF_PROP_VAL_MAX]; +#endif std::stringstream s; s << default_value; +#ifdef HAVE_ANDROID_UTILS + property_get(property.c_str(), prop_val, s.str().c_str()); +#else qmmf_property_get(property.c_str(), prop_val, s.str().c_str()); +#endif std::stringstream output(prop_val); output >> value; @@ -60,6 +68,10 @@ class Property { std::stringstream s; s << value; +#ifdef HAVE_ANDROID_UTILS + property_set(property.c_str(), s.str().c_str()); +#else qmmf_property_set(property.c_str(), s.str().c_str()); +#endif } }; diff --git a/common/memory/CMakeLists.txt b/common/memory/CMakeLists.txt index 227191d..4571e3b 100644 --- a/common/memory/CMakeLists.txt +++ b/common/memory/CMakeLists.txt @@ -4,10 +4,12 @@ find_package(PkgConfig REQUIRED) pkg_check_modules(QMMF_CAMERA_METADATA REQUIRED qmmf_camera_metadata) -pkg_check_modules(QMMF_PROTO - REQUIRED qmmf_proto) pkg_check_modules(QMMF_UTILS REQUIRED qmmf_utils) +if (NOT HAVE_ANDROID_UTILS) +pkg_check_modules(QMMF_CONFIG + REQUIRED qmmf_config) +endif() if (NOT MEMORY_ENABLED) set(exclude EXCLUDE_FROM_ALL) @@ -37,10 +39,10 @@ qmmf_memory_interface.cc qmmf_gralloc_interface.cc) endif() -add_dependencies(qmmf_memory_interface_${PLATFORM} - qmmf_utils - qmmf_config -) +add_dependencies(qmmf_memory_interface_${PLATFORM} qmmf_utils) +if (NOT HAVE_ANDROID_UTILS) +add_dependencies(qmmf_memory_interface_${PLATFORM} qmmf_config) +endif() target_include_directories(qmmf_memory_interface_${PLATFORM} PRIVATE ${TOP_DIRECTORY} diff --git a/common/memory/qmmf_gbm_interface.h b/common/memory/qmmf_gbm_interface.h index 8cccec0..107841e 100644 --- a/common/memory/qmmf_gbm_interface.h +++ b/common/memory/qmmf_gbm_interface.h @@ -101,9 +101,12 @@ class GBMDevice : public IAllocDevice { gbm_device* GetDevice() const; MemAllocError AllocBuffer(IBufferHandle& handle, int32_t width, - int32_t height, int32_t format, - MemAllocFlags usage, uint32_t* stride, - uint32_t colorimetry) override; +#ifdef HAVE_BINDER + int32_t height, int32_t format, +#else + int32_t height, int32_t format, int32_t override_format, +#endif // HAVE_BINDER + MemAllocFlags usage, uint32_t *stride, uint32_t colorimetry) override; MemAllocError ImportBuffer(IBufferHandle& handle, void* buffer_handle, int fd) override; diff --git a/common/utils/qmmf_common_utils_defs.h b/common/utils/qmmf_common_utils_defs.h index 405f067..5cef3a2 100644 --- a/common/utils/qmmf_common_utils_defs.h +++ b/common/utils/qmmf_common_utils_defs.h @@ -51,7 +51,14 @@ namespace qmmf { const int64_t kWaitDelay = 2000000000; // 2 sec const uint32_t kMaxSocketBufSize = 300000; +#ifdef HAVE_ANDROID_UTILS +inline const char* kCameraMetaDataLibName = "libcamera_metadata"; +inline const char* kCameraMetaDataLibVersion = "0"; +#else inline const char* kCameraMetaDataLibName = "libcamx_metadata"; +inline const char* kCameraMetaDataLibVersion = "1"; +#endif + #define FORCE_SENSOR_MODE_MASK (0x00F00000) #define FORCE_SENSOR_MODE_DATA(idx) ((idx + 1) << 20) @@ -108,7 +115,10 @@ enum class SocId { kHAMOA = 709, kHAMOA_10CORE = 710, kPURWA = 711, - kGLYMUR_KALAMBO = 719 + kGLYMUR_KALAMBO = 719, + kSHIKRA_CQM = 756, + kSHIKRA_CQS = 758, + kSHIKRA_IQS = 759 }; struct StreamBuffer { @@ -225,9 +235,9 @@ struct CameraStreamParameters { height(0), format(-1), data_space(0x0), - color_space(0), + color_space(-1), usecase(0), - hdrmode(0), + hdrmode(0x01), rotation(0), allocFlags(), bufferCount(0), @@ -306,6 +316,8 @@ typedef std::function ResultCallback; // Notifies about all sorts of system messages that can happen during camera // operation typedef std::function SystemCallback; +// Notifies about camera device status changes (present/not present) +typedef std::function DeviceStatusCallback; // Please note that these callbacks shouldn't get blocked for long durations. // Also very important is to not to try and call "Camera3DeviceClient" API @@ -318,6 +330,7 @@ typedef struct { PreparedCallback peparedCb; ResultCallback resultCb; SystemCallback systemCb; + DeviceStatusCallback deviceStatusCb; } CameraClientCallbacks; // Please note that this callbacks need to return as fast as possible @@ -466,6 +479,12 @@ class Target { case SocId::kGLYMUR_MAHUA: case SocId::kGLYMUR_KALAMBO: return "glymur"; + + case SocId::kSHIKRA_CQM: + case SocId::kSHIKRA_CQS: + case SocId::kSHIKRA_IQS: + return "shikra"; + default: return {}; } diff --git a/common/utils/qmmf_extra_param.cc b/common/utils/qmmf_extra_param.cc index 88b19d4..48aa349 100644 --- a/common/utils/qmmf_extra_param.cc +++ b/common/utils/qmmf_extra_param.cc @@ -37,11 +37,7 @@ #include "qmmf-sdk/qmmf_recorder_extra_param.h" -#ifdef HAVE_ANDROID_UTILS -#include -#else #include -#endif namespace qmmf { diff --git a/common/utils/qmmf_log.h b/common/utils/qmmf_log.h index 23610ca..ce6d68c 100644 --- a/common/utils/qmmf_log.h +++ b/common/utils/qmmf_log.h @@ -75,11 +75,14 @@ int qmmf_property_set(const char *key, const char *value); #ifdef HAVE_ANDROID_UTILS #define QMMF_GET_LOG_LEVEL() \ ({ \ - char prop[QMMF_PROP_VAL_MAX]; \ + char prop[PROPERTY_VALUE_MAX]; \ property_get("persist.qmmf.sdk.log.level", prop, "0"); \ qmmf_log_level = atoi(prop); \ }) +#define QMMF_INFO(fmt, args...) ALOGI(fmt, ##args) +#define QMMF_WARN(fmt, args...) ALOGW(fmt, ##args) +#define QMMF_ERROR(fmt, args...) ALOGE(fmt, ##args) #define QMMF_DEBUG(fmt, args...) ALOGD_IF((qmmf_log_level > 0), fmt, ##args) #define QMMF_VERBOSE(fmt, args...) ALOGV_IF((qmmf_log_level > 1), fmt, ##args) #else diff --git a/config/common/CMakeLists.txt b/config/common/CMakeLists.txt index ba988e0..91defdd 100644 --- a/config/common/CMakeLists.txt +++ b/config/common/CMakeLists.txt @@ -22,10 +22,6 @@ set(COMMON_CXX_FLAGS "${COMMON_CXX_FLAGS} -DUSE_FPS_IDX") set(COMMON_CXX_FLAGS "${COMMON_CXX_FLAGS} -DDISABLE_RESCALER_COLORSPACE") -set(JPEG_LIB chiofflinepostproclib.so.0) - -set(COMMON_CXX_FLAGS "${COMMON_CXX_FLAGS} -DJPEG_POSTPROC_LIB=\"\\\"${JPEG_LIB}\\\"\"") - set(COMMON_CXX_FLAGS "${COMMON_CXX_FLAGS} -DEIS_MODES_ENABLE") set(COMMON_CXX_FLAGS "${COMMON_CXX_FLAGS} -DVHDR_MODES_ENABLE") diff --git a/config/pebble/CMakeLists.txt b/config/pebble/CMakeLists.txt new file mode 100644 index 0000000..9e13b45 --- /dev/null +++ b/config/pebble/CMakeLists.txt @@ -0,0 +1,82 @@ +cmake_minimum_required(VERSION 3.1) + +project(config-pebble) + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DTARGET_ION_ABI_VERSION=2") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DFLUSH_RESTART_NOTAVAILABLE") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DTARGET_USES_GBM") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DDISABLE_OP_MODES") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DQCAMERA3_TAG_LOCAL_COPY") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DCAM_ARCH_V2") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DJPEG_BLOB_OFFSET=0") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DHFR_THRESHOLD=120") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DUSE_FPS_IDX") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DDISABLE_RESCALER_COLORSPACE") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DCAMERA_HAL_API_VERSION=0x0307") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DCAMERA_METADATA_1_0_NS") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DENABLE_IMAGE_NV12") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DCAMX_ANDROID_API=34") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DLOGICAL_CAMERA_SENSOR_SWITCH") + +set(TARGET_USES_GBM "1" PARENT_SCOPE) + +set(TARGET_USES_DMABUF "1" PARENT_SCOPE) + +set(DISABLE_RESCALER_COLORSPACE "1" PARENT_SCOPE) + +set(CAMERA_CLIENT_DISABLED "1" PARENT_SCOPE) + +if(BUILD_CATEGORY STREQUAL "BASE" OR BUILD_CATEGORY STREQUAL "ALL") + +set(CAMERAADAPTOR_ENABLED "1" PARENT_SCOPE) +set(QMMF_UTILS_ENABLED "1" PARENT_SCOPE) +set(RESIZER_FASTCV_ENABLED "0" PARENT_SCOPE) +set(RESIZER_NEON_ENABLED "0" PARENT_SCOPE) +set(MEMORY_ENABLED "1" PARENT_SCOPE) + +endif() + +if(BUILD_CATEGORY STREQUAL "RECORDER" OR BUILD_CATEGORY STREQUAL "ALL") + +set(RECORDER_CLIENT_ENABLED "1" PARENT_SCOPE) +set(RECORDER_SERVICE_ENABLED "1" PARENT_SCOPE) + +endif() + +if(BUILD_CATEGORY STREQUAL "SERVER" OR BUILD_CATEGORY STREQUAL "ALL") + +set(QMMF_SERVER_ENABLED "1" PARENT_SCOPE) + +endif() + +if(BUILD_CATEGORY STREQUAL "TESTS" OR BUILD_CATEGORY STREQUAL "ALL") + +set(RECORDER_GTEST_ENABLED "1" PARENT_SCOPE) +set(CAMERAADAPTOR_GTEST_ENABLED "1" PARENT_SCOPE) + +endif() + +if (HAVE_CHI_OFFLINE_POST_PROC_INTF_H) + +set(JPEG_LIB /usr/lib/camera/components/com.qti.offline.jpeg.so) +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DJPEG_POSTPROC_LIB=\"\\\"${JPEG_LIB}\\\"\"") +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DENABLE_OFFLINE_JPEG") +set(ENABLE_OFFLINE_JPEG "1" PARENT_SCOPE) + +endif() + +set(PLATFORM_CXX_FLAGS ${PLATFORM_CXX_FLAGS} PARENT_SCOPE) diff --git a/config/qcm6490/CMakeLists.txt b/config/qcm6490/CMakeLists.txt index 1ede293..8d07379 100644 --- a/config/qcm6490/CMakeLists.txt +++ b/config/qcm6490/CMakeLists.txt @@ -2,4 +2,12 @@ project(config-qcm6490) set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DCAMERA_HAL_API_VERSION=0x0306") +set(JPEG_LIB libcamxchiofflinepostproclib_kodiak.so.1) + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DJPEG_POSTPROC_LIB=\"\\\"${JPEG_LIB}\\\"\"") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DENABLE_OFFLINE_JPEG") + +set(ENABLE_OFFLINE_JPEG "1" PARENT_SCOPE) + set(PLATFORM_CXX_FLAGS ${PLATFORM_CXX_FLAGS} PARENT_SCOPE) diff --git a/config/qcs6490/CMakeLists.txt b/config/qcs6490/CMakeLists.txt index bd1f606..4cb6999 100644 --- a/config/qcs6490/CMakeLists.txt +++ b/config/qcs6490/CMakeLists.txt @@ -2,4 +2,12 @@ project(config-qcs6490) set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DCAMERA_HAL_API_VERSION=0x0305") +set(JPEG_LIB libcamxchiofflinepostproclib_kodiak.so.1) + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DJPEG_POSTPROC_LIB=\"\\\"${JPEG_LIB}\\\"\"") + +set(PLATFORM_CXX_FLAGS "${PLATFORM_CXX_FLAGS} -DENABLE_OFFLINE_JPEG") + +set(ENABLE_OFFLINE_JPEG "1" PARENT_SCOPE) + set(PLATFORM_CXX_FLAGS ${PLATFORM_CXX_FLAGS} PARENT_SCOPE) diff --git a/qmmf-server/CMakeLists.txt b/qmmf-server/CMakeLists.txt index ccbc1af..2e88b61 100644 --- a/qmmf-server/CMakeLists.txt +++ b/qmmf-server/CMakeLists.txt @@ -2,8 +2,10 @@ project(qti-cam-server) find_package(PkgConfig REQUIRED) +if (NOT HAVE_ANDROID_UTILS) pkg_check_modules(QMMF_CONFIG REQUIRED qmmf_config) +endif() if (NOT QMMF_SERVER_ENABLED) set(exclude EXCLUDE_FROM_ALL) @@ -23,7 +25,7 @@ configure_file( add_executable(qti-cam-server ${exclude} qmmf_server_main.cc) if (HAVE_BINDER_H) -add_dependencies(qti-cam-server qmmf_recorder_service) +add_dependencies(qti-cam-server qmmf_recorder_service_${TARGET_BOARD_PLATFORM}) else() add_dependencies(qti-cam-server qmmf_proto qmmf_config) endif() @@ -44,6 +46,10 @@ install(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/check-camx-overlay.sh DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/qmmf-server) +install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/service/99-camera.rules + DESTINATION ${CMAKE_INSTALL_LIBDIR}/udev/rules.d/) + if(HAVE_ANDROID_UTILS) target_link_libraries(qti-cam-server log cutils utils binder) else() @@ -51,6 +57,10 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99 -lpthread -lrt -lm -lglib-2.0 -ldl target_link_libraries(qti-cam-server ${QMMF_CONFIG_LIBRARIES}) endif() +if(HAVE_BINDER_H) +target_link_libraries(qti-cam-server qmmf_recorder_service_${TARGET_BOARD_PLATFORM}) +endif() + if (QMMF_SERVER_ENABLED) if (CAM_SERVER_ENABLED) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qti-cam-server-base.service @@ -67,6 +77,8 @@ if (QMMF_SERVER_ENABLED) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/service/qmmf-server-cam-arch-v2-usrgrp.service DESTINATION ${QMMF_SYSTEMD_DIR} RENAME qti-cam-server.service) elseif (TARGET_BOARD_PLATFORM STREQUAL "kalama") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/service/qmmf-server-cam-arch-v2-usrgrp.service DESTINATION ${QMMF_SYSTEMD_DIR} RENAME qti-cam-server.service) + elseif (TARGET_BOARD_PLATFORM STREQUAL "pebble") + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/service/qmmf-server-cam-arch-v2-usrgrp.service DESTINATION ${QMMF_SYSTEMD_DIR} RENAME qti-cam-server.service) elseif (TARGET_BOARD_PLATFORM STREQUAL "pineapple") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/service/qmmf-server-cam-arch-v2-usrgrp.service DESTINATION ${QMMF_SYSTEMD_DIR} RENAME qti-cam-server.service) elseif (TARGET_BOARD_PLATFORM STREQUAL "qcm2290-mtp") diff --git a/qmmf-server/qmmf_server_main.cc b/qmmf-server/qmmf_server_main.cc index 4ff327c..cf388b5 100644 --- a/qmmf-server/qmmf_server_main.cc +++ b/qmmf-server/qmmf_server_main.cc @@ -53,6 +53,9 @@ #include "common/utils/qmmf_log.h" #include "common/utils/qmmf_common_utils_defs.h" +#ifdef HAVE_BINDER +#include "recorder/src/service/qmmf_recorder_service.h" +#endif /** * Property to indicate completion of QMMF services initialization. diff --git a/qmmf-server/service/99-camera.rules b/qmmf-server/service/99-camera.rules new file mode 100644 index 0000000..9f8cbfc --- /dev/null +++ b/qmmf-server/service/99-camera.rules @@ -0,0 +1 @@ +SUBSYSTEM=="video4linux", KERNEL=="video*", ACTION=="add", DRIVERS=="cam_req_mgr", TAG+="systemd", ENV{SYSTEMD_WANTS}="qti-cam-server.service" diff --git a/qmmf-server/service/qti-cam-server-base.service.in b/qmmf-server/service/qti-cam-server-base.service.in index 5ecd8eb..afa836e 100644 --- a/qmmf-server/service/qti-cam-server-base.service.in +++ b/qmmf-server/service/qti-cam-server-base.service.in @@ -39,13 +39,10 @@ After=var-volatile-lib.service User=@CAM_SERVER_USER@ Group=@CAM_SERVER_GROUP@ SupplementaryGroups=@CAM_SERVER_SUPP_GROUP@ -Restart=always +Restart=on-failure RuntimeDirectory=cam_server RuntimeDirectoryMode=0775 RuntimeDirectoryPreserve=yes CacheDirectory=camera ExecCondition=/usr/libexec/qmmf-server/check-camx-overlay.sh ExecStart=/usr/bin/qti-cam-server - -[Install] -WantedBy=multi-user.target diff --git a/recorder/src/client/CMakeLists.txt b/recorder/src/client/CMakeLists.txt index ef13f99..050bf85 100644 --- a/recorder/src/client/CMakeLists.txt +++ b/recorder/src/client/CMakeLists.txt @@ -2,10 +2,15 @@ project(qmmf_recorder_client VERSION 1.0) find_package(PkgConfig) +if (NOT HAVE_BINDER_H) pkg_check_modules(QMMF_PROTO REQUIRED qmmf_proto) +endif() +if (NOT HAVE_ANDROID_UTILS) pkg_check_modules(QMMF_CONFIG REQUIRED qmmf_config) +endif() + pkg_check_modules(QMMF_UTILS REQUIRED qmmf_utils) @@ -29,11 +34,13 @@ ${CMAKE_CURRENT_SOURCE_DIR}/qmmf_recorder.cc ${CMAKE_CURRENT_SOURCE_DIR}/qmmf_recorder_client.cc ) -add_dependencies(qmmf_recorder_client - qmmf_proto - qmmf_utils - qmmf_config -) +add_dependencies(qmmf_recorder_client qmmf_utils) +if (NOT HAVE_BINDER_H) +add_dependencies(qmmf_recorder_client qmmf_proto) +endif() +if (NOT HAVE_ANDROID_UTILS) +add_dependencies(qmmf_recorder_client qmmf_config) +endif() pkg_check_modules(GBM gbm) @@ -44,9 +51,8 @@ if(GBM_FOUND AND USE_LIBGBM) ) target_link_libraries(qmmf_recorder_client - PRIVATE - ${CMAKE_DL_LIBS} - gbm + ${CMAKE_DL_LIBS} + gbm ) endif() diff --git a/recorder/src/client/qmmf_recorder_client.cc b/recorder/src/client/qmmf_recorder_client.cc index e832dc8..f798253 100644 --- a/recorder/src/client/qmmf_recorder_client.cc +++ b/recorder/src/client/qmmf_recorder_client.cc @@ -1188,7 +1188,12 @@ RecorderClient::RecorderClient() } assert(gbm_fd_ >= 0); - std::string libname = "libgbm.so." + std::string(GBM_VER); +#ifdef HAVE_ANDROID_UTILS + std::string libname = "libgbm.so"; +#else + std::string libname = "libgbm.so. " + std::string(GBM_VER); +#endif + libgbm_handle_ = dlopen(libname.c_str(), RTLD_LAZY); char* err = dlerror(); @@ -1337,6 +1342,7 @@ status_t RecorderClient::Connect(const RecorderCb& cb) { track_cb_list_.clear(); #ifndef CAMERA_HAL1_SUPPORT +#ifdef ENABLE_OFFLINE_JPEG if (vendor_tag_desc_ == nullptr) { vendor_tag_desc_ = std::make_shared(); ret = GetVendorTagDescriptor(vendor_tag_desc_); @@ -1354,6 +1360,7 @@ status_t RecorderClient::Connect(const RecorderCb& cb) { return ret; } } +#endif #endif QMMF_DEBUG("%s Exit ", __func__); @@ -1779,6 +1786,23 @@ status_t RecorderClient::CancelCaptureImage(const uint32_t camera_id, if(0 != ret) { QMMF_ERROR("%s CancelCaptureImage failed!", __func__); } + + { + std::lock_guard l(snapshot_buffers_lock_); + if (snapshot_buffers_.size() != 0) { + for (auto& pair : snapshot_buffers_) { + auto& buffer_info = pair.second; + + QMMF_INFO("%s Snapshot BufInfo: ion_fd(%d), vaddr(%p), size(%lu)", + __func__, buffer_info.ion_fd, buffer_info.vaddr, + buffer_info.size); + + UnmapBuffer(buffer_info); + } + snapshot_buffers_.clear(); + } + } + QMMF_DEBUG("%s Exit ", __func__); return ret; } diff --git a/recorder/src/client/qmmf_recorder_client.h b/recorder/src/client/qmmf_recorder_client.h index e24d006..e4e5f7c 100644 --- a/recorder/src/client/qmmf_recorder_client.h +++ b/recorder/src/client/qmmf_recorder_client.h @@ -47,6 +47,7 @@ #ifdef USE_LIBGBM #include #include +#include "common/memory/qmmf_memory_interface.h" #endif // USE_LIBGBM #include "common/utils/qmmf_common_utils_defs.h" diff --git a/recorder/src/service/CMakeLists.txt b/recorder/src/service/CMakeLists.txt index 98a5bad..b015ce4 100644 --- a/recorder/src/service/CMakeLists.txt +++ b/recorder/src/service/CMakeLists.txt @@ -1,6 +1,15 @@ project(qmmf_recorder_service_${PLATFORM} VERSION 1.0) find_package(PkgConfig REQUIRED) + +if (NOT HAVE_BINDER_H) +pkg_check_modules(QMMF_PROTO + REQUIRED qmmf_proto) +endif() +if (NOT HAVE_ANDROID_UTILS) +pkg_check_modules(QMMF_CONFIG + REQUIRED qmmf_config) +endif() include(CheckCXXSourceCompiles) # Check whether ANDROID_REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR is supported @@ -32,10 +41,6 @@ check_cxx_source_compiles("${SRC_MAX_RES_CONFIG}" HAS_ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_MAXIMUM_RESOLUTION) -pkg_check_modules(QMMF_PROTO - REQUIRED qmmf_proto) -pkg_check_modules(QMMF_CONFIG - REQUIRED qmmf_config) pkg_check_modules(QMMF_UTILS REQUIRED qmmf_utils) @@ -76,10 +81,14 @@ if (NOT CAMERA_HAL1_SUPPORT) add_dependencies( qmmf_recorder_service_${PLATFORM} qmmf_camera_adaptor_${PLATFORM} - qmmf_proto - qmmf_config qmmf_utils ) +if (NOT HAVE_BINDER_H) +add_dependencies(qmmf_recorder_service_${PLATFORM} qmmf_proto) +endif() +if (NOT HAVE_ANDROID_UTILS) +add_dependencies(qmmf_recorder_service_${PLATFORM} qmmf_config) +endif() if (RESIZER_C2D_ENABLED) add_dependencies( qmmf_recorder_service_${PLATFORM} @@ -177,6 +186,10 @@ target_link_libraries(qmmf_recorder_service_${PLATFORM} dl log utils cutils bind endif() # TODO remove this hack when camx issue with propagating c and cpp glags is solved +if(HAVE_BINDER_H) +target_link_libraries(qmmf_recorder_service_${PLATFORM} qmmf_recorder_client) +endif() + if(HAVE_ANDROID_UTILS) target_link_libraries(qmmf_recorder_service_${PLATFORM} ion qmmf_camera_metadata) else() diff --git a/recorder/src/service/qmmf_camera_context.cc b/recorder/src/service/qmmf_camera_context.cc index 5ce9799..cc5e94d 100644 --- a/recorder/src/service/qmmf_camera_context.cc +++ b/recorder/src/service/qmmf_camera_context.cc @@ -47,9 +47,7 @@ #include #endif -#ifndef HAVE_BINDER #include "common/config/qmmf_config.h" -#endif // HAVE_BINDER #include "recorder/src/service/qmmf_camera_context.h" #include "recorder/src/service/qmmf_recorder_utils.h" @@ -88,7 +86,7 @@ float CameraContext::kHFRBatchModeThreshold = 90.0f; float CameraContext::kHFRBatchModeThreshold = 120.0f; #endif -CameraContext::CameraContext() +CameraContext::CameraContext(const DeviceStatusCb &devstatuscb) : camera_id_(-1), streaming_request_id_(-1), capture_request_id_(-1), @@ -97,6 +95,7 @@ CameraContext::CameraContext() result_cb_(nullptr), error_cb_(nullptr), system_cb_(nullptr), + device_status_cb_(devstatuscb), zsl_port_id_(0x100), hfr_supported_(false), batch_stream_id_(-1), @@ -132,6 +131,8 @@ CameraContext::CameraContext() { CameraResultCb(result); }; camera_callbacks_.systemCb = [&] (uint32_t errcode) { CameraSystemCb(errcode); }; + camera_callbacks_.deviceStatusCb = [&] (int camera_id, bool is_present) + { CameraDeviceStatusCb(camera_id, is_present); }; camera_device_ = std::make_shared(camera_callbacks_); if (!camera_device_) { @@ -1245,8 +1246,9 @@ status_t CameraContext::ConfigImageCapture(const uint32_t image_id, // Image color space hdrmode && data_space setting switch (param.colorimetry) { case Colorimetry::kBT601: - stream_param.hdrmode = 0; - stream_param.color_space = 0; + stream_param.hdrmode = + ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; + stream_param.color_space = -1; break; case Colorimetry::kBT2100HLGFULL: stream_param.hdrmode = @@ -2155,16 +2157,8 @@ status_t CameraContext::ReturnImageCaptureBuffer(const uint32_t camera_id, StreamBuffer buffer = snapshot_buffer_list_.find(buffer_id)->second; assert(buffer.fd == buffer_id); - - if (snapshot_buffer_stream_list_.find(buffer_id) == - snapshot_buffer_stream_list_.end()) { - QMMF_ERROR("%s: buffer_id(%u) is not valid!!", __func__, buffer_id); - return -EINVAL; - } - int32_t stream_id = snapshot_buffer_stream_list_.find(buffer_id)->second; - QMMF_DEBUG("%s: stream_id(%d):stream_buffer(0x%p):ion_fd(%d)" - " returned back!", __func__, stream_id, buffer.handle, buffer_id); + " returned back!", __func__, buffer.stream_id, buffer.handle, buffer_id); status_t ret = 0; ret = camera_device_->ReturnStreamBuffer(buffer); @@ -2173,7 +2167,6 @@ status_t CameraContext::ReturnImageCaptureBuffer(const uint32_t camera_id, assert(ret == 0); snapshot_buffer_list_.erase(buffer_id); - snapshot_buffer_stream_list_.erase(buffer_id); snapshot_buffer_lock_.unlock(); QMMF_DEBUG("%s: Exit", __func__); @@ -3242,7 +3235,6 @@ void CameraContext::SnapshotCaptureCallback(StreamBuffer &buffer) { snapshot_buffer_lock_.lock(); snapshot_buffer_list_.insert(std::make_pair(buffer.fd, buffer)); - snapshot_buffer_stream_list_.insert(std::make_pair(buffer.fd, buffer.stream_id)); snapshot_buffer_lock_.unlock(); assert(client_snapshot_cb_ != nullptr); @@ -3752,6 +3744,14 @@ std::shared_ptr CameraContext::GetPort(const uint32_t& track_id) { return port; } +void CameraContext::CameraDeviceStatusCb(int camera_id, bool is_present) { + QMMF_INFO("%s: Camera: %d, Status: %s", __func__, camera_id, + is_present ? "Present" : "Not Present"); + if (device_status_cb_) { + device_status_cb_(camera_id, is_present); + } +} + void CameraContext::OnFrameAvailable(StreamBuffer& buffer) { QMMF_DEBUG("%s: StreamBuffer(0x%p) fd: %d stream_id: %d ts: %ld", @@ -3975,7 +3975,8 @@ status_t CameraPort::Init() { #if defined(CAMX_ANDROID_API) && (CAMX_ANDROID_API >= 31) if (params_.colorimetry == Colorimetry::kBT601) { - cam_stream_params_.hdrmode = 0; + cam_stream_params_.hdrmode = + ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD; cam_stream_params_.data_space = HAL_DATASPACE_UNKNOWN; } else { switch (params_.colorimetry) { diff --git a/recorder/src/service/qmmf_camera_context.h b/recorder/src/service/qmmf_camera_context.h index 8297f40..3febc53 100644 --- a/recorder/src/service/qmmf_camera_context.h +++ b/recorder/src/service/qmmf_camera_context.h @@ -82,7 +82,7 @@ struct AECData { // to camera device stream. class CameraContext : public CameraInterface { public: - CameraContext(); + CameraContext(const DeviceStatusCb &devstatuscb = nullptr); ~CameraContext(); @@ -261,6 +261,7 @@ class CameraContext : public CameraInterface { void CameraResultCb(const CaptureResult &result); void CameraSystemCb(uint32_t errcode); + void CameraDeviceStatusCb(int camera_id, bool is_present); uint32_t GetROICountTag () { return multi_roi_count_tag_; } @@ -360,6 +361,8 @@ class CameraContext : public CameraInterface { ResultCb result_cb_; ErrorCb error_cb_; SystemCb system_cb_; + DeviceStatusCb device_status_cb_; + std::vector supported_fps_; uint32_t zsl_port_id_; uint32_t reproc_port_id_; @@ -378,7 +381,6 @@ class CameraContext : public CameraInterface { std::vector hfr_batch_modes_list_; std::vector streaming_active_requests_; - std::map snapshot_buffer_stream_list_; int32_t batch_stream_id_; std::mutex pending_frames_lock_; diff --git a/recorder/src/service/qmmf_camera_frc.cc b/recorder/src/service/qmmf_camera_frc.cc index 2dcc231..d0b4c41 100644 --- a/recorder/src/service/qmmf_camera_frc.cc +++ b/recorder/src/service/qmmf_camera_frc.cc @@ -40,12 +40,7 @@ #include #include -#ifdef HAVE_ANDROID_UTILS -#include -#else #include "common/config/qmmf_config.h" -#endif - #include "common/utils/qmmf_log.h" namespace qmmf { diff --git a/recorder/src/service/qmmf_camera_rescaler.cc b/recorder/src/service/qmmf_camera_rescaler.cc index 0c418c0..dfb8fe1 100644 --- a/recorder/src/service/qmmf_camera_rescaler.cc +++ b/recorder/src/service/qmmf_camera_rescaler.cc @@ -44,9 +44,7 @@ #include "recorder/src/service/qmmf_camera_rescaler.h" #include "recorder/src/service/qmmf_recorder_utils.h" -#ifndef HAVE_BINDER #include "common/config/qmmf_config.h" -#endif #include "common/resizer-neon/qmmf_resizer_neon.h" #include "common/resizer-c2d/qmmf_resizer_c2d.h" #ifndef CAMERA_HAL1_SUPPORT diff --git a/recorder/src/service/qmmf_camera_source.cc b/recorder/src/service/qmmf_camera_source.cc index 6b3dc50..fcbdcfa 100644 --- a/recorder/src/service/qmmf_camera_source.cc +++ b/recorder/src/service/qmmf_camera_source.cc @@ -49,6 +49,7 @@ #include "recorder/src/service/qmmf_camera_source.h" #include "recorder/src/service/qmmf_recorder_common.h" #include "recorder/src/service/qmmf_recorder_utils.h" +#include "common/config/qmmf_config.h" #ifndef JPEG_BLOB_OFFSET #define JPEG_BLOB_OFFSET (1) @@ -91,9 +92,11 @@ CameraSource::CameraSource() QMMF_KPI_DETAIL(); QMMF_INFO("%s: Enter", __func__); - +#ifdef HAVE_BINDER + int32_t n_preload = Property::Get("persist.qmmf.preload.cameras", 0); +#else int32_t n_preload = Property::Get("persist.qmmf.preload.cameras", 1); - +#endif // Preload camera interefaces. for (int32_t idx = 0; idx < n_preload; ++idx) { std::shared_ptr camera; @@ -121,7 +124,8 @@ status_t CameraSource::StartCamera(const uint32_t camera_id, const CameraExtraParam& extra_param, const ResultCb &cb, const ErrorCb &errcb, - const SystemCb &syscb) { + const SystemCb &syscb, + const DeviceStatusCb &devicestatus) { QMMF_INFO("%s: Camera Id(%u) to open!", __func__, camera_id); QMMF_KPI_DETAIL(); @@ -131,7 +135,7 @@ status_t CameraSource::StartCamera(const uint32_t camera_id, camera = preloaded_cameras_.front(); preloaded_cameras_.pop_front(); } else { - camera = std::make_shared(); + camera = std::make_shared(devicestatus); } if (!camera) { diff --git a/recorder/src/service/qmmf_camera_source.h b/recorder/src/service/qmmf_camera_source.h index 89c44af..a58fbc7 100644 --- a/recorder/src/service/qmmf_camera_source.h +++ b/recorder/src/service/qmmf_camera_source.h @@ -86,7 +86,8 @@ class CameraSource { const CameraExtraParam& extra_param, const ResultCb &cb = nullptr, const ErrorCb &errcb = nullptr, - const SystemCb &syscb = nullptr); + const SystemCb &syscb = nullptr, + const DeviceStatusCb &devicestatus = nullptr); /// Close Camera. status_t StopCamera(const uint32_t camera_id); diff --git a/recorder/src/service/qmmf_offline_proc_impl.cc b/recorder/src/service/qmmf_offline_proc_impl.cc index 3235d26..32b7a02 100644 --- a/recorder/src/service/qmmf_offline_proc_impl.cc +++ b/recorder/src/service/qmmf_offline_proc_impl.cc @@ -16,6 +16,7 @@ #endif #include "common/utils/qmmf_log.h" +#include "common/utils/qmmf_common_utils_defs.h" #ifdef QCAMERA3_TAG_LOCAL_COPY #include "common/cameraadaptor/qmmf_camera3_utils.h" #else @@ -59,11 +60,21 @@ status_t OfflineProcess::Init( return ret; } - offline_proc_lib_ = dlopen(JPEG_POSTPROC_LIB, RTLD_NOW | RTLD_LOCAL); + std::string jpeg_lib_path = JPEG_POSTPROC_LIB; + for (const auto& search_path : {LIB_SEARCH_PATH_DEFAULT, + LIB_SEARCH_PATH_MULTIARCH}) { + std::string full = std::string(search_path) + "/" + JPEG_POSTPROC_LIB; + if (access(full.c_str(), F_OK) == 0) { + jpeg_lib_path = full; + break; + } + } + + offline_proc_lib_ = dlopen(jpeg_lib_path.c_str(), RTLD_NOW | RTLD_LOCAL); if (!offline_proc_lib_) { QMMF_ERROR("%s: No postproc lib, dlopen failed with: %s.", - __func__, dlerror()); - return -EINVAL; + __func__, dlerror()); + return 0; } pCameraPostProcCreate = (PFN_CameraPostProc_Create) @@ -246,6 +257,12 @@ status_t OfflineProcess::Create(const uint32_t client_id, QMMF_INFO("%s: Enter client_id %d", __func__, client_id); + if (!offline_proc_lib_) { + QMMF_ERROR("%s: Offline JPEG lib not loaded, cannot create postproc instance.", + __func__); + return -EINVAL; + } + std::lock_guard client_lock(client_pproc_lock_); // get_number_of_cameras() must be called once prior using jpeg lib @@ -355,6 +372,12 @@ status_t OfflineProcess::Process(const uint32_t client_id, const CameraMetadata& meta) { QMMF_INFO("%s: Enter client_id %d", __func__, client_id); + if (!offline_proc_lib_) { + QMMF_ERROR("%s: Offline JPEG lib not loaded, cannot process.", + __func__); + return -EINVAL; + } + std::unique_lock client_lock(client_pproc_lock_); if(!IsClientFound(client_id)) { QMMF_ERROR("%s Error: Client %d not found.", __func__, client_id); @@ -648,11 +671,6 @@ void OfflineProcess::NotifyOfflineProc(const uint32_t& client_id, int32_t OfflineCb(PostProcSessionParams* pproc_params, uint32_t out_size, void* user_data) { -#else -void OfflineCb(PostProcSessionParams* pproc_params, - uint32_t out_size, - void* user_data) { -#endif if (!pproc_params) { QMMF_ERROR("%s: pproc_params is null", __func__); return -EINVAL; @@ -669,5 +687,22 @@ void OfflineCb(PostProcSessionParams* pproc_params, enc->NotifyOfflineProc(client, out_buf_fd, out_size, pproc_params); return 0; } +#else +void OfflineCb(PostProcSessionParams* pproc_params, + uint32_t out_size, + void* user_data) { + if (!pproc_params) { + QMMF_ERROR("%s: pproc_params is null", __func__); + } + if (!user_data) { + QMMF_ERROR("%s: user_data is null", __func__); + } + OfflineCbData* cb_data = reinterpret_cast(user_data); + OfflineProcess* enc = cb_data->offline_proc; + uint32_t client = cb_data->client_id; + int32_t out_buf_fd = pproc_params->outHandle[0].phHandle->data[0]; + enc->NotifyOfflineProc(client, out_buf_fd, out_size, pproc_params); +} +#endif }; // namespace qmmf. diff --git a/recorder/src/service/qmmf_recorder_common.h b/recorder/src/service/qmmf_recorder_common.h index 8c07a69..307e45a 100644 --- a/recorder/src/service/qmmf_recorder_common.h +++ b/recorder/src/service/qmmf_recorder_common.h @@ -84,6 +84,7 @@ typedef std::function< const std::shared_ptr& (uint32_t client_i typedef std::function ErrorCb; typedef std::function SystemCb; +typedef std::function DeviceStatusCb; }; //namespace recorder. diff --git a/recorder/src/service/qmmf_recorder_impl.cc b/recorder/src/service/qmmf_recorder_impl.cc index 85a392d..79ec577 100644 --- a/recorder/src/service/qmmf_recorder_impl.cc +++ b/recorder/src/service/qmmf_recorder_impl.cc @@ -379,9 +379,12 @@ status_t RecorderImpl::StartCamera(const uint32_t client_id, SystemCb syscb = [&] (uint32_t camera_id, uint32_t errcode) { CameraSystemCb(camera_id, errcode); }; + DeviceStatusCb devstatuscb = [&] (uint32_t camera_id, bool is_present) { + CameraDeviceStatusCb(camera_id, is_present); }; + auto ret = camera_source_->StartCamera(camera_id, framerate, extra_param, enable_result_cb ? cb : nullptr, - errcb, syscb); + errcb, syscb, devstatuscb); if (ret != 0) { QMMF_ERROR("%s: StartCamera Failed!!", __func__); return -EINVAL; @@ -1513,6 +1516,22 @@ void RecorderImpl::CameraSystemCb(uint32_t camera_id, uint32_t errcode) { } } +void RecorderImpl::CameraDeviceStatusCb(uint32_t camera_id, bool is_present) { + assert(remote_cb_handle_ != nullptr); + + EventType event = EventType::kCameraDeviceStatusChanged; + + // Create a struct to pass both camera_id and is_present + CameraDeviceStatusData status_data = {camera_id, is_present}; + std::lock_guard lock(client_track_lock_); + + for (auto const& client_tracks : client_track_map_) { + auto const& client_id = client_tracks.first; + remote_cb_handle_(client_id)->NotifyRecorderEvent( + event, &status_data, sizeof(status_data)); + } +} + bool RecorderImpl::IsClientValid(const uint32_t& client_id) { std::lock_guard lock(client_track_lock_); @@ -1639,6 +1658,8 @@ status_t RecorderImpl::ForceReturnBuffers(const uint32_t client_id) { uint32_t ret = 0; + { + std::lock_guard lock(camera_map_lock_); // Return all image capture buffers auto const& cameras = client_cameraid_map_[client_id]; for (auto camera : cameras) { @@ -1649,6 +1670,7 @@ status_t RecorderImpl::ForceReturnBuffers(const uint32_t client_id) { __func__, camera_id); } } + } // Return all track buffers client_track_lock_.lock(); diff --git a/recorder/src/service/qmmf_recorder_impl.h b/recorder/src/service/qmmf_recorder_impl.h index 6618991..b0cdd1e 100644 --- a/recorder/src/service/qmmf_recorder_impl.h +++ b/recorder/src/service/qmmf_recorder_impl.h @@ -233,6 +233,9 @@ class RecorderImpl { /// Camera System callback handler void CameraSystemCb(uint32_t camera_id, uint32_t errcode); + /// Camera Device status callback handler + void CameraDeviceStatusCb(uint32_t camera_id, bool is_present); + // Get suitable trackid for linked stream uint32_t FindSuitableIdForLinkedTrack(const VideoTrackParam& params); @@ -248,6 +251,12 @@ class RecorderImpl { kIdle, }; + // Struct for camera device status data + struct CameraDeviceStatusData { + uint32_t camera_id; + bool is_present; + }; + // typedef std::map TrackMap; // > diff --git a/recorder/src/service/qmmf_recorder_service.cc b/recorder/src/service/qmmf_recorder_service.cc index c1b8170..92e3fe8 100644 --- a/recorder/src/service/qmmf_recorder_service.cc +++ b/recorder/src/service/qmmf_recorder_service.cc @@ -42,6 +42,7 @@ namespace qmmf { namespace recorder { +#ifndef HAVE_BINDER extern "C" { int CreateRecorderServiceInstance(void) { @@ -54,6 +55,7 @@ int CreateRecorderServiceInstance(void) { return 0; } } +#endif #ifndef HAVE_BINDER ThreadPool::ThreadPool() @@ -157,7 +159,7 @@ RecorderService::RecorderService() { } else { #ifdef HAVE_BINDER std::function< const sp& (uint32_t id)> - remote_cb_handle = [&] (uint32_t id) { + remote_cb_handle = [&] (uint32_t id) -> const sp& { QMMF_VERBOSE("%s: Client(%u): RemoteCallback request!", __func__, id); assert(remote_cb_list_.count(id) != 0); return remote_cb_list_[id]; @@ -1866,7 +1868,9 @@ status_t RecorderService::Disconnect(uint32_t client_id) { death_notifier_list_.erase(client_id); remote_cb_list_.erase(client_id); +#ifndef HAVE_BINDER active_client_ids_.erase(client_id); +#endif if (death_notifier_list_.empty() && remote_cb_list_.empty()) { if (recorder_) { @@ -2453,7 +2457,9 @@ status_t RecorderService::DisconnectInternal(const uint32_t client_id) { #endif death_notifier_list_.erase(client_id); remote_cb_list_.erase(client_id); +#ifndef HAVE_BINDER active_client_ids_.erase(client_id); +#endif if (death_notifier_list_.empty() && remote_cb_list_.empty()) { if (recorder_) {