From 4ab121bcc69191e9b94f7be4949df0d55e47c7ab Mon Sep 17 00:00:00 2001 From: Guangde Date: Mon, 2 Feb 2026 15:12:18 +0800 Subject: [PATCH 01/16] le-services : add release buffer after cancel snapshot stream After add cached instead of release buffer every time, need release all buffer when close snapshot streams. Signed-off-by: Girish K --- recorder/src/client/qmmf_recorder_client.cc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/recorder/src/client/qmmf_recorder_client.cc b/recorder/src/client/qmmf_recorder_client.cc index e832dc8..c32d488 100644 --- a/recorder/src/client/qmmf_recorder_client.cc +++ b/recorder/src/client/qmmf_recorder_client.cc @@ -1779,6 +1779,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; } From 4e522764976e16ea8637fbe1b5d46c29be986e14 Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Wed, 4 Mar 2026 15:52:07 +0800 Subject: [PATCH 02/16] le-services: skip frame sequence check in ProviderExtension mode Skip frame sequence check in ProviderExtension mode Signed-off-by: Hui Liu Signed-off-by: Girish K --- .../qmmf_camera3_device_client.cc | 27 ++++++++++++++++++- .../qmmf_camera3_device_client.h | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/common/cameraadaptor/qmmf_camera3_device_client.cc b/common/cameraadaptor/qmmf_camera3_device_client.cc index 05324e7..b34c11c 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( 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_; From 11cd8d72a14fc83dee6d47a8ec9ccd71f2d92198 Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Thu, 19 Mar 2026 11:26:47 +0800 Subject: [PATCH 03/16] le-services: fix a race condition issue for client_cameraid_map_ fix a race condition issue for client_cameraid_map_. Signed-off-by: Hui Liu Signed-off-by: Girish K --- recorder/src/service/qmmf_recorder_impl.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/recorder/src/service/qmmf_recorder_impl.cc b/recorder/src/service/qmmf_recorder_impl.cc index 85a392d..fa309c4 100644 --- a/recorder/src/service/qmmf_recorder_impl.cc +++ b/recorder/src/service/qmmf_recorder_impl.cc @@ -1639,6 +1639,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 +1651,7 @@ status_t RecorderImpl::ForceReturnBuffers(const uint32_t client_id) { __func__, camera_id); } } + } // Return all track buffers client_track_lock_.lock(); From fb85bab9dbadf48a7712ace6291308eb6f57b9b7 Mon Sep 17 00:00:00 2001 From: Ziyi Gai Date: Fri, 9 May 2025 16:36:30 +0800 Subject: [PATCH 04/16] le-services: add lock to protect the map of capture buffer. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Hui Liu (cherry picked from commit bc32e7b474e3809447ac9c49b97d60549691be6f) Signed-off-by: Girish K --- recorder/src/service/qmmf_camera_context.cc | 12 +----------- recorder/src/service/qmmf_camera_context.h | 1 - 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/recorder/src/service/qmmf_camera_context.cc b/recorder/src/service/qmmf_camera_context.cc index 5ce9799..e241837 100644 --- a/recorder/src/service/qmmf_camera_context.cc +++ b/recorder/src/service/qmmf_camera_context.cc @@ -2155,16 +2155,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 +2165,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 +3233,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); diff --git a/recorder/src/service/qmmf_camera_context.h b/recorder/src/service/qmmf_camera_context.h index 8297f40..3b53b25 100644 --- a/recorder/src/service/qmmf_camera_context.h +++ b/recorder/src/service/qmmf_camera_context.h @@ -378,7 +378,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_; From ecb19e0144195dd3333436f000d07f63c6f579b8 Mon Sep 17 00:00:00 2001 From: Deepali Reddy Karra Date: Thu, 20 Nov 2025 16:01:15 +0530 Subject: [PATCH 05/16] le-services : add support for propogating deviceStatusChange event - Forward this event to the clients for further processing. Signed-off-by: Hui Liu (cherry picked from commit b4dba08bb1c8b0d804276d256efbe69117be6565) Signed-off-by: Girish K --- .../qmmf_camera3_device_client.cc | 6 ++++++ common/utils/qmmf_common_utils_defs.h | 3 +++ recorder/src/service/qmmf_camera_context.cc | 13 +++++++++++- recorder/src/service/qmmf_camera_context.h | 5 ++++- recorder/src/service/qmmf_camera_source.cc | 5 +++-- recorder/src/service/qmmf_camera_source.h | 3 ++- recorder/src/service/qmmf_recorder_common.h | 1 + recorder/src/service/qmmf_recorder_impl.cc | 21 ++++++++++++++++++- recorder/src/service/qmmf_recorder_impl.h | 9 ++++++++ 9 files changed, 60 insertions(+), 6 deletions(-) diff --git a/common/cameraadaptor/qmmf_camera3_device_client.cc b/common/cameraadaptor/qmmf_camera3_device_client.cc index b34c11c..87d6eec 100644 --- a/common/cameraadaptor/qmmf_camera3_device_client.cc +++ b/common/cameraadaptor/qmmf_camera3_device_client.cc @@ -2408,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/utils/qmmf_common_utils_defs.h b/common/utils/qmmf_common_utils_defs.h index 405f067..ddfd367 100644 --- a/common/utils/qmmf_common_utils_defs.h +++ b/common/utils/qmmf_common_utils_defs.h @@ -306,6 +306,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 +320,7 @@ typedef struct { PreparedCallback peparedCb; ResultCallback resultCb; SystemCallback systemCb; + DeviceStatusCallback deviceStatusCb; } CameraClientCallbacks; // Please note that this callbacks need to return as fast as possible diff --git a/recorder/src/service/qmmf_camera_context.cc b/recorder/src/service/qmmf_camera_context.cc index e241837..cbdaa3d 100644 --- a/recorder/src/service/qmmf_camera_context.cc +++ b/recorder/src/service/qmmf_camera_context.cc @@ -88,7 +88,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 +97,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 +133,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_) { @@ -3742,6 +3745,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", diff --git a/recorder/src/service/qmmf_camera_context.h b/recorder/src/service/qmmf_camera_context.h index 3b53b25..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_; diff --git a/recorder/src/service/qmmf_camera_source.cc b/recorder/src/service/qmmf_camera_source.cc index 6b3dc50..029273f 100644 --- a/recorder/src/service/qmmf_camera_source.cc +++ b/recorder/src/service/qmmf_camera_source.cc @@ -121,7 +121,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 +132,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_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 fa309c4..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_); 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; // > From bb48a3d5502379c283cb9d5adbb4b9cee3e35279 Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Sun, 12 Jul 2026 18:51:52 +0800 Subject: [PATCH 06/16] le-services: support pebble platform Support pebble platform. Signed-off-by: Hui Liu Signed-off-by: Girish K --- config/pebble/CMakeLists.txt | 82 ++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 config/pebble/CMakeLists.txt 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) From b241e2edfdee7ef0dd6e888da8e741aaa3360653 Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Mon, 20 Jul 2026 17:28:07 +0800 Subject: [PATCH 07/16] le-services: enable binder path Signed-off-by: Hui Liu Signed-off-by: Girish K --- CMakeLists.txt | 2 ++ common/cameraadaptor/CMakeLists.txt | 5 ++++ .../cameraadaptor/qmmf_camera3_smooth_zoom.cc | 4 --- common/config/qmmf_config.h | 12 +++++++++ common/memory/CMakeLists.txt | 14 ++++++----- common/utils/qmmf_extra_param.cc | 4 --- common/utils/qmmf_log.h | 5 +++- qmmf-server/CMakeLists.txt | 10 +++++++- qmmf-server/qmmf_server_main.cc | 3 +++ recorder/src/client/CMakeLists.txt | 22 ++++++++++------ recorder/src/client/qmmf_recorder_client.cc | 9 ++++++- recorder/src/client/qmmf_recorder_client.h | 1 + recorder/src/service/CMakeLists.txt | 25 ++++++++++++++----- recorder/src/service/qmmf_camera_context.cc | 2 -- recorder/src/service/qmmf_camera_frc.cc | 5 ---- recorder/src/service/qmmf_camera_rescaler.cc | 2 -- recorder/src/service/qmmf_camera_source.cc | 7 ++++-- recorder/src/service/qmmf_recorder_service.cc | 8 +++++- 18 files changed, 97 insertions(+), 43 deletions(-) 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/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/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/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/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/qmmf-server/CMakeLists.txt b/qmmf-server/CMakeLists.txt index ccbc1af..513c2f0 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() @@ -51,6 +53,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 +73,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/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 c32d488..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__); 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 cbdaa3d..a2c38f3 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" 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 029273f..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; 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_) { From cdfccce112b25b5e1ad34fe0946d01ff9cfb25bb Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Mon, 20 Jul 2026 20:42:10 +0800 Subject: [PATCH 08/16] le-service: using the correct libs for different platform Signed-off-by: Hui Liu Signed-off-by: Girish K --- common/camera-meta/qmmf_camera_metadata.cpp | 3 ++- common/camera-meta/qmmf_vendor_tag_descriptor.cpp | 3 ++- common/cameraadaptor/qmmf_camera3_utils.cc | 3 ++- common/cameraadaptor/qmmf_camera3_utils.h | 6 ++++++ common/utils/qmmf_common_utils_defs.h | 7 +++++++ 5 files changed, 19 insertions(+), 3 deletions(-) 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/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/utils/qmmf_common_utils_defs.h b/common/utils/qmmf_common_utils_defs.h index ddfd367..0e6b672 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) From 40b5335ef03b87ac8d1d8a1809c77dd85655ba3b Mon Sep 17 00:00:00 2001 From: Ritesh Agarwal Date: Tue, 4 Aug 2026 11:21:39 +0530 Subject: [PATCH 09/16] camera-service: Fix startup failure after boot The camera service can fail to start when launched before the camera hardware is ready. Trigger the service from udev when cam_req_mgr appears instead of multi-user.target and retain ExecCondition to reject manual starts when the camera hardware is unavailable. Signed-off-by: Ritesh Agarwal Signed-off-by: Girish K --- qmmf-server/CMakeLists.txt | 4 ++++ qmmf-server/service/99-camera.rules | 1 + qmmf-server/service/qti-cam-server-base.service.in | 5 +---- 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 qmmf-server/service/99-camera.rules diff --git a/qmmf-server/CMakeLists.txt b/qmmf-server/CMakeLists.txt index 513c2f0..2e88b61 100644 --- a/qmmf-server/CMakeLists.txt +++ b/qmmf-server/CMakeLists.txt @@ -46,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() diff --git a/qmmf-server/service/99-camera.rules b/qmmf-server/service/99-camera.rules new file mode 100644 index 0000000..dae36c1 --- /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}="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 From 8dc81f19b8789c6836290769fc4ae3498b5993c2 Mon Sep 17 00:00:00 2001 From: Yaqiao Zhou Date: Wed, 26 Aug 2026 11:04:06 +0800 Subject: [PATCH 10/16] le-services: Modify the default value of color space & HDR mode - Camera side request to use -1 as default value of video bt601, bt601-full, bt709-full, bt2100-hlg-full, bt2100-pq-full and image bt601. - Image bt601-full keeps 0, and image bt709-full, bt2100-hlg-full, bt2100-pq-full keep 4,5,5. - DynamicRangeProfile has been set to value 1 since Android 13. Default value of HDR mode should be ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD. Signed-off-by: Yaqiao Zhou Signed-off-by: Girish K --- .../gtest/qmmf_camera_adaptor_gtest.cc | 56 ++++++++++++++++++- .../gtest/qmmf_dual_camera_adaptor_gtest.cc | 1 + common/cameraadaptor/qmmf_camera3_stream.cc | 4 +- .../cameraadaptor/test/camera_factory_test.cc | 1 + common/utils/qmmf_common_utils_defs.h | 4 +- recorder/src/service/qmmf_camera_context.cc | 8 ++- 6 files changed, 65 insertions(+), 9 deletions(-) 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_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/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/utils/qmmf_common_utils_defs.h b/common/utils/qmmf_common_utils_defs.h index 0e6b672..b2a9a3d 100644 --- a/common/utils/qmmf_common_utils_defs.h +++ b/common/utils/qmmf_common_utils_defs.h @@ -232,9 +232,9 @@ struct CameraStreamParameters { height(0), format(-1), data_space(0x0), - color_space(0), + color_space(-1), usecase(0), - hdrmode(0), + hdrmode(ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD), rotation(0), allocFlags(), bufferCount(0), diff --git a/recorder/src/service/qmmf_camera_context.cc b/recorder/src/service/qmmf_camera_context.cc index a2c38f3..cc5e94d 100644 --- a/recorder/src/service/qmmf_camera_context.cc +++ b/recorder/src/service/qmmf_camera_context.cc @@ -1246,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 = @@ -3974,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) { From 0136a053ce023d9f040fb1254cac0b7b65776847 Mon Sep 17 00:00:00 2001 From: Jai Shiv Date: Wed, 2 Sep 2026 11:48:10 +0530 Subject: [PATCH 11/16] camera-service: add support for below target - add support for shikra target. Signed-off-by: Jai Shiv Signed-off-by: Girish K --- common/utils/qmmf_common_utils_defs.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/common/utils/qmmf_common_utils_defs.h b/common/utils/qmmf_common_utils_defs.h index b2a9a3d..6b795ea 100644 --- a/common/utils/qmmf_common_utils_defs.h +++ b/common/utils/qmmf_common_utils_defs.h @@ -115,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 { @@ -476,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 {}; } From 790d59f72f7814996e1d3c136885d89653c2d0d1 Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Wed, 2 Sep 2026 20:27:26 +0800 Subject: [PATCH 12/16] le-services: Independently implement OfflineCb Independently implement off for different platforms, since the definition of the function is diffrent for downstream SP and QClinux SP. Signed-off-by: Hui Liu Signed-off-by: Girish K --- .../src/service/qmmf_offline_proc_impl.cc | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/recorder/src/service/qmmf_offline_proc_impl.cc b/recorder/src/service/qmmf_offline_proc_impl.cc index 3235d26..221c856 100644 --- a/recorder/src/service/qmmf_offline_proc_impl.cc +++ b/recorder/src/service/qmmf_offline_proc_impl.cc @@ -648,11 +648,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 +664,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. From 076121826d6e6a5eb42d3b1c9afcfbf525c99b5a Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Thu, 3 Sep 2026 15:30:03 +0800 Subject: [PATCH 13/16] le-services: fix a compilation issue Fix a compilation issue when not define the BINDER. Signed-off-by: Hui Liu Signed-off-by: Girish K --- common/memory/qmmf_gbm_interface.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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; From c2bb479280e9d715985cb667c40c174537c594ec Mon Sep 17 00:00:00 2001 From: Shubhankar Kulkarni Date: Thu, 27 Aug 2026 15:04:42 +0530 Subject: [PATCH 14/16] le-camera-server : enabling offline jpeg for kodiak. - Enabled offline jpeg in qcs6490 and qcm6490. - Changed the offline jpeg library name. - In ubuntu the library path is different, therefore added the logic where before dlopen will search for the lib path on device. Signed-off-by: Shubhankar Kulkarni Signed-off-by: Girish K --- config/common/CMakeLists.txt | 4 --- config/qcm6490/CMakeLists.txt | 8 +++++ config/qcs6490/CMakeLists.txt | 8 +++++ .../src/service/qmmf_offline_proc_impl.cc | 29 +++++++++++++++++-- 4 files changed, 42 insertions(+), 7 deletions(-) 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/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/recorder/src/service/qmmf_offline_proc_impl.cc b/recorder/src/service/qmmf_offline_proc_impl.cc index 221c856..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); From d34f08d267f7b7b979f48f6f22b8c8172fd3c3ea Mon Sep 17 00:00:00 2001 From: Ritesh Agarwal Date: Tue, 8 Sep 2026 19:04:53 +0530 Subject: [PATCH 15/16] le-service: update udev rule - The camera service was renamed from cam-server.service to qti-cam-server.service. - Update the udev rule to use the new service name. Signed-off-by: Ritesh Agarwal Signed-off-by: Girish K --- qmmf-server/service/99-camera.rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qmmf-server/service/99-camera.rules b/qmmf-server/service/99-camera.rules index dae36c1..9f8cbfc 100644 --- a/qmmf-server/service/99-camera.rules +++ b/qmmf-server/service/99-camera.rules @@ -1 +1 @@ -SUBSYSTEM=="video4linux", KERNEL=="video*", ACTION=="add", DRIVERS=="cam_req_mgr", TAG+="systemd", ENV{SYSTEMD_WANTS}="cam-server.service" +SUBSYSTEM=="video4linux", KERNEL=="video*", ACTION=="add", DRIVERS=="cam_req_mgr", TAG+="systemd", ENV{SYSTEMD_WANTS}="qti-cam-server.service" From d4e3ba662f411c097f0cb430a2baf2b673809213 Mon Sep 17 00:00:00 2001 From: Hui Liu Date: Wed, 9 Sep 2026 15:25:57 +0800 Subject: [PATCH 16/16] le-services: fix a compile issue Some Android macro definition only can be used under the specific android version. Here to use the definition only for initializa the HDR MODE, we can initialize it with default value (1) directly. Signed-off-by: Hui Liu Signed-off-by: Girish K --- common/utils/qmmf_common_utils_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/utils/qmmf_common_utils_defs.h b/common/utils/qmmf_common_utils_defs.h index 6b795ea..5cef3a2 100644 --- a/common/utils/qmmf_common_utils_defs.h +++ b/common/utils/qmmf_common_utils_defs.h @@ -237,7 +237,7 @@ struct CameraStreamParameters { data_space(0x0), color_space(-1), usecase(0), - hdrmode(ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD), + hdrmode(0x01), rotation(0), allocFlags(), bufferCount(0),