diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 04b20adc..533e86ed 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -21,7 +21,7 @@ if(ANDROID_ABI STREQUAL "armeabi-v7a") add_definitions(-DUSING_N938) elseif(ANDROID_ABI STREQUAL "arm64-v8a") # add_definitions(-DUSING_N938) - # add_definitions(-DUSING_PTZ) + add_definitions(-DUSING_PTZ) endif() # OUTPUT_DBG_INFO: 输出调试相关信息 diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 52903112..c367c15a 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -1012,7 +1012,6 @@ NdkCamera::CaptureRequest* NdkCamera::CreateRequest(bool isPreviewRequest, int32 // status = ACaptureSessionOutput_create(request->imageWindow, &request->sessionOutput); // status = ACaptureSessionOutputContainer_add(capture_session_output_container, request->sessionOutput); - if (!isPreviewRequest/* && !forceToPreview*/) { #if 0 uint8_t colorMode = ACAMERA_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX; @@ -2483,6 +2482,51 @@ void NdkCamera::EnumCameraResult(ACameraMetadata* result, CAPTURE_RESULT& captur val = {0}; status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AE_EXPOSURE_COMPENSATION, &val); captureResult.compensation = (status == ACAMERA_OK) ? *(val.data.i32) : 0; + + status = ACameraMetadata_getConstEntry(result, MTK_HDR_FEATURE_HDR_DETECTION_RESULT, &val); + ALOGI("HDR Detection Result: %d", val.data.i32[0]); + + val = {0}; + status = ACameraMetadata_getConstEntry(result, MTK_HDR_FEATURE_HDR_MODE, &val); + if (status == ACAMERA_OK && val.count > 0) { + int32_t appliedHdrMode = val.data.i32[0]; + ALOGI("Applied HDR Mode: %d", appliedHdrMode); + + // 判断是否与请求的HDR模式一致 + if (appliedHdrMode == MTK_HDR_FEATURE_HDR_MODE_AUTO || + appliedHdrMode == MTK_HDR_FEATURE_HDR_MODE_ON) { + ALOGI("HDR mode successfully applied"); + } + } + + + // 检查 HDR 是否激活(最重要的指标) dd + // 从结果中获取 MTK_HDR_FEATURE_HDR_HAL_MODE + val = {0}; + status = ACameraMetadata_getConstEntry(result, MTK_HDR_FEATURE_HDR_HAL_MODE, &val); + if (status == ACAMERA_OK && val.count > 0) { + int32_t hdrHalMode = val.data.i32[0]; + ALOGI("HDR HAL Mode: %d", hdrHalMode); + + if (hdrHalMode != MTK_HDR_FEATURE_HDR_HAL_MODE_OFF) { + ALOGI("HDR is actively working on hardware level"); + } + } + + val = {0}; + status = ACameraMetadata_getConstEntry(result, MTK_3A_ISP_FUS_NUM, &val); + if (status == ACAMERA_OK && val.count > 0) { + int32_t fusionFrames = val.data.i32[0]; + ALOGI("多帧融合数量: %d", fusionFrames); + + if (fusionFrames > 1) { + ALOGI("正在使用多帧融合,这通常表明 HDR 处理正在进行"); + } + } + + + int aa = 0; + } @@ -2627,7 +2671,29 @@ void NdkCamera::SetupHDR(ACameraMetadata* characteristics, ACaptureRequest* requ // 1. 设置基础的相机参数 camera_status_t status; __system_property_set("vendor.forceset.hdrmode", "1"); -#if 0 +#if 1 + + // 首先检查相机是否支持 HDR + ACameraMetadata_const_entry entry = { 0 }; + status = ACameraMetadata_getConstEntry(characteristics, MTK_HDR_FEATURE_AVAILABLE_HDR_MODES_PHOTO, &entry); + if (status == ACAMERA_OK) { + bool hdrSupported = false; + for (int i = 0; i < entry.count; i++) { + ALOGI("支持的 HDR 模式: 0x%x", entry.data.i32[i]); + if (entry.data.i32[i] == MTK_HDR_FEATURE_HDR_MODE_AUTO || + entry.data.i32[i] == MTK_HDR_FEATURE_HDR_MODE_ON) { + hdrSupported = true; + } + } + + if (!hdrSupported) { + ALOGI("警告: 相机不支持 AUTO 或 ON 模式的 HDR"); + return; + } + } else { + ALOGI("警告: 无法获取支持的 HDR 模式列表"); + } + int32_t tagCount = 0; const uint32_t* tags = nullptr; ACameraMetadata_getAllTags(characteristics, &tagCount, &tags); @@ -2638,7 +2704,7 @@ void NdkCamera::SetupHDR(ACameraMetadata* characteristics, ACaptureRequest* requ } } - ACameraMetadata_const_entry entry; + entry = { 0 }; status = ACameraMetadata_getConstEntry(characteristics, MTK_MFNR_FEATURE_AVAILABLE_MFB_MODES, &entry); if (status == ACAMERA_OK) { @@ -2651,7 +2717,7 @@ void NdkCamera::SetupHDR(ACameraMetadata* characteristics, ACaptureRequest* requ #endif - ACameraMetadata_const_entry entry = { 0 }; + entry = { 0 }; status = ACameraMetadata_getConstEntry(characteristics, MTK_HDR_FEATURE_AVAILABLE_HDR_MODES_PHOTO, &entry); if (status == ACAMERA_OK) { @@ -2663,16 +2729,36 @@ void NdkCamera::SetupHDR(ACameraMetadata* characteristics, ACaptureRequest* requ // 2. 设置 MediaTek 特定的 HDR 参数 // 使用 vendor tag 描述符 - int32_t hdrMode = MTK_HDR_FEATURE_HDR_MODE_AUTO; // 1 Enable MFNR uint8_t aeMode = MTK_CONTROL_AE_MODE_ON; status = ACaptureRequest_setEntry_u8(request, MTK_CONTROL_AE_MODE, 1, &aeMode); + uint8_t sceneMode = ACAMERA_CONTROL_SCENE_MODE_HDR; + status = ACaptureRequest_setEntry_u8(request, ACAMERA_CONTROL_SCENE_MODE, 1, &sceneMode); + if (status == ACAMERA_OK) { + ALOGI("已设置场景模式为 HDR"); + + // 启用场景模式控制 + uint8_t sceneModeControl = ACAMERA_CONTROL_MODE_USE_SCENE_MODE; + ACaptureRequest_setEntry_u8(request, ACAMERA_CONTROL_MODE, 1, &sceneModeControl); + } + + + int32_t hdrMode = MTK_HDR_FEATURE_HDR_MODE_ON; // 1 Enable HDR + ALOGI("Try to set MTK_HDR_FEATURE_HDR_MODE = %d", hdrMode); status = ACaptureRequest_setEntry_i32(request, MTK_HDR_FEATURE_HDR_MODE, 1, &hdrMode); if (status != ACAMERA_OK) { ALOGE("Failed to set MTK_HDR_FEATURE_HDR_MODE, status: %d", status); } + int32_t halHdrMode = MTK_HDR_FEATURE_HDR_HAL_MODE_MSTREAM_CAPTURE; + status = ACaptureRequest_setEntry_i32(request, MTK_HDR_FEATURE_HDR_HAL_MODE, 1, &halHdrMode); + if (status != ACAMERA_OK) + { + ALOGE("Failed to set MTK_HDR_FEATURE_HDR_HAL_MODE, status: %d", status); + } + + // int32_t ispTuning = (mfbMode != 0) ? MTK_CONTROL_CAPTURE_HINT_FOR_ISP_TUNING_MFNR : MTK_CONTROL_CAPTURE_HINT_FOR_ISP_TUNING_DEFAULT_NONE; // status = ACaptureRequest_setEntry_i32(request, MTK_CONTROL_CAPTURE_HINT_FOR_ISP_TUNING, 1, &ispTuning); @@ -2692,6 +2778,16 @@ void NdkCamera::SetupHDR(ACameraMetadata* characteristics, ACaptureRequest* requ ALOGE("Failed to set MTK_CONTROL_AE_EXPOSURE_COMPENSATION, status: %d", status); } } + + // 设置HDR的AE目标模式 + int32_t aeTargetMode = MTK_3A_FEATURE_AE_TARGET_MODE_NORMAL; + status = ACaptureRequest_setEntry_i32(request, MTK_3A_FEATURE_AE_TARGET_MODE, 1, &aeTargetMode); + +// 设置更高的曝光等级 + int32_t exposureLevel = MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_LONG; // 选择长曝光模式 + status = ACaptureRequest_setEntry_i32(request, MTK_3A_FEATURE_AE_EXPOSURE_LEVEL, 1, &exposureLevel); + + int aa = 0; } bool NdkCamera::SetupTonemapCurve(ACameraMetadata* characteristics, ACaptureRequest* request)