| @@ -1957,24 +1957,33 @@ void CameraManager::ParsingCameraConcurrentLimted(camera_metadata_item_t &item, |
| cameraDevNow->limtedCapabilitySave_.colorspaces.modeInfo.clear(); | cameraDevNow->limtedCapabilitySave_.colorspaces.modeInfo.clear(); |
| for (int32_t i = 0; i < static_cast<int32_t>(count);) { | for (int32_t i = 0; i < static_cast<int32_t>(count);) { |
| if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_FLASH_MODES) { | if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_FLASH_MODES) { |
| - std::vector<int32_t>vec; | + CHECK_BREAK_WLOG(i + STEP_ONE >= static_cast<int32_t>(count), "brk1"); |
| int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); | int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); |
| + CHECK_BREAK_WLOG( |
| + length < 0 || static_cast<int64_t>(i) + STEP_TWO + length > static_cast<int64_t>(count), "brk2"); |
| + std::vector<int32_t> vec; |
| cameraDevNow->limtedCapabilitySave_.flashmodes.count = length; | cameraDevNow->limtedCapabilitySave_.flashmodes.count = length; |
| GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); | GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); |
| cameraDevNow->limtedCapabilitySave_.flashmodes.mode = vec; | cameraDevNow->limtedCapabilitySave_.flashmodes.mode = vec; |
| i = i + length + STEP_TWO + STEP_ONE; | i = i + length + STEP_TWO + STEP_ONE; |
| } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_EXPOSURE_MODES) { | } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_EXPOSURE_MODES) { |
| - std::vector<int32_t>vec; | + CHECK_BREAK_WLOG(i + STEP_ONE >= static_cast<int32_t>(count), "brk3"); |
| int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); | int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); |
| + CHECK_BREAK_WLOG( |
| + length < 0 || static_cast<int64_t>(i) + STEP_TWO + length > static_cast<int64_t>(count), "brk4"); |
| + std::vector<int32_t> vec; |
| cameraDevNow->limtedCapabilitySave_.exposuremodes.count = length; | cameraDevNow->limtedCapabilitySave_.exposuremodes.count = length; |
| GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); | GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); |
| cameraDevNow->limtedCapabilitySave_.exposuremodes.mode = vec; | cameraDevNow->limtedCapabilitySave_.exposuremodes.mode = vec; |
| i = i + length + STEP_TWO + STEP_ONE; | i = i + length + STEP_TWO + STEP_ONE; |
| } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_ZOOM_RATIO_RANGE) { | } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_ZOOM_RATIO_RANGE) { |
| - std::vector<float>vec; | + CHECK_BREAK_WLOG(i + STEP_ONE >= static_cast<int32_t>(count), "brk5"); |
| int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); | int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); |
| + CHECK_BREAK_WLOG(length < 0, "brk6"); |
| + std::vector<float> vec; |
| cameraDevNow->limtedCapabilitySave_.ratiorange.count = length / STEP_THREE; | cameraDevNow->limtedCapabilitySave_.ratiorange.count = length / STEP_THREE; |
| for (int j = i + STEP_TWO; j < i + length + STEP_TWO + STEP_ONE; j += STEP_THREE) { | for (int j = i + STEP_TWO; j < i + length + STEP_TWO + STEP_ONE; j += STEP_THREE) { |
| + CHECK_BREAK_WLOG(j + STEP_TWO >= static_cast<int32_t>(count), "brk7"); |
| cameraDevNow->limtedCapabilitySave_.ratiorange.mode.push_back(static_cast<int32_t>(originInfo[j])); | cameraDevNow->limtedCapabilitySave_.ratiorange.mode.push_back(static_cast<int32_t>(originInfo[j])); |
| cameraDevNow->limtedCapabilitySave_.ratiorange.range.insert({static_cast<int32_t>(originInfo[j]), | cameraDevNow->limtedCapabilitySave_.ratiorange.range.insert({static_cast<int32_t>(originInfo[j]), |
| make_pair(static_cast<float>(originInfo[j + STEP_ONE]), | make_pair(static_cast<float>(originInfo[j + STEP_ONE]), |
| @@ -1982,22 +1991,31 @@ void CameraManager::ParsingCameraConcurrentLimted(camera_metadata_item_t &item, |
| } | } |
| i = i + length + STEP_TWO + STEP_ONE; | i = i + length + STEP_TWO + STEP_ONE; |
| } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_AE_COMPENSATION_RANGE) { | } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_AE_COMPENSATION_RANGE) { |
| - std::vector<float>vec; | + CHECK_BREAK_WLOG(i + STEP_ONE >= static_cast<int32_t>(count), "brk8"); |
| int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); | int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); |
| + CHECK_BREAK_WLOG( |
| + length < 0 || static_cast<int64_t>(i) + STEP_TWO + length > static_cast<int64_t>(count), "brk9"); |
| + std::vector<float> vec; |
| cameraDevNow->limtedCapabilitySave_.compensation.count = length; | cameraDevNow->limtedCapabilitySave_.compensation.count = length; |
| GetAbilityStructofConcurrentLimtedfloat(vec, originInfo + i + STEP_TWO, length); | GetAbilityStructofConcurrentLimtedfloat(vec, originInfo + i + STEP_TWO, length); |
| cameraDevNow->limtedCapabilitySave_.compensation.range = vec; | cameraDevNow->limtedCapabilitySave_.compensation.range = vec; |
| i = i + length + STEP_TWO + STEP_ONE; | i = i + length + STEP_TWO + STEP_ONE; |
| } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_FOCUS_MODES) { | } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_FOCUS_MODES) { |
| - std::vector<int32_t>vec; | + CHECK_BREAK_WLOG(i + STEP_ONE >= static_cast<int32_t>(count), "brk10"); |
| int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); | int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); |
| + CHECK_BREAK_WLOG( |
| + length < 0 || static_cast<int64_t>(i) + STEP_TWO + length > static_cast<int64_t>(count), "brk11"); |
| + std::vector<int32_t> vec; |
| cameraDevNow->limtedCapabilitySave_.focusmodes.count = length; | cameraDevNow->limtedCapabilitySave_.focusmodes.count = length; |
| GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); | GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); |
| cameraDevNow->limtedCapabilitySave_.focusmodes.mode = vec; | cameraDevNow->limtedCapabilitySave_.focusmodes.mode = vec; |
| i = i + length + STEP_TWO + STEP_ONE; | i = i + length + STEP_TWO + STEP_ONE; |
| } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_VIDEO_STABILIZATION_MODES) { | } else if (static_cast<camera_device_metadata_tag>(originInfo[i]) == OHOS_ABILITY_VIDEO_STABILIZATION_MODES) { |
| - std::vector<int32_t>vec; | + CHECK_BREAK_WLOG(i + STEP_ONE >= static_cast<int32_t>(count), "brk12"); |
| int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); | int length = static_cast<int32_t>(originInfo[i + STEP_ONE]); |
| + CHECK_BREAK_WLOG( |
| + length < 0 || static_cast<int64_t>(i) + STEP_TWO + length > static_cast<int64_t>(count), "brk13"); |
| + std::vector<int32_t> vec; |
| cameraDevNow->limtedCapabilitySave_.stabilizationmodes.count = length; | cameraDevNow->limtedCapabilitySave_.stabilizationmodes.count = length; |
| GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); | GetAbilityStructofConcurrentLimted(vec, originInfo + i + STEP_TWO, length); |
| cameraDevNow->limtedCapabilitySave_.stabilizationmodes.mode = vec; | cameraDevNow->limtedCapabilitySave_.stabilizationmodes.mode = vec; |
| @@ -3078,7 +3096,9 @@ sptr<CameraOutputCapability> CameraManager::GetSupportedOutputCapability(sptr<Ca |
| FillSupportPreviewFormats(curPreviewProfiles)); | FillSupportPreviewFormats(curPreviewProfiles)); |
| cameraOutputCapability->SetPreviewProfiles(curPreviewProfiles); | cameraOutputCapability->SetPreviewProfiles(curPreviewProfiles); |
| if (!isPhotoMode_.count(modeName)) { | if (!isPhotoMode_.count(modeName)) { |
| - cameraOutputCapability->SetVideoProfiles(camera->modeVideoProfiles_[modeName]); | + std::vector<VideoProfile> curVideoProfiles = camera->modeVideoProfiles_[modeName]; |
| + RemoveExtendedVideoFrameRates(curVideoProfiles, completeRemove); |
| + cameraOutputCapability->SetVideoProfiles(curVideoProfiles); |
| } | } |
| cameraOutputCapability->SetDepthProfiles(camera->modeDepthProfiles_[modeName]); | cameraOutputCapability->SetDepthProfiles(camera->modeDepthProfiles_[modeName]); |
| | |
| @@ -3114,6 +3134,25 @@ sptr<CameraOutputCapability> CameraManager::GetSupportedFullOutputCapability(spt |
| #endif | #endif |
| } | } |
| | |
| +void CameraManager::RemoveExtendedVideoFrameRates(std::vector<VideoProfile>& videoProfiles, bool completeRemove) |
| +{ |
| + CHECK_RETURN(!completeRemove || videoProfiles.size() == 0); |
| + std::vector<VideoProfile> preservedProfiles = {}; |
| + for (const auto& profile : videoProfiles) { |
| + bool has50fps = false; |
| + for (const auto& framerate : profile.framerates_) { |
| + if (framerate == MAX_FPS_50) { |
| + has50fps = true; |
| + break; |
| + } |
| + } |
| + if (!has50fps) { |
| + preservedProfiles.push_back(profile); |
| + } |
| + } |
| + videoProfiles = preservedProfiles; |
| +} |
| + |
| sptr<CameraOutputCapability> CameraManager::ParseSupportedOutputCapability(sptr<CameraDevice>& camera, int32_t modeName, | sptr<CameraOutputCapability> CameraManager::ParseSupportedOutputCapability(sptr<CameraDevice>& camera, int32_t modeName, |
| std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility) | std::shared_ptr<OHOS::Camera::CameraMetadata> cameraAbility) |
| { | { |
| |