fsl Camera 调试第一篇 CameraModule.cpp

来源:互联网 发布:java socket 百度云盘 编辑:程序博客网 时间:2024/06/03 13:30

       CameraModule.cpp文件不需要修改;只是作为代码的开始;CameraModule.cpp之上的Android源码都不用修改;

static struct hw_module_methods_t camera_module_methods = {        open: camera_device_open<span style="white-space:pre"></span>//最主要就这个函数,初始化,指针函数赋值;从它开始看起};//这就是HAL模块;Android HAL固定写法;camera_module_t HAL_MODULE_INFO_SYM = {    common: {         tag: HARDWARE_MODULE_TAG,         version_major: 1,         version_minor: 0,         id: CAMERA_HARDWARE_MODULE_ID,         name: "Freescale CameraHal Module",         author: "Freescale",         methods: &camera_module_methods,         dso: NULL, /* remove compilation warnings */         reserved: {0}, /* remove compilation warnings */    },

int camera_device_open(const hw_module_t* module, const char* name,                hw_device_t** device){    int rv = 0;    int num_cameras = 0;    int cameraid;    fsl_camera_device_t* camera_device = NULL;    camera_device_ops_t* camera_ops = NULL;    android::CameraHal* camera = NULL;    char *SelectedCameraName;//设备名字;    android::sp<android::CaptureDeviceInterface> pCaptureDevice = NULL;    android::sp<android::JpegEncoderInterface>pJpegEncoder = NULL;    //android::CameraProperties::Properties* properties = NULL;    android::Mutex::Autolock lock(gCameraHalDeviceLock);    LOGI("camera_device open: %s", name);    if (name != NULL) {        cameraid = atoi(name);//判断是否有前摄像头gCameraName[0]、后摄像头gCameraName[1], //返回gCameraNum摄像头总个数(最大为2),摄像头文件路径gCameraDevPath[2]        num_cameras = camera_get_number_of_cameras();//gCameraProperties.camerasSupported();        if(cameraid > num_cameras)        {            LOGE("camera service provided cameraid out of bounds, "                    "cameraid = %d, num supported = %d",                    cameraid, num_cameras);            rv = -EINVAL;            goto fail;        }#if 0        if(gCamerasOpen >= MAX_SIMUL_CAMERAS_SUPPORTED)        {            LOGE("maximum number of cameras already open");            rv = -ENOMEM;            goto fail;        }#endif        camera_device = (fsl_camera_device_t*)malloc(sizeof(*camera_device));        if(!camera_device)        {            LOGE("camera_device allocation fail");            rv = -ENOMEM;            goto fail;        }        camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops));        if(!camera_ops)        {            LOGE("camera_ops allocation fail");            rv = -ENOMEM;            goto fail;        }        memset(camera_device, 0, sizeof(*camera_device));        memset(camera_ops, 0, sizeof(*camera_ops));        camera_device->base.common.tag = HARDWARE_DEVICE_TAG;        camera_device->base.common.version = 0;        camera_device->base.common.module = (hw_module_t *)(module);        camera_device->base.common.close = camera_device_close;        camera_device->base.ops = camera_ops;//各个Camera操作函数的指针函数赋值;很重要;后面的函数都是HAL文件实现;        camera_ops->set_preview_window = camera_set_preview_window;        camera_ops->set_callbacks = camera_set_callbacks;        camera_ops->enable_msg_type = camera_enable_msg_type;        camera_ops->disable_msg_type = camera_disable_msg_type;        camera_ops->msg_type_enabled = camera_msg_type_enabled;        camera_ops->start_preview = camera_start_preview;        camera_ops->stop_preview = camera_stop_preview;        camera_ops->preview_enabled = camera_preview_enabled;        camera_ops->store_meta_data_in_buffers = camera_store_meta_data_in_buffers;        camera_ops->start_recording = camera_start_recording;        camera_ops->stop_recording = camera_stop_recording;        camera_ops->recording_enabled = camera_recording_enabled;        camera_ops->release_recording_frame = camera_release_recording_frame;        camera_ops->auto_focus = camera_auto_focus;        camera_ops->cancel_auto_focus = camera_cancel_auto_focus;        camera_ops->take_picture = camera_take_picture;        camera_ops->cancel_picture = camera_cancel_picture;        camera_ops->set_parameters = camera_set_parameters;        camera_ops->get_parameters = camera_get_parameters;        camera_ops->put_parameters = camera_put_parameters;        camera_ops->send_command = camera_send_command;        camera_ops->release = camera_release;        camera_ops->dump = camera_dump;        *device = &camera_device->base.common;        camera_device->cameraid = cameraid;        SelectedCameraName = gCameraName[sCameraInfo[cameraid].facing];//createCaptureDevice是和V4L2沟通的桥梁;// 根据当前选中的cameraName和设备路径来创建一个合适的捕获图像的设备  pCaptureDevice = android::createCaptureDevice(SelectedCameraName/*设备名字*/,                gCameraDevPath[sCameraInfo[cameraid].facing]/*设备路径*/);// 创建相应的图片编码器  pJpegEncoder = android::createJpegEncoder(android::SOFTWARE_JPEG_ENC);// 创建HAL层的代理        camera = new android::CameraHal(cameraid);//一个Camera设备完全产生了;        if(!camera)        {            LOGE("Couldn't create instance of CameraHal class");            rv = -ENOMEM;            goto fail;        }// 设置为HAL层->捕获设备;        if (camera->setCaptureDevice(pCaptureDevice) < 0 ||                camera->setJpegEncoder(pJpegEncoder) < 0) {            rv = -EINVAL;            goto fail;        }// HAL层初始化          if (camera->Init() < 0) {            rv = -EINVAL;            goto fail;        }        gCameraHals[cameraid] = camera;        gCamerasOpen++;    }    return rv;fail:    if(camera_device) {        free(camera_device);        camera_device = NULL;    }    if(camera_ops) {        free(camera_ops);        camera_ops = NULL;    }    if(camera) {        delete camera;        camera = NULL;    }    *device = NULL;    return rv;}
一下是几个需要注意的地方;很重要;看懂代码的关键;






0 0
原创粉丝点击