From 96aab478d7497f1a84d55c4c7a7ab3a47511a8ae Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 10 Apr 2025 23:19:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8mtk=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E7=9A=84=E5=A4=9A=E5=B8=A7=E9=99=8D=E5=99=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 62 +++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 0aea57f0..ad701c5a 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -28,6 +28,60 @@ #include #include "DngCreator.h" +#define MTK_MFBMODE_TAG "com.mediatek.mfbmode" +#define MTK_MFNR_ENABLE_TAG "com.mediatek.3afeature.mfnrenable" + +#define MTK_VENDOR_TAG_SECTION 0x8000 +#define MTK_MFNR_FEATURE 4 +#define MTK_MFNR_FEATURE_START ((MTK_MFNR_FEATURE + MTK_VENDOR_TAG_SECTION) << 16) +#define MTK_MFNR_FEATURE_MFB_MODE MTK_MFNR_FEATURE_START +#define MTK_MFNR_FEATURE_MFB_RESULT (MTK_MFNR_FEATURE_START + 1) +#define MTK_MFNR_FEATURE_AVAILABLE_MFB_MODES (MTK_MFNR_FEATURE_START + 2) + +#define MTK_MFNR_FEATURE_MFB_AUTO 0xFF + +// #define MTK_3A_MFNR_ENABLE "com.mediatek.3afeature.mfnrenable" +#define MTK_3A_MFNR_INTENSITY_TAG "com.mediatek.3afeature.mfnrintensity" + +void SetupMFNR(ACameraMetadata* characteristics, ACaptureRequest* request) { + // 1. 设置基础的相机参数 + // ACaptureRequest_setEntry_i32(request, ACAMERA_CONTROL_MODE, 1, ACAMERA_CONTROL_MODE_AUTO); + camera_status_t status; + +#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 + + uint8_t nrMode = ACAMERA_NOISE_REDUCTION_MODE_HIGH_QUALITY; + status = ACaptureRequest_setEntry_u8(request, ACAMERA_NOISE_REDUCTION_MODE, 1, &nrMode); + + // 2. 设置 MediaTek 特定的 MFNR 参数 + // 使用 vendor tag 描述符 + int32_t mfbMode = MTK_MFNR_FEATURE_MFB_AUTO; // 1 Enable MFNR + status = ACaptureRequest_setEntry_i32(request, MTK_MFNR_FEATURE_MFB_MODE, 1, &mfbMode); + if (status == ACAMERA_OK) + { + + } +} #ifdef _DEBUG void Auto_AImage_delete(AImage* image) @@ -1754,12 +1808,17 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque for (int idx = 0; idx < burstCaptures; idx++) { CaptureRequest* request = CreateRequest(false); + if (m_params.burstRawCapture == 0 && m_params.customHdr != 0) + { + SetupMFNR(mCharacteristics.get(), request->request); + } mCaptureRequests.push_back(request); // CopyPreviewRequest(mCaptureRequests[idx]->request, result); requests.push_back(request->request); } - if (m_params.customHdr) +#if 0 + if (m_params.customHdr && burstCaptures > 1) { int32_t hdrStep = m_params.hdrStep; if (hdrStep == 0) @@ -1789,6 +1848,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque } } } +#endif // ALOGW("Will Stop Repeating Request"); // status = ACameraCaptureSession_stopRepeating(capture_session);