diff --git a/config/linux/ipu75xa/gcss/IMX471_BBG803N3.IPU75XA.bin b/config/linux/ipu75xa/gcss/IMX471_BBG803N3.IPU75XA.bin index 3523005b..0164b31a 100644 Binary files a/config/linux/ipu75xa/gcss/IMX471_BBG803N3.IPU75XA.bin and b/config/linux/ipu75xa/gcss/IMX471_BBG803N3.IPU75XA.bin differ diff --git a/config/linux/ipu75xa/libcamhal_configs.json b/config/linux/ipu75xa/libcamhal_configs.json index f04d7b1c..2e976a0a 100644 --- a/config/linux/ipu75xa/libcamhal_configs.json +++ b/config/linux/ipu75xa/libcamhal_configs.json @@ -21,33 +21,11 @@ // The value format of availableSensors is "sensor name"-wf/uf-"CSI port ID". // wf is word facing, and uf is user facing. "availableSensors": [ - "ov8856-wf-0", "ov13b10-wf-0", "ov13b10-uf-2", "ov08x40-uf-0", "ov08x40-uf-2", "imx471-uf-0", - "ov05c10-uf-0", - "lt6911gxd-1-0", - "lt6911gxd-2-2", - "isx031-1-0", - "isx031-2-0", - "isx031-3-0", - "isx031-4-0", - "isx031-5-2", - "isx031-6-2", - "isx031-7-2", - "isx031-8-2", - "ar0233-1-0", - "ar0820-1-0", - "isx031-5-0", - "isx031-6-0", - "isx031-7-0", - "isx031-8-0", - "ar0830-a-0", - "ar0830-b-2", - "isx031-a-0", - "isx031-b-2" ], "videoStreamNum" : 2 } diff --git a/config/linux/ipu8/gcss/OV08X40_KAFE799.IPU8.bin b/config/linux/ipu8/gcss/OV08X40_KAFE799.IPU8.bin index e3cfe05a..b333b912 100644 Binary files a/config/linux/ipu8/gcss/OV08X40_KAFE799.IPU8.bin and b/config/linux/ipu8/gcss/OV08X40_KAFE799.IPU8.bin differ diff --git a/config/linux/ipu8/libcamhal_configs.json b/config/linux/ipu8/libcamhal_configs.json index 76b58642..ab53b93f 100644 --- a/config/linux/ipu8/libcamhal_configs.json +++ b/config/linux/ipu8/libcamhal_configs.json @@ -1,5 +1,5 @@ // -// Copyright (C) 2025-2026 Intel Corporation +// Copyright (C) 2025 Intel Corporation // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -23,17 +23,7 @@ "availableSensors": [ "ov13b10-wf-0", "ov13b10-uf-2", - "lt6911gxd-1-0", - "lt6911gxd-2-2", - "isx031-1-0", - "isx031-2-0", - "isx031-3-0", - "isx031-4-0", - "isx031-5-2", - "isx031-6-2", - "isx031-7-2", - "isx031-8-2" - + "ov08x40-uf-0" ], "videoStreamNum" : 2 } diff --git a/config/linux/ipu8/sensors/ov13b10-uf.json b/config/linux/ipu8/sensors/ov13b10-uf.json index 6046b760..9c8ce687 100644 --- a/config/linux/ipu8/sensors/ov13b10-uf.json +++ b/config/linux/ipu8/sensors/ov13b10-uf.json @@ -43,12 +43,12 @@ }, { "srcName": "Intel IPU7 CSI2 $CSI_PORT", "srcPad": 1, - "sinkName": "Intel IPU7 ISYS Capture 16", "sinkPad": 0, "enable": true + "sinkName": "Intel IPU7 ISYS Capture $CAP_N", "sinkPad": 0, "enable": true } ], "videonode": [ { - "name": "Intel IPU7 ISYS Capture 16", "videoNodeType": "VIDEO_GENERIC" + "name": "Intel IPU7 ISYS Capture $CAP_N", "videoNodeType": "VIDEO_GENERIC" }, { "name": "Intel IPU7 CSI2 $CSI_PORT", "videoNodeType": "VIDEO_ISYS_RECEIVER" diff --git a/config/linux/ipu8/sensors/ov13b10-wf.json b/config/linux/ipu8/sensors/ov13b10-wf.json index ff14cd65..ca1bf397 100644 --- a/config/linux/ipu8/sensors/ov13b10-wf.json +++ b/config/linux/ipu8/sensors/ov13b10-wf.json @@ -43,12 +43,12 @@ }, { "srcName": "Intel IPU7 CSI2 $CSI_PORT", "srcPad": 1, - "sinkName": "Intel IPU7 ISYS Capture 0", "sinkPad": 0, "enable": true + "sinkName": "Intel IPU7 ISYS Capture $CAP_N", "sinkPad": 0, "enable": true } ], "videonode": [ { - "name": "Intel IPU7 ISYS Capture 0", "videoNodeType": "VIDEO_GENERIC" + "name": "Intel IPU7 ISYS Capture $CAP_N", "videoNodeType": "VIDEO_GENERIC" }, { "name": "Intel IPU7 CSI2 $CSI_PORT", "videoNodeType": "VIDEO_ISYS_RECEIVER" diff --git a/include/utils/ScopedAtrace.h b/include/utils/ScopedAtrace.h index bdc4a6ea..a846626f 100644 --- a/include/utils/ScopedAtrace.h +++ b/include/utils/ScopedAtrace.h @@ -39,6 +39,10 @@ class ScopedAtrace { long value = -1, const char* note2 = NULL, int value2 = -1, const char* note3 = NULL, int value3 = -1); ~ScopedAtrace(); + + ScopedAtrace(const ScopedAtrace&) = delete; + ScopedAtrace& operator=(const ScopedAtrace&) = delete; + static void setTraceLevel(uint32_t); private: diff --git a/modules/algowrapper/IntelCca.h b/modules/algowrapper/IntelCca.h index 7f632f94..069b71e3 100644 --- a/modules/algowrapper/IntelCca.h +++ b/modules/algowrapper/IntelCca.h @@ -33,6 +33,9 @@ class IntelCca { IntelCca(int cameraId, TuningMode mode); virtual ~IntelCca(); + IntelCca(const IntelCca&) = delete; + IntelCca& operator=(const IntelCca&) = delete; + static IntelCca* getInstance(int cameraId, TuningMode mode); static void releaseInstance(int cameraId, TuningMode mode); diff --git a/modules/ipu_desc/ipu75xa/FragmentsConfigurator.cpp b/modules/ipu_desc/ipu75xa/FragmentsConfigurator.cpp index a42549ef..9ca2cb84 100644 --- a/modules/ipu_desc/ipu75xa/FragmentsConfigurator.cpp +++ b/modules/ipu_desc/ipu75xa/FragmentsConfigurator.cpp @@ -205,13 +205,6 @@ StaticGraphStatus Gen2FragmentsConfigurator::configFragmentsDownscaler(StaticGra for (int32_t stripe = leftNonVanishedStripe; stripe <= rightNonVanishedStripe; stripe++) { - if (scaleFactor == 1.0) - { - kernelFragments[stripe].fragmentOutputWidth = kernelFragments[stripe].fragmentInputWidth; - _outputStartX[runKernel->kernel_uuid][stripe] = kernelFragments[stripe].fragmentStartX; - continue; - } - int rightCrop = stripe == static_cast(_numberOfFragments - 1) ? resInfo->input_crop.right : 0; double value = (static_cast(kernelFragments[stripe].fragmentInputWidth - rightCrop) * scaleFactor) / 4; diff --git a/modules/ipu_desc/ipu75xa/GraphResolutionConfigurator.cpp b/modules/ipu_desc/ipu75xa/GraphResolutionConfigurator.cpp index 9abc7417..28ee47e3 100644 --- a/modules/ipu_desc/ipu75xa/GraphResolutionConfigurator.cpp +++ b/modules/ipu_desc/ipu75xa/GraphResolutionConfigurator.cpp @@ -720,7 +720,7 @@ StaticGraphStatus GraphResolutionConfigurator::updateRunKernelUpScaler(StaticGra upscalerActualInputWidth = GRA_ROUND_DOWN(upscalerActualInputWidth, stepW); upscalerActualInputHeight = (upscalerActualInputWidth / stepW) * stepH; - if ((static_cast(upscalerActualOutputWidth) / upscalerActualInputWidth) > max_upscaling) + if ((upscalerActualOutputWidth / upscalerActualInputWidth) > max_upscaling) { // Perform the max possible up scaling, downscaler will adjust itself upscalerActualInputWidth = upscalerActualOutputWidth / max_upscaling; diff --git a/modules/ipu_desc/ipu7x/FragmentsConfigurator.cpp b/modules/ipu_desc/ipu7x/FragmentsConfigurator.cpp index a42549ef..9ca2cb84 100644 --- a/modules/ipu_desc/ipu7x/FragmentsConfigurator.cpp +++ b/modules/ipu_desc/ipu7x/FragmentsConfigurator.cpp @@ -205,13 +205,6 @@ StaticGraphStatus Gen2FragmentsConfigurator::configFragmentsDownscaler(StaticGra for (int32_t stripe = leftNonVanishedStripe; stripe <= rightNonVanishedStripe; stripe++) { - if (scaleFactor == 1.0) - { - kernelFragments[stripe].fragmentOutputWidth = kernelFragments[stripe].fragmentInputWidth; - _outputStartX[runKernel->kernel_uuid][stripe] = kernelFragments[stripe].fragmentStartX; - continue; - } - int rightCrop = stripe == static_cast(_numberOfFragments - 1) ? resInfo->input_crop.right : 0; double value = (static_cast(kernelFragments[stripe].fragmentInputWidth - rightCrop) * scaleFactor) / 4; diff --git a/modules/ipu_desc/ipu7x/GraphResolutionConfigurator.cpp b/modules/ipu_desc/ipu7x/GraphResolutionConfigurator.cpp index 9abc7417..28ee47e3 100644 --- a/modules/ipu_desc/ipu7x/GraphResolutionConfigurator.cpp +++ b/modules/ipu_desc/ipu7x/GraphResolutionConfigurator.cpp @@ -720,7 +720,7 @@ StaticGraphStatus GraphResolutionConfigurator::updateRunKernelUpScaler(StaticGra upscalerActualInputWidth = GRA_ROUND_DOWN(upscalerActualInputWidth, stepW); upscalerActualInputHeight = (upscalerActualInputWidth / stepW) * stepH; - if ((static_cast(upscalerActualOutputWidth) / upscalerActualInputWidth) > max_upscaling) + if ((upscalerActualOutputWidth / upscalerActualInputWidth) > max_upscaling) { // Perform the max possible up scaling, downscaler will adjust itself upscalerActualInputWidth = upscalerActualOutputWidth / max_upscaling; diff --git a/modules/ipu_desc/ipu8/FragmentsConfigurator.cpp b/modules/ipu_desc/ipu8/FragmentsConfigurator.cpp index a42549ef..9ca2cb84 100644 --- a/modules/ipu_desc/ipu8/FragmentsConfigurator.cpp +++ b/modules/ipu_desc/ipu8/FragmentsConfigurator.cpp @@ -205,13 +205,6 @@ StaticGraphStatus Gen2FragmentsConfigurator::configFragmentsDownscaler(StaticGra for (int32_t stripe = leftNonVanishedStripe; stripe <= rightNonVanishedStripe; stripe++) { - if (scaleFactor == 1.0) - { - kernelFragments[stripe].fragmentOutputWidth = kernelFragments[stripe].fragmentInputWidth; - _outputStartX[runKernel->kernel_uuid][stripe] = kernelFragments[stripe].fragmentStartX; - continue; - } - int rightCrop = stripe == static_cast(_numberOfFragments - 1) ? resInfo->input_crop.right : 0; double value = (static_cast(kernelFragments[stripe].fragmentInputWidth - rightCrop) * scaleFactor) / 4; diff --git a/modules/ipu_desc/ipu8/GraphResolutionConfigurator.cpp b/modules/ipu_desc/ipu8/GraphResolutionConfigurator.cpp index 9abc7417..28ee47e3 100644 --- a/modules/ipu_desc/ipu8/GraphResolutionConfigurator.cpp +++ b/modules/ipu_desc/ipu8/GraphResolutionConfigurator.cpp @@ -720,7 +720,7 @@ StaticGraphStatus GraphResolutionConfigurator::updateRunKernelUpScaler(StaticGra upscalerActualInputWidth = GRA_ROUND_DOWN(upscalerActualInputWidth, stepW); upscalerActualInputHeight = (upscalerActualInputWidth / stepW) * stepH; - if ((static_cast(upscalerActualOutputWidth) / upscalerActualInputWidth) > max_upscaling) + if ((upscalerActualOutputWidth / upscalerActualInputWidth) > max_upscaling) { // Perform the max possible up scaling, downscaler will adjust itself upscalerActualInputWidth = upscalerActualOutputWidth / max_upscaling; diff --git a/modules/v4l2/v4l2_device.h b/modules/v4l2/v4l2_device.h index 0c9ea94b..2050df98 100644 --- a/modules/v4l2/v4l2_device.h +++ b/modules/v4l2/v4l2_device.h @@ -40,6 +40,7 @@ class V4L2Buffer { public: V4L2Buffer(); explicit V4L2Buffer(const V4L2Buffer& buf); + ~V4L2Buffer() = default; uint32_t Index() const { return v4l2_buf_.index; } void SetIndex(uint32_t index) { v4l2_buf_.index = index; } uint32_t Type() const { return v4l2_buf_.type; } @@ -141,6 +142,10 @@ class V4L2Device { virtual ~V4L2Device(); + // Explicitly delete copy and move operations (manages file descriptor) + V4L2Device(const V4L2Device&) = delete; + V4L2Device& operator=(const V4L2Device&) = delete; + // This method opens the V4L2 device. // // Args: diff --git a/src/3a/AiqCore.cpp b/src/3a/AiqCore.cpp index b4784b49..99681501 100644 --- a/src/3a/AiqCore.cpp +++ b/src/3a/AiqCore.cpp @@ -547,7 +547,7 @@ int AiqCore::reFormatLensShadingMap(const LSCGrid& inputLscGrid, float* dstLscGr // Metadata spec request order [R, Geven, Godd, B] // the lensShading from ISP is 4 width * height block, // for ia_aiq_bayer_order_grbg, the four block is G, R, B, G - const size_t size = inputLscGrid.height * inputLscGrid.width; + const size_t size = static_cast(inputLscGrid.height) * static_cast(inputLscGrid.width); for (size_t i = 0U; i < size; i++) { *dstLscGridRGGB = inputLscGrid.gridR[i]; dstLscGridRGGB++; diff --git a/src/3a/AiqEngine.cpp b/src/3a/AiqEngine.cpp index a2e348fe..296ae115 100644 --- a/src/3a/AiqEngine.cpp +++ b/src/3a/AiqEngine.cpp @@ -295,9 +295,6 @@ AiqEngine::AiqState AiqEngine::prepareInputParam(AiqStatistics* aiqStats, AiqRes // Update sensor info for the first-run of AIQ if (mFirstAiqRunning) { - // CRL_MODULE_S - mSensorManager->setFrameRate(aiqParams.fps); - // CRL_MODULE_E // set sensor info if needed ia_aiq_exposure_sensor_descriptor sensorDescriptor = {}; ia_aiq_frame_params frameParams = {}; diff --git a/src/3a/AiqResult.cpp b/src/3a/AiqResult.cpp index f0cf9335..b9f771b0 100644 --- a/src/3a/AiqResult.cpp +++ b/src/3a/AiqResult.cpp @@ -51,6 +51,39 @@ AiqResult::~AiqResult() { deinit(); } +AiqResult::AiqResult(const AiqResult& other) : + mCameraId(other.mCameraId), + mTimestamp(other.mTimestamp), + mSequence(other.mSequence), + mFrameId(other.mFrameId), + mTuningMode(other.mTuningMode), + mAfDistanceDiopters(other.mAfDistanceDiopters), + mSkip(other.mSkip), + mFocusRange(other.mFocusRange), + mLensPosition(other.mLensPosition), + mSceneMode(other.mSceneMode), + mAeResults(other.mAeResults), + mAwbResults(other.mAwbResults), + mAfResults(other.mAfResults), + mGbceResults(other.mGbceResults), + mPaResults(other.mPaResults), + mOutStats(other.mOutStats), + mFrameDuration(other.mFrameDuration), + mRollingShutter(other.mRollingShutter) { + CLEAR(mCustomControls); + CLEAR(mCustomControlsParams); + + mOutStats.rgbs_grid[0].blocks_ptr = mOutStats.rgbs_blocks[0]; + + mCustomControls.count = other.mCustomControls.count; + mCustomControls.parameters = mCustomControlsParams; + for (int i = 0; i < mCustomControls.count; i++) { + mCustomControlsParams[i] = other.mCustomControlsParams[i]; + } + MEMCPY_S(mLensShadingMap, sizeof(mLensShadingMap), + other.mLensShadingMap, sizeof(other.mLensShadingMap)); +} + int AiqResult::init() { CLEAR(mAeResults); CLEAR(mAfResults); diff --git a/src/3a/AiqResult.h b/src/3a/AiqResult.h index 87c19cf4..dc0bb370 100644 --- a/src/3a/AiqResult.h +++ b/src/3a/AiqResult.h @@ -34,6 +34,7 @@ class AiqResult { public: AiqResult(int cameraId); ~AiqResult(); + AiqResult(const AiqResult& other); int init(); int deinit() const; diff --git a/src/3a/AiqResultStorage.h b/src/3a/AiqResultStorage.h index 35f0d37a..0ef16fa9 100644 --- a/src/3a/AiqResultStorage.h +++ b/src/3a/AiqResultStorage.h @@ -124,6 +124,8 @@ class AiqResultStorage { AiqResultStorage(int cameraId); ~AiqResultStorage(); + AiqResultStorage(const AiqResultStorage&) = delete; + AiqResultStorage& operator=(const AiqResultStorage&) = delete; private: int mCameraId; diff --git a/src/3a/AiqUtils.cpp b/src/3a/AiqUtils.cpp index 4f9ec24b..cc7d8bea 100644 --- a/src/3a/AiqUtils.cpp +++ b/src/3a/AiqUtils.cpp @@ -370,11 +370,11 @@ void AiqUtils::applyTonemapSRGB(cca::cca_gbce_params* results) { CheckAndLogError(lutSize < MIN_TONEMAP_POINTS, VOID_VALUE, "Bad gamma lut size (%d) in gbce results", lutSize); for (int i = 0; i < lutSize; i++) { - if (i / (lutSize - 1) < 0.0031308) { - results->g_gamma_lut[i] = 12.92 * (i / (lutSize - 1)); + if (i / (static_cast(lutSize) - 1.0F) < 0.0031308) { + results->g_gamma_lut[i] = 12.92 * (i / (static_cast(lutSize) - 1.0F)); } else { results->g_gamma_lut[i] = - 1.055 * pow(i / static_cast(lutSize - 1), 1 / 2.4) - 0.055; + 1.055 * pow(i / (static_cast(lutSize) - 1.0F), 1 / 2.4) - 0.055; } } @@ -498,9 +498,9 @@ void AiqUtils::applyAwbGainForTonemapCurve(const camera_tonemap_curves_t& curves */ float AiqUtils::calculateHyperfocalDistance(const cca::cca_cmc &cmc) { const float DEFAULT_HYPERFOCAL_DISTANCE = 5000.0F; - // Pixel size is stored in CMC in hundreds of micrometers - const float pixelSizeMicro = cmc.optics.sensor_pix_size_h / 100; + const float pixelSizeMicro = static_cast(cmc.optics.sensor_pix_size_h) / 100; + // focal length is stored in CMC in hundreds of millimeters const float focalLengthMillis = static_cast(cmc.optics.effect_focal_length) / 100; diff --git a/src/3a/MakerNote.cpp b/src/3a/MakerNote.cpp index 9e7a9501..5c8a0e8f 100644 --- a/src/3a/MakerNote.cpp +++ b/src/3a/MakerNote.cpp @@ -127,8 +127,8 @@ int MakerNote::saveMakernoteData(int cameraId, camera_makernote_mode_t makernote } void MakerNote::updateTimestamp(int64_t sequence, uint64_t timestamp) { - LOG2("@%s, mMknState:%d", __func__, mMknState); AutoMutex lock(mMknLock); + LOG2("@%s, mMknState:%d", __func__, mMknState); CheckAndLogError(mMknState != INIT, VOID_VALUE, "@%s, mkn isn't initialized", __func__); for (auto rit = mMakernoteDataList.rbegin(); rit != mMakernoteDataList.rend(); ++rit) { diff --git a/src/3a/SensorManager.cpp b/src/3a/SensorManager.cpp index 7ab99b79..90a27eb7 100644 --- a/src/3a/SensorManager.cpp +++ b/src/3a/SensorManager.cpp @@ -120,7 +120,7 @@ void SensorManager::handleSensorModeSwitch(int64_t sequence) { if (mWdrModeSetting.sequence <= sequence) { const int wdrMode = convertTuningModeToWdrMode(mWdrModeSetting.tuningMode); LOG2("@%s, tunning mode %d, set wdrMode %d sequence %ld", sequence, __func__, - wdrMode, mWdrModeSetting.sequence); + mWdrModeSetting.tuningMode, wdrMode, mWdrModeSetting.sequence); if (mSensorHwCtrl->setWdrMode(wdrMode) == OK) { mModeSwitched = false; @@ -253,12 +253,6 @@ uint32_t SensorManager::updateSensorExposure(SensorExpGroup sensorExposures, int effectSeq, applyingSeq); return static_cast(effectSeq); } -// CRL_MODULE_S -int SensorManager::setFrameRate(float fps) -{ - return mSensorHwCtrl->setFrameRate(fps); -} -// CRL_MODULE_E int SensorManager::getSensorInfo(ia_aiq_frame_params &frameParams, ia_aiq_exposure_sensor_descriptor &sensorDescriptor) { @@ -276,7 +270,7 @@ int SensorManager::getSensorInfo(ia_aiq_frame_params &frameParams, CheckAndLogError(res.empty(), BAD_VALUE, "Supported ISYS resolutions are not configured."); // In none-ISYS cases, only take 30 fps into account. const int fps = 30; - float freq = res[0].width * res[0].height * fps / 1000000; + float freq = (res[0].width * res[0].height * fps) / 1000000.0F; sensorDescriptor = {freq, static_cast(res[0].width), static_cast(res[0].height), 24, 0, static_cast(res[0].width), 6, 0, diff --git a/src/3a/SensorManager.h b/src/3a/SensorManager.h index e6549b60..6afeee40 100644 --- a/src/3a/SensorManager.h +++ b/src/3a/SensorManager.h @@ -68,9 +68,6 @@ class SensorManager { int setAWB(float r_per_g, float b_per_g); // HDR_FEATURE_E - // CRL_MODULE_S - int setFrameRate(float fps); - // CRL_MODULE_E int getCurrentExposureAppliedDelay(); uint64_t getSofTimestamp(int64_t sequence); private: diff --git a/src/3a/intel3a/Intel3AParameter.cpp b/src/3a/intel3a/Intel3AParameter.cpp index 9aba5e4e..d3163e4d 100644 --- a/src/3a/intel3a/Intel3AParameter.cpp +++ b/src/3a/intel3a/Intel3AParameter.cpp @@ -167,7 +167,7 @@ int Intel3AParameter::setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor return OK; } -int Intel3AParameter::updateParameter(aiq_parameter_t param) { +int Intel3AParameter::updateParameter(const aiq_parameter_t& param) { updateAeParameter(param); updateAwbParameter(param); updateAfParameter(param); diff --git a/src/3a/intel3a/Intel3AParameter.h b/src/3a/intel3a/Intel3AParameter.h index 6f8bb05d..f7b7671c 100644 --- a/src/3a/intel3a/Intel3AParameter.h +++ b/src/3a/intel3a/Intel3AParameter.h @@ -34,7 +34,7 @@ class Intel3AParameter { void init(); int getCMCInfo(TuningMode tuningMode); int setSensorInfo(ia_aiq_exposure_sensor_descriptor descriptor); - int updateParameter(aiq_parameter_t param); + int updateParameter(const aiq_parameter_t& param); void updateAeResult(cca::cca_ae_results* aeResult) const ; void updateAwbResult(cca::cca_awb_results* awbResult); void updatePaResult(cca::cca_pa_params* paResult); diff --git a/src/core/CameraBuffer.h b/src/core/CameraBuffer.h index 8ecbf509..6eeea843 100644 --- a/src/core/CameraBuffer.h +++ b/src/core/CameraBuffer.h @@ -168,6 +168,10 @@ class CameraBuffer { DeviceRender(); explicit DeviceRender(const char* path_file); ~DeviceRender(); + + DeviceRender(const DeviceRender&) = delete; + DeviceRender& operator=(const DeviceRender&) = delete; + void* mapDmaBufferAddr(int fd, unsigned int bufferSize); private: @@ -185,6 +189,8 @@ class CameraBufferMapper { public: explicit CameraBufferMapper(std::shared_ptr buffer); ~CameraBufferMapper(); + CameraBufferMapper(const CameraBufferMapper&) = delete; + CameraBufferMapper& operator=(const CameraBufferMapper&) = delete; void* addr(); int size(); diff --git a/src/core/CameraContext.h b/src/core/CameraContext.h index d7d88f48..bffa74ac 100644 --- a/src/core/CameraContext.h +++ b/src/core/CameraContext.h @@ -24,9 +24,6 @@ #include "AiqSetting.h" #include "CameraTypes.h" #include "ParamDataType.h" -// JPEG_ENCODE_S -#include "EXIFMetaData.h" -// JPEG_ENCODE_E namespace icamera { @@ -51,30 +48,6 @@ struct IspParameters { } }; -// JPEG_ENCODE_S -struct JpegParameters { - double latitude; - double longitude; - double altitude; - char gpsProcessingMethod[MAX_NUM_GPS_PROCESSING_METHOD + 1]; - uint8_t gpsProcessingMethodSize; - int64_t gpsTimestamp; - int32_t rotation; - uint8_t jpegQuality; - uint8_t thumbQuality; - camera_resolution_t thumbSize; - float focalLength; - float aperture; - - JpegParameters() { - memset(this, 0, sizeof(*this)); - - jpegQuality = DEFAULT_JPEG_QUALITY; - thumbQuality = DEFAULT_JPEG_QUALITY; - } -}; -// JPEG_ENCODE_E - class DataContext { public: int64_t mFrameNumber; @@ -90,11 +63,9 @@ class DataContext { struct aiq_parameter_t mAiqParams; struct IspParameters mIspParams; -// JPEG_ENCODE_S - struct JpegParameters mJpegParams; -// JPEG_ENCODE_E DataContext(int cameraId); + DataContext(const DataContext&) = default; ~DataContext() {} void reset(); @@ -106,9 +77,6 @@ class DataContext { zoomRegion = other.zoomRegion; mAiqParams = other.mAiqParams; mIspParams = other.mIspParams; -// JPEG_ENCODE_S - mJpegParams = other.mJpegParams; -// JPEG_ENCODE_E return *this; } @@ -122,6 +90,9 @@ class CameraContext { explicit CameraContext(int cameraId); ~CameraContext(); + CameraContext(const CameraContext&) = delete; + CameraContext& operator=(const CameraContext&) = delete; + static CameraContext* getInstance(int cameraId); static void releaseInstance(int cameraId); diff --git a/src/core/CameraDevice.cpp b/src/core/CameraDevice.cpp index 96bac0e0..17d54af7 100644 --- a/src/core/CameraDevice.cpp +++ b/src/core/CameraDevice.cpp @@ -465,11 +465,6 @@ int CameraDevice::configure(stream_config_t* streamList) { CheckAndLogError(ret != OK, ret, "@%s failed to configure CSI meta device", __func__); // CSI_META_E - // CRL_MODULE_S - ret = mSensorCtrl->configure(); - CheckAndLogError(ret != OK, ret, "@%s failed to configure sensor HW", __func__); - // CRL_MODULE_E - ret = mSofSource->configure(); CheckAndLogError(ret != OK, ret, "@%s failed to configure SOF source device", __func__); @@ -652,7 +647,7 @@ int CameraDevice::createStreams(const stream_config_t* streamList, int configure for (int streamId = 0; streamId < streamCounts; streamId++) { stream_t& streamConf = streamList->streams[streamId]; LOG1("@%s, stream_number:%d, stream configure: format:%s (%dx%d)", __func__, streamCounts, - CameraUtils::pixelCode2String(streamConf.format), streamConf.width, streamConf.height); + CameraUtils::pixelCode2String(streamConf.format), streamConf.width, streamConf.height); CameraStream* stream = nullptr; // Create a normal CameraStream @@ -889,8 +884,9 @@ int CameraDevice::dqbuf(int streamId, camera_buffer_t** ubuffer) { PERF_CAMERA_ATRACE(); LOG2("@%s, stream id:%d", mCameraId, __func__, streamId); - int ret; + int ret = OK; do { + AutoMutex m(mDeviceLock); ret = mRequestThread->waitFrame(streamId, ubuffer); } while (ret == TIMED_OUT); diff --git a/src/core/CaptureUnit.cpp b/src/core/CaptureUnit.cpp index 16407426..375e930b 100644 --- a/src/core/CaptureUnit.cpp +++ b/src/core/CaptureUnit.cpp @@ -212,6 +212,7 @@ void CaptureUnit::streamOff() { int CaptureUnit::stop() { PERF_CAMERA_ATRACE(); LOG1("%s", mCameraId, __func__); + AutoMutex l(mLock); CheckWarning(mState != CAPTURE_START, OK, "@%s: device not started", __func__); mExitPending = true; @@ -225,7 +226,6 @@ int CaptureUnit::stop() { streamOff(); mPollThread->wait(); - AutoMutex l(mLock); mState = CAPTURE_STOP; for (auto device : mDevices) { diff --git a/src/core/CsiMetaDevice.cpp b/src/core/CsiMetaDevice.cpp index e01ec836..694eb0cd 100644 --- a/src/core/CsiMetaDevice.cpp +++ b/src/core/CsiMetaDevice.cpp @@ -318,7 +318,7 @@ void CsiMetaDevice::handleCsiMetaBuffer() { mCsiMetaBufferDQIndex = (mCsiMetaBufferDQIndex + 1) % mCsiMetaCameraBuffers.size(); if (CameraDump::isDumpTypeEnable(DUMP_EMBEDDED_METADATA)) { - BinParam_t bParam; + BinParam_t bParam{}; bParam.bType = BIN_TYPE_SENSOR_METADATA; bParam.mType = M_ISYS; bParam.sequence = camBuffer->getSequence(); @@ -345,9 +345,7 @@ void CsiMetaDevice::handleCsiMetaBuffer() { } int CsiMetaDevice::setFormat() { - struct v4l2_format v4l2fmt; - CLEAR(v4l2fmt); - + struct v4l2_format v4l2fmt = {}; v4l2fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; v4l2fmt.fmt.pix_mp.width = mEmbeddedMetaData.width; v4l2fmt.fmt.pix_mp.height = mEmbeddedMetaData.height; diff --git a/src/core/CsiMetaDevice.h b/src/core/CsiMetaDevice.h index 551a1711..cb420ec4 100644 --- a/src/core/CsiMetaDevice.h +++ b/src/core/CsiMetaDevice.h @@ -62,8 +62,10 @@ class CsiMetaDevice : public EventSource { int configure(); int start(); int stop(); - bool isEnabled() { return mIsCsiMetaEnabled; } - + bool isEnabled() { + AutoMutex l(mCsiMetaDeviceLock); + return mIsCsiMetaEnabled; + } void deinitLocked(); int resetState(); int initDev(); diff --git a/src/core/DeviceBase.cpp b/src/core/DeviceBase.cpp index dfc0b22a..d075290c 100644 --- a/src/core/DeviceBase.cpp +++ b/src/core/DeviceBase.cpp @@ -301,7 +301,7 @@ int MainDevice::createBufferPool(const stream_t& config) { LOG1("%s, fmt:%s(%dx%d) field:%d", DeviceBase::mCameraId, __func__, CameraUtils::pixelCode2String(config.format), config.width, config.height, config.field); - struct v4l2_format v4l2fmt; + struct v4l2_format v4l2fmt = {}; v4l2fmt.fmt.pix_mp.field = config.field; v4l2fmt.fmt.pix.width = config.width; diff --git a/src/core/FileSource.cpp b/src/core/FileSource.cpp index 6440ddee..3a61b016 100644 --- a/src/core/FileSource.cpp +++ b/src/core/FileSource.cpp @@ -264,6 +264,7 @@ bool FileSource::produce() { notifyFrame(qBuffer); + AutoMutex l(mLock); return !mExitPending; } diff --git a/src/core/IProcessingUnit.h b/src/core/IProcessingUnit.h index cf312da7..df75db6b 100644 --- a/src/core/IProcessingUnit.h +++ b/src/core/IProcessingUnit.h @@ -27,6 +27,8 @@ namespace icamera { class IProcessingUnit : public BufferQueue { public: IProcessingUnit() : mProcessThread(nullptr), mThreadRunning(false) {} + virtual ~IProcessingUnit() = default; + virtual int configure(const std::map& inputInfo, const std::map& outputInfo, const ConfigMode configModes) { diff --git a/src/core/InputEventMonitor.cpp b/src/core/InputEventMonitor.cpp index 656d3adb..75edefa1 100644 --- a/src/core/InputEventMonitor.cpp +++ b/src/core/InputEventMonitor.cpp @@ -83,8 +83,7 @@ int InputEventMonitor::configure(int eventType, int eventCode) { mFd = status; mEventType = eventType; mEventCode = eventCode; - const uint32_t modes_count = sizeof(EVENTIOCTLMODES) / sizeof(struct EventIoctlMode); - for (uint32_t i = 0; i < modes_count; ++i) { + for (uint32_t i = 0; i < sizeof(EVENTIOCTLMODES) / sizeof(EVENTIOCTLMODES[0]); ++i) { if (mEventType == EVENTIOCTLMODES[i].type) { mEventIoctlModesIndex = i; break; @@ -115,7 +114,7 @@ int InputEventMonitor::getValue() { int InputEventMonitor::readRawValue() { // Only used inside locked context so no need to get lock again if (mFd < 0 || mEventType < 0 || mEventCode < 0) return -1; - + int status = -1; uint32_t bits = EVENTIOCTLMODES[mEventIoctlModesIndex].max; uint32_t req = EVENTIOCTLMODES[mEventIoctlModesIndex].rq; @@ -124,7 +123,7 @@ int InputEventMonitor::readRawValue() { memset(codeBits, 0, sizeof(codeBits)); status = ioctl(mFd, req, codeBits); if (status >= 0) { - mValue = (codeBits[mEventCode / U32_BITS] & (1UL << (mEventCode % U32_BITS)) != 0U) ? 1 : 0; + mValue = ((codeBits[mEventCode / U32_BITS] & (1UL << (mEventCode % U32_BITS))) != 0U) ? 1 : 0; } return status; diff --git a/src/core/IpuPacAdaptor.cpp b/src/core/IpuPacAdaptor.cpp index a8aad3f5..2541654a 100644 --- a/src/core/IpuPacAdaptor.cpp +++ b/src/core/IpuPacAdaptor.cpp @@ -232,6 +232,13 @@ status_t IpuPacAdaptor::storeTerminalResult(int64_t sequence, int32_t streamId) LOG2("%s, get the aic buffer for streamId: %d, contextId: %u, terminal num: %d", __func__, streamId, data.first.second, index); + /* False Positive: Lock held by caller runAIC() which owns mPacAdaptorLock */ + /* storeTerminalResult() is only called from runAIC() */ + /* runAIC() acquires mPacAdaptorLock before calling this function */ + /* mIntelCca access here is protected by caller's lock */ + /* Adding lock here would cause deadlock */ + /* Waive by deviation: False Positive */ + /* coverity[missing_lock : FALSE] */ const ia_err iaErr = mIntelCca->getAicBuf(ccaTermConfig, streamId); CheckAndLogError(iaErr != ia_err_none, UNKNOWN_ERROR, "%s, Failed to getAicBuf. streamId: %d, contextId: %d", @@ -356,18 +363,32 @@ status_t IpuPacAdaptor::runAIC(const IspSettings* ispSettings, if (STILL_STREAM_ID == streamId) { inputParams->force_lsc_update = true; } + /* False Positive: Pipeline execution guarantees temporal separation */ + /* ProcessingUnit writes manualSettings under mIspSettingsLock protection */ + /* After write completes, settings become read-only for this frame */ + /* Pipeline advances to PAC stage where runAIC() executes */ + /* This function only reads already-finalized immutable settings */ + /* No concurrent modifications possible, writer finished before reader starts */ + /* Lock is owned by ProcessingUnit and intentionally not accessible here */ + /* Waive by deviation: False Positive */ + /* coverity[missing_lock : FALSE] */ if (ispSettings != nullptr) { inputParams->nr_setting = ispSettings->nrSetting; inputParams->ee_setting = ispSettings->eeSetting; + //coverity[missing_lock : FALSE] LOG2("%s: ISP NR setting, level: %d, strength: %d", __func__, static_cast(ispSettings->nrSetting.feature_level), static_cast(ispSettings->nrSetting.strength)); inputParams->effects = ispSettings->effects; + //coverity[missing_lock : FALSE] inputParams->manual_brightness = ispSettings->manualSettings.manualBrightness; + //coverity[missing_lock : FALSE] inputParams->manual_contrast = ispSettings->manualSettings.manualContrast; + //coverity[missing_lock : FALSE] inputParams->manual_hue = ispSettings->manualSettings.manualHue; + //coverity[missing_lock : FALSE] inputParams->manual_saturation = ispSettings->manualSettings.manualSaturation; LOG2("%s: ISP EE setting, level: %d, strength: %d", __func__, ispSettings->eeSetting.feature_level, ispSettings->eeSetting.strength); diff --git a/src/core/PSysDevice.h b/src/core/PSysDevice.h index 6e644540..57908e42 100644 --- a/src/core/PSysDevice.h +++ b/src/core/PSysDevice.h @@ -94,6 +94,9 @@ class PSysDevice { explicit PSysDevice(int cameraId); virtual ~PSysDevice(); + PSysDevice(const PSysDevice&) = delete; + PSysDevice& operator=(const PSysDevice&) = delete; + virtual int init(); virtual void deinit(); virtual void registerPSysDeviceCallback(uint8_t contextId, IPSysDeviceCallback* callback); diff --git a/src/core/ProcessingUnit.cpp b/src/core/ProcessingUnit.cpp index cab66bc4..8e805ea4 100644 --- a/src/core/ProcessingUnit.cpp +++ b/src/core/ProcessingUnit.cpp @@ -178,8 +178,11 @@ void ProcessingUnit::stop() { mProcessThread->wait(); - mRawBufferMap.clear(); - // Thread is not running. It is safe to clear the Queue + { + AutoMutex l(mBufferMapLock); + mRawBufferMap.clear(); + // Thread is not running. It is safe to clear the Queue + } BufferQueue::clearBufferQueues(); } @@ -755,8 +758,7 @@ status_t ProcessingUnit::prepareTask(CameraBufferPortMap* srcBuffers, sendPsysRequestEvent(dstBuffers, settingSequence, timestamp, EVENT_REQUEST_METADATA_READY); } - } else if ((!holdOnInput) && (!isBufferHoldForRawReprocess(inputSequence)) - && mBufferProducer != nullptr) { + } else if ((!holdOnInput) && (!isBufferHoldForRawReprocess(inputSequence)) && (mBufferProducer != nullptr)) { for (const auto& src : *srcBuffers) { mBufferProducer->qbuf(src.first, src.second); } diff --git a/src/core/RequestThread.cpp b/src/core/RequestThread.cpp index a376fd30..dd822dbd 100644 --- a/src/core/RequestThread.cpp +++ b/src/core/RequestThread.cpp @@ -118,8 +118,6 @@ void RequestThread::clearRequests() { int RequestThread::configure(const stream_config_t *streamList) { int previewIndex = -1, videoIndex = -1, stillIndex = -1; - bool block_request = false; - for (int i = 0; i < streamList->num_streams; i++) { if (streamList->streams[i].usage == CAMERA_STREAM_PREVIEW) { previewIndex = i; @@ -131,17 +129,15 @@ int RequestThread::configure(const stream_config_t *streamList) { } // Don't block request handling if no 3A stats (from video pipe) - block_request = PlatformData::isEnableAIQ(mCameraId) && - ((previewIndex >= 0) || (videoIndex >= 0)); + AutoMutex l(mPendingReqLock); + mBlockRequest = PlatformData::isEnableAIQ(mCameraId) && ((previewIndex >= 0) || + (videoIndex >= 0)); LOG1("%s: user specified Configmode: %d, blockRequest: %d", __func__, - static_cast(streamList->operation_mode), block_request); - { - AutoMutex l(mPendingReqLock); - mBlockRequest = block_request; - } + static_cast(streamList->operation_mode), mBlockRequest); mGet3AStatWithFakeRequest = mPerframeControlSupport ? PlatformData::isPsysContinueStats(mCameraId) : false; + if (mGet3AStatWithFakeRequest) { const int fakeStreamIndex = (previewIndex >= 0) ? previewIndex : ((videoIndex >= 0) ? videoIndex : stillIndex); @@ -245,7 +241,7 @@ int RequestThread::waitFrame(int streamId, camera_buffer_t **ubuffer) { int RequestThread::wait1stRequestDone() { int ret = OK; std::unique_lock lock(mFirstRequestLock); - if (mFirstRequest) { + while (mFirstRequest) { LOG2("%s, waiting the first request done", __func__); std::cv_status status = mFirstRequestSignal.wait_for( lock, @@ -253,6 +249,7 @@ int RequestThread::wait1stRequestDone() { if (status == std::cv_status::timeout) { LOGE("@%s: Wait 1st request timed out", __func__); ret = TIMED_OUT; + break; } } @@ -306,6 +303,7 @@ void RequestThread::handleEvent(EventData eventData) { break; case EVENT_FRAME_AVAILABLE: { + AutoMutex l(mPendingReqLock); if (eventData.buffer->getUserBuffer() != &mFakeReqBuf) { const int streamId = eventData.data.frameDone.streamId; FrameQueue& frameQueue = mOutputFrames[streamId]; @@ -320,7 +318,6 @@ void RequestThread::handleEvent(EventData eventData) { LOG2("%s: fake request return %u", __func__, eventData.buffer->getSequence()); } - AutoMutex l(mPendingReqLock); // Insert fake request if no any request in the HAL to keep 3A running if (mGet3AStatWithFakeRequest && (eventData.buffer->getSequence() >= mLastEffectSeq) && @@ -371,7 +368,7 @@ bool RequestThread::threadLoop() { { std::unique_lock lock(mPendingReqLock); - if (blockRequest()) { + while (blockRequest()) { std::cv_status ret = mRequestSignal.wait_for(lock, std::chrono::nanoseconds(kWaitDuration * SLOWLY_MULTIPLIER)); CheckWarning(ret == std::cv_status::timeout, true, diff --git a/src/core/SensorHwCtrl.cpp b/src/core/SensorHwCtrl.cpp index 65d26b7f..799e02e2 100644 --- a/src/core/SensorHwCtrl.cpp +++ b/src/core/SensorHwCtrl.cpp @@ -19,9 +19,6 @@ #include #include #include -// CRL_MODULE_S -#include -// CRL_MODULE_E #include "PlatformData.h" #include "SensorHwCtrl.h" @@ -35,9 +32,6 @@ namespace icamera { SensorHwCtrl::SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev) : mPixelArraySubdev(pixelArraySubdev), - // CRL_MODULE_S - mSensorOutputSubdev(sensorOutputSubdev), - // CRL_MODULE_E mCameraId(cameraId), mHorzBlank(0), mVertBlank(0), @@ -49,21 +43,6 @@ SensorHwCtrl::SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, mCurFll(0), mCalculatingFrameDuration(true) { LOG1(" @%s", mCameraId, __func__); - // CRL_MODULE_S - /** - * Try to call V4L2_CID_LINE_LENGTH_PIXELS, if failed, it means llp can't - * be read directly from sensor. Then calculate it with HBlank. - * fll will be in the same case. - */ - if (mPixelArraySubdev != nullptr) { - int llp = 0; - const int status = mPixelArraySubdev->GetControl(V4L2_CID_LINE_LENGTH_PIXELS, &llp); - if (status == OK) { - LOG1("%s, some sensors can get llp directly, don't calculate it", __func__); - mCalculatingFrameDuration = false; - } - } - // CRL_MODULE_E } SensorHwCtrl* SensorHwCtrl::createSensorCtrl(int cameraId) { @@ -106,12 +85,6 @@ SensorHwCtrl* SensorHwCtrl::createSensorCtrl(int cameraId) { return sensorCtrl; } -// CRL_MODULE_S -int SensorHwCtrl::configure() { - return OK; -} -// CRL_MODULE_E - int SensorHwCtrl::getActivePixelArraySize(int& width, int& height, int& pixelCode) { HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2); CheckAndLogError(mPixelArraySubdev == nullptr, NO_INIT, "pixel array sub device is not set"); @@ -150,17 +123,6 @@ int SensorHwCtrl::setExposure(const vector& coarseExposures, CheckAndLogError((coarseExposures.empty() || fineExposures.empty()), BAD_VALUE, "No exposure data!"); - // CRL_MODULE_S - if (coarseExposures.size() > 1) { - if (PlatformData::getSensorExposureType(mCameraId) == SENSOR_MULTI_EXPOSURES) { - return setMultiExposures(coarseExposures, fineExposures); - } else if (PlatformData::getSensorExposureType(mCameraId) == - SENSOR_DUAL_EXPOSURES_DCG_AND_VS) { - return setDualExposuresDCGAndVS(coarseExposures, fineExposures); - } - } - // CRL_MODULE_E - LOG2("%s coarseExposure=%d fineExposure=%d", __func__, coarseExposures[0], fineExposures[0]); LOG2("SENSORCTRLINFO: exposure_value=%d", coarseExposures[0]); int status = mPixelArraySubdev->SetControl(V4L2_CID_EXPOSURE, coarseExposures[0]); @@ -169,79 +131,11 @@ int SensorHwCtrl::setExposure(const vector& coarseExposures, return OK; } -// CRL_MODULE_S -int SensorHwCtrl::setMultiExposures(const vector& coarseExposures, - const vector& fineExposures) { - int status = BAD_VALUE; - int shortExp = coarseExposures[0]; - int longExp = coarseExposures[1]; - - if (coarseExposures.size() > 2) { - LOG2("coarseExposure[0]=%d fineExposure[0]=%d", coarseExposures[0], fineExposures[0]); - // The first exposure is very short exposure if larger than 2 exposures. - status = mPixelArraySubdev->SetControl(CRL_CID_EXPOSURE_SHS2, coarseExposures[0]); - CheckAndLogError(status != OK, status, "failed to set exposure SHS2 %d.", - coarseExposures[0]); - - shortExp = coarseExposures[1]; - longExp = coarseExposures[2]; - - LOG2("SENSORCTRLINFO: exposure_long=%d", coarseExposures[2]); // long - LOG2("SENSORCTRLINFO: exposure_med=%d", coarseExposures[1]); // short - LOG2("SENSORCTRLINFO: exposure_short=%d", coarseExposures[0]); // very short - } - - LOG2("shortExp=%d longExp=%d", shortExp, longExp); - status = mPixelArraySubdev->SetControl(CRL_CID_EXPOSURE_SHS1, shortExp); - CheckAndLogError(status != OK, status, "failed to set exposure SHS1 %d.", shortExp); - - status = mPixelArraySubdev->SetControl(V4L2_CID_EXPOSURE, longExp); - CheckAndLogError(status != OK, status, "failed to set long exposure %d.", longExp); - LOG2("SENSORCTRLINFO: exposure_value=%d", longExp); - - return status; -} - -int SensorHwCtrl::setDualExposuresDCGAndVS(const vector& coarseExposures, - const vector& fineExposures) { - int status = BAD_VALUE; - int longExp = coarseExposures[1]; - - if (coarseExposures.size() > 2) { - LOG2("coarseExposure[0]=%d fineExposure[0]=%d", coarseExposures[0], fineExposures[0]); - // The first exposure is very short exposure for DCG + VS case. - status = mPixelArraySubdev->SetControl(CRL_CID_EXPOSURE_SHS1, coarseExposures[0]); - CheckAndLogError(status != OK, status, "failed to set exposure SHS1 %d.", - coarseExposures[0]); - - longExp = coarseExposures[2]; - LOG2("SENSORCTRLINFO: exposure_long=%d", coarseExposures[2]); // long - } - - status = mPixelArraySubdev->SetControl(V4L2_CID_EXPOSURE, longExp); - CheckAndLogError(status != OK, status, "failed to set long exposure %d.", longExp); - LOG2("SENSORCTRLINFO: exposure_value=%d", longExp); - - return status; -} -// CRL_MODULE_E - int SensorHwCtrl::setAnalogGains(const vector& analogGains) { HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2); CheckAndLogError(mPixelArraySubdev == nullptr, NO_INIT, "pixel array sub device is not set"); CheckAndLogError(analogGains.empty(), BAD_VALUE, "No analog gain data!"); - // CRL_MODULE_S - if (analogGains.size() > 1) { - if (PlatformData::getSensorGainType(mCameraId) == SENSOR_MULTI_DG_AND_CONVERSION_AG) { - return setConversionGain(analogGains); - } else if (PlatformData::getSensorGainType(mCameraId) == SENSOR_MULTI_DG_AND_DIRECT_AG) { - LOG2("sensor multi conversion gain"); - return setMultiAnalogGain(analogGains); - } - } - // CRL_MODULE_E - LOG2("%s analogGain=%d", __func__, analogGains[0]); int status = mPixelArraySubdev->SetControl(V4L2_CID_ANALOGUE_GAIN, analogGains[0]); CheckAndLogError((status != 0), status, "failed to set analog gain %d.", analogGains[0]); @@ -254,26 +148,6 @@ int SensorHwCtrl::setDigitalGains(const vector& digitalGains) { CheckAndLogError(mPixelArraySubdev == nullptr, NO_INIT, "pixel array sub device is not set"); CheckAndLogError(digitalGains.empty(), BAD_VALUE, "No digital gain data!"); - // CRL_MODULE_S - if (digitalGains.size() > 1) { - if (PlatformData::getSensorGainType(mCameraId) == SENSOR_MULTI_DG_AND_CONVERSION_AG) { - return setMultiDigitalGain(digitalGains); - } else if (PlatformData::getSensorGainType(mCameraId) == SENSOR_MULTI_DG_AND_DIRECT_AG) { - LOG2("sensor multi conversion gain"); - return setMultiDigitalGain(digitalGains); - } - } - - if ((mWdrMode != 0) && - (PlatformData::getSensorGainType(mCameraId) == ISP_DG_AND_SENSOR_DIRECT_AG)) { - LOG2("%s: WDR mode, skip sensor DG, all digital gain is passed to ISP", __func__); - } else if (PlatformData::isUsingSensorDigitalGain(mCameraId)) { - if (mPixelArraySubdev->SetControl(V4L2_CID_GAIN, digitalGains[0]) != OK) { - LOGW("set digital gain failed"); - } - } - // CRL_MODULE_E - LOG2("%s digitalGain=%d", __func__, digitalGains[0]); int status = mPixelArraySubdev->SetControl(V4L2_CID_DIGITAL_GAIN, digitalGains[0]); CheckAndLogError((status != 0), status, "failed to set digitalGain gain %d.", digitalGains[0]); @@ -281,78 +155,6 @@ int SensorHwCtrl::setDigitalGains(const vector& digitalGains) { return OK; } -// CRL_MODULE_S -int SensorHwCtrl::setMultiDigitalGain(const vector& digitalGains) { - int status = BAD_VALUE; - int shortDg = digitalGains[0]; - int longDg = digitalGains[1]; - - if (digitalGains.size() > 2) { - LOG2("digitalGains[0]=%d", digitalGains[0]); - status = mPixelArraySubdev->SetControl(CRL_CID_DIGITAL_GAIN_VS, digitalGains[0]); - CheckAndLogError(status != OK, status, "failed to set very short DG %d.", digitalGains[0]); - - shortDg = digitalGains[1]; - longDg = digitalGains[2]; - } - - LOG2("shortDg=%d longDg=%d", shortDg, longDg); - status = mPixelArraySubdev->SetControl(CRL_CID_DIGITAL_GAIN_S, shortDg); - CheckAndLogError(status != OK, status, "failed to set short DG %d.", shortDg); - - status = mPixelArraySubdev->SetControl(V4L2_CID_GAIN, longDg); - CheckAndLogError(status != OK, status, "failed to set long DG %d.", longDg); - - return status; -} - -int SensorHwCtrl::setMultiAnalogGain(const vector& analogGains) { - int status = BAD_VALUE; - int shortAg = analogGains[0]; - int longAg = analogGains[1]; - - if (analogGains.size() > 2) { - LOG2("VS AG %d", analogGains[0]); - const int status = mPixelArraySubdev->SetControl(CRL_CID_ANALOG_GAIN_VS, analogGains[0]); - CheckAndLogError(status != OK, status, "failed to set VS AG %d", analogGains[0]); - - shortAg = analogGains[1]; - longAg = analogGains[2]; - - LOG2("SENSORCTRLINFO: gain_long=%d", analogGains[2]); // long - LOG2("SENSORCTRLINFO: gain_med=%d", analogGains[1]); // short - LOG2("SENSORCTRLINFO: gain_short=%d", analogGains[0]); // very short - } - - LOG2("shortAg=%d longAg=%d", shortAg, longAg); - status = mPixelArraySubdev->SetControl(CRL_CID_ANALOG_GAIN_S, shortAg); - CheckAndLogError(status != OK, status, "failed to set short AG %d.", shortAg); - - status = mPixelArraySubdev->SetControl(V4L2_CID_ANALOGUE_GAIN, longAg); - CheckAndLogError(status != OK, status, "failed to set long AG %d.", longAg); - - return status; -} - -int SensorHwCtrl::setConversionGain(const vector& analogGains) { - CheckAndLogError(analogGains.size() < 2, BAD_VALUE, "Gain data error!"); - - /* [0, 1] bits are long AG, [2, 3] bits are short AG, [4, 5] bits are very short AG. - [6] bit is long conversion gain, [7] bit is very short conversion gain. - Long AG: 0x0X0000XX - Short AG: 0x0000XX00 - Very Short AG: 0xX0XX0000 */ - int value = analogGains[0] | analogGains[1] | analogGains[2]; - LOG2("very short AG %d, short AG %d, long AG %d, conversion value %d", analogGains[0], - analogGains[1], analogGains[2], value); - - const int status = mPixelArraySubdev->SetControl(V4L2_CID_ANALOGUE_GAIN, value); - CheckAndLogError(status != OK, status, "failed to set AG %d", value); - - return OK; -} -// CRL_MODULE_E - int SensorHwCtrl::setLineLengthPixels(int llp) { int status = OK; LOG2("@%s, llp:%d", __func__, llp); @@ -362,10 +164,6 @@ int SensorHwCtrl::setLineLengthPixels(int llp) { if (mHorzBlank != horzBlank) { status = mPixelArraySubdev->SetControl(V4L2_CID_HBLANK, horzBlank); } - // CRL_MODULE_S - } else { - status = mPixelArraySubdev->SetControl(V4L2_CID_LINE_LENGTH_PIXELS, llp); - // CRL_MODULE_E } CheckAndLogError(status != OK, status, "failed to set llp. (%d)", status); @@ -383,10 +181,6 @@ int SensorHwCtrl::setFrameLengthLines(int fll) { if (mVertBlank != vertBlank) { status = mPixelArraySubdev->SetControl(V4L2_CID_VBLANK, vertBlank); } - // CRL_MODULE_S - } else { - status = mPixelArraySubdev->SetControl(V4L2_CID_FRAME_LENGTH_LINES, fll); - // CRL_MODULE_E } mCurFll = fll; @@ -424,13 +218,6 @@ int SensorHwCtrl::getLineLengthPixels(int& llp) { mHorzBlank = horzBlank; llp = horzBlank + mCropWidth; } - // CRL_MODULE_S - } else { - status = mPixelArraySubdev->GetControl(V4L2_CID_LINE_LENGTH_PIXELS, &llp); - if (status == OK) { - mHorzBlank = llp - mCropWidth; - } - // CRL_MODULE_E } LOG2("@%s, llp:%d", __func__, llp); @@ -449,13 +236,6 @@ int SensorHwCtrl::getFrameLengthLines(int& fll) { mVertBlank = vertBlank; fll = vertBlank + mCropHeight; } - // CRL_MODULE_S - } else { - status = mPixelArraySubdev->GetControl(V4L2_CID_FRAME_LENGTH_LINES, &fll); - if (status == OK) { - mVertBlank = fll - mCropHeight; - } - // CRL_MODULE_E } LOG2("@%s, fll:%d", __func__, fll); @@ -515,8 +295,6 @@ int SensorHwCtrl::getExposureRange(int& exposureMin, int& exposureMax, int& expo // HDR_FEATURE_S int SensorHwCtrl::setWdrMode(int mode) { HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2); - CheckAndLogError(mSensorOutputSubdev == nullptr, NO_INIT, "sensor output sub device is not set"); - LOG2("%s WDR Mode=%d", __func__, mode); int ret = OK; @@ -525,7 +303,6 @@ int SensorHwCtrl::setWdrMode(int mode) { if ((PlatformData::getSensorExposureType(mCameraId) != SENSOR_RELATIVE_MULTI_EXPOSURES) && (PlatformData::getSensorExposureType(mCameraId) != SENSOR_DUAL_EXPOSURES_DCG_AND_VS)) { LOG2("%s: set WDR mode", __func__); - ret = mSensorOutputSubdev->SetControl(V4L2_CID_WDR_MODE, mode); } return ret; @@ -544,38 +321,4 @@ int SensorHwCtrl::setAWB(float r_per_g, float b_per_g) { } // HDR_FEATURE_E -// CRL_MODULE_S -int SensorHwCtrl::setFrameRate(float fps) { - HAL_TRACE_CALL(CAMERA_DEBUG_LOG_LEVEL2); - CheckAndLogError(mSensorOutputSubdev == nullptr, NO_INIT, "sensor output sub device is not set"); - - struct v4l2_queryctrl query; - CLEAR(query); - query.id = V4L2_CID_LINK_FREQ; - int status = mSensorOutputSubdev->QueryControl(&query); - CheckAndLogError(status != OK, status, "Couldn't get V4L2_CID_LINK_FREQ, status:%d", status); - - LOG2("@%s, query V4L2_CID_LINK_FREQ:, default_value:%d, maximum:%d, minimum:%d, step:%d", - __func__, query.default_value, query.maximum, query.minimum, query.step); - - int mode = 0; - if (query.maximum == query.minimum) { - mode = query.default_value; - } else { - /*********************************************************************************** - * WA: This heavily depends on sensor driver implementation, need to find a graceful - * solution. - * imx185: - * When fps larger than 30, should switch to high speed mode, currently only - * 0, 1, 2 are available. 0 means 720p 30fps, 1 means 2M 30fps, and 2 means 2M 60fps. - * imx290: - * 0 and 1 available, for 30 and higher FPS. - ***********************************************************************************/ - mode = (fps > 30) ? query.maximum : (query.maximum - 1); - } - LOG2("@%s, set V4L2_CID_LINK_FREQ to %d, fps %f", __func__, mode, fps); - return mSensorOutputSubdev->SetControl(V4L2_CID_LINK_FREQ, mode); -} -// CRL_MODULE_E - } // namespace icamera diff --git a/src/core/SensorHwCtrl.h b/src/core/SensorHwCtrl.h index 1963eb39..171751f7 100644 --- a/src/core/SensorHwCtrl.h +++ b/src/core/SensorHwCtrl.h @@ -32,9 +32,6 @@ class SensorHwCtrl { SensorHwCtrl(int cameraId, V4L2Subdevice* pixelArraySubdev, V4L2Subdevice* sensorOutputSubdev); virtual ~SensorHwCtrl() {} - // CRL_MODULE_S - virtual int configure(); - // CRL_MODULE_E virtual int setTestPatternMode(int32_t testPatternMode); virtual int getPixelRate(int& pixelRate); virtual int setExposure(const std::vector& coarseExposures, @@ -69,29 +66,13 @@ class SensorHwCtrl { virtual int setAWB(float r_per_g, float b_per_g); // HDR_FEATURE_E - // CRL_MODULE_S - virtual int setFrameRate(float fps); - // CRL_MODULE_E private: int setLineLengthPixels(int llp); int getLineLengthPixels(int& llp); int setFrameLengthLines(int fll); int getFrameLengthLines(int& fll); - // CRL_MODULE_S - int setMultiExposures(const std::vector& coarseExposures, - const std::vector& fineExposures); - int setDualExposuresDCGAndVS(const std::vector& coarseExposures, - const std::vector& fineExposures); - int setConversionGain(const std::vector& analogGains); - int setMultiDigitalGain(const std::vector& digitalGains); - int setMultiAnalogGain(const std::vector& analogGains); - // CRL_MODULE_E - V4L2Subdevice* mPixelArraySubdev; - // CRL_MODULE_S - V4L2Subdevice* mSensorOutputSubdev; - // CRL_MODULE_E int mCameraId; int mHorzBlank; int mVertBlank; @@ -137,9 +118,6 @@ class DummySensor : public SensorHwCtrl { // HDR_FEATURE_S virtual int setWdrMode(int mode) { return OK; } // HDR_FEATURE_E - // CRL_MODULE_S - virtual int setFrameRate(float fps) { return OK; } - // CRL_MODULE_E }; } // namespace icamera diff --git a/src/core/SwPostProcessUnit.cpp b/src/core/SwPostProcessUnit.cpp index 60ef096a..60c2d833 100644 --- a/src/core/SwPostProcessUnit.cpp +++ b/src/core/SwPostProcessUnit.cpp @@ -164,25 +164,6 @@ status_t SwPostProcessUnit::configure(const stream_t& srcStream, const stream_t& processingOrder.push_back(info); } -// JPEG_ENCODE_S - // Encode - if (dstStream.format == V4L2_PIX_FMT_JPEG && - mPostProcessorCore->isPostProcessTypeSupported(POST_PROCESS_JPEG_ENCODING)) { - mPostProcessType |= POST_PROCESS_JPEG_ENCODING; - info.type = POST_PROCESS_JPEG_ENCODING; - info.inputInfo = inputStreamInfo; - info.outputInfo.width = dstStream.width; - info.outputInfo.height = dstStream.height; - info.outputInfo.stride = dstStream.width; - info.outputInfo.format = V4L2_PIX_FMT_NV12; // should get the actual format - info.outputInfo.size = - CameraUtils::getFrameSize(info.outputInfo.format, info.outputInfo.width, - info.outputInfo.height, false, false, false); - inputStreamInfo = info.outputInfo; - processingOrder.push_back(info); - } -// JPEG_ENCODE_E - if (inputStreamInfo.width != dstStream.width || inputStreamInfo.height != dstStream.height) { //inputStreamInfo.format != diff --git a/src/core/processingUnit/IPipeManager.h b/src/core/processingUnit/IPipeManager.h index 4732f67d..3580f604 100644 --- a/src/core/processingUnit/IPipeManager.h +++ b/src/core/processingUnit/IPipeManager.h @@ -86,7 +86,7 @@ class IPipeManager : public EventListener { virtual void setControl(int64_t sequence, const PipeControl& control) {} - virtual void addTask(PipeTaskData taskParam) = 0; + virtual void addTask(const PipeTaskData& taskParam) = 0; virtual int prepareIpuParams(IspSettings* settings, int64_t sequence = 0, int streamId = VIDEO_STREAM_ID) { return OK; diff --git a/src/core/processingUnit/PipeLine.cpp b/src/core/processingUnit/PipeLine.cpp index afd82f7b..5aca942f 100644 --- a/src/core/processingUnit/PipeLine.cpp +++ b/src/core/processingUnit/PipeLine.cpp @@ -32,7 +32,8 @@ PipeLine::PipeLine(int cameraId, int streamId, std::shared_ptr gc, mGraphConfig(gc), mScheduler(scheduler), mPSysDevice(nullptr), - mPacAdaptor(nullptr) { + mPacAdaptor(nullptr), + mTuningMode(TUNING_MODE_VIDEO) { LOG1("@%s stream %d", mCameraId, __func__, mStreamId); } diff --git a/src/core/processingUnit/PipeLine.h b/src/core/processingUnit/PipeLine.h index 0f881f00..003a0545 100644 --- a/src/core/processingUnit/PipeLine.h +++ b/src/core/processingUnit/PipeLine.h @@ -76,6 +76,9 @@ class PipeLine { std::shared_ptr scheduler); virtual ~PipeLine(); + PipeLine(const PipeLine&) = delete; + PipeLine& operator=(const PipeLine&) = delete; + void deinit(); int configure(TuningMode tuningMode, IpuPacAdaptor* adaptor); int start(); diff --git a/src/core/processingUnit/PipeManager.cpp b/src/core/processingUnit/PipeManager.cpp index 5307f1f5..16ceac60 100644 --- a/src/core/processingUnit/PipeManager.cpp +++ b/src/core/processingUnit/PipeManager.cpp @@ -399,7 +399,7 @@ void PipeManager::setControl(int64_t sequence, const PipeControl& control) { } } -void PipeManager::addTask(PipeTaskData taskParam) { +void PipeManager::addTask(const PipeTaskData& taskParam) { LOG2("@%s", mCameraId, __func__); TaskInfo task = {}; @@ -437,7 +437,7 @@ void PipeManager::addTask(PipeTaskData taskParam) { TRACE_LOG_PROCESS("run PAC", __func__, MAKE_COLOR(sequence), sequence); for (const auto& id : activeStreamIds) { - (void)prepareIpuParams(&taskParam.mIspSettings, sequence, id); + (void)prepareIpuParams(&task.mTaskData.mIspSettings, sequence, id); } queueBuffers(taskParam, mInputMaps, mOutputMaps, mDefaultMainInputPort); } diff --git a/src/core/processingUnit/PipeManager.h b/src/core/processingUnit/PipeManager.h index 60fdb548..b0109f44 100644 --- a/src/core/processingUnit/PipeManager.h +++ b/src/core/processingUnit/PipeManager.h @@ -43,11 +43,14 @@ class PipeManager : public IPipeManager { virtual void setControl(int64_t sequence, const PipeControl& control); - virtual void addTask(PipeTaskData taskParam); + virtual void addTask(const PipeTaskData& taskParam); virtual int prepareIpuParams(IspSettings* settings, int64_t sequence = 0, int streamId = VIDEO_STREAM_ID); protected: + PipeManager(const PipeManager&) = delete; + PipeManager& operator=(const PipeManager&) = delete; + /** * @brief handle bufferDone and metadata event from pipeStage */ diff --git a/src/image_process/PostProcessorBase.cpp b/src/image_process/PostProcessorBase.cpp index 8143c174..5d8639c5 100644 --- a/src/image_process/PostProcessorBase.cpp +++ b/src/image_process/PostProcessorBase.cpp @@ -111,210 +111,4 @@ status_t ConvertProcess::doPostProcessing(const shared_ptr& inBuf, return OK; } -// JPEG_ENCODE_S -JpegProcess::JpegProcess(int cameraId) - : PostProcessorBase("JpegEncode"), - mCameraId(cameraId), - mCropBuf(nullptr), - mScaleBuf(nullptr), - mThumbOut(nullptr), - mExifData(nullptr) { - LOG1("@%s create jpeg encode processor", __func__); - - mProcessor = IImageProcessor::createImageProcessor(); - mJpegEncoder = IJpegEncoder::createJpegEncoder(); - mMemoryType = mJpegEncoder->getMemoryType(); - mJpegMaker = std::unique_ptr(new JpegMaker()); -} - -void JpegProcess::attachJpegBlob(const EncodePackage& package) { - LOG2("@%s, encoded data size: %d, exif data size: %d", __func__, package.encodedDataSize, - package.exifDataSize); - uint8_t* resultPtr = static_cast(package.outputData) + package.outputSize - - sizeof(struct camera3_jpeg_blob); - - // save jpeg size at the end of file - auto* blob = reinterpret_cast(resultPtr); - blob->jpeg_blob_id = CAMERA3_JPEG_BLOB_ID; - blob->jpeg_size = package.encodedDataSize + package.exifDataSize; -} - -std::shared_ptr JpegProcess::cropAndDownscaleThumbnail( - int thumbWidth, int thumbHeight, const shared_ptr& inBuf) { - LOG2("@%s, input size: %dx%d, thumbnail info: %dx%d", __func__, - inBuf->getWidth(), inBuf->getHeight(), thumbWidth, thumbHeight); - - if (thumbWidth <= 0 || thumbHeight <= 0) { - LOGW("@%s, skip, thumbWidth:%d, thumbHeight:%d", __func__, thumbWidth, thumbHeight); - return nullptr; - } - - int ret = OK; - shared_ptr tempBuffer = inBuf; - - // Do crop first if needed - if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_CROP) && - inBuf->getWidth() * thumbHeight != inBuf->getHeight() * thumbWidth) { - int width = 0, height = 0; - if (inBuf->getWidth() * thumbHeight < inBuf->getHeight() * thumbWidth) { - width = inBuf->getWidth(); - height = ALIGN(inBuf->getWidth() * thumbHeight / thumbWidth, 2); - } else { - width = ALIGN(inBuf->getHeight() * thumbWidth / thumbHeight, 2); - height = inBuf->getHeight(); - } - - if (mCropBuf && (mCropBuf->getWidth() != width || mCropBuf->getHeight() != height)) { - mCropBuf.reset(); - } - if (!mCropBuf) { - int bufSize = CameraUtils::getFrameSize(inBuf->getFormat(), width, height, - false, false, false); - mCropBuf = CameraBuffer::create(mMemoryType, bufSize, 0, inBuf->getFormat(), - width, height); - CheckAndLogError(!mCropBuf, nullptr, - "%s, Failed to allocate the internal crop buffer", __func__); - } - - LOG2("@%s, Crop the main buffer from %dx%d to %dx%d", __func__, inBuf->getWidth(), - inBuf->getHeight(), width, height); - ret = mProcessor->cropFrame(inBuf, mCropBuf); - CheckAndLogError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__); - tempBuffer = mCropBuf; - } - - if (IImageProcessor::isProcessingTypeSupported(POST_PROCESS_SCALING)) { - if (mScaleBuf && - (mScaleBuf->getWidth() != thumbWidth || mScaleBuf->getHeight() != thumbHeight)) - mScaleBuf.reset(); - if (!mScaleBuf) { - int bufSize = CameraUtils::getFrameSize(inBuf->getFormat(), thumbWidth, thumbHeight, - false, false, false); - mScaleBuf = CameraBuffer::create(mMemoryType, bufSize, 0, inBuf->getFormat(), - thumbWidth, thumbHeight); - CheckAndLogError(!mScaleBuf, nullptr, - "%s, Failed to allocate the internal crop buffer", __func__); - } - - LOG2("@%s, Scale the buffer from %dx%d to %dx%d", __func__, inBuf->getWidth(), - inBuf->getHeight(), thumbWidth, thumbHeight); - ret = mProcessor->scaleFrame(tempBuffer, mScaleBuf); - CheckAndLogError(ret != OK, nullptr, "%s, Failed to crop the frame", __func__); - tempBuffer = mScaleBuf; - } - - if (tempBuffer->getWidth() != thumbWidth || tempBuffer->getHeight() != thumbHeight) { - LOGE("%s, Failed to crop & downscale the main buffer to thumbnail buffer", __func__); - return nullptr; - } - - return tempBuffer; -} - -void JpegProcess::fillEncodeInfo(const shared_ptr& inBuf, - const shared_ptr& outBuf, - EncodePackage& package) { - package.inputWidth = inBuf->getWidth(); - package.inputHeight = inBuf->getHeight(); - package.inputStride = inBuf->getStride(); - package.inputFormat = inBuf->getFormat(); - package.inputSize = inBuf->getBufferSize(); - - if (inBuf->getMemory() == V4L2_MEMORY_DMABUF && outBuf->getMemory() == V4L2_MEMORY_DMABUF) { - camera_buffer_t* uInBuf = inBuf->getUserBuffer(); - package.inputBufferHandle = &(uInBuf->privateHandle); - - camera_buffer_t* uOutBuf = outBuf->getUserBuffer(); - package.outputBufferHandle = &(uOutBuf->privateHandle); - } - - package.inputData = inBuf->getBufferAddr(); - package.outputData = outBuf->getBufferAddr(); - - package.outputWidth = outBuf->getWidth(); - package.outputHeight = outBuf->getHeight(); - package.outputSize = outBuf->getBufferSize(); -} - -status_t JpegProcess::doPostProcessing(const shared_ptr& inBuf, - shared_ptr& outBuf) { - PERF_CAMERA_ATRACE_PARAM1(mName.c_str(), 0); - LOG1("@%s processor name: %s", __func__, mName.c_str()); - - bool isEncoded = false; - - icamera::ExifMetaData exifMetadata; - status_t status = mJpegMaker->setupExifWithMetaData(inBuf->getWidth(), inBuf->getHeight(), - inBuf->getSequence(), TIMEVAL2NSECS(inBuf->getTimestamp()),mCameraId, - &exifMetadata); - CheckAndLogError(status != OK, UNKNOWN_ERROR, "@%s, Setup exif metadata failed.", __func__); - LOG2("@%s: setting exif metadata done!", __func__); - - std::shared_ptr thumbInput = cropAndDownscaleThumbnail( - exifMetadata.mJpegSetting.thumbWidth, exifMetadata.mJpegSetting.thumbHeight, inBuf); - - EncodePackage thumbnailPackage; - if (thumbInput) { - if (mThumbOut == nullptr || - mThumbOut->getWidth() != exifMetadata.mJpegSetting.thumbWidth || - mThumbOut->getHeight() != exifMetadata.mJpegSetting.thumbHeight || - mThumbOut->getFormat() != outBuf->getFormat()) { - int bufSize = CameraUtils::getFrameSize(inBuf->getFormat(), - exifMetadata.mJpegSetting.thumbWidth, - exifMetadata.mJpegSetting.thumbHeight, - false, false, false); - - mThumbOut = CameraBuffer::create(mMemoryType, bufSize, 0, V4L2_PIX_FMT_JPEG, - exifMetadata.mJpegSetting.thumbWidth, - exifMetadata.mJpegSetting.thumbHeight); - CheckAndLogError(!mThumbOut, NO_MEMORY, - "%s, Failed to allocate the internal crop buffer", __func__); - } - - // encode thumbnail image - fillEncodeInfo(thumbInput, mThumbOut, thumbnailPackage); - thumbnailPackage.quality = exifMetadata.mJpegSetting.jpegThumbnailQuality; - // the exifDataSize should be 0 for encoding thumbnail - thumbnailPackage.exifData = nullptr; - thumbnailPackage.exifDataSize = 0; - - do { - isEncoded = mJpegEncoder->doJpegEncode(&thumbnailPackage); - thumbnailPackage.quality -= 5; - } while (thumbnailPackage.encodedDataSize > THUMBNAIL_SIZE_LIMITATION && - thumbnailPackage.quality > 0); - - if (!isEncoded || thumbnailPackage.quality < 0) { - LOGW( - "Failed to generate thumbnail, isEncoded: %d, encoded thumbnail size: %d, " - "quality:%d", - isEncoded, thumbnailPackage.encodedDataSize, thumbnailPackage.quality); - } - } - - // save exif data - uint32_t exifBufSize = ENABLE_APP2_MARKER ? EXIF_SIZE_LIMITATION * 2 : EXIF_SIZE_LIMITATION; - if (mExifData == nullptr) { - mExifData = std::unique_ptr(new unsigned char[exifBufSize]); - } - uint8_t* finalExifDataPtr = static_cast(mExifData.get()); - uint32_t finalExifDataSize = 0; - status = mJpegMaker->getExif(thumbnailPackage, finalExifDataPtr, &finalExifDataSize); - CheckAndLogError(status != OK, status, "@%s, Failed to get Exif", __func__); - LOG2("%s, exifBufSize %d, finalExifDataSize %d", __func__, exifBufSize, finalExifDataSize); - - // encode main image - EncodePackage finalEncodePackage; - fillEncodeInfo(inBuf, outBuf, finalEncodePackage); - finalEncodePackage.quality = exifMetadata.mJpegSetting.jpegQuality; - finalEncodePackage.exifData = finalExifDataPtr; - finalEncodePackage.exifDataSize = finalExifDataSize; - isEncoded = mJpegEncoder->doJpegEncode(&finalEncodePackage); - CheckAndLogError(!isEncoded, UNKNOWN_ERROR, "@%s, Failed to encode main image", __func__); - mJpegMaker->writeExifData(&finalEncodePackage); - attachJpegBlob(finalEncodePackage); - - return OK; -} -// JPEG_ENCODE_E } // namespace icamera diff --git a/src/image_process/PostProcessorBase.h b/src/image_process/PostProcessorBase.h index f19833b0..b6b71e03 100644 --- a/src/image_process/PostProcessorBase.h +++ b/src/image_process/PostProcessorBase.h @@ -22,11 +22,6 @@ #include "IImageProcessor.h" #include "iutils/Errors.h" #include "iutils/Utils.h" -// JPEG_ENCODE_S -#include "EXIFMetaData.h" -#include "IJpegEncoder.h" -#include "JpegMaker.h" -// JPEG_ENCODE_E namespace icamera { @@ -88,34 +83,4 @@ class ConvertProcess : public PostProcessorBase { std::shared_ptr& outBuf); }; -// JPEG_ENCODE_S -class JpegProcess : public PostProcessorBase { - public: - JpegProcess(int cameraId); - ~JpegProcess(){} - - virtual status_t doPostProcessing(const std::shared_ptr& inBuf, - std::shared_ptr& outBuf); - - private: - void attachJpegBlob(const EncodePackage& package); - - std::shared_ptr cropAndDownscaleThumbnail( - int thumbWidth, int thumbHeight, const std::shared_ptr& inBuf); - void fillEncodeInfo(const std::shared_ptr& inBuf, - const std::shared_ptr& outBuf, - EncodePackage& package); - - private: - int mCameraId; - - std::shared_ptr mCropBuf; - std::shared_ptr mScaleBuf; - std::shared_ptr mThumbOut; - - std::unique_ptr mJpegMaker; - std::unique_ptr mJpegEncoder; - std::unique_ptr mExifData; -}; -// JPEG_ENCODE_E } // namespace icamera diff --git a/src/image_process/PostProcessorCore.cpp b/src/image_process/PostProcessorCore.cpp index bc5bb372..41e12824 100644 --- a/src/image_process/PostProcessorCore.cpp +++ b/src/image_process/PostProcessorCore.cpp @@ -49,11 +49,6 @@ status_t PostProcessorCore::createProcessor() { case POST_PROCESS_CONVERT: processor = std::make_shared(); break; -// JPEG_ENCODE_S - case POST_PROCESS_JPEG_ENCODING: - processor = std::make_shared(mCameraId); - break; -// JPEG_ENCODE_E case POST_PROCESS_NONE: break; default: diff --git a/src/iutils/CameraLog.h b/src/iutils/CameraLog.h index 79d316eb..e2f48f80 100644 --- a/src/iutils/CameraLog.h +++ b/src/iutils/CameraLog.h @@ -204,6 +204,10 @@ class ScopedTrace { } } + // Prevent copying (RAII class should not be copied) + ScopedTrace(const ScopedTrace&) = delete; + ScopedTrace& operator=(const ScopedTrace&) = delete; + private: int mLevel; const char* mName; diff --git a/src/iutils/CameraShm.cpp b/src/iutils/CameraShm.cpp index f766318d..13ac8d91 100644 --- a/src/iutils/CameraShm.cpp +++ b/src/iutils/CameraShm.cpp @@ -92,9 +92,9 @@ void CameraSharedMemory::acquireSharedMemory() { CheckAndLogError(lock() != OK, VOID_VALUE, "Fail to lock shared memory!"); // get the shared memory ID, create shared memory if not exist - mSharedMemId = shmget(CAMERA_IPCKEY, CAMERA_SM_SIZE, 0640); + mSharedMemId = shmget(CAMERA_IPCKEY, CAMERA_SM_SIZE, S_IRUSR | S_IWUSR | S_IRGRP); if (mSharedMemId == -1) { - mSharedMemId = shmget(CAMERA_IPCKEY, CAMERA_SM_SIZE, IPC_CREAT | 0640); + mSharedMemId = shmget(CAMERA_IPCKEY, CAMERA_SM_SIZE, IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP); if (mSharedMemId < 0) { LOGE("Fail to allocate shared memory by shmget."); unlock(); @@ -213,7 +213,7 @@ bool CameraSharedMemory::processExist(pid_t pid, const char* storedName) { } void CameraSharedMemory::openSemLock() { - mSemLock = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0644, 1); + mSemLock = sem_open(SEM_NAME, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, 1); if (mSemLock == SEM_FAILED) { mSemLock = sem_open(SEM_NAME, O_RDWR); if (mSemLock == SEM_FAILED) { @@ -223,7 +223,9 @@ void CameraSharedMemory::openSemLock() { LOG1("Open the sem lock"); } } else { - chmod(SEM_FD_NAME, 0666); + if(chmod(SEM_FD_NAME, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) != 0){ + LOGW("Failed to chmod, errno: %s", strerror(errno)); + } LOG1("Create the sem lock"); return; } @@ -246,11 +248,13 @@ void CameraSharedMemory::openSemLock() { LOG1("Lock timed out, process holding it may have crashed. Re-create the semaphore."); sem_close(mSemLock); sem_unlink(SEM_NAME); - mSemLock = sem_open(SEM_NAME, O_CREAT | O_EXCL, 0644, 1); + mSemLock = sem_open(SEM_NAME, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH, 1); if (mSemLock == SEM_FAILED) { LOGE("failed to re-create sem lock, errno: %s\n", strerror(errno)); } else { - chmod(SEM_FD_NAME, 0666); + if(chmod(SEM_FD_NAME, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) != 0){ + LOGW("Failed to chmod, errno: %s", strerror(errno)); + } } } } diff --git a/src/iutils/LogSink.cpp b/src/iutils/LogSink.cpp index cc63959c..16b81732 100644 --- a/src/iutils/LogSink.cpp +++ b/src/iutils/LogSink.cpp @@ -114,6 +114,13 @@ FileLogSink::FileLogSink() { mFp = fopen(filePath, "w"); } +FileLogSink::~FileLogSink() { + if (mFp != nullptr) { + (void)fclose(mFp); + mFp = nullptr; + } +} + void FileLogSink::sendOffLog(LogItem logItem) { char timeInfo[TIME_BUF_SIZE]; LogOutputSink::setLogTime(timeInfo); diff --git a/src/iutils/LogSink.h b/src/iutils/LogSink.h index 72e96f7a..623df6f4 100644 --- a/src/iutils/LogSink.h +++ b/src/iutils/LogSink.h @@ -60,6 +60,7 @@ class StdconLogSink : public LogOutputSink { class FileLogSink : public LogOutputSink { public: FileLogSink(); + ~FileLogSink(); void sendOffLog(LogItem logItem) override; private: diff --git a/src/iutils/RWLock.h b/src/iutils/RWLock.h index daa254ae..c48d110e 100644 --- a/src/iutils/RWLock.h +++ b/src/iutils/RWLock.h @@ -48,16 +48,26 @@ class RWLock { class AutoRLock { public: - inline AutoRLock(RWLock& rwlock) : mLock(rwlock) { mLock.readLock(); } + inline explicit AutoRLock(RWLock& rwlock) : mLock(rwlock) { mLock.readLock(); } inline ~AutoRLock() { mLock.unlock(); } + + // Prevent copying (RAII lock guard should not be copied) + AutoRLock(const AutoRLock&) = delete; + AutoRLock& operator=(const AutoRLock&) = delete; + private: RWLock& mLock; }; class AutoWLock { public: - inline AutoWLock(RWLock& rwlock) : mLock(rwlock) { mLock.writeLock(); } + inline explicit AutoWLock(RWLock& rwlock) : mLock(rwlock) { mLock.writeLock(); } inline ~AutoWLock() { mLock.unlock(); } + + // Prevent copying (RAII lock guard should not be copied) + AutoWLock(const AutoWLock&) = delete; + AutoWLock& operator=(const AutoWLock&) = delete; + private: RWLock& mLock; }; @@ -86,7 +96,7 @@ inline status_t RWLock::tryWriteLock() { return -pthread_rwlock_trywrlock(&mRWLock); } inline void RWLock::unlock() { - pthread_rwlock_unlock(&mRWLock); + (void)pthread_rwlock_unlock(&mRWLock); } #endif // HAVE_PTHREADS diff --git a/src/iutils/SwImageConverter.cpp b/src/iutils/SwImageConverter.cpp index 2f864b66..24a20a81 100644 --- a/src/iutils/SwImageConverter.cpp +++ b/src/iutils/SwImageConverter.cpp @@ -435,13 +435,15 @@ int SwImageConverter::convertFormat(unsigned int width, unsigned int height, uns for (y = 0U; y < height; y += 2) { for (x = 0U; x < width; x += 2) { if (CameraUtils::isRaw(srcFmt)) { - if (CameraUtils::getBpp(srcFmt) == 8) { + const int bpp = CameraUtils::getBpp(srcFmt); + if (bpp == 8) { bayer_data[0] = inBuf[y * srcStride + x]; bayer_data[1] = inBuf[y * srcStride + x + 1]; bayer_data[2] = inBuf[(y + 1) * srcStride + x]; bayer_data[3] = inBuf[(y + 1) * srcStride + x + 1]; } else { - const int offset = srcStride / (CameraUtils::getBpp(srcFmt) / 8); + CheckAndLogError(bpp < 8, BAD_VALUE, "Unsupported BPP: %d", bpp); + const int offset = srcStride / (bpp / 8); bayer_data[0] = *((unsigned short*)inBuf + y * offset + x); bayer_data[1] = *((unsigned short*)inBuf + y * offset + x + 1U); bayer_data[2] = *((unsigned short*)inBuf + (y + 1U) * offset + x); diff --git a/src/iutils/Utils.cpp b/src/iutils/Utils.cpp index db9f93bb..4bba1c2a 100644 --- a/src/iutils/Utils.cpp +++ b/src/iutils/Utils.cpp @@ -620,8 +620,12 @@ void CameraUtils::getDeviceName(const char* entityName, string& deviceNodeName, subDeviceName += dirp->d_name; subDeviceName += "/name"; const int fd = open(subDeviceName.c_str(), O_RDONLY); - CheckAndLogError((fd < 0), VOID_VALUE, "@%s, open file %s failed. err: %s", __func__, - subDeviceName.c_str(), strerror(errno)); + if (fd < 0) { + LOGE("@%s, open file %s failed. err: %s", __func__, + subDeviceName.c_str(), strerror(errno)); + closedir(dp); + return; + } char buf[128] = {'\0'}; int len = read(fd, buf, sizeof(buf)); diff --git a/src/metadata/CameraMetadata.cpp b/src/metadata/CameraMetadata.cpp index 7950db96..388471d3 100644 --- a/src/metadata/CameraMetadata.cpp +++ b/src/metadata/CameraMetadata.cpp @@ -19,6 +19,8 @@ #include "CameraMetadata.h" +#include + #include "iutils/CameraLog.h" #include "iutils/Utils.h" @@ -39,7 +41,10 @@ CameraMetadata::CameraMetadata(icamera_metadata_t* buffer) : mBuffer(nullptr), m } CameraMetadata& CameraMetadata::operator=(const CameraMetadata& other) { - return operator=(other.mBuffer); + if(this != &other) { + acquire(other.mBuffer); + } + return *this; } CameraMetadata& CameraMetadata::operator=(const icamera_metadata_t* buffer) { @@ -228,9 +233,10 @@ status_t CameraMetadata::updateImpl(uint32_t tag, const void* data, size_t data_ } if (res != OK) { + const int errCode = (res == INT_MIN) ? INT_MAX : -res; LOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)", __func__, get_icamera_metadata_section_name(tag), get_icamera_metadata_tag_name(tag), tag, - strerror(-res), res); + strerror(errCode), res); } if (validate_icamera_metadata_structure(mBuffer, /*size*/ nullptr) != OK) { @@ -281,15 +287,19 @@ status_t CameraMetadata::erase(uint32_t tag) { if (res == NAME_NOT_FOUND) { return OK; } else if (res != OK) { + const int errCode = (res == INT_MIN) ? INT_MAX : -res; LOGE("%s: Error looking for entry %s.%s (%x): %s %d", __func__, get_icamera_metadata_section_name(tag), get_icamera_metadata_tag_name(tag), tag, - strerror(-res), res); + strerror(errCode), res); return res; } res = delete_icamera_metadata_entry(mBuffer, entry.index); - CheckAndLogError(res != OK, res, "%s: Error deleting entry %s.%s (%x): %s %d", __func__, - get_icamera_metadata_section_name(tag), get_icamera_metadata_tag_name(tag), - tag, strerror(-res), res); + if (res != OK) { + const int errCode = (res == INT_MIN) ? INT_MAX : -res; + LOGE("%s: Error deleting entry %s.%s (%x): %s %d", __func__, + get_icamera_metadata_section_name(tag), get_icamera_metadata_tag_name(tag), + tag, strerror(errCode), res); + } return res; } diff --git a/src/metadata/ParameterHelper.h b/src/metadata/ParameterHelper.h index 09e0fb45..0250232b 100644 --- a/src/metadata/ParameterHelper.h +++ b/src/metadata/ParameterHelper.h @@ -99,6 +99,8 @@ class ParameterHelper { public: AutoRLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.readLock(); } ~AutoRLock() { mLock.unlock(); } + AutoRLock(const AutoRLock&) = delete; + AutoRLock& operator=(const AutoRLock&) = delete; private: RWLock& mLock; }; @@ -107,6 +109,8 @@ class ParameterHelper { public: AutoWLock(void* data) : mLock(getInternalData(data).mRwLock) { mLock.writeLock(); } ~AutoWLock() { mLock.unlock(); } + AutoWLock(const AutoWLock&) = delete; + AutoWLock& operator=(const AutoWLock&) = delete; private: RWLock& mLock; }; diff --git a/src/metadata/icamera_metadata_base.cpp b/src/metadata/icamera_metadata_base.cpp index 1db972d2..782176f0 100644 --- a/src/metadata/icamera_metadata_base.cpp +++ b/src/metadata/icamera_metadata_base.cpp @@ -187,9 +187,13 @@ icamera_metadata_t *allocate_icamera_metadata(size_t entry_capacity, const size_t memory_needed = calculate_icamera_metadata_size(entry_capacity, data_capacity); void *buffer = malloc(memory_needed); - return place_icamera_metadata(buffer, memory_needed, + icamera_metadata_t *metadata = place_icamera_metadata(buffer, memory_needed, entry_capacity, data_capacity); + if(metadata == nullptr) { + free(buffer); + } + return metadata; } icamera_metadata_t *place_icamera_metadata(void *dst, diff --git a/src/platformdata/AiqInitData.cpp b/src/platformdata/AiqInitData.cpp index 0009a2a0..922cf0e2 100644 --- a/src/platformdata/AiqInitData.cpp +++ b/src/platformdata/AiqInitData.cpp @@ -19,7 +19,9 @@ #include "AiqInitData.h" #include +#include #include +#include #include @@ -65,30 +67,37 @@ void AiqData::loadFile(const std::string& fileName, ia_binary_data* data, int ma LOG1("%s, file name %s", __func__, fileName.c_str()); CheckAndLogError(data == nullptr, VOID_VALUE, "data is nullptr"); - // Get file size - struct stat fileStat; - CLEAR(fileStat); - const int ret = stat(fileName.c_str(), &fileStat); - if (ret != 0) { - LOG1("There is no file %s", fileName.c_str()); + const int fd = open(fileName.c_str(), O_RDONLY | O_CLOEXEC); + if (fd < 0) { + LOG1("Failed to open file %s, error %s", fileName.c_str(), strerror(errno)); return; } - int64_t usedFileSize = fileStat.st_size; - if ((maxSize > 0) && (maxSize < fileStat.st_size)) { + struct stat statBuf; + const int ret = fstat(fd, &statBuf); + if ((ret != 0) || (S_ISREG(statBuf.st_mode) == 0)) { + LOG1("Failed to stat file: %s!", fileName.c_str()); + close(fd); + return; + } + + int64_t usedFileSize = statBuf.st_size; + if ((maxSize > 0) && (maxSize < statBuf.st_size)) { usedFileSize = maxSize; } - // Open file - FILE* fp = fopen(fileName.c_str(), "rb"); - CheckWarning(fp == nullptr, VOID_VALUE, "Failed to open file %s, error %s", fileName.c_str(), - strerror(errno)); + FILE* file = fdopen(fd, "rb"); + if (file == nullptr) { + LOG1("Failed to fdopen file %s", fileName.c_str()); + close(fd); + return; + } std::unique_ptr dataPtr(new char[usedFileSize]); // Read data - const size_t readSize = fread(dataPtr.get(), sizeof(char), usedFileSize, fp); - (void)fclose(fp); + const size_t readSize = fread(dataPtr.get(), sizeof(char), usedFileSize, file); + (void)fclose(file); CheckWarning(readSize != (size_t)usedFileSize, VOID_VALUE, "Failed to read %s, error %s", fileName.c_str(), strerror(errno)); @@ -262,7 +271,7 @@ ia_binary_data* AiqInitData::getNvm(int cameraId, const char* overwrittenFile, i if (CameraDump::isDumpTypeEnable(DUMP_NVM_DATA)) { ia_binary_data* nvmData = mNvm->getData(); if (nvmData && nvmData->data && (nvmData->size > 0U)) { - BinParam_t bParam; + BinParam_t bParam{}; bParam.bType = BIN_TYPE_GENERAL; bParam.mType = M_NVM; bParam.sequence = 0; diff --git a/src/platformdata/CMakeLists.txt b/src/platformdata/CMakeLists.txt index 39b624ee..40df9ab8 100644 --- a/src/platformdata/CMakeLists.txt +++ b/src/platformdata/CMakeLists.txt @@ -29,12 +29,12 @@ set(PLATFORMDATA_SRCS ${PLATFORMDATA_SRCS} ) # IPU7_SOURCE_FILE_E - set(PLATFORMDATA_SRCS - ${PLATFORMDATA_SRCS} - ${PLATFORMDATA_DIR}/AiqInitData.cpp - ${PLATFORMDATA_DIR}/gc/GraphUtils.cpp - ${PLATFORMDATA_DIR}/gc/GraphConfigManager.cpp - ${PLATFORMDATA_DIR}/gc/GraphConfig.cpp - CACHE INTERNAL "platformdata sources" - ) +set(PLATFORMDATA_SRCS + ${PLATFORMDATA_SRCS} + ${PLATFORMDATA_DIR}/AiqInitData.cpp + ${PLATFORMDATA_DIR}/gc/GraphUtils.cpp + ${PLATFORMDATA_DIR}/gc/GraphConfigManager.cpp + ${PLATFORMDATA_DIR}/gc/GraphConfig.cpp + CACHE INTERNAL "platformdata sources" + ) diff --git a/src/platformdata/CameraSensorsParser.cpp b/src/platformdata/CameraSensorsParser.cpp index 4212ae49..8b197119 100644 --- a/src/platformdata/CameraSensorsParser.cpp +++ b/src/platformdata/CameraSensorsParser.cpp @@ -23,10 +23,6 @@ #include #include -// CRL_MODULE_S -#include - -// CRL_MODULE_E #include "iutils/CameraLog.h" namespace icamera { @@ -161,13 +157,6 @@ std::map ctlCmdMapTable = { // HDR_FEATURE_S {"V4L2_CID_WDR_MODE", V4L2_CID_WDR_MODE}, // HDR_FEATURE_E -// CRL_MODULE_S - {"V4L2_CID_LINE_LENGTH_PIXELS", V4L2_CID_LINE_LENGTH_PIXELS}, - {"V4L2_CID_FRAME_LENGTH_LINES", V4L2_CID_FRAME_LENGTH_LINES}, - {"CRL_CID_SENSOR_MODE", CRL_CID_SENSOR_MODE}, - {"CRL_CID_EXPOSURE_MODE", CRL_CID_EXPOSURE_MODE}, - {"CRL_CID_EXPOSURE_HDR_RATIO", CRL_CID_EXPOSURE_HDR_RATIO}, -// CRL_MODULE_E }; void CameraSensorsParser::parseMediaCtlControlObject(const Json::Value& node, MediaCtlConf* conf) { for (Json::Value::ArrayIndex i = 0; i < node.size(); ++i) { @@ -1051,6 +1040,11 @@ void CameraSensorsParser::updateNVMDir() { } if (readSize > 0) { for (auto& nvm : mNVMDeviceInfo) { + /* STRING_NULL: String not null terminated warning */ + /* False Positive: Buffer allocated with size+1 bytes and explicitly null-terminated */ + /* (readSize < size) and (readSize >= size) address the null-termination */ + /* Waive by deviation: False Positive */ + //coverity[string_null : FALSE] if (strstr(ptr.get(), nvm.nodeName.c_str()) != nullptr) { std::string nvmPath(NVM_DATA_PATH); nvmPath.append("i2c-"); diff --git a/src/platformdata/JsonParserBase.h b/src/platformdata/JsonParserBase.h index c1d7d227..10fa6eac 100644 --- a/src/platformdata/JsonParserBase.h +++ b/src/platformdata/JsonParserBase.h @@ -22,6 +22,15 @@ namespace icamera { +/* Rule of Three: All special functions should be defined defined */ +/* Destructor: Explicitly declared as virtual ~JsonParserBase() = default */ +/* Copy constructor: Deleted by DISALLOW_COPY_AND_ASSIGN macro expansion in Utils.h */ +/* Copy assignment: Deleted by DISALLOW_COPY_AND_ASSIGN macro expansion in Utils.h */ +/* The macro expands to: TypeName(const TypeName&) = delete; */ +/* TypeName& operator=(const TypeName&) = delete; */ +/* All three (destructor, copy constructor, copy assignment) are defined */ +/* Waive by deviation: False Positive */ +//coverity[rule_of_three_violation : FALSE] */ class JsonParserBase { public: JsonParserBase() = default; diff --git a/src/platformdata/PlatformData.h b/src/platformdata/PlatformData.h index 8f1f84d6..959c3be1 100644 --- a/src/platformdata/PlatformData.h +++ b/src/platformdata/PlatformData.h @@ -155,6 +155,10 @@ class StaticMetadata { class PlatformData { private: + + PlatformData(const PlatformData&) = delete; + PlatformData& operator=(const PlatformData&) = delete; + // Prevent to create multiple instances PlatformData(); ~PlatformData(); diff --git a/src/platformdata/gc/GraphConfig.cpp b/src/platformdata/gc/GraphConfig.cpp index e4f2a001..6b9900e6 100644 --- a/src/platformdata/gc/GraphConfig.cpp +++ b/src/platformdata/gc/GraphConfig.cpp @@ -18,6 +18,10 @@ #include "src/platformdata/gc/GraphConfig.h" +#include +#include +#include + #include "PlatformData.h" #include "iutils/CameraLog.h" #include "GraphUtils.h" @@ -58,7 +62,7 @@ GraphConfig::GraphConfig(int32_t camId, ConfigMode mode) : mCameraId(camId), mSe "%s: failed to init graph reader", __func__); } -GraphConfig::GraphConfig() : mCameraId(-1) { } +GraphConfig::GraphConfig() : mCameraId(-1), mSensorRatio(0.0f) { } GraphConfig::~GraphConfig() { for (auto& graph : mStaticGraphs) graph.second.clear(); @@ -600,12 +604,26 @@ int32_t GraphConfig::loadPipeConfig(const string& fileName) { int32_t GraphConfig::loadStaticGraphConfig(const std::string& name) { const char* fileName = name.c_str(); + + const int fd = open(fileName, O_RDONLY | O_CLOEXEC); + CheckAndLogError(fd < 0, NAME_NOT_FOUND, "%s, Failed to open file: %s", __func__, fileName); + struct stat statBuf; - int32_t ret = stat(fileName, &statBuf); - CheckAndLogError(ret != OK, ret, "Failed to query the size of file: %s!", fileName); + const int ret = fstat(fd, &statBuf); + if ((ret != 0) || (S_ISREG(statBuf.st_mode) == 0)) { + close(fd); + if (ret != 0) { + CheckAndLogError(true, ret, "%s, Failed to get file stats for: %s", __func__, fileName); + } else { + CheckAndLogError(true, BAD_VALUE, "%s, Invalid file type (directory, link, or device): %s", __func__, fileName); + } + } - FILE* file = fopen(fileName, "rb"); - CheckAndLogError(!file, NAME_NOT_FOUND, "%s, Failed to open file: %s", __func__, fileName); + FILE* file = fdopen(fd, "rb"); + if (file == nullptr) { + close(fd); + CheckAndLogError(true, NAME_NOT_FOUND, "%s, Failed to create file stream for: %s", __func__, fileName); + } StaticReaderBinaryData binData; binData.size = static_cast(statBuf.st_size); @@ -616,7 +634,7 @@ int32_t GraphConfig::loadStaticGraphConfig(const std::string& name) { return NO_MEMORY; } - size_t len = fread(binData.data, 1, binData.size, file); + const size_t len = fread(binData.data, 1, binData.size, file); (void)fclose(file); if (len != binData.size) { LOGE("%s, read data %zu from file %s, should be %u", __func__, len, fileName, binData.size); @@ -1011,10 +1029,13 @@ status_t GraphConfig::pipelineGetConnections(int32_t streamId, if (!conn.portFormatSettings.enabled) { continue; } - checkAndUpdatePostConnection(streamId, &conn, &postVector, mGPUStageInfos); + if (conn.stream != nullptr) { + checkAndUpdatePostConnection(streamId, &conn, &postVector, mGPUStageInfos); + } IGraphType::PipelineConnection* connPtr = postVector.size() > 0 ? &(postVector[postVector.size() - 1]) : &conn; - checkAndUpdatePostConnection(streamId, connPtr, &postVector, mPostStageInfos); + if (connPtr->stream) + checkAndUpdatePostConnection(streamId, connPtr, &postVector, mPostStageInfos); } confVector->insert(confVector->end(), postVector.begin(), postVector.end()); LOG3("%s dump for stream %d ++", __func__, streamId); @@ -1027,10 +1048,10 @@ void GraphConfig::checkAndUpdatePostConnection(int32_t streamId, IGraphType::PipelineConnection* conn, vector* postVector, std::map& postStageInfos) { - if (!conn || !conn->stream || !postVector) { + + if (conn->stream == nullptr) { return; } - int32_t useStreamId = conn->stream->streamId(); if (postStageInfos.find(useStreamId) == postStageInfos.end()) { diff --git a/src/v4l2/MediaControl.cpp b/src/v4l2/MediaControl.cpp index 0b2cc334..3afdd107 100644 --- a/src/v4l2/MediaControl.cpp +++ b/src/v4l2/MediaControl.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2011 The Android Open Source Project - * Copyright (C) 2015-2026 Intel Corporation + * Copyright (C) 2015-2022 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -128,6 +128,10 @@ void MediaControl::releaseInstance() { MediaControl::MediaControl(const char* devName) : mDevName(devName) { LOG1("@%s device: %s", __func__, devName); +// VIRTUAL_CHANNEL_S + + mIsMediaCtlSetup = false; +// VIRTUAL_CHANNEL_E int ret = initEntities(); CheckAndLogError(ret, VOID_VALUE, "Failed to init entities"); @@ -360,8 +364,8 @@ void MediaControl::closeDevice(int fd) { } void MediaControl::dumpInfo(media_device_info& devInfo) { - LOGI("Media controller API version %u.%u.%u\n\n", (devInfo.media_version << 16) & 0xff, - (devInfo.media_version << 8) & 0xff, (devInfo.media_version << 0) & 0xff); + LOGI("Media controller API version %u.%u.%u\n\n", (devInfo.media_version >> 16) & 0xffU, + (devInfo.media_version >> 8) & 0xffU, (devInfo.media_version >> 0) & 0xffU); LOGI("Media device information\n" "------------------------\n" @@ -372,11 +376,12 @@ void MediaControl::dumpInfo(media_device_info& devInfo) { "hw revision 0x%x\n" "driver version %u.%u.%u\n\n", devInfo.driver, devInfo.model, devInfo.serial, devInfo.bus_info, devInfo.hw_revision, - (devInfo.driver_version << 16) & 0xff, (devInfo.driver_version << 8) & 0xff, - (devInfo.driver_version << 0) & 0xff); + (devInfo.driver_version >> 16) & 0xffU, (devInfo.driver_version >> 8) & 0xffU, + (devInfo.driver_version >> 0) & 0xffU); - for (uint32_t i = 0U; i < sizeof(devInfo.reserved) / sizeof(uint32_t); i++) + for (uint32_t i = 0U; i < sizeof(devInfo.reserved) / sizeof(uint32_t); i++) { LOGI("reserved[%u] %d", i, devInfo.reserved[i]); + } } int MediaControl::enumInfo() { @@ -601,22 +606,32 @@ int MediaControl::enumLinks(int fd) { source = getEntityById(link->source.entity); sink = getEntityById(link->sink.entity); - if ((source == nullptr) || (sink == nullptr)) { + if ((source == nullptr) || (sink == nullptr)) { LOG1("WARNING entity %u link %u src %u/%u to %u/%u is invalid!", entity.info.id, i, - link->source.entity, link->source.index, link->sink.entity, link->sink.index); + link->source.entity, link->source.index, link->sink.entity, link->sink.index); ret = -EINVAL; } else { + const uint16_t sourceIndex = link->source.index; + const uint16_t sinkIndex = link->sink.index; + const uint16_t sourcePads = source->info.pads; + const uint16_t sinkPads = sink->info.pads; + + if ((sourceIndex >= sourcePads) || (sinkIndex >= sinkPads)) { + LOG1("WARNING entity %u link %u pad index out of bounds (src %u/%u, sink %u/%u)!", + entity.info.id, i, sourceIndex, sourcePads, sinkIndex, sinkPads); + ret = -EINVAL; + } else { fwdlink = entityAddLink(source); if (fwdlink != nullptr) { - fwdlink->source = &source->pads[link->source.index]; - fwdlink->sink = &sink->pads[link->sink.index]; + fwdlink->source = &source->pads[sourceIndex]; + fwdlink->sink = &sink->pads[sinkIndex]; fwdlink->flags = link->flags; } backlink = entityAddLink(sink); if (backlink != nullptr) { - backlink->source = &source->pads[link->source.index]; - backlink->sink = &sink->pads[link->sink.index]; + backlink->source = &source->pads[sourceIndex]; + backlink->sink = &sink->pads[sinkIndex]; backlink->flags = link->flags; } @@ -628,6 +643,7 @@ int MediaControl::enumLinks(int fd) { } } } + } delete[] links.pads; delete[] links.links; @@ -849,39 +865,6 @@ int MediaControl::setRouting(int cameraId, MediaCtlConf* mc, bool enableRouting) routes[i] = r; } - - // When enabling routes, compare current hardware state with the desired configuration. - // VIDIOC_SUBDEV_S_ROUTING resets all stream states on the subdev, which can disrupt - // other processes or camera instances sharing the same subdev. Skip SetRouting when - // the hardware already reflects the exact routes we need. - if (enableRouting) { - uint32_t numCurrentRoutes = static_cast(num); - v4l2_subdev_route* currentRoutes = new v4l2_subdev_route[numCurrentRoutes](); - int gret = subDev->GetRouting(currentRoutes, &numCurrentRoutes); - bool skip = (gret == 0 && numCurrentRoutes == static_cast(num)); - for (int i = 0; i < num && skip; i++) { - bool found = false; - for (uint32_t j = 0; j < numCurrentRoutes; j++) { - if (routes[i].sink_pad == currentRoutes[j].sink_pad && - routes[i].sink_stream == currentRoutes[j].sink_stream && - routes[i].source_pad == currentRoutes[j].source_pad && - routes[i].source_stream == currentRoutes[j].source_stream && - routes[i].flags == currentRoutes[j].flags) { - found = true; - break; - } - } - if (!found) skip = false; - } - delete[] currentRoutes; - if (skip) { - LOG1(" Routes already match for entity:%s, skipping SetRouting", - cameraId, routing.first.c_str()); - delete[] routes; - continue; - } - } - int ret = subDev->SetRouting(routes, num); delete[] routes; CheckAndLogError(ret != 0, ret, "setRouting fail, ret:%d", ret); @@ -894,7 +877,7 @@ int MediaControl::setRouting(int cameraId, MediaCtlConf* mc, bool enableRouting) int MediaControl::setVideoNodeFormat(struct V4L2VideoNode* device, const stream_t* config) { PERF_CAMERA_ATRACE(); - struct v4l2_format v4l2fmt; + struct v4l2_format v4l2fmt = {}; v4l2fmt.fmt.pix_mp.field = config->field; v4l2fmt.fmt.pix.width = config->width; @@ -941,15 +924,6 @@ int MediaControl::setVideoNodesFormat(MediaCtlConf* mc, int field) { return ret; } -const std::string MediaControl::getVideoIsysReceiverName(const MediaCtlConf* mc) { - for (const auto& videoNode : mc->videoNodes) { - if (videoNode.videoNodeType == VIDEO_ISYS_RECEIVER) { - return videoNode.name; - } - } - return std::string(); -} - // VIRTUAL_CHANNEL_E int MediaControl::mediaCtlSetup(int cameraId, MediaCtlConf* mc, int width, int height, int field) { LOG1(" %s", cameraId, __func__); @@ -960,11 +934,11 @@ int MediaControl::mediaCtlSetup(int cameraId, MediaCtlConf* mc, int width, int h AutoMutex lock(sLock); if (!mc->routings.empty()) { - if (mIsysReceiverNamesConfigured.find(getVideoIsysReceiverName(mc)) != - mIsysReceiverNamesConfigured.end()) + if (mIsMediaCtlSetup) { return OK; - else - mIsysReceiverNamesConfigured.insert(getVideoIsysReceiverName(mc)); + } else { + mIsMediaCtlSetup = true; + } } // VIRTUAL_CHANNEL_E @@ -1018,14 +992,7 @@ void MediaControl::mediaCtlClear(int cameraId, MediaCtlConf* mc) { LOG1(" %s", cameraId, __func__); // VIRTUAL_CHANNEL_S - /* Do not disable routes on close. VIDIOC_SUBDEV_S_ROUTING resets stream states, so - * clearing routes here would disrupt other processes or camera instances that share the - * same subdev and are still streaming. Routes are left active on the hardware; the next - * open() will skip SetRouting if the routes already match (see setRouting). - * Remove the receiver from the in-process tracking set so that a subsequent open() in - * this process re-evaluates the full setup (formats, links), even though SetRouting itself - * will be skipped when routes are still correctly configured. - */ + (void)setRouting(cameraId, mc, false); // VIRTUAL_CHANNEL_E } @@ -1361,7 +1328,11 @@ void MediaControl::setSensorOrientation(int cameraId) { } std::string subDevName; - PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_ARRAY, subDevName); + const int ret = PlatformData::getDevNameByType(cameraId, VIDEO_PIXEL_ARRAY, subDevName); + if (ret != OK) { + LOGE("@%s, failed to get device name for VIDEO_PIXEL_ARRAY, cameraId: %d", __func__, cameraId); + return; + } LOG1("@%s, sub-dev name is %s", __func__, subDevName.c_str()); V4L2Subdevice* subDev = V4l2DeviceFactory::getSubDev(cameraId, subDevName); if ((subDev->SetControl(V4L2_CID_HFLIP, 1) == OK) && diff --git a/src/v4l2/MediaControl.h b/src/v4l2/MediaControl.h index 83957210..70599a9d 100644 --- a/src/v4l2/MediaControl.h +++ b/src/v4l2/MediaControl.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2026 Intel Corporation. + * Copyright (C) 2015-2021 Intel Corporation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,9 +31,6 @@ #include #include -// VIRTUAL_CHANNEL_S -#include -// VIRTUAL_CHANNEL_E #include #include "CameraTypes.h" @@ -270,7 +267,8 @@ class MediaControl { std::string* i2cBus); private: - MediaControl& operator=(const MediaControl&); + MediaControl(const MediaControl&) = delete; + MediaControl& operator=(const MediaControl&) = delete; MediaControl(const char* devName); ~MediaControl(); @@ -304,11 +302,10 @@ class MediaControl { int setMediaMcLink(std::vector links); int setFormat(int cameraId, const McFormat* format, int targetWidth, int targetHeight, int field); - // VIRTUAL_CHANNEL_S +// VIRTUAL_CHANNEL_S int setVideoNodeFormat(struct V4L2VideoNode *device, const stream_t* format); int setVideoNodesFormat(MediaCtlConf* mc, int field); - const std::string getVideoIsysReceiverName(const MediaCtlConf *mc); - // VIRTUAL_CHANNEL_E +// VIRTUAL_CHANNEL_E int setSelection(int cameraId, const McFormat* format, int targetWidth, int targetHeight); int setRouting(int cameraId, MediaCtlConf* mc, bool enableRouting); /* Dump functions */ @@ -327,12 +324,13 @@ class MediaControl { std::string mDevName; std::vector mEntities; - // VIRTUAL_CHANNEL_S - std::unordered_set mIsysReceiverNamesConfigured; - // VIRTUAL_CHANNEL_E static MediaControl* sInstance; static Mutex sLock; +// VIRTUAL_CHANNEL_S + + bool mIsMediaCtlSetup; +// VIRTUAL_CHANNEL_E }; } // namespace icamera diff --git a/src/v4l2/V4l2DeviceFactory.h b/src/v4l2/V4l2DeviceFactory.h index 2a911064..7c27e025 100644 --- a/src/v4l2/V4l2DeviceFactory.h +++ b/src/v4l2/V4l2DeviceFactory.h @@ -41,6 +41,10 @@ class V4l2DeviceFactory { static void releaseSubDev(int cameraId, const std::string& devName); private: + + V4l2DeviceFactory(const V4l2DeviceFactory&) = delete; + V4l2DeviceFactory& operator=(const V4l2DeviceFactory&) = delete; + V4l2DeviceFactory(int cameraId); ~V4l2DeviceFactory();