/////////////////////////////////////////////////////////////////////////// /// @brief Set 3 SmallImg Buffer addresses to HDR Drv. /// /// @return SUCCDSS (TRUE) or Fail (FALSE). /////////////////////////////////////////////////////////////////////////// MBOOL HdrHal::HdrSmallImgBufSet(HDR_PIPE_CONFIG_PARAM& rHdrPipeConfigParam) { HDR_LOGD("- E."); HDR_LOGV("rHdrPipeConfigParam.pSmallImgBufAddr[0/1/2]: (%p, %p, %p).", rHdrPipeConfigParam.pSmallImgBufAddr[0], rHdrPipeConfigParam.pSmallImgBufAddr[1], rHdrPipeConfigParam.pSmallImgBufAddr[2]); MBOOL ret = MTRUE; MINT32 err = 0; // 0: No error. HDR_SET_PROC_INFO_STRUCT HDR_SET_PROC_INFO; #if 1 //kidd for new hdr HDR_SET_PROC_INFO.ehdr_round = (HDR_PROC_ROUND_ENUM)rHdrPipeConfigParam.eHdrRound; HDR_SET_PROC_INFO.input_source_image_width = rHdrPipeConfigParam.u4SourceImgWidth; HDR_SET_PROC_INFO.input_source_image_height = rHdrPipeConfigParam.u4SourceImgHeight; HDR_SET_PROC_INFO.input_source_image[0] = rHdrPipeConfigParam.pSourceImgBufAddr[0]; HDR_SET_PROC_INFO.input_source_image[1] = rHdrPipeConfigParam.pSourceImgBufAddr[1]; HDR_SET_PROC_INFO.input_source_image[2] = rHdrPipeConfigParam.pSourceImgBufAddr[2]; #endif // Set process info (small image addr and working buffer) HDR_SET_PROC_INFO.small_image_addr[0] = rHdrPipeConfigParam.pSmallImgBufAddr[0]; HDR_SET_PROC_INFO.small_image_addr[1] = rHdrPipeConfigParam.pSmallImgBufAddr[1]; HDR_SET_PROC_INFO.small_image_addr[2] = rHdrPipeConfigParam.pSmallImgBufAddr[2]; ret = ( 0 == (err = m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_SET_PROC_INFO, &HDR_SET_PROC_INFO, NULL)) ); HDR_LOGD("- X. ret: %d.", ret); return ret; }
/////////////////////////////////////////////////////////////////////////// /// @brief Get MAV Working Buffer size. /// /// Get MAV Working Buffer size. Working Buffer size is obtained from MAV DRv. /// /// @param [IN] ru4SmallImgWidth Small Image width. /// @param [IN] ru4SmallImgHeight Small Image height. /// @return MAV Working Buffer Size. /////////////////////////////////////////////////////////////////////////// MUINT32 HdrHal::MavWorkingBuffSizeGet(MUINT32 ru4SmallImgWidth, MUINT32 ru4SmallImgHeight) { HDR_LOGV("- E. ru4SmallImgWidth/Height: (%d, %d).", ru4SmallImgWidth, ru4SmallImgHeight); MUINT32 u4MavWorkingBuffSize = 0; MavImageInfo ImageInfo; ImageInfo.Width = ru4SmallImgWidth; ImageInfo.Height= ru4SmallImgHeight; // m_pMavDrv->MavFeatureCtrl(MAV_FEATURE_GET_WORKBUF_SIZE, &ImageInfo, &u4MavWorkingBuffSize); //Get small image width/height and ask working buf size u4MavWorkingBuffSize = ru4SmallImgWidth * ru4SmallImgHeight * 10; // FIXME: This knowledge (MAV working buffer size) should not be known by HDR Hal. HDR_LOGV("- X. MavWorkingBuffSize: %d.", u4MavWorkingBuffSize); return u4MavWorkingBuffSize; }
/////////////////////////////////////////////////////////////////////////// /// @brief Query SW EIS image width/height. /// /// @param [OUT] ru4Width SW EIS Image width. /// @param [OUT] ru4Height SW EIS Image height. /////////////////////////////////////////////////////////////////////////// void HdrHal::QuerySEImgResolution(MUINT32& ru4Width, MUINT32& ru4Height) { ru4Width = EIS_WIDTH2; // FIXME: Should be replaced by customer parameter. ru4Height = EIS_HEIGHT2; // FIXME: Should be replaced by customer parameter. HDR_LOGV("SW EIS W/H: (%d, %d).", ru4Width, ru4Height); }
/////////////////////////////////////////////////////////////////////////// /// @brief Set HDR Working Buffer address and size to HDR Drv. /// /// @return SUCCDSS (TRUE) or Fail (FALSE). /////////////////////////////////////////////////////////////////////////// MBOOL HdrHal::HdrWorkingBufSet(MUINT32 u4BufAddr, MUINT32 u4BufSize) { HDR_LOGD("- E. u4BufAddr: 0x%08X. u4BufSize: %d.", u4BufAddr, u4BufSize); MBOOL ret = MTRUE; MINT32 err = 0; // 0: No error. HDR_SET_WORK_BUF_INFO_STRUCT HDR_SET_WORK_BUF_INFO; // Allocate workin buffer HDR_SET_WORK_BUF_INFO.ext_mem_size = u4BufSize; HDR_SET_WORK_BUF_INFO.ext_mem_start_addr = u4BufAddr; HDR_LOGV("Before Enter HDR_FEATURE_SET_WORK_BUF_INFO."); ret = ( 0 == (err = m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_SET_WORK_BUF_INFO, &HDR_SET_WORK_BUF_INFO, NULL)) ); HDR_LOGV("After Enter HDR_FEATURE_SET_WORK_BUF_INFO."); HDR_LOGD("- X. ret: %d.", ret); return ret; }
/////////////////////////////////////////////////////////////////////////// /// @brief Get HDR Working Buffer size. /// /// Get HDR Working Buffer size. Working Buffer size is obtained from HDR Drv. /// Important Note: This function can only be used after HDR Drv knows the /// width and Height of Image, i.e. after HDR Drv init. /// /// @return HDR Working Buffer Size. /////////////////////////////////////////////////////////////////////////// MUINT32 HdrHal::HdrWorkingBuffSizeGet(void) { MUINT32 u4HdrWorkingBuffSize = 0; HDR_GET_PROC_INFO_STRUCT rHdrGetProcInfo; m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_GET_PROC_INFO, NULL, &rHdrGetProcInfo); //Get small image width/height and ask working buf size u4HdrWorkingBuffSize = rHdrGetProcInfo.ext_mem_size; HDR_LOGV("HdrWorkingBuffSize: %d.", u4HdrWorkingBuffSize); return u4HdrWorkingBuffSize; }
/////////////////////////////////////////////////////////////////////////// /// @brief Query small image width/height. /// /// Important Note: This function can only be used after HDR Drv knows the /// width and Height of Image, i.e. after HDR Drv init. //// /// @param [OUT] ru4Width SW EIS Image width. /// @param [OUT] ru4Height SW EIS Image height. /////////////////////////////////////////////////////////////////////////// void HdrHal::QuerySmallImgResolution(MUINT32& ru4Width, MUINT32& ru4Height) { HDR_GET_PROC_INFO_STRUCT rHdrGetProcInfo; m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_GET_PROC_INFO, NULL, &rHdrGetProcInfo); //Get small image width/height and ask working buf size ru4Width = rHdrGetProcInfo.small_image_width; ru4Height = rHdrGetProcInfo.small_image_height; HDR_LOGV("SmallImg W/H: (%d, %d).", ru4Width, ru4Height); }
/////////////////////////////////////////////////////////////////////////// /// @brief Get MAV Working Buffer size. /// /// Get MAV Working Buffer size. Working Buffer size is obtained from MAV DRv. /// /// @param [IN] ru4SmallImgWidth Small Image width. /// @param [IN] ru4SmallImgHeight Small Image height. /// @param [OUT] u4MavWorkingBuffSize return MAV Working Buffer Size. /// @return SUCCDSS (TRUE) or Fail (FALSE). /////////////////////////////////////////////////////////////////////////// MBOOL HdrHal::MavWorkingBuffSizeGet(MUINT32 ru4SmallImgWidth, MUINT32 ru4SmallImgHeight, MUINT32 *pMavWorkingBuffSize) { HDR_LOGD("- E."); MBOOL ret = MTRUE; if(m_pMavDrv) { HDR_LOGV("ru4SmallImgWidth/Height: (%d, %d).", ru4SmallImgWidth, ru4SmallImgHeight); //Get small image width/height and ask working buf size MavImageInfo ImageInfo; ImageInfo.Width = ru4SmallImgWidth; ImageInfo.Height= ru4SmallImgHeight; m_pMavDrv->MavFeatureCtrl(MAV_FEATURE_GET_WORKBUF_SIZE, &ImageInfo, pMavWorkingBuffSize); HDR_LOGV("MavWorkingBuffSize: %d.", *pMavWorkingBuffSize); } else { HDR_LOGE("m_pMavDrv wasn't inited"); ret = MFALSE; } HDR_LOGD("- X. ret: %d.", ret); return ret; }
/////////////////////////////////////////////////////////////////////////// /// @brief Get HDR final result. /// /// @param [OUT] prHdrResult A pointer pointing to HDR result (including width, height, address). /// @return SUCCDSS (TRUE) or Fail (FALSE). /////////////////////////////////////////////////////////////////////////// MBOOL HdrHal::HdrCroppedResultGet(HDR_PIPE_HDR_RESULT_STRUCT& rHdrCroppedResult) { HDR_LOGD("- E."); MBOOL ret = MTRUE; MINT32 err = 0; // 0: No error. ret = ( 0 == (err = m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_GET_RESULT, 0, &rHdrCroppedResult)) ); HDR_LOGV("rHdrResult:: W/H: (%d, %d). Addr: 0x%08X. Size: %d.", rHdrCroppedResult.output_image_width, rHdrCroppedResult.output_image_height, rHdrCroppedResult.output_image_addr, rHdrCroppedResult.output_image_width * rHdrCroppedResult.output_image_height * 3 / 2); HDR_LOGD("- X. ret: %d.", ret); return ret; }
/////////////////////////////////////////////////////////////////////////// /// @brief Set 3 SmallImg Buffer addresses to HDR Drv. /// /// @return SUCCDSS (TRUE) or Fail (FALSE). /////////////////////////////////////////////////////////////////////////// MBOOL HdrHal::HdrSmallImgBufSet(HDR_PIPE_CONFIG_PARAM& rHdrPipeConfigParam) { HDR_LOGD("- E."); HDR_LOGV("rHdrPipeConfigParam.pSmallImgBufAddr[0/1/2]: (0x%08X, 0x%08X, 0x%08X).", rHdrPipeConfigParam.pSmallImgBufAddr[0], rHdrPipeConfigParam.pSmallImgBufAddr[1], rHdrPipeConfigParam.pSmallImgBufAddr[2]); MBOOL ret = MTRUE; MINT32 err = 0; // 0: No error. HDR_SET_PROC_INFO_STRUCT HDR_SET_PROC_INFO; // Set process info (small image addr and working buffer) HDR_SET_PROC_INFO.small_image_addr[0] = rHdrPipeConfigParam.pSmallImgBufAddr[0]; HDR_SET_PROC_INFO.small_image_addr[1] = rHdrPipeConfigParam.pSmallImgBufAddr[1]; HDR_SET_PROC_INFO.small_image_addr[2] = rHdrPipeConfigParam.pSmallImgBufAddr[2]; ret = ( 0 == (err = m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_SET_PROC_INFO, &HDR_SET_PROC_INFO, NULL)) ); HDR_LOGD("- X. ret: %d.", ret); return ret; }
/////////////////////////////////////////////////////////////////////////// /// @brief Do Feature Extraction. /// /// @param [IN] rHdrPipeFeatureExtractInputInfo /// @return SUCCDSS (TRUE) or Fail (FALSE). /////////////////////////////////////////////////////////////////////////// MBOOL HdrHal::Do_FeatureExtraction(HDR_PIPE_FEATURE_EXTRACT_INPUT_INFO& rHdrPipeFeatureExtractInputInfo) { HDR_LOGD("- E."); HDR_LOGV("rHdrPipeFeatureExtractInputInfo: W/H: (%d, %d). Addr[0/1/2]: (%p, %p, %p) .", rHdrPipeFeatureExtractInputInfo.u2SmallImgW, rHdrPipeFeatureExtractInputInfo.u2SmallImgH, rHdrPipeFeatureExtractInputInfo.pSmallImgBufAddr[0], rHdrPipeFeatureExtractInputInfo.pSmallImgBufAddr[1], rHdrPipeFeatureExtractInputInfo.pSmallImgBufAddr[2]); MBOOL ret = MTRUE; MINT32 err = 0; // 0: No error. MavImageInfo rMavInfo; // assign working buffer m_pMavDrv->MavFeatureCtrl(MAV_FEATURE_SET_WORKBUF_ADDR , (void*)rHdrPipeFeatureExtractInputInfo.pWorkingBuffer , NULL); // overall process starts from 2nd image for (MUINT32 i = 0; i < GS_u4OutputFrameNum; i++) { // Add i image rMavInfo.Width = rHdrPipeFeatureExtractInputInfo.u2SmallImgW; rMavInfo.Height = rHdrPipeFeatureExtractInputInfo.u2SmallImgH; rMavInfo.ImgAddr = rHdrPipeFeatureExtractInputInfo.pSmallImgBufAddr[i]; if ( i == 0) // 1st image. { rMavInfo.MotionValue[0] = 0; rMavInfo.MotionValue[1] = 0; } else // 2nd and 3rd image. { rMavInfo.MotionValue[0] = G_i4GMV2[(i-1)*2]; rMavInfo.MotionValue[1] = G_i4GMV2[(i-1)*2+1]; } HDR_LOGV("rMavInfo[%d]:: W/H: (%d, %d). ImgAddr: 0x%08X. MotionValue[0/1]: (%d, %d)." , i , rMavInfo.Width , rMavInfo.Height , rMavInfo.ImgAddr , rMavInfo.MotionValue[0] , rMavInfo.MotionValue[1] ); ret = ( 0 == (err = m_pMavDrv->MavFeatureCtrl(MAV_FEATURE_ADD_IMAGE, &rMavInfo, 0)) ); // Leave For_loop if error happened. if (! ret) // if ret != MTRUE means error happened. { goto lbExit; } } ret = ( 0 == (err = m_pMavDrv->MavMain()) ); // Feature Extraction if (! ret) // if ret != MTRUE means error happened. { HDR_LOGE("MavMain() fail, err(%d)", err); goto lbExit; } // Get MAV result, and set for HDR. mav_rec_par_struct gRecPar; MavMatchImagePairStruct gMyMavMatchImagePair; gRecPar.m_Match = &gMyMavMatchImagePair; ret = ( 0 == (err = m_pMavDrv->MavFeatureCtrl(MAV_FEATURE_GET_MATCH_PAIR_INFO,NULL,&gRecPar)) ) && ( 0 == (err = m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_SET_REC_PAIR_INFO, &gRecPar, NULL)) ) ; if(!ret) { HDR_LOGE("MavFeatureCtrl() or fail HdrFeatureCtrl(), err(%d)", err); goto lbExit; } lbExit: HDR_LOGD("- X. ret: %d.", ret); return ret; }
MBOOL HdrHal::init(void *pInitInData) { HDR_LOGD("- E. mUsers: %d.", mUsers); HDR_PIPE_INIT_INFO* prHdrPipeInitInfo = (HDR_PIPE_INIT_INFO*)pInitInData; HDR_LOGV("ImgW/H: (%d, %d). FinalGainDiff[0/1]: (%d, %d). OutputFrameNum: %d. TargetTone: %d.", prHdrPipeInitInfo->u4ImgW, prHdrPipeInitInfo->u4ImgH, prHdrPipeInitInfo->u4FinalGainDiff0, prHdrPipeInitInfo->u4FinalGainDiff1, prHdrPipeInitInfo->u4OutputFrameNum, prHdrPipeInitInfo->u4TargetTone); HDR_LOGV("pSourceImgBufAddr[0/1/2]: (%p, %p, %p).", prHdrPipeInitInfo->pSourceImgBufAddr[0], prHdrPipeInitInfo->pSourceImgBufAddr[1], prHdrPipeInitInfo->pSourceImgBufAddr[2]); MBOOL ret = MFALSE; MINT32 err = 0; // 0: No error. other value: error. Mutex::Autolock lock(mLock); if (mUsers > 0) { HDR_LOGD("%d has created.", mUsers); android_atomic_inc(&mUsers); HDR_LOGD("- X. ret: %d.", MTRUE); return MTRUE; } // Create HdrDrv instance. m_pHdrDrv = MTKHdr::createInstance(); if (!m_pHdrDrv) { HDR_LOGD("MTKHdr::createInstance() fail."); goto create_fail_exit; } // Allocate working buffer needed by Drv (HdrDrv and MavDrv). // Init HdrDrv object. // Fill init data. HDR_SET_ENV_INFO_STRUCT rHdrInitInfo; rHdrInitInfo.image_num = prHdrPipeInitInfo->u4OutputFrameNum; GS_u4OutputFrameNum = prHdrPipeInitInfo->u4OutputFrameNum; // Record u4OutputFrameNum for HDR Pipe to use. rHdrInitInfo.ev_gain1 = (MUINT16)prHdrPipeInitInfo->u4FinalGainDiff0; rHdrInitInfo.ev_gain2 = 1024; // Fix at 1024. rHdrInitInfo.ev_gain3 = (MUINT16)prHdrPipeInitInfo->u4FinalGainDiff1; rHdrInitInfo.target_tone = prHdrPipeInitInfo->u4TargetTone; rHdrInitInfo.image_width = prHdrPipeInitInfo->u4ImgW; rHdrInitInfo.image_height = prHdrPipeInitInfo->u4ImgH; if(CustomHdrUseIspGamma()) { HDR_LOGD("Use ISP Gamma"); rHdrInitInfo.pIsp_gamma = prHdrPipeInitInfo->pIsp_gamma; } else { HDR_LOGD("Use Fixed Gamma"); rHdrInitInfo.pIsp_gamma = NULL; } rHdrInitInfo.hdr_tuning_data.BRatio = CustomHdrBRatioGet(); for (MUINT32 i = 0; i < 11; i++) { rHdrInitInfo.hdr_tuning_data.Gain[i] = CustomHdrGainArrayGet(i); } rHdrInitInfo.hdr_tuning_data.BottomFRatio = CustomHdrBottomFRatioGet(); rHdrInitInfo.hdr_tuning_data.TopFRatio = CustomHdrTopFRatioGet(); rHdrInitInfo.hdr_tuning_data.BottomFBound = CustomHdrBottomFBoundGet(); rHdrInitInfo.hdr_tuning_data.TopFBound = CustomHdrTopFBoundGet(); rHdrInitInfo.hdr_tuning_data.ThHigh = CustomHdrThHighGet(); rHdrInitInfo.hdr_tuning_data.ThLow = CustomHdrThLowGet(); rHdrInitInfo.hdr_tuning_data.TargetLevelSub = CustomHdrTargetLevelSubGet(); rHdrInitInfo.hdr_tuning_data.CoreNumber = CustomHdrCoreNumberGet(); rHdrInitInfo.hdr_tuning_data.HdrSpeed = HDR_PROCESS_NORMAL; //Never use HDR_PROCESS_FAST rHdrInitInfo.HdrSrcInfo = (prHdrPipeInitInfo->u4SensorType == NSCam::SENSOR_TYPE_YUV) ? HDR_INFO_SRC_YUV : HDR_INFO_SRC_RAW; HDR_LOGD("rHdrInitInfo:: ImgW/H: (%d, %d). FinalGainDiff[0/1]: (%d, %d). OutputFrameNum: %d. TargetTone: %d. RawSensor: %d." , rHdrInitInfo.image_width , rHdrInitInfo.image_height , rHdrInitInfo.ev_gain1 , rHdrInitInfo.ev_gain3 , rHdrInitInfo.image_num , rHdrInitInfo.target_tone , rHdrInitInfo.HdrSrcInfo); //HDR_LOGV("rHdrInitInfo:: pSourceImgBufAddr[0/1/2]: (0x%08X, 0x%08X, 0x%08X).", rHdrInitInfo.image_addr[0], rHdrInitInfo.image_addr[1], rHdrInitInfo.image_addr[2]); HDR_LOGV("rHdrInitInfo:: BRatio: %d. BottomFRatio: %f. TopFRatio: %f. BottomFBound: %d. TopFBound: %d.", rHdrInitInfo.hdr_tuning_data.BRatio, rHdrInitInfo.hdr_tuning_data.BottomFRatio, rHdrInitInfo.hdr_tuning_data.TopFRatio, rHdrInitInfo.hdr_tuning_data.BottomFBound, rHdrInitInfo.hdr_tuning_data.TopFBound ); HDR_LOGV("rHdrInitInfo:: ThHigh: %d. ThLow: %d. TargetLevelSub: %d.", rHdrInitInfo.hdr_tuning_data.ThHigh, rHdrInitInfo.hdr_tuning_data.ThLow, rHdrInitInfo.hdr_tuning_data.TargetLevelSub ); for (MUINT32 i = 0; i < 11; i++) HDR_LOGV("rHdrInitInfo:: u4Gain[%d]: %d.", i, rHdrInitInfo.hdr_tuning_data.Gain[i]); // Call HdrDrv init. err = m_pHdrDrv->HdrInit(&rHdrInitInfo, 0); if (err) // if ret != 0 means error happened. { HDR_LOGD("m_pHdrDrv->HdrInit() fail, err=%d", err); goto create_fail_exit; } if(1) { // set HDR default pthread attribute to avoid RT throttling pthread_attr_t attr = {0, NULL, 1024 * 1024, 4096, SCHED_OTHER, ANDROID_PRIORITY_FOREGROUND+1}; m_pHdrDrv->HdrFeatureCtrl(HDR_FEATURE_SET_PTHREAD_ATTR, &attr, NULL); } #if EARLY_MAV_INIT // Create MavDrv instance. m_pMavDrv = MTKMav::createInstance(DRV_MAV_OBJ_SWHDR); if (!m_pMavDrv) { HDR_LOGD("MTKMav::createInstance() fail."); goto create_fail_exit; } // Init MavDrv object. // Fill init data. MavInitInfo rMavInitInfo; rMavInitInfo.WorkingBuffAddr = (MUINT32)global_buffer_rectify; // FIXME: Allocate working buffer for MAV. rMavInitInfo.pTuningInfo = NULL; // Call MavDrv init. err = m_pMavDrv->MavInit(&rMavInitInfo, 0); if (err) // if ret != 0 means error happened. { HDR_LOGD("m_pMavDrv->MavInit() fail. err: %d.", err); goto create_fail_exit; } #endif // EARLY_MAV_INIT android_atomic_inc(&mUsers); ret = MTRUE; HDR_LOGD("- X. ret: %d.", ret); return ret; create_fail_exit: // HdrDrv Init failed, destroy HdrDrv instance. if (m_pHdrDrv) { m_pHdrDrv->destroyInstance(); m_pHdrDrv = NULL; } #if EARLY_MAV_INIT // MavDrv Init failed, destroy MavDrv instance. if (m_pMavDrv) { m_pMavDrv->MavReset(); m_pMavDrv->destroyInstance(); m_pMavDrv = NULL; } #endif // EARLY_MAV_INIT HDR_LOGD("- X. ret: %d.", ret); return ret; // 0: No error. other value: error. }
MBOOL HdrHal::init(void *pInitInData) { HDR_LOGD("- E. mUsers: %d.", mUsers); HDR_PIPE_INIT_INFO* prHdrPipeInitInfo = (HDR_PIPE_INIT_INFO*)pInitInData; HDR_LOGV("ImgW/H: (%d, %d). FinalGainDiff[0/1]: (%d, %d). OutputFrameNum: %d. TargetTone: %d.", prHdrPipeInitInfo->u4ImgW, prHdrPipeInitInfo->u4ImgH, prHdrPipeInitInfo->u4FinalGainDiff0, prHdrPipeInitInfo->u4FinalGainDiff1, prHdrPipeInitInfo->u4OutputFrameNum, prHdrPipeInitInfo->u4TargetTone); HDR_LOGV("pSourceImgBufAddr[0/1/2]: (0x%08X, 0x%08X, 0x%08X).", prHdrPipeInitInfo->pSourceImgBufAddr[0], prHdrPipeInitInfo->pSourceImgBufAddr[1], prHdrPipeInitInfo->pSourceImgBufAddr[2]); MBOOL ret = MFALSE; MINT32 err = 0; // 0: No error. other value: error. Mutex::Autolock lock(mLock); if (mUsers > 0) { HDR_LOGD("%d has created.", mUsers); android_atomic_inc(&mUsers); HDR_LOGD("- X. ret: %d.", MTRUE); return MTRUE; } // Create HdrDrv instance. m_pHdrDrv = MTKHdr::createInstance(); if (!m_pHdrDrv) { HDR_LOGD("MTKHdr::createInstance() fail."); goto create_fail_exit; } // Allocate working buffer needed by Drv (HdrDrv and MavDrv). // Init HdrDrv object. // Fill init data. HDR_SET_ENV_INFO_STRUCT rHdrInitInfo; rHdrInitInfo.image_num = prHdrPipeInitInfo->u4OutputFrameNum; GS_u4OutputFrameNum = prHdrPipeInitInfo->u4OutputFrameNum; // Record u4OutputFrameNum for HDR Pipe to use. rHdrInitInfo.ev_gain1 = (MUINT16)prHdrPipeInitInfo->u4FinalGainDiff0; rHdrInitInfo.ev_gain2 = 1024; // Fix at 1024. rHdrInitInfo.ev_gain3 = (MUINT16)prHdrPipeInitInfo->u4FinalGainDiff1; rHdrInitInfo.target_tone = prHdrPipeInitInfo->u4TargetTone; rHdrInitInfo.image_width = prHdrPipeInitInfo->u4ImgW; rHdrInitInfo.image_height = prHdrPipeInitInfo->u4ImgH; rHdrInitInfo.image_addr[0] = prHdrPipeInitInfo->pSourceImgBufAddr[0]; rHdrInitInfo.image_addr[1] = prHdrPipeInitInfo->pSourceImgBufAddr[1]; rHdrInitInfo.image_addr[2] = prHdrPipeInitInfo->pSourceImgBufAddr[2]; rHdrInitInfo.hdr_tuning_data.BlurRatio = CustomHdrBlurRatioGet(); for (MUINT32 i = 0; i < 11; i++) { rHdrInitInfo.hdr_tuning_data.Gain[i] = CustomHdrGainArrayGet(i); } rHdrInitInfo.hdr_tuning_data.BottomFlareRatio = CustomHdrBottomFlareRatioGet(); rHdrInitInfo.hdr_tuning_data.TopFlareRatio = CustomHdrTopFlareRatioGet(); rHdrInitInfo.hdr_tuning_data.BottomFlareBound = CustomHdrBottomFlareBoundGet(); rHdrInitInfo.hdr_tuning_data.TopFlareBound = CustomHdrTopFlareBoundGet(); rHdrInitInfo.hdr_tuning_data.ThHigh = CustomHdrThHighGet(); rHdrInitInfo.hdr_tuning_data.ThLow = CustomHdrThLowGet(); rHdrInitInfo.hdr_tuning_data.TargetLevelSub = CustomHdrTargetLevelSubGet(); rHdrInitInfo.hdr_tuning_data.CoreNumber = CustomHdrCoreNumberGet(); HDR_LOGV("rHdrInitInfo:: ImgW/H: (%d, %d). FinalGainDiff[0/1]: (%d, %d). OutputFrameNum: %d. TargetTone: %d.", rHdrInitInfo.image_width, rHdrInitInfo.image_height, rHdrInitInfo.ev_gain1, rHdrInitInfo.ev_gain3, rHdrInitInfo.image_num, rHdrInitInfo.target_tone); HDR_LOGV("rHdrInitInfo:: pSourceImgBufAddr[0/1/2]: (0x%08X, 0x%08X, 0x%08X).", rHdrInitInfo.image_addr[0], rHdrInitInfo.image_addr[1], rHdrInitInfo.image_addr[2]); HDR_LOGV("rHdrInitInfo:: BlurRatio: %d. BottomFlareRatio: %f. TopFlareRatio: %f. BottomFlareBound: %d. TopFlareBound: %d.", rHdrInitInfo.hdr_tuning_data.BlurRatio, rHdrInitInfo.hdr_tuning_data.BottomFlareRatio, rHdrInitInfo.hdr_tuning_data.TopFlareRatio, rHdrInitInfo.hdr_tuning_data.BottomFlareBound, rHdrInitInfo.hdr_tuning_data.TopFlareBound ); HDR_LOGD("rHdrInitInfo:: ThHigh: %d. ThLow: %d. TargetLevelSub: %d. CoreNumber: %d.", rHdrInitInfo.hdr_tuning_data.ThHigh, rHdrInitInfo.hdr_tuning_data.ThLow, rHdrInitInfo.hdr_tuning_data.TargetLevelSub, rHdrInitInfo.hdr_tuning_data.CoreNumber ); for (MUINT32 i = 0; i < 11; i++) HDR_LOGV("rHdrInitInfo:: u4Gain[%d]: %d.", i, rHdrInitInfo.hdr_tuning_data.Gain[i]); // Call HdrDrv init. err = m_pHdrDrv->HdrInit(&rHdrInitInfo, 0); if (err) // if ret != 0 means error happened. { HDR_LOGD("m_pHdrDrv->HdrInit() fail."); goto create_fail_exit; } #if EARLY_MAV_INIT // Create MavDrv instance. m_pMavDrv = MTKMav::createInstance(DRV_MAV_OBJ_SWHDR); if (!m_pMavDrv) { HDR_LOGD("MTKMav::createInstance() fail."); goto create_fail_exit; } // Init MavDrv object. // Fill init data. MavInitInfo rMavInitInfo; rMavInitInfo.WorkingBuffAddr = (MUINT32)global_buffer_rectify; // FIXME: Allocate working buffer for MAV. rMavInitInfo.pTuningInfo = NULL; // Call MavDrv init. err = m_pMavDrv->MavInit(&rMavInitInfo, 0); if (err) // if ret != 0 means error happened. { HDR_LOGD("m_pMavDrv->MavInit() fail. err: %d.", err); goto create_fail_exit; } #endif // EARLY_MAV_INIT android_atomic_inc(&mUsers); ret = MTRUE; HDR_LOGD("- X. ret: %d.", ret); return ret; create_fail_exit: // HdrDrv Init failed, destroy HdrDrv instance. if (m_pHdrDrv) { m_pHdrDrv->destroyInstance(); m_pHdrDrv = NULL; } #if EARLY_MAV_INIT // MavDrv Init failed, destroy MavDrv instance. if (m_pMavDrv) { m_pMavDrv->destroyInstance(); m_pMavDrv = NULL; } #endif // EARLY_MAV_INIT HDR_LOGD("- X. ret: %d.", ret); return ret; // 0: No error. other value: error. }