summaryrefslogtreecommitdiff
authorpeng.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)
commit93f0429c04bb526926f3460d41f3397bf76a18ab (patch)
tree87a7335cb897e681895630a29475cd0a23e2ca98
parent231ca96c941636e8256fa4d6f53612e01d61e6d0 (diff)
downloadcamera-93f0429c04bb526926f3460d41f3397bf76a18ab.zip
camera-93f0429c04bb526926f3460d41f3397bf76a18ab.tar.gz
camera-93f0429c04bb526926f3460d41f3397bf76a18ab.tar.bz2
add camera para
Diffstat
-rwxr-xr-xAndroid.mk2
-rwxr-xr-xOpCameraHardware.c131
-rwxr-xr-xV4L2/V4L2Camera.cpp110
-rwxr-xr-xV4L2/V4L2Camera.h1
-rwxr-xr-xamlogic_camera_para.h148
5 files changed, 381 insertions, 11 deletions
diff --git a/Android.mk b/Android.mk
index 5973d52..52d05d2 100755
--- a/Android.mk
+++ b/Android.mk
@@ -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
+
+