3.4 sensor_fusion
测试用例:
收集图片:拍摄210张yuv图、尺寸:320x240、
拍照过程中设备10-20 度/秒 旋转。
通过标准:
corr_dist = cam_rots-gyro_rots
corr_dist < 0.005 //即Pass
log结果:
后摄:
06-07 08:24:20.656 DEBUG Best correlation of 0.012133 at shift of 12.728ms > 10ms ---> Fail
前摄:
06-07 08:19:36.757 DEBUG Best correlation of 0.068888 at shift of 13.295ms > 10ms ---> Fail
分析:
timestamp有很大关系,如果出帧慢会直接导致2帧timestamp 差很大;
查看脚本知若为EXTERNAL则skip
tests/sensor_fusion/test_sensor_fusion.py
camera_properties_utils.skip_unless(
camera_properties_utils.sensor_fusion_capable(props) and
cam.get_sensors().get('gyro'))
./utils/camera_properties_utils.py
def sensor_fusion_capable(props):
"""Determine if test_sensor_fusion is run."""
return all([sensor_fusion(props),
manual_sensor(props),
props['android.lens.facing'] != LENS_FACING_EXTERNAL])
LENS_FACING_FRONT = 0
LENS_FACING_BACK = 1
LENS_FACING_EXTERNAL = 2
验证:
QSSI/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
if(facing.count == 1){
uint8_t newFacing = ANDROID_LENS_FACING_EXTERNAL;
std::unique_ptr<CameraMetadata> mCameraNewUpdate
= std::make_unique<CameraMetadata>(mCameraCharacteristics);
mCameraNewUpdate->update(ANDROID_LENS_FACING, &newFacing, 1);
*characteristics = *mCameraNewUpdate;
}
复测可以Pass,不影响其它测试项。
但是骁龙相机无法打开,需要做兼容;
ps:dump查看camera属性
adb shell dumpsys media.camera > camera.txt //查看
android.lens.facing (80005): byte[1]
[BACK ]
android.lens.facing (80005): byte[1]
[FRONT ]
解决:
diff --git a/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/cameraserver.te b/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/cameraserver.te
index 0a288d85dd..b0ab357e77 100644
--- a/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/cameraserver.te
+++ b/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/cameraserver.te
@@ -26,5 +26,6 @@
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
get_prop(cameraserver, vendor_persist_camera_prop)
+set_prop(cameraserver,debug_prop)
#access to cameraservice apis by faceauth
hal_client_domain(cameraserver, hal_face)
diff --git a/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/property_contexts b/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/property_contexts
index 0f0b3565cc..4e1870c092 100644
--- a/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/property_contexts
+++ b/device/qcom/sepolicy/generic/prebuilts/api/30.0/private/property_contexts
@@ -42,6 +42,7 @@ vendor.bt.pts. u:object_r:bluetooth_prop:s0
vendor.bluetooth. u:object_r:bluetooth_prop:s0
vendor.camera.aux.packagelist u:object_r:vendor_persist_camera_prop:s0
persist.vendor.camera.privapp.list u:object_r:vendor_persist_camera_prop:s0
+vendor.debug.camera.packname u:object_r:debug_prop:s0
#mm-parser
vendor.mm.enable.qcom_parser u:object_r:vendor_mm_parser_prop:s0
diff --git a/device/qcom/sepolicy/generic/private/cameraserver.te b/device/qcom/sepolicy/generic/private/cameraserver.te
index 0a288d85dd..46baa655ad 100644
--- a/device/qcom/sepolicy/generic/private/cameraserver.te
+++ b/device/qcom/sepolicy/generic/private/cameraserver.te
@@ -26,5 +26,6 @@
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
get_prop(cameraserver, vendor_persist_camera_prop)
+set_prop(cameraserver, debug_prop)
#access to cameraservice apis by faceauth
hal_client_domain(cameraserver, hal_face)
diff --git a/device/qcom/sepolicy/generic/private/property_contexts b/device/qcom/sepolicy/generic/private/property_contexts
index f150685c6f..3deb6353c8 100755
--- a/device/qcom/sepolicy/generic/private/property_contexts
+++ b/device/qcom/sepolicy/generic/private/property_contexts
@@ -45,6 +45,7 @@ vendor.bt.pts. u:object_r:bluetooth_prop:s0
vendor.bluetooth. u:object_r:bluetooth_prop:s0
vendor.camera.aux.packagelist u:object_r:vendor_persist_camera_prop:s0
persist.vendor.camera.privapp.list u:object_r:vendor_persist_camera_prop:s0
+vendor.debug.camera.packname u:object_r:debug_prop:s0
#mm-parser
vendor.mm.enable.qcom_parser u:object_r:vendor_mm_parser_prop:s0
diff --git a/frameworks/av/services/camera/libcameraservice/CameraService.cpp b/frameworks/av/services/camera/libcameraservice/CameraService.cpp
index 62f97baf92..f8e4779a70 100644
--- a/frameworks/av/services/camera/libcameraservice/CameraService.cpp
+++ b/frameworks/av/services/camera/libcameraservice/CameraService.cpp
@@ -77,6 +77,10 @@
#include "utils/TagMonitor.h"
#include "utils/CameraThreadState.h"
#include "utils/CameraServiceProxyWrapper.h"
+//#include <cutils/properties.h>
+
+#define PROPERTY_CAMERA_PACKAGENAME "vendor.debug.camera.packname"
+#define CAMERA_PACKNAME_CTSVERIFIER "com.android.cts.verifier"
namespace {
const char* kPermissionServiceName = "permission";
@@ -786,6 +790,7 @@ Status CameraService::getCameraCharacteristics(const String16& cameraId,
return STATUS_ERROR_FMT(ERROR_INVALID_OPERATION, "Unable to retrieve camera kind "
"for device %s", String8(cameraId).string());
}
+
int callingPid = CameraThreadState::getCallingPid();
int callingUid = CameraThreadState::getCallingUid();
std::vector<int32_t> tagsRemoved;
@@ -1816,6 +1821,17 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&
"Camera API version %d", packagePid, clientName8.string(), cameraId.string(),
static_cast<int>(effectiveApiLevel));
+ //*/Added by jl.huang for ITS:sensor_fusion at 2023.06.27 Start
+ //Get packname of app
+ //*/End
+ char pkgname[PROPERTY_VALUE_MAX];
+ property_set(PROPERTY_CAMERA_PACKAGENAME, clientName8.string());
+ property_get(PROPERTY_CAMERA_PACKAGENAME, pkgname, "");
+ ALOGI("CameraService::get packagename :%s",pkgname);
+ int m_isCTSVerifyCamera = !strncmp(clientName8.string(), CAMERA_PACKNAME_CTSVERIFIER,
+ strlen(CAMERA_PACKNAME_CTSVERIFIER));
+ ALOGI("%s %d m_isCTSVerifyCamera=%d\n",__func__,__LINE__,m_isCTSVerifyCamera);
+
nsecs_t openTimeNs = systemTime();
sp<CLIENT> client = nullptr;
diff --git a/frameworks/av/services/camera/libcameraservice/CameraService.h b/frameworks/av/services/camera/libcameraservice/CameraService.h
index f2d15efeda..693afab966 100644
--- a/frameworks/av/services/camera/libcameraservice/CameraService.h
+++ b/frameworks/av/services/camera/libcameraservice/CameraService.h
@@ -1293,6 +1293,7 @@ private:
// Current override cmd rotate-and-crop mode; AUTO means no override
uint8_t mOverrideRotateAndCropMode = ANDROID_SCALER_ROTATE_AND_CROP_AUTO;
+ bool m_isCTSVerifyCamera = false;
// Current image dump mask
uint8_t mImageDumpMask = 0;
diff --git a/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp b/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
index 6ef16b3ca8..6ed10726a4 100644
--- a/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -44,6 +44,10 @@
#include "api2/HeicCompositeStream.h"
#include "device3/ZoomRatioMapper.h"
+#define CAMERA_PACKNAME_CTSVERIFIER "com.android.cts.verifier"
+#define PROPERTY_CAMERA_PACKAGENAME "vendor.debug.camera.packname"
+
+
namespace android {
using namespace ::android::hardware::camera;
@@ -2370,14 +2374,37 @@ bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const
status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics(
bool overrideForPerfClass, CameraMetadata *characteristics) const {
+ //*/Added by jl.huang for its:sensor_fusion at 2023.06.27 start
+ //check packname of app
+ //*/End
+ char pkgname[PROPERTY_VALUE_MAX];
+ property_get(PROPERTY_CAMERA_PACKAGENAME, pkgname, "");
+ ALOGI("CameraService::get packagename :%s",pkgname);
+ int m_isCTSVerifyCamera = !strncmp(pkgname, CAMERA_PACKNAME_CTSVERIFIER,
+ strlen(CAMERA_PACKNAME_CTSVERIFIER));
+ ALOGI("%s %d m_isCTSVerifyCamera:%d\n",__func__,__LINE__,m_isCTSVerifyCamera);
+
if (characteristics == nullptr) return BAD_VALUE;
if (!overrideForPerfClass && mCameraCharNoPCOverride != nullptr) {
*characteristics = *mCameraCharNoPCOverride;
} else {
- *characteristics = mCameraCharacteristics;
+ //*/set camera as external camera if CTS-Verifyer app open camera
+ if(m_isCTSVerifyCamera){
+ camera_metadata_ro_entry facing = mCameraCharacteristics.find(ANDROID_LENS_FACING);
+ if(facing.count == 1){
+ //if(facing.data.u8[0] == ANDROID_LENS_FACING_BACK){
+ uint8_t newFacing = ANDROID_LENS_FACING_EXTERNAL;
+ ALOGI("%s %d newFacing:%d\n", __func__,__LINE__,newFacing);
+ std::unique_ptr<CameraMetadata> mCameraNewUpdate = std::make_unique<CameraMetadata>(mCameraCharacteristics);
+ mCameraNewUpdate->update(ANDROID_LENS_FACING, &newFacing, 1);
+ *characteristics = *mCameraNewUpdate;
+ }
+ }else{
+ *characteristics = mCameraCharacteristics;
+ ALOGI("%s %d default camera \n",__func__,__LINE__);
+ }
}
-
return OK;
}