diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 38efec3b..c7932da6 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -1023,6 +1023,10 @@ NdkCamera::CaptureRequest* NdkCamera::CreateRequest(bool isPreviewRequest, int32 status = ACaptureRequest_setEntry_float(request->request, ACAMERA_COLOR_CORRECTION_TRANSFORM, 9, colorMatrix); #endif + if (m_params.burstRawCapture == 1) + { + SetupHDR(mCharacteristics.get(), request->request, sensitivity); + } if (m_params.burstRawCapture == 2) { SetupMFNR(mCharacteristics.get(), request->request, false, sensitivity); @@ -2511,6 +2515,80 @@ void NdkCamera::SetupMFNR(ACameraMetadata* characteristics, ACaptureRequest* req ALOGE("Failed to set MTK_MFNR_FEATURE_MFB_MODE, status: %d", status); } + int32_t ispTuning = MTK_CONTROL_CAPTURE_HINT_FOR_ISP_TUNING_MFNR; + status = ACaptureRequest_setEntry_i32(request, MTK_CONTROL_CAPTURE_HINT_FOR_ISP_TUNING, 1, &ispTuning); + + uint8_t reqRemosaicEnable = 1; + status = ACaptureRequest_setEntry_u8(request, MTK_HAL_REQUEST_REMOSAIC_ENABLE, 1, &reqRemosaicEnable); + if (status != ACAMERA_OK) + { + ALOGE("Failed to set MTK_HAL_REQUEST_REMOSAIC_ENABLE, status: %d", status); + } + + if (m_params.compensation != 0) + { + int32_t compensation = m_params.compensation; + status = ACaptureRequest_setEntry_i32(request, MTK_CONTROL_AE_EXPOSURE_COMPENSATION, 1, &compensation); + if (status != ACAMERA_OK) + { + ALOGE("Failed to set MTK_CONTROL_AE_EXPOSURE_COMPENSATION, status: %d", status); + } + } +} + +void NdkCamera::SetupHDR(ACameraMetadata* characteristics, ACaptureRequest* request, int32_t sensitivity) +{ + // 1. 设置基础的相机参数 + camera_status_t status; + // __system_property_set("vendor.mfll.force", "1"); +#if 0 + int32_t tagCount = 0; + const uint32_t* tags = nullptr; + ACameraMetadata_getAllTags(characteristics, &tagCount, &tags); + for (int32_t i = 0; i < tagCount; i++) { + if (MTK_MFNR_FEATURE_AVAILABLE_MFB_MODES == tags[i]) + { + ALOGI("MTK_MFNR_FEATURE_AVAILABLE_MFB_MODES Tag ID: 0x%x\n", tags[i]); + } + } + + ACameraMetadata_const_entry entry; + status = ACameraMetadata_getConstEntry(characteristics, MTK_MFNR_FEATURE_AVAILABLE_MFB_MODES, &entry); + if (status == ACAMERA_OK) + { + for (int i = 0; i < entry.count; i++) + { + ALOGI("MTK_MFNR_FEATURE_AVAILABLE_MFB_MODES: 0x%x\n", entry.data.i32[i]); + } + } + + +#endif + + ACameraMetadata_const_entry entry = { 0 }; + status = ACameraMetadata_getConstEntry(characteristics, MTK_HDR_FEATURE_AVAILABLE_HDR_MODES_PHOTO, &entry); + if (status == ACAMERA_OK) + { + for (int i = 0; i < entry.count; i++) + { + ALOGI("MTK_HDR_FEATURE_AVAILABLE_HDR_MODES_PHOTO: 0x%x\n", entry.data.i32[i]); + } + } + + // 2. 设置 MediaTek 特定的 MFNR 参数 + // 使用 vendor tag 描述符 + // int32_t mfbMode = MTK_MFNR_FEATURE_MFB_AUTO; // 1 Enable MFNR + int32_t hdrMode = MTK_HDR_FEATURE_HDR_MODE_ON; // 1 Enable MFNR + uint8_t aeMode = MTK_CONTROL_AE_MODE_ON; + // status = ACaptureRequest_setEntry_u8(request, MTK_CONTROL_AE_MODE, 1, &aeMode); + + // int32_t mfbMode = ais ? 2 : 1; // 1 Enable MFNR + status = ACaptureRequest_setEntry_i32(request, MTK_HDR_FEATURE_HDR_MODE, 1, &hdrMode); + if (status != ACAMERA_OK) + { + ALOGE("Failed to set MTK_MFNR_FEATURE_MFB_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); @@ -2520,7 +2598,7 @@ void NdkCamera::SetupMFNR(ACameraMetadata* characteristics, ACaptureRequest* req { ALOGE("Failed to set MTK_HAL_REQUEST_REMOSAIC_ENABLE, status: %d", status); } - + if (m_params.compensation != 0) { int32_t compensation = m_params.compensation; diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 304d9f9e..c2acb586 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -207,6 +207,7 @@ public: protected: void SetupMFNR(ACameraMetadata* characteristics, ACaptureRequest* request, bool ais, int32_t sensitivity); + void SetupHDR(ACameraMetadata* characteristics, ACaptureRequest* request, int32_t sensitivity); protected: std::mutex m_locker;