1、应用.java中
camera = Camera.open(0);
java框架base/core/java/android/hardware/Camera.java
public static Camera open(int cameraId) { return new Camera(cameraId); }
Camera(int cameraId) { //定义回调函数 Looper looper; //定义处理函数
native_setup(new WeakReference<Camera>(this), cameraId); }
Camera JNI:base/core/jni/android_hardware_Camera.cpp
// connect to camera service static void android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, jint cameraId) { sp<Camera> camera = Camera::connect(cameraId); if (camera == NULL) { jniThrowRuntimeException(env, "Fail to connect to camera service"); return; } // make sure camera hardware is alive if (camera->getStatus() != NO_ERROR) { jniThrowRuntimeException(env, "Camera initialization failed"); return; } jclass clazz = env->GetObjectClass(thiz); if (clazz == NULL) { jniThrowRuntimeException(env, "Can't find android/hardware/Camera"); return; } // We use a weak reference so the Camera object can be garbage collected. // The reference is only used as a proxy for callbacks. sp<JNICameraContext> context = new JNICameraContext(env, weak_this, clazz, camera); context->incStrong(thiz); camera->setListener(context); // save context in opaque field env->SetIntField(thiz, fields.context, (int)context.get()); }
Camera::connect:
av/camera/Camera.cpp
sp<Camera> Camera::connect(int cameraId) { ALOGV("connect"); sp<Camera> c = new Camera(); const sp<ICameraService>& cs = getCameraService(); if (cs != 0) { c->mCamera = cs->connect(c, cameraId); } if (c->mCamera != 0) { c->mCamera->asBinder()->linkToDeath(c); c->mStatus = NO_ERROR; } else { c.clear(); } return c; }
cs->connect(c, cameraId) ---------》》av/services/camera/libcameraservice/CameraService.cpp
sp<ICamera> CameraService::connect( const sp<ICameraClient>& cameraClient, int cameraId) { int callingPid = getCallingPid(); sp<CameraHardwareInterface> hardware = NULL; ...
struct camera_info info;
if (mModule->get_camera_info(cameraId, &info) != OK) {// 重要
ALOGE("Invalid camera id %d", cameraId);
return NULL;
}
hardware = new CameraHardwareInterface(camera_device_name); // 没什么, if (hardware->initialize(&mModule->common) != OK) { //重要 hardware.clear(); return NULL; }
mModule->get_camera_info(cameraId, &info) ----------》》
int camera_get_camera_info(int camera_id, struct camera_info *info) { // this going to be the first call from camera service // initialize camera properties here... if(gCameraProperties.initialize() != android::NO_ERROR) {} //Get camera properties for camera index if(gCameraProperties.getProperties(camera_id, &properties) < 0) { }
gCameraProperties.initialize()--------》》CameraProperties.cpp
// Initializes the CameraProperties class status_t CameraProperties::initialize() { #ifdef AMLOGIC_USB_CAMERA_SUPPORT mCamerasSupported = 0; ret = loadProperties(); mInitialized = 0; #else ret = loadProperties(); mInitialized = 1; #endif }
///Loads all the Camera related properties status_t CameraProperties::loadProperties() {
// adapter updates capabilities and we update camera count mCamerasSupported = CameraAdapter_Capabilities(mCameraProps, mCamerasSupported, CameraAdapter_CameraNum()); for (unsigned int i = 0; i < mCamerasSupported; i++) { mCameraProps[i].set(CAMERA_SENSOR_INDEX, i); mCameraProps[i].dump(); } }
mCameraProps[i].dump();将所有的属性打印出来
D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - preferred-preview-size-for-video = 1280x720 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-antibanding-default = off D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-antibanding-values = off,50hz,60hz, D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-auto-exposure-lock = false D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-auto-whitebalance-lock = false D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-brightness-default = 50 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-camera-name = Camera D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-contrast-default = 100 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-effect-default = none D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-effect-values = none,negative,sepia D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-ev-compensation-default = 0 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-ev-compensation-max = 4 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-ev-compensation-min = -4 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-ev-compensation-step = 1 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-exif-make = MBX D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-exif-model = MBX reference board (goer) D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-exposure-mode-default = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-exposure-mode-values = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-facing = front D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-focal-length = 4.31 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-focus-mode-default = fixed D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-focus-mode-values = fixed D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-framerate-range-default = 5000,26623 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-framerate-range-image-default = 10000,15000 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-framerate-range-values = (5000,26623) D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-framerate-range-video-default = 10000,15000 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-gbce-default = disable D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-horizontal-angle = 54.8 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-ipp-default = ldc-nsf D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-ipp-values = ldc-nsf D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-iso-mode-default = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-iso-mode-values = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-jpeg-quality-default = 90 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-jpeg-thumbnail-quality-default = 90 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-jpeg-thumbnail-size-default = 180x160 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-jpeg-thumbnail-size-values = 180x160,0x0 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-max-fd-hw-faces = 0 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-max-fd-sw-faces = 0 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-orientation = 270 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-picture-format-default = jpeg D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-picture-format-values = jpeg D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-picture-size-default = 1280x720 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-picture-size-values = 640x480,160x120,320x240,640x360,384x216,352x288,1280x720,960x720,800x448,800x600,160x90,320x180 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-preview-format-default = yuv420sp D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-preview-format-values = yuv420sp,yuv420p, mjpeg D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-preview-frame-rate-default = 15 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-preview-frame-rate-values = 10,15 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-preview-size-default = 1280x720 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-preview-size-values = 640x480,160x120,320x240,640x360,384x216,352x288,1280x720,960x720,800x448,800x600,160x90,320x180 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-required-image-bufs = 1 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-required-preview-bufs = 6 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-saturation-default = 100 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-scene-mode-default = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-scene-mode-values = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-sensor-index = 0 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-sharpness-default = 100 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-smooth-zoom-supported = false D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-vertical-angle = 42.5 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-video-snapshot-supported = false D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-vstab-default = false D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-vstab-supported = true D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-whitebalance-default = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-whitebalance-values = auto D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-zoom-default = 0 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-zoom-ratios = 100 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-zoom-stages = 0 D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - prop-zoom-supported = false D/CameraParameters( 2270): hardware/amlogic/camera/CameraParameters.cpp:169 dump - video-size = 1280x720
mCamerasSupported = CameraAdapter_Capabilities(mCameraProps, mCamerasSupported, CameraAdapter_CameraNum()); -------》》V4LCameraAdapter/V4LCameraAdapter.cpp
extern "C" int CameraAdapter_Capabilities(CameraProperties::Properties* properties_array, const unsigned int starting_camera, const unsigned int camera_num) { loadCaps(starting_camera + num_cameras_supported, properties); }
loadCaps(starting_camera + num_cameras_supported, properties);
此函数主要是初始化所有的参数,实现中会根据具体的camera设备来设置相关参数,使用open("/dev/video0")之类,得到当前camera所支持的所有参数。
extern "C" void loadCaps(int camera_id, CameraProperties::Properties* params) { const char DEFAULT_BRIGHTNESS[] = "50"; const char DEFAULT_CONTRAST[] = "100"; const char DEFAULT_IPP[] = "ldc-nsf"; const char DEFAULT_GBCE[] = "disable"; const char DEFAULT_ISO_MODE[] = "auto"; const char DEFAULT_PICTURE_FORMAT[] = "jpeg"; const char DEFAULT_PICTURE_SIZE[] = "640x480"; const char PREVIEW_FORMAT_420SP[] = "yuv420sp"; const char PREVIEW_FORMAT_422I[] = "yuv422i-yuyv"; const char DEFAULT_PREVIEW_SIZE[] = "640x480"; const char DEFAULT_NUM_PREV_BUFS[] = "6"; const char DEFAULT_NUM_PIC_BUFS[] = "1"; const char DEFAULT_MAX_FOCUS_AREAS[] = "1"; const char DEFAULT_SATURATION[] = "100"; const char DEFAULT_SCENE_MODE[] = "auto"; const char DEFAULT_SHARPNESS[] = "100"; const char DEFAULT_VSTAB[] = "false"; const char DEFAULT_VSTAB_SUPPORTED[] = "true"; const char DEFAULT_MAX_FD_HW_FACES[] = "0"; const char DEFAULT_MAX_FD_SW_FACES[] = "0"; const char DEFAULT_FOCAL_LENGTH_PRIMARY[] = "4.31"; const char DEFAULT_FOCAL_LENGTH_SECONDARY[] = "1.95"; const char DEFAULT_HOR_ANGLE[] = "54.8"; const char DEFAULT_VER_ANGLE[] = "42.5"; const char DEFAULT_AE_LOCK[] = "false"; const char DEFAULT_AWB_LOCK[] = "false"; const char DEFAULT_MAX_NUM_METERING_AREAS[] = "0"; const char DEFAULT_LOCK_SUPPORTED[] = "true"; const char DEFAULT_LOCK_UNSUPPORTED[] = "false"; const char DEFAULT_VIDEO_SIZE[] = "640x480"; const char DEFAULT_PREFERRED_PREVIEW_SIZE_FOR_VIDEO[] = "640x480"; bool bFrontCam = false; int camera_fd = -1; if (camera_id == 0) { #ifdef AMLOGIC_BACK_CAMERA_SUPPORT bFrontCam = false; #elif defined(AMLOGIC_FRONT_CAMERA_SUPPORT) bFrontCam = true; #elif defined(AMLOGIC_USB_CAMERA_SUPPORT) bFrontCam = true; #else//defined nothing, we try by ourself.we assume, the 0 is front camera, 1 is back camera bFrontCam = true; #endif } else if (camera_id == 1) { #if defined(AMLOGIC_BACK_CAMERA_SUPPORT) && defined(AMLOGIC_FRONT_CAMERA_SUPPORT) bFrontCam = true; #else//defined nothing, we try to by ourself bFrontCam = false; #endif } //should changed while the screen orientation changed. int degree = -1; char property[64]; memset(property,0,sizeof(property)); if(bFrontCam == true) { params->set(CameraProperties::FACING_INDEX, ExCameraParameters::FACING_FRONT); if(getCameraOrientation(bFrontCam,property)>=0){ params->set(CameraProperties::ORIENTATION_INDEX,property); }else{ #ifdef AMLOGIC_USB_CAMERA_SUPPORT params->set(CameraProperties::ORIENTATION_INDEX,"0"); #else params->set(CameraProperties::ORIENTATION_INDEX,"270"); #endif } } else { params->set(CameraProperties::FACING_INDEX, ExCameraParameters::FACING_BACK); if(getCameraOrientation(bFrontCam,property)>=0){ params->set(CameraProperties::ORIENTATION_INDEX,property); }else{ #ifdef AMLOGIC_USB_CAMERA_SUPPORT params->set(CameraProperties::ORIENTATION_INDEX,"180"); #else params->set(CameraProperties::ORIENTATION_INDEX,"90"); #endif } } params->set(CameraProperties::SUPPORTED_PREVIEW_FORMATS,"yuv420sp,yuv420p, mjpeg"); //yuv420p for cts //leon add mjpeg if(DEFAULT_PREVIEW_PIXEL_FORMAT == V4L2_PIX_FMT_YUYV){ // 422I //params->set(CameraProperties::SUPPORTED_PREVIEW_FORMATS,PREVIEW_FORMAT_422I); params->set(CameraProperties::PREVIEW_FORMAT,PREVIEW_FORMAT_422I); }else if(DEFAULT_PREVIEW_PIXEL_FORMAT == V4L2_PIX_FMT_NV21){ //420sp //params->set(CameraProperties::SUPPORTED_PREVIEW_FORMATS,PREVIEW_FORMAT_420SP); params->set(CameraProperties::PREVIEW_FORMAT,PREVIEW_FORMAT_420SP); }else{ //default case //params->set(CameraProperties::SUPPORTED_PREVIEW_FORMATS,PREVIEW_FORMAT_420SP); params->set(CameraProperties::PREVIEW_FORMAT,PREVIEW_FORMAT_420SP); } //get preview size & set char *sizes = (char *) calloc (1, 1024); if(!sizes){ CAMHAL_LOGEA("Alloc string buff error!"); return; } #ifdef AMLOGIC_USB_CAMERA_SUPPORT #ifdef AMLOGIC_TWO_CH_UVC int main_id = -1; if(NO_ERROR == getVideodevId( camera_id,main_id )){ if ((camera_fd = open(DEVICE_PATH(camera_id), O_RDWR)) != -1) { CAMHAL_LOGDB("open %s success to loadCaps ", DEVICE_PATH(camera_id)); } } #else while( camera_id < (int)ARRAY_SIZE(SENSOR_PATH)){ if ((camera_fd = open(DEVICE_PATH(camera_id), O_RDWR)) != -1) { CAMHAL_LOGDB("open %s success when loadCaps! ", DEVICE_PATH(camera_id)); break; } camera_id++; } if(camera_id >= (int)ARRAY_SIZE(SENSOR_PATH)){ CAMHAL_LOGEB("failed to opening Camera when loadCaps: %s", strerror(errno)); } #endif #else camera_fd = open(DEVICE_PATH(camera_id), O_RDWR); #endif if(camera_fd<0) CAMHAL_LOGEB("open camera %d error when loadcaps",camera_id); #ifdef AMLOGIC_CAMERA_NONBLOCK_SUPPORT int fps=0, fps_num=0; int ret; char *fpsrange=(char *)calloc(32,sizeof(char)); ret = enumFramerate(camera_fd, &fps, &fps_num); if((fpsrange != NULL)&&(NO_ERROR == ret) && ( 0 !=fps_num )){ sprintf(fpsrange,"%s%d","10,",fps/fps_num); CAMHAL_LOGDA("O_NONBLOCK operation to do previewThread "); params->set(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES, fpsrange); params->set(CameraProperties::PREVIEW_FRAME_RATE, fps/fps_num); memset( fpsrange, 0, 32*sizeof(char)); sprintf(fpsrange,"%s%d","10000,",fps*1000/fps_num); params->set(CameraProperties::FRAMERATE_RANGE_IMAGE, fpsrange); params->set(CameraProperties::FRAMERATE_RANGE_VIDEO, fpsrange); memset( fpsrange, 0, 32*sizeof(char)); sprintf(fpsrange,"(%s%d)","5000,",fps*1000/fps_num); params->set(CameraProperties::FRAMERATE_RANGE_SUPPORTED, fpsrange); memset( fpsrange, 0, 32*sizeof(char)); sprintf(fpsrange,"%s%d","5000,",fps*1000/fps_num); params->set(CameraProperties::FRAMERATE_RANGE, fpsrange); }else{ if(NO_ERROR != ret) CAMHAL_LOGDA("sensor driver need to implement VIDIOC_G_PARM!!! "); params->set(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES, "10,15"); params->set(CameraProperties::PREVIEW_FRAME_RATE, "15"); params->set(CameraProperties::FRAMERATE_RANGE_SUPPORTED, "(5000,26623)"); params->set(CameraProperties::FRAMERATE_RANGE, "5000,26623"); params->set(CameraProperties::FRAMERATE_RANGE_IMAGE, "10000,15000"); params->set(CameraProperties::FRAMERATE_RANGE_VIDEO, "10000,15000"); } #else params->set(CameraProperties::SUPPORTED_PREVIEW_FRAME_RATES, "10,15"); params->set(CameraProperties::PREVIEW_FRAME_RATE, "15"); params->set(CameraProperties::FRAMERATE_RANGE_SUPPORTED, "(5000,26623)"); params->set(CameraProperties::FRAMERATE_RANGE, "5000,26623"); params->set(CameraProperties::FRAMERATE_RANGE_IMAGE, "10000,15000"); params->set(CameraProperties::FRAMERATE_RANGE_VIDEO, "10000,15000"); #endif memset(sizes,0,1024); uint32_t preview_format = DEFAULT_PREVIEW_PIXEL_FORMAT; #ifdef AMLOGIC_USB_CAMERA_SUPPORT preview_format = V4L2_PIX_FMT_YUYV; #endif if (!getValidFrameSize(camera_fd, preview_format, sizes)) { int len = strlen(sizes); unsigned int supported_w = 0, supported_h = 0,w = 0,h = 0; if(len>1){ if(sizes[len-1] == ',') sizes[len-1] = '