日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

camera hardware module

發布時間:2024/8/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 camera hardware module 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ICS 中 沿用了linux驅動模塊化的方式,把camera hal 形成一個hardware module,這點跟HC明顯不同。

打開camera時, cameraservice 會先打開camera hw_moudle, 如下代碼所示:

void CameraService::onFirstRef(){BnCameraService::onFirstRef();if (hw_get_module(CAMERA_HARDWARE_MODULE_ID, //獲得camera 模塊,(const hw_module_t **)&mModule) < 0) { //&mModule 應該就是camera.medfield.so.LOGE("Could not load camera HAL module");mNumberOfCameras = 0;}else {mNumberOfCameras = mModule->get_number_of_cameras(); //調用camera hal 層函數。if (mNumberOfCameras > MAX_CAMERAS) {LOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",mNumberOfCameras, MAX_CAMERAS);mNumberOfCameras = MAX_CAMERAS;}for (int i = 0; i < mNumberOfCameras; i++) {setCameraFree(i);}}// Read the system property to determine if we have to use the// AUDIO_STREAM_ENFORCED_AUDIBLE type.char value[PROPERTY_VALUE_MAX];property_get("ro.camera.sound.forced", value, "0");if (strcmp(value, "0") != 0) {mAudioStreamType = AUDIO_STREAM_ENFORCED_AUDIBLE;} else {mAudioStreamType = AUDIO_STREAM_MUSIC;}} 1. 這里的
hw_get_module(CAMERA_HARDWARE_MODULE_ID,
(const hw_module_t **)&mModule)
調用了hardware/libhardware/hardware.c
int hw_get_module(const char *id, const struct hw_module_t **module){return hw_get_module_by_class(id, NULL, module);}const char *id ------- 應該是module name const struct hw_module_t **module -----應該是module模塊地址。int hw_get_module_by_class(const char *class_id, const char *inst,const struct hw_module_t **module){int status;int i;const struct hw_module_t *hmi = NULL;char prop[PATH_MAX];char path[PATH_MAX];char name[PATH_MAX];if (inst)snprintf(name, PATH_MAX, "%s.%s", class_id, inst); // 這里class_id 是camera,inst 應該是medfield,elsestrlcpy(name, class_id, PATH_MAX);/** Here we rely on the fact that calling dlopen multiple times on* the same .so will simply increment a refcount (and not load* a new copy of the library).* We also assume that dlopen() is thread-safe.*//* Loop through the configuration variants looking for a module */for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {if (i < HAL_VARIANT_KEYS_COUNT) {if (property_get(variant_keys[i], prop, NULL) == 0) {continue;}snprintf(path, sizeof(path), "%s/%s.%s.so",HAL_LIBRARY_PATH2, name, prop);if (access(path, R_OK) == 0) break;snprintf(path, sizeof(path), "%s/%s.%s.so",HAL_LIBRARY_PATH1, name, prop);if (access(path, R_OK) == 0) break;} else {snprintf(path, sizeof(path), "%s/%s.default.so",HAL_LIBRARY_PATH1, name);if (access(path, R_OK) == 0) break;}}status = -ENOENT;if (i < HAL_VARIANT_KEYS_COUNT+1) {/* load the module, if this fails, we're doomed, and we should not try* to load a different variant. */status = load(class_id, path, module);}return status;} load(class_id, path, module) 代碼如下:
/*** Load the file defined by the variant and if successful* return the dlopen handle and the hmi.* @return 0 = success, !0 = failure.*/static int load(const char *id,const char *path,const struct hw_module_t **pHmi){int status;void *handle;struct hw_module_t *hmi;/** load the symbols resolving undefined symbols before* dlopen returns. Since RTLD_GLOBAL is not or'd in with* RTLD_NOW the external symbols will not be global*/handle = dlopen(path, RTLD_NOW);if (handle == NULL) {char const *err_str = dlerror();LOGE("load: module=%s\n%s", path, err_str?err_str:"unknown");status = -EINVAL;goto done;}/* Get the address of the struct hal_module_info. */const char *sym = HAL_MODULE_INFO_SYM_AS_STR;hmi = (struct hw_module_t *)dlsym(handle, sym);if (hmi == NULL) {LOGE("load: couldn't find symbol %s", sym);status = -EINVAL;goto done;}/* Check that the id matches */if (strcmp(id, hmi->id) != 0) {LOGE("load: id=%s != hmi->id=%s", id, hmi->id);status = -EINVAL;goto done;}hmi->dso = handle;/* success */status = 0;done:if (status != 0) {hmi = NULL;if (handle != NULL) {dlclose(handle);handle = NULL;}} else {LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",id, path, *pHmi, handle);}*pHmi = hmi;return status;} 2.? mNumberOfCameras = mModule->get_number_of_cameras();
調用了 hardware/intel/libcamera/IntelCameraHAL.cpp 中的
camera_module_t HAL_MODULE_INFO_SYM = {common: {tag: HARDWARE_MODULE_TAG,version_major: 1,version_minor: 0,id: CAMERA_HARDWARE_MODULE_ID,name: "Intel CameraHardware Module",author: "Intel",methods: &camera_module_methods, //這里面定義了各種函數接口。dso: NULL, /* remove compilation warnings */reserved: {0}, /* remove compilation warnings */},get_number_of_cameras: HAL_GetNumberOfCameras, //cameraservice 中會調用這兩個函數。get_camera_info: HAL_GetCameraInfo,}; a.? get_number_of_cameras: HAL_GetNumberOfCameras,
int HAL_GetNumberOfCameras(void){return android::CameraHardware::getNumberOfCameras();}/* This function will be called when the camera service is created.* Do some init work in this function.*/int CameraHardware::getNumberOfCameras(){LogEntry(LOG_TAG, __FUNCTION__);if (num_cameras != 0)return num_cameras;int ret;struct v4l2_input input;int fd = -1;char *dev_name = "/dev/video0";fd = open(dev_name, O_RDWR);if (fd <= 0) {LogError("Error opening video device %s: %s",dev_name, strerror(errno));return 0;}int i;for (i = 0; i < MAX_CAMERAS; i++) {memset(&input, 0, sizeof(input));input.index = i;ret = ioctl(fd, VIDIOC_ENUMINPUT, &input); //從kernel 獲得相應信息,枚舉input通道信息。if (ret < 0) {break;}camInfo[i].port = input.reserved[1];strncpy(camInfo[i].name, (const char *)input.name, MAX_SENSOR_NAME_LENGTH);}close(fd);num_cameras = i;return num_cameras;} b. get_camera_info: HAL_GetCameraInfo,
int HAL_GetCameraInfo(int camera_id, struct camera_info *info){return android::CameraHardware::getCameraInfo(camera_id, info);}int CameraHardware::getCameraInfo(int cameraId, struct camera_info* cameraInfo){LogEntry(LOG_TAG, __FUNCTION__);if (cameraId >= MAX_CAMERAS)return -EINVAL;memcpy(cameraInfo, &HAL_cameraInfo[cameraId], sizeof(camera_info)); //從HAL_cameraInfo[cameraId] 中獲得信息。return 0;} HAL_cameraInfo[cameraId] 定義如下:
static camera_info HAL_cameraInfo[MAX_CAMERAS] = {{CAMERA_FACING_FRONT,180,},{CAMERA_FACING_BACK,0,}}; c. methods: &camera_module_methods,???? //這里面定義了各種函數接口。
static struct hw_module_methods_t camera_module_methods = {open: HAL_OpenCameraHardware // 也就是這個函數};open: HAL_OpenCameraHardware,int HAL_OpenCameraHardware(const hw_module_t* module, const char* name,hw_device_t** device){int rv = 0;int num_cameras = 0;int cameraid;intel_camera_device_t* camera_device = NULL;camera_device_ops_t* camera_ops = NULL;android::CameraHardware* camera = NULL;android::Mutex::Autolock lock(gCameraHalDeviceLock);LOGI("camera_device open");if (name != NULL) {cameraid = atoi(name);num_cameras = android::CameraHardware::getNumberOfCameras();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(gCamerasOpen >= MAX_CAMERAS){LOGE("maximum number of cameras already open");rv = -ENOMEM;goto fail;}camera_device = (intel_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->device.common.tag = HARDWARE_DEVICE_TAG;camera_device->device.common.version = 0;camera_device->device.common.module = (hw_module_t *)(module);camera_device->device.common.close = HAL_CloseCameraHardware;camera_device->device.ops = camera_ops;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->device.common;camera_device->cameraId = cameraid;camera = new android::CameraHardware(cameraid);if(!camera){LOGE("Couldn't create instance of CameraHardware class!");rv = -ENOMEM;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;} 這個函數里 封裝了一系列 camera interface。 但是cameraservice 并沒有用到這些接口,還是老的調用方式,直接調用了 camerahardware, 而沒經過這里的接口。
只有
HAL_GetCameraInfo HAL_GetNumberOfCameras 通過這些接口來調用。


總結

以上是生活随笔為你收集整理的camera hardware module的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女av一区二区 | 九九天堂网 | 蜜桃tv一区二区三区 | 国产精品国产三级国产a | 国产成人av在线 | 综合色导航 | 午夜精品一二三区 | 日本精品免费在线观看 | 日美女网站| 久久作爱 | 日韩精品啪啪 | 亚洲熟妇无码一区二区三区 | 天天看天天干 | 久久免费精品 | 成人在线观 | 一级片观看 | 制服丝袜在线视频 | 亚洲国产日韩一区 | 秘密基地免费观看完整版中文 | 999成人网| 欧美a在线观看 | 欧美黑吊大战白妞欧美大片 | 肮脏的交易在线观看 | 久久免费看片 | 91成人福利在线 | 亚洲第一二区 | 97视频久久久 | 中文字幕有码无码人妻av蜜桃 | 欧美三级色图 | 免费的黄色小视频 | 国产在线毛片 | 亚洲第九十九页 | 日本久久激情 | 久久久久人妻一区精品色欧美 | jizz日本视频 | 2一3sex性hd | 能免费看18视频网站 | 成人高清视频在线观看 | 人人上人人干 | 国产999久久久 | 97在线免费观看视频 | 欧美激情 亚洲 | 9l视频自拍蝌蚪9l视频成人 | 中文字幕在线免费观看 | 影音先锋激情 | 成人二区三区 | 浪浪视频在线观看 | 亚洲日本天堂 | 国产黄大片在线观看画质优化 | 九色影视 | 欧美精品一区二区在线播放 | 欧美另类z0z变态 | 视频在线观看网站免费 | 国产精品一区二区网站 | 超碰神马| 九一毛片 | 五月网婷婷 | 欧美性猛交xxxx乱大交蜜桃 | 欧美精品一区二区性色a+v | 91成人免费视频 | 亚洲精品久久久久久国产精华液 | 小泽玛利亚一区二区三区在线观看 | 色鬼综合 | 99视频久久 | www.久久 | 成人无码久久久久毛片 | 亚洲精品ww | 日本一卡二卡在线 | 小柔的裸露日记h | 精品久久国产字幕高潮 | 一级二级三级黄色片 | 一本免费视频 | 捆绑凌虐一区二区三区 | 久久这里 | 中文字幕第一页在线视频 | 亚洲av无码一区东京热久久 | 亚洲欧洲一二三区 | 精品一久久 | 欧美,日韩,国产精品免费观看 | 1024香蕉视频 | 亚洲精品一区二 | 欧美色悠悠 | 国产专区一区 | 国产妞干网| 91国产中文字幕 | 永久毛片 | 国产一级久久久 | 欧美情趣视频 | 国产欧美日韩成人 | www.精品久久 | 成人av网站大全 | 永久视频在线观看 | 日本色中色 | 阿娇全套94张未删图久久 | xxx在线视频| 国产老熟女伦老熟妇露脸 | 污漫在线观看 | 蜜桃成熟时李丽珍在线观看 | 日本一区二区三区在线视频 |