author | Lawrence Mok <lawrence.mok@amlogic.com> | 2012-08-27 21:52:45 (GMT) |
---|---|---|
committer | Lawrence Mok <lawrence.mok@amlogic.com> | 2012-08-27 21:52:45 (GMT) |
commit | 6b0e11c913717a728dcf93dff05f89cc241c3318 (patch) | |
tree | 26c3ab7e5dc92ea4d2fd2911fed7af2ee5f928bd | |
parent | 823e95db9db6d8f616c678cf26a9996d921e0da7 (diff) | |
download | camera-6b0e11c913717a728dcf93dff05f89cc241c3318.zip camera-6b0e11c913717a728dcf93dff05f89cc241c3318.tar.gz camera-6b0e11c913717a728dcf93dff05f89cc241c3318.tar.bz2 |
merge latest ics-amlogic
only change is white balance:
commit 8efd1bae076558147e8089ffcbd631f12d75e770
Author: jiyu.yang <jiyu.yang@amlogic.com>
Date: Mon Aug 27 13:31:23 2012 +0800
some white balance value define
commit ef4fdcacf7e925477e016235bf8fcc48eaa8dd3c
Author: jiyu.yang <jiyu.yang@amlogic.com>
Date: Mon Aug 27 11:40:25 2012 +0800
add some white parameters for android API
cloudy-daylight,shade,twilight,warm-fluorescent.
and read the drivers to set def and support para.
Conflicts:
CameraHal.cpp
V4LCameraAdapter/V4LCameraAdapter.cpp
-rwxr-xr-x | CameraHal.cpp | 1 | ||||
-rwxr-xr-x | V4LCameraAdapter/V4LCameraAdapter.cpp | 96 | ||||
-rwxr-xr-x | inc/V4LCameraAdapter/V4LCameraAdapter.h | 3 |
3 files changed, 97 insertions, 3 deletions
diff --git a/CameraHal.cpp b/CameraHal.cpp index b03d3ce..643a78d 100755 --- a/CameraHal.cpp +++ b/CameraHal.cpp @@ -39,7 +39,6 @@ namespace android { #define LOGV ALOGV #define LOGI ALOGI - static void write_sys_int(const char *path, int val) { char cmd[16]; diff --git a/V4LCameraAdapter/V4LCameraAdapter.cpp b/V4LCameraAdapter/V4LCameraAdapter.cpp index 415fe04..acb0f52 100755 --- a/V4LCameraAdapter/V4LCameraAdapter.cpp +++ b/V4LCameraAdapter/V4LCameraAdapter.cpp @@ -1849,6 +1849,68 @@ static int getCameraOrientation(bool frontcamera, char* property) return degree; } +static int enumCtrlMenu(int camera_fd, struct v4l2_queryctrl *qi, + char* menu_items, char*def_menu_item) +{ + struct v4l2_queryctrl qc; + struct v4l2_querymenu qm; + int ret; + int mode_count = -1; + + memset(&qc, 0, sizeof(struct v4l2_queryctrl)); + qc.id = qi->id; + ret = ioctl (camera_fd, VIDIOC_QUERYCTRL, &qc); + if( (ret<0) || (qc.flags == V4L2_CTRL_FLAG_DISABLED) ){ + CAMHAL_LOGDB("camera handle %d can't suppurt this ctrl",camera_fd); + return mode_count; + }else if( qc.type != V4L2_CTRL_TYPE_MENU){ + CAMHAL_LOGDB("this ctrl of camera handle %d can't suppurt menu type",camera_fd); + return 0; + }else{ + memset(&qm, 0, sizeof(qm)); + qm.id = qi->id; + qm.index = qc.default_value; + if(ioctl (camera_fd, VIDIOC_QUERYMENU, &qm) < 0){ + return 0; + } else { + strcpy(def_menu_item, (char*)qm.name); + } + int index = 0; + mode_count = 0; + + for (index = qc.minimum; index <= qc.maximum; index+= qc.step) { + memset(&qm, 0, sizeof(struct v4l2_querymenu)); + qm.id = qi->id; + qm.index = index; + if(ioctl (camera_fd, VIDIOC_QUERYMENU, &qm) < 0){ + continue; + } else { + if(mode_count>0) + strcat(menu_items, ","); + strcat( menu_items, (char*)qm.name); + mode_count++; + } + } + } + return mode_count; +} + +static bool getCameraWhiteBalance(int camera_fd, char* wb_modes, char*def_wb_mode) +{ + struct v4l2_queryctrl qc; + int item_count=0; + + memset( &qc, 0, sizeof(qc)); + qc.id = V4L2_CID_DO_WHITE_BALANCE; + item_count = enumCtrlMenu( camera_fd, &qc, wb_modes, def_wb_mode); + + if(0 >= item_count){ + strcpy( wb_modes, "auto,daylight,incandescent,fluorescent"); + strcpy(def_wb_mode, "auto"); + } + return true; +} + static bool getCameraAutoFocus(int camera_fd, char* focus_mode_str, char*def_focus_mode) { struct v4l2_queryctrl qc; @@ -2192,10 +2254,32 @@ extern "C" void loadCaps(int camera_id, CameraProperties::Properties* params) { #ifdef AMLOGIC_USB_CAMERA_SUPPORT params->set(CameraProperties::SUPPORTED_WHITE_BALANCE, "auto"); + params->set(CameraProperties::WHITEBALANCE, "auto"); #else - params->set(CameraProperties::SUPPORTED_WHITE_BALANCE, "auto,daylight,incandescent,fluorescent"); + char *wb_mode = (char *) calloc (1, 256); + char *def_wb_mode = (char *) calloc (1, 64); + + if( wb_mode && def_wb_mode){ + memset(wb_mode, 0, 256); + memset(def_wb_mode, 0, 64); + getCameraWhiteBalance(camera_fd, wb_mode, def_wb_mode); + params->set(CameraProperties::SUPPORTED_WHITE_BALANCE, wb_mode); + params->set(CameraProperties::WHITEBALANCE, def_wb_mode); + }else{ + params->set(CameraProperties::SUPPORTED_WHITE_BALANCE, "auto,daylight,incandescent,fluorescent"); + params->set(CameraProperties::WHITEBALANCE, "auto"); + } + + if(wb_mode){ + free(wb_mode); + wb_mode = NULL; + } + if(def_wb_mode){ + free(def_wb_mode); + def_wb_mode = NULL; + } #endif - params->set(CameraProperties::WHITEBALANCE, "auto"); + params->set(CameraProperties::AUTO_WHITEBALANCE_LOCK, DEFAULT_AWB_LOCK); params->set(CameraProperties::SUPPORTED_EFFECTS, "none,negative,sepia"); @@ -2328,6 +2412,14 @@ extern "C" int set_white_balance(int camera_fd,const char *swb) ctl.value=CAM_WB_INCANDESCENCE; else if(strcasecmp(swb,"fluorescent")==0) ctl.value=CAM_WB_FLUORESCENT; + else if(strcasecmp(swb,"cloudy-daylight")==0) + ctl.value=CAM_WB_CLOUD; + else if(strcasecmp(swb,"shade")==0) + ctl.value=CAM_WB_SHADE; + else if(strcasecmp(swb,"twilight")==0) + ctl.value=CAM_WB_TWILIGHT; + else if(strcasecmp(swb,"warm-fluorescent")==0) + ctl.value=CAM_WB_WARM_FLUORESCENT; #endif ret = ioctl(camera_fd, VIDIOC_S_CTRL, &ctl); diff --git a/inc/V4LCameraAdapter/V4LCameraAdapter.h b/inc/V4LCameraAdapter/V4LCameraAdapter.h index 39f42ba..91d4c98 100755 --- a/inc/V4LCameraAdapter/V4LCameraAdapter.h +++ b/inc/V4LCameraAdapter/V4LCameraAdapter.h @@ -162,6 +162,9 @@ typedef enum camera_wb_flip_e { CAM_WB_TUNGSTEN, CAM_WB_FLUORESCENT, CAM_WB_MANUAL, + CAM_WB_SHADE, + CAM_WB_TWILIGHT, + CAM_WB_WARM_FLUORESCENT, }camera_wb_flip_t; typedef enum camera_night_mode_flip_e { CAM_NM_AUTO = 0, |