author | peng.su <peng.su@amlogic.com> | 2011-03-14 13:10:15 (GMT) |
---|---|---|
committer | peng.su <peng.su@amlogic.com> | 2011-03-14 13:10:15 (GMT) |
commit | 93f0429c04bb526926f3460d41f3397bf76a18ab (patch) | |
tree | 87a7335cb897e681895630a29475cd0a23e2ca98 | |
parent | 231ca96c941636e8256fa4d6f53612e01d61e6d0 (diff) | |
download | camera-93f0429c04bb526926f3460d41f3397bf76a18ab.zip camera-93f0429c04bb526926f3460d41f3397bf76a18ab.tar.gz camera-93f0429c04bb526926f3460d41f3397bf76a18ab.tar.bz2 |
add camera para
-rwxr-xr-x | Android.mk | 2 | ||||
-rwxr-xr-x | OpCameraHardware.c | 131 | ||||
-rwxr-xr-x | V4L2/V4L2Camera.cpp | 110 | ||||
-rwxr-xr-x | V4L2/V4L2Camera.h | 1 | ||||
-rwxr-xr-x | amlogic_camera_para.h | 148 |
5 files changed, 381 insertions, 11 deletions
@@ -21,7 +21,7 @@ LOCAL_C_INCLUDES += ../../kernel/include/ LOCAL_SRC_FILES += jpegenc/amljpeg_enc.c #LOCAL_SRC_FILES += AmlogicCameraHardware.cpp FakeCamera/FakeCamera.cpp -LOCAL_SRC_FILES += AmlogicCameraHardware.cpp V4L2/V4L2Camera.cpp FakeCamera/FakeCamera.cpp +LOCAL_SRC_FILES += AmlogicCameraHardware.cpp V4L2/V4L2Camera.cpp FakeCamera/FakeCamera.cpp OpCameraHardware.c diff --git a/OpCameraHardware.c b/OpCameraHardware.c new file mode 100755 index 0000000..18f964d --- a/dev/null +++ b/OpCameraHardware.c @@ -0,0 +1,131 @@ +#define LOG_NDEBUG 0 +//#define NDEBUG 0 +#define LOG_TAG "OpCameraHardware" +#include <utils/Log.h> +#include "amlogic_camera_para.h" + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/ioctl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> +#include <cutils/properties.h> +#include <linux/videodev2.h> + +int set_white_balance(int camera_fd,const char *swb) +{ + int ret = 0; + struct v4l2_control ctl; + if(camera_fd<0) + return -1; + + ctl.id = V4L2_CID_DO_WHITE_BALANCE; + + if(strcasecmp(swb,"auto")==0) + ctl.value=CAM_WB_AUTO; + else if(strcasecmp(swb,"daylight")==0) + ctl.value=CAM_WB_DAYLIGHT; + else if(strcasecmp(swb,"incandescent")==0) + ctl.value=CAM_WB_INCANDESCENCE; + else if(strcasecmp(swb,"fluorescent")==0) + ctl.value=CAM_WB_FLUORESCENT; + + if(ioctl(camera_fd, VIDIOC_S_CTRL, &ctl)<0) + { + ret = -1; + LOGV("AMLOGIC CAMERA SetParametersToDriver fail !! "); + } + return ret ; +} + +int SetExposure(int camera_fd,const char *sbn) +{ + int ret = 0; + struct v4l2_control ctl; + if(camera_fd<0) + return -1; + + ctl.id = V4L2_CID_EXPOSURE; + + if(strcasecmp(sbn,"4")==0) + ctl.value=EXPOSURE_P4_STEP; + else if(strcasecmp(sbn,"3")==0) + ctl.value=EXPOSURE_P3_STEP; + else if(strcasecmp(sbn,"2")==0) + ctl.value=EXPOSURE_P2_STEP; + else if(strcasecmp(sbn,"1")==0) + ctl.value=EXPOSURE_P1_STEP; + else if(strcasecmp(sbn,"0")==0) + ctl.value=EXPOSURE_0_STEP; + else if(strcasecmp(sbn,"-1")==0) + ctl.value=EXPOSURE_N1_STEP; + else if(strcasecmp(sbn,"-2")==0) + ctl.value=EXPOSURE_N2_STEP; + else if(strcasecmp(sbn,"-3")==0) + ctl.value=EXPOSURE_N3_STEP; + else if(strcasecmp(sbn,"-4")==0) + ctl.value=EXPOSURE_N4_STEP; + + if(ioctl(camera_fd, VIDIOC_S_CTRL, &ctl)<0) + { + ret = -1; + LOGV("AMLOGIC CAMERA SetParametersToDriver fail !! "); + } + + return ret ; +} + + +int set_effect(int camera_fd,const char *sef) +{ + int ret = 0; + struct v4l2_control ctl; + if(camera_fd<0) + return -1; + + ctl.id = V4L2_CID_COLORFX; + + if(strcasecmp(sef,"none")==0) + ctl.value=CAM_EFFECT_ENC_NORMAL; + else if(strcasecmp(sef,"negative")==0) + ctl.value=CAM_EFFECT_ENC_COLORINV; + else if(strcasecmp(sef,"sepia")==0) + ctl.value=CAM_EFFECT_ENC_SEPIA; + + if(ioctl(camera_fd, VIDIOC_S_CTRL, &ctl)<0) + { + ret = -1; + LOGV("AMLOGIC CAMERA SetParametersToDriver fail !! "); + } + + return ret ; +} + +int set_night_mode(int camera_fd,const char *snm) +{ + int ret = 0; + struct v4l2_control ctl; + if(camera_fd<0) + return -1; + + if(strcasecmp(snm,"auto")==0) + ctl.value=CAM_NM_AUTO; + else if(strcasecmp(snm,"night")==0) + ctl.value=CAM_NM_ENABLE; + + ctl.id = V4L2_CID_DO_WHITE_BALANCE; + + if(ioctl(camera_fd, VIDIOC_S_CTRL, &ctl)<0) + { + ret = -1; + LOGV("AMLOGIC CAMERA SetParametersToDriver fail !! "); + } + return ret ; +} + + + diff --git a/V4L2/V4L2Camera.cpp b/V4L2/V4L2Camera.cpp index e5133f0..bf7174b 100755 --- a/V4L2/V4L2Camera.cpp +++ b/V4L2/V4L2Camera.cpp @@ -16,6 +16,18 @@ #include <errno.h>
#include <jpegenc/amljpeg_enc.h>
+#include <cutils/properties.h>
+
+
+extern "C" {
+int set_white_balance(int camera_fd,const char *swb);
+int SetExposure(int camera_fd,const char *sbn);
+int set_effect(int camera_fd,const char *sef);
+
+//extern int v4l2_qulity;
+
+
+}
namespace android {
@@ -26,6 +38,7 @@ static void dump_to_file(const char *fname,uint8_t *buf, uint32_t size); #define V4L2_TAKEPIC_BUFF_NUM (1)
#define V4L2_JPEG_QUALITY (90)
+
V4L2Camera::V4L2Camera(char* devname)
{
int namelen = strlen(devname)+1;
@@ -37,14 +50,39 @@ V4L2Camera::V4L2Camera(char* devname) pV4L2Frames = NULL;
pV4L2FrameSize = NULL;
m_iPicIdx = -1;
+ v4l2_qulity = 90;
}
V4L2Camera::~V4L2Camera()
{
delete m_pDevName;
}
+static int opengt2005Flag=0;
status_t V4L2Camera::Open()
{
+int temp_id=-1;
+char camera_b09[PROPERTY_VALUE_MAX];
+
+ property_get("camera.b09", camera_b09, "camera");
+
+ if(strcmp(camera_b09,"1")==0){
+ LOGD("*****do camera_b09 special %s\n",camera_b09);
+ if(strcasecmp(m_pDevName,"/dev/video0")==0)
+ {
+ opengt2005Flag=1;
+ }
+ if((strcasecmp(m_pDevName,"/dev/video1")==0)&&(!opengt2005Flag)&&(m_iDevFd == -1))
+ {
+ temp_id = open("/dev/video0", O_RDWR);
+ if (temp_id != -1)
+ {
+ LOGD("*****open %s success %d \n", "video0+++",temp_id);
+ opengt2005Flag=1;
+ close(temp_id);
+ usleep(100);
+ }
+ }
+ }
if(m_iDevFd == -1)
{
m_iDevFd = open(m_pDevName, O_RDWR);
@@ -83,10 +121,10 @@ status_t V4L2Camera::InitParameters(CameraParameters& pParameters) pParameters.setPictureSize(800,600);
pParameters.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
- pParameters.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,"auto,daylight,incandescent");
+ pParameters.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,"auto,daylight,incandescent,fluorescent");
pParameters.set(CameraParameters::KEY_WHITE_BALANCE,"auto");
- pParameters.set(CameraParameters::KEY_SUPPORTED_EFFECTS,"none,mono,negative");
+ pParameters.set(CameraParameters::KEY_SUPPORTED_EFFECTS,"none,negative,sepia");
pParameters.set(CameraParameters::KEY_EFFECT,"none");
//pParameters.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,"auto,on,off,torch");
@@ -98,16 +136,16 @@ status_t V4L2Camera::InitParameters(CameraParameters& pParameters) //pParameters.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,"auto,infinity,macro");
//pParameters.set(CameraParameters::KEY_FOCUS_MODE,"auto");
- pParameters.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,2);
- pParameters.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,-2);
+ pParameters.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,4);
+ pParameters.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,-4);
pParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,1);
pParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,0);
- //pParameters.set(CameraParameters::KEY_MAX_ZOOM,3);
- //pParameters.set(CameraParameters::KEY_ZOOM_RATIOS,"100,120,140,160,200,220,150,280,290,300");
- //pParameters.set(CameraParameters::KEY_ZOOM_SUPPORTED,CameraParameters::TRUE);
- //pParameters.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,1);
- //pParameters.set(CameraParameters::KEY_ZOOM,1);
+ pParameters.set(CameraParameters::KEY_MAX_ZOOM,3);
+ pParameters.set(CameraParameters::KEY_ZOOM_RATIOS,"100,120,140,160,200,220,150,280,290,300");
+ pParameters.set(CameraParameters::KEY_ZOOM_SUPPORTED,CameraParameters::TRUE);
+ pParameters.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,1);
+ pParameters.set(CameraParameters::KEY_ZOOM,1);
return NO_ERROR;
}
@@ -116,6 +154,58 @@ status_t V4L2Camera::InitParameters(CameraParameters& pParameters) status_t V4L2Camera::SetParameters(CameraParameters& pParameters)
{
m_hParameter = pParameters;
+ int preview_width, preview_height,preview_FrameRate;
+ const char *white_balance=NULL;
+ const char *exposure=NULL;
+ const char *effect=NULL;
+ const char *night_mode=NULL;
+ const char *qulity=NULL;
+ int n=0;
+
+
+ pParameters.getPreviewSize(&preview_width, &preview_height);
+ LOGV("getPreviewSize %dx%d ",preview_width,preview_height);
+
+ if(preview_width >800&&preview_height >600)
+ pParameters.setPreviewSize(800, 600);
+ else if(preview_width <800&&preview_height <600&&preview_width>640&&preview_height>480)
+ pParameters.setPreviewSize(640, 480);
+ else if(preview_width <640&&preview_height <480&&preview_width>352&&preview_height>288)
+ pParameters.setPreviewSize(352, 288);
+ else if(preview_width <352&&preview_height <288&&preview_width>176&&preview_height>144)
+ pParameters.setPreviewSize(176, 144);
+
+ white_balance=pParameters.get(CameraParameters::KEY_WHITE_BALANCE);
+ LOGV("white_balance=%s ",white_balance);
+
+
+ exposure=pParameters.get(CameraParameters::KEY_EXPOSURE_COMPENSATION);
+ LOGV("exposure=%s ",exposure);
+ effect=pParameters.get(CameraParameters::KEY_EFFECT);
+ LOGV("effect=%s ",effect);
+ night_mode=pParameters.get(CameraParameters::KEY_SCENE_MODE);
+ LOGV("night_mode=%s ",night_mode);
+ qulity=pParameters.get(CameraParameters::KEY_JPEG_QUALITY);
+ LOGV("qulity=%s ",qulity);
+ if(exposure)
+ SetExposure(m_iDevFd,exposure);
+ if(white_balance)
+ set_white_balance(m_iDevFd,white_balance);
+ if(effect)
+ set_effect(m_iDevFd,effect);
+ //if(night_mode)
+ //set_night_mode(night_mode);
+ if(qulity){
+ if(strcasecmp(qulity,"70")==0)
+ v4l2_qulity=70;
+ else if(strcasecmp(qulity,"80")==0)
+ v4l2_qulity=80;
+ else if(strcasecmp(qulity,"90")==0)
+ v4l2_qulity=90;
+ else
+ v4l2_qulity=90;
+ }
+
//LOGD("V4L2Camera::SetParameters");
return NO_ERROR;
}
@@ -185,7 +275,7 @@ status_t V4L2Camera::GetJpegFrame(uint8_t* framebuf) enc.odata = (unsigned char*)framebuf;
enc.ibuff_size = pV4L2FrameSize[m_iPicIdx];
enc.obuff_size = pV4L2FrameSize[m_iPicIdx];
- enc.quality = V4L2_JPEG_QUALITY;
+ enc.quality = v4l2_qulity;
encode_jpeg(&enc);
}
else
diff --git a/V4L2/V4L2Camera.h b/V4L2/V4L2Camera.h index e9dda99..c7d8c40 100755 --- a/V4L2/V4L2Camera.h +++ b/V4L2/V4L2Camera.h @@ -50,6 +50,7 @@ protected: int m_iDevFd;
int m_V4L2BufNum;
int m_iPicIdx;
+ int v4l2_qulity;
};
diff --git a/amlogic_camera_para.h b/amlogic_camera_para.h new file mode 100755 index 0000000..07ed2b9 --- a/dev/null +++ b/amlogic_camera_para.h @@ -0,0 +1,148 @@ +/*
+ * TVIN Modules Exported Header File
+ *
+ * Author: Lin Xu <lin.xu@amlogic.com>
+ * Bobby Yang <bo.yang@amlogic.com>
+ *
+ * Copyright (C) 2010 Amlogic Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+
+#ifndef _AMLOGIC_CAMERA_PARA_H
+#define _AMLOGIC_CAMERA_PARA_H
+
+/*
+ below macro defined applied to camera driver
+*/
+typedef enum camera_light_mode_e {
+ ADVANCED_AWB = 0,
+ SIMPLE_AWB,
+ MANUAL_DAY,
+ MANUAL_A,
+ MANUAL_CWF,
+ MANUAL_CLOUDY,
+}camera_light_mode_t;
+
+typedef enum camera_saturation_e {
+ SATURATION_N4_STEP = 0,
+ SATURATION_N3_STEP,
+ SATURATION_N2_STEP,
+ SATURATION_N1_STEP,
+ SATURATION_0_STEP,
+ SATURATION_P1_STEP,
+ SATURATION_P2_STEP,
+ SATURATION_P3_STEP,
+ SATURATION_P4_STEP,
+}camera_saturation_t;
+
+
+typedef enum camera_brightness_e {
+ BRIGHTNESS_N4_STEP = 0,
+ BRIGHTNESS_N3_STEP,
+ BRIGHTNESS_N2_STEP,
+ BRIGHTNESS_N1_STEP,
+ BRIGHTNESS_0_STEP,
+ BRIGHTNESS_P1_STEP,
+ BRIGHTNESS_P2_STEP,
+ BRIGHTNESS_P3_STEP,
+ BRIGHTNESS_P4_STEP,
+}camera_brightness_t;
+
+typedef enum camera_contrast_e {
+ CONTRAST_N4_STEP = 0,
+ CONTRAST_N3_STEP,
+ CONTRAST_N2_STEP,
+ CONTRAST_N1_STEP,
+ CONTRAST_0_STEP,
+ CONTRAST_P1_STEP,
+ CONTRAST_P2_STEP,
+ CONTRAST_P3_STEP,
+ CONTRAST_P4_STEP,
+}camera_contrast_t;
+
+typedef enum camera_hue_e {
+ HUE_N180_DEGREE = 0,
+ HUE_N150_DEGREE,
+ HUE_N120_DEGREE,
+ HUE_N90_DEGREE,
+ HUE_N60_DEGREE,
+ HUE_N30_DEGREE,
+ HUE_0_DEGREE,
+ HUE_P30_DEGREE,
+ HUE_P60_DEGREE,
+ HUE_P90_DEGREE,
+ HUE_P120_DEGREE,
+ HUE_P150_DEGREE,
+}camera_hue_t;
+
+typedef enum camera_special_effect_e {
+ SPECIAL_EFFECT_NORMAL = 0,
+ SPECIAL_EFFECT_BW,
+ SPECIAL_EFFECT_BLUISH,
+ SPECIAL_EFFECT_SEPIA,
+ SPECIAL_EFFECT_REDDISH,
+ SPECIAL_EFFECT_GREENISH,
+ SPECIAL_EFFECT_NEGATIVE,
+}camera_special_effect_t;
+
+typedef enum camera_exposure_e {
+ EXPOSURE_N4_STEP = 0,
+ EXPOSURE_N3_STEP,
+ EXPOSURE_N2_STEP,
+ EXPOSURE_N1_STEP,
+ EXPOSURE_0_STEP,
+ EXPOSURE_P1_STEP,
+ EXPOSURE_P2_STEP,
+ EXPOSURE_P3_STEP,
+ EXPOSURE_P4_STEP,
+}camera_exposure_t;
+
+
+typedef enum camera_sharpness_e {
+ SHARPNESS_1_STEP = 0,
+ SHARPNESS_2_STEP,
+ SHARPNESS_3_STEP,
+ SHARPNESS_4_STEP,
+ SHARPNESS_5_STEP,
+ SHARPNESS_6_STEP,
+ SHARPNESS_7_STEP,
+ SHARPNESS_8_STEP,
+ SHARPNESS_AUTO_STEP,
+}camera_sharpness_t;
+
+typedef enum camera_mirror_flip_e {
+ MF_NORMAL = 0,
+ MF_MIRROR,
+ MF_FLIP,
+ MF_MIRROR_FLIP,
+}camera_mirror_flip_t;
+
+
+typedef enum camera_wb_flip_e {
+ CAM_WB_AUTO = 0,
+ CAM_WB_CLOUD,
+ CAM_WB_DAYLIGHT,
+ CAM_WB_INCANDESCENCE,
+ CAM_WB_TUNGSTEN,
+ CAM_WB_FLUORESCENT,
+ CAM_WB_MANUAL,
+}camera_wb_flip_t;
+typedef enum camera_night_mode_flip_e {
+ CAM_NM_AUTO = 0,
+ CAM_NM_ENABLE,
+}camera_night_mode_flip_t;
+typedef enum camera_effect_flip_e {
+ CAM_EFFECT_ENC_NORMAL = 0,
+ CAM_EFFECT_ENC_GRAYSCALE,
+ CAM_EFFECT_ENC_SEPIA,
+ CAM_EFFECT_ENC_SEPIAGREEN,
+ CAM_EFFECT_ENC_SEPIABLUE,
+ CAM_EFFECT_ENC_COLORINV,
+}camera_effect_flip_t;
+#endif
+
+
|