android camera 结构,高通camera架构 (一)

本文详细介绍了Android系统中JNI层如何获取摄像头数量的过程,从`android_hardware_Camera.cpp`开始,逐步深入到`camera.cpp`、`cameraservice.cpp`,再到`QualcommCameraHardware.cpp`,最后涉及与内核交互的`mm_camera_interface.c`,揭示了从用户空间到内核空间获取摄像头信息的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作记录 从JNI往下看

JNI :

frameworks/base/core/jni/android_hardware_camera.cpp

static JNINativeMethod

camMethods[] = {

{

"getNumberOfCameras", "()I", (void

*)android_hardware_Camera_getNumberOfCameras

},

{

"getCameraInfo", "(ILandroid/hardware/Camera$CameraInfo;)V",

(void*)android_hardware_Camera_getCameraInfo

},

{

"native_setup", "(Ljava/lang/Object;II)V", (void*)android_hardware_Camera_native_setup },

{

"native_release", "()V", (void*)android_hardware_Camera_release },

{

"setPreviewDisplay", "(Landroid/view/Surface;)V", (void *)android_hardware_Camera_setPreviewDisplay },

{

"startPreview", "()V", (void

*)android_hardware_Camera_startPreview },

{

"stopPreview", "()V", (void

*)android_hardware_Camera_stopPreview },

{

"previewEnabled", "()Z", (void

*)android_hardware_Camera_previewEnabled },

{

"setHasPreviewCallback", "(ZZ)V", (void *)android_hardware_Camera_setHasPreviewCallback },

{

"addCallbackBuffer", "([B)V", (void *)android_hardware_Camera_addCallbackBuffer },

{

"native_autoFocus", "()V", (void

*)android_hardware_Camera_autoFocus },

{

"native_encodeData", "()V", (void

*)android_hardware_Camera_encodeData },

{

"native_cancelAutoFocus", "()V", (void

*)android_hardware_Camera_cancelAutoFocus },

{

"native_takePicture", "()V", (void

*)android_hardware_Camera_takePicture },

{

"native_setHistogramMode", "(Z)V", (void

*)android_hardware_Camera_setHistogramMode },

{

"native_sendHistogramData", "()V", (void

*)android_hardware_Camera_sendHistogramData },

{

"native_setFaceDetectionCb", "(Z)V", (void

*)android_hardware_Camera_setFaceDetectionCb },

{

"native_sendMetaData", "()V", (void

*)android_hardware_Camera_sendMetaData },

{

"native_setParameters", "(Ljava/lang/String;)V", (void *)android_hardware_Camera_setParameters },

{

"native_getParameters", "()Ljava/lang/String;", (void *)android_hardware_Camera_getParameters },

{

"reconnect", "()V", (void*)android_hardware_Camera_reconnect },

{

"lock", "()V", (void*)android_hardware_Camera_lock },

{

"unlock", "()V", (void*)android_hardware_Camera_unlock },

{

"startSmoothZoom", "(I)V", (void

*)android_hardware_Camera_startSmoothZoom },

{

"stopSmoothZoom", "()V", (void

*)android_hardware_Camera_stopSmoothZoom },

{ "setDisplayOrientation", "(I)V", (void

*)android_hardware_Camera_setDisplayOrientation },

};

====================================================================================

static jint android_hardware_Camera_getNumberOfCameras(JNIEnv

*env, jobject thiz)

{

return

Camera::getNumberOfCameras();

}

此处调到/framework/base/libs/camera/camera.cpp

中。

int32_t Camera::getNumberOfCameras()

{

const

sp& cs =

getCameraService();

if (cs == 0)

return 0;

return

cs->getNumberOfCameras();

}

此处调用到/framework/base/service/camera/libcameraservice/cameraservice.cpp中借口

int32_t

CameraService::getNumberOfCameras() {

return

mNumberOfCameras;

}

而,此处mNumberOfCameras由cameraservice.cpp中

mNumberOfCameras =

HAL_getNumberOfCameras();

获得。

HAL_getNumberOfCameras()函数,调用\vendor\qcom\android-open\libcamera2\QualcommCameraHardware.cpp中的接口。

extern "C" int HAL_getNumberOfCameras()

{

QualcommCameraHardware::getCameraInfo();

return

HAL_numOfCameras;

}

接下来看下getCameraInfo()

void

QualcommCameraHardware::getCameraInfo()

{

LOGI("getCameraInfo: IN");

mm_camera_status_t status;

#if DLOPEN_LIBMMCAMERA

void

*libhandle = ::dlopen("liboemcamera.so", RTLD_NOW);

LOGI("getCameraInfo: loading libqcamera at %p", libhandle);

if

(!libhandle) {

LOGE("FATAL ERROR: could not dlopen liboemcamera.so: %s",

dlerror());

}

*(void

**)&LINK_mm_camera_get_camera_info =

::dlsym(libhandle, "mm_camera_get_camera_info");

#endif

storeTargetType();

status =

LINK_mm_camera_get_camera_info(HAL_cameraInfo,

&HAL_numOfCameras);

LOGI("getCameraInfo: numOfCameras = %d", HAL_numOfCameras);

for(int i =

0; i < HAL_numOfCameras; i++) {

if((HAL_cameraInfo[i].position == BACK_CAMERA )&&

mCurrentTarget == TARGET_MSM8660){

HAL_cameraInfo[i].modes_supported |= CAMERA_ZSL_MODE;

} else{

HAL_cameraInfo[i].modes_supported |= CAMERA_NONZSL_MODE;

}

LOGI("Camera sensor %d info:", i);

LOGI("camera_id: %d", HAL_cameraInfo[i].camera_id);

LOGI("modes_supported: %x",

HAL_cameraInfo[i].modes_supported);

LOGI("position: %d", HAL_cameraInfo[i].position);

LOGI("sensor_mount_angle: %d",

HAL_cameraInfo[i].sensor_mount_angle);

}

#if DLOPEN_LIBMMCAMERA

if

(libhandle) {

::dlclose(libhandle);

LOGV("getCameraInfo: dlclose(libqcamera)");

}

#endif

LOGI("getCameraInfo: OUT");

}

在前面有#define LINK_mm_camera_get_camera_info

mm_camera_get_camera_info ,所以我们接下来到

mm_camera_get_camera_info(HAL_cameraInfo,

&HAL_numOfCameras);调用到哪。

vendor\qcom\proprietary\mm-camera\apps\appslib\mm_camera_interface.c中有定义

mm_camera_status_t mm_camera_get_camera_info(camera_info_t*

p_cam_info,

int* p_num_cameras)

{

int i = 0;

int controlfd = -1;

char device[MAX_DEV_NAME_LEN];

CDBG("%s: [S]\n", __func__);

mm_camera_status_t status =

MM_CAMERA_SUCCESS;

struct msm_camera_info cameraInfo;

if (NULL == p_cam_info) {

status =

MM_CAMERA_ERR_INVALID_INPUT;

goto

ERROR;

}

sprintf (device, MSM_CAMERA_CONTROL, 0);

controlfd =

open(device, O_RDWR);

//此处打开的是内核注册的控制节点

"/dev/msm_camera/control%d"

//

内核一共注册了四个节点,control、config、frame、pic

对应了四组操作函数。老一点的版本是三组节点。

if (controlfd < 0) {

CDBG_HIGH("%s: controlfd is invalid %s", __func__,

strerror(errno));

status =

MM_CAMERA_ERR_GENERAL;

goto

ERROR;

}

if (ioctl(controlfd,

MSM_CAM_IOCTL_GET_CAMERA_INFO, &cameraInfo) < 0)

{ //此处获得内核注册camera信息

CDBG_HIGH("%s: error (%s)", __func__, strerror(errno));

status =

MM_CAMERA_ERR_GENERAL;

goto

ERROR;

}

CDBG("%s: num %d\n", __func__,

cameraInfo.num_cameras);

for (i=0; i < cameraInfo.num_cameras; i++)

{

p_cam_info[i].camera_id = i; p_cam_info[i].modes_supported =

(!cameraInfo.has_3d_support[i]) ? CAMERA_MODE_2D

: //前置摄像头只支持2D

CAMERA_MODE_2D | CAMERA_MODE_3D; p_cam_info[i].position

= //在内核前置摄像头is_internal_cam[i]定义为1,后置摄像头默认为0.

(cameraInfo.is_internal_cam[i]) ? FRONT_CAMERA :

BACK_CAMERA;

//到此用户层将前置和后置摄像头区分开

p_cam_info[i].sensor_mount_angle =

cameraInfo.s_mount_angle[i];

}

*p_num_cameras = cameraInfo.num_cameras;

ERROR:

if (controlfd > 0) {

close(controlfd);

}

CDBG("%s: %d [E]", __func__, status);

return status;

}

至此

android_hardware_Camera_getNumberOfCameras 的流程完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值