summaryrefslogtreecommitdiff
authorsky.zhou <sky.zhou@droidsh.(none)>2011-03-23 09:14:09 (GMT)
committer sky.zhou <sky.zhou@droidsh.(none)>2011-03-23 09:14:09 (GMT)
commitcfb61edc786308085461f0147b67a9d9477e7486 (patch)
tree940996f69697798f40c67d2075a9c5b56a549f0a
parente3b6175ffe4435b016b3b3986c77b6a6a3c72ac9 (diff)
downloadcamera-cfb61edc786308085461f0147b67a9d9477e7486.zip
camera-cfb61edc786308085461f0147b67a9d9477e7486.tar.gz
camera-cfb61edc786308085461f0147b67a9d9477e7486.tar.bz2
fix camera cts fail & add exif info in jpeg
Diffstat
-rwxr-xr-xAmlogicCameraHardware.cpp29
-rwxr-xr-xAmlogicCameraHardware.h2
-rwxr-xr-xAndroid.mk3
-rwxr-xr-xV4L2/V4L2Camera.cpp72
-rwxr-xr-xV4L2/V4L2Camera.h1
-rwxr-xr-xjpegenc/amljpeg_enc.c48
-rwxr-xr-xjpegenc/amljpeg_enc.h2
7 files changed, 117 insertions, 40 deletions
diff --git a/AmlogicCameraHardware.cpp b/AmlogicCameraHardware.cpp
index b83a3d0..66e0bdc 100755
--- a/AmlogicCameraHardware.cpp
+++ b/AmlogicCameraHardware.cpp
@@ -94,7 +94,7 @@ void AmlogicCameraHardware::initHeapLocked()
int preview_width, preview_height;
mParameters.getPreviewSize(&preview_width, &preview_height);
- LOGD("initHeapLocked: preview size=%dx%d", preview_width, preview_height);
+ // LOGD("initHeapLocked: preview size=%dx%d", preview_width, preview_height);
// Note that we enforce yuv422 in setParameters().
int how_big = preview_width * preview_height * 2;
@@ -126,13 +126,13 @@ void AmlogicCameraHardware::initHeapLocked()
sp<IMemoryHeap> AmlogicCameraHardware::getPreviewHeap() const
{
- LOGV("getPreviewHeap");
+ //LOGV("getPreviewHeap");
return mPreviewHeap;
}
sp<IMemoryHeap> AmlogicCameraHardware::getRawHeap() const
{
- LOGV("getRawHeap");
+ //LOGV("getRawHeap");
return mRawHeap;
}
@@ -150,6 +150,7 @@ void AmlogicCameraHardware::setCallbacks(notify_callback notify_cb,
void AmlogicCameraHardware::enableMsgType(int32_t msgType)
{
+ LOGD("Enable msgtype %d",msgType);
Mutex::Autolock lock(mLock);
mMsgEnabled |= msgType;
}
@@ -183,7 +184,9 @@ int AmlogicCameraHardware::previewThread()
sp<MemoryHeapBase> heap = mPreviewHeap;
sp<MemoryBase> buffer = mBuffers[mCurrentPreviewFrame];
+#ifndef AMLOGIC_CAMERA_OVERLAY_SUPPORT
sp<MemoryBase> recordBuffer = mRecordBuffers[mCurrentPreviewFrame];
+#endif
mLock.unlock();
// TODO: here check all the conditions that could go wrong
@@ -196,18 +199,20 @@ int AmlogicCameraHardware::previewThread()
void *base = heap->base();
uint8_t *frame = ((uint8_t *)base) + offset;
- //when use overlay, we did't have this message???
- //if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
+ //get preview frame
{
mCamera->GetPreviewFrame(frame);
-
- if(drop_frames >= 0)
+ if(drop_frames > 0)
{
drop_frames--;
return NO_ERROR;
}
- else
+
+ if(mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME)
+ {
+ LOGD("Return preview frame");
mDataCb(CAMERA_MSG_PREVIEW_FRAME, buffer, mCallbackCookie);
+ }
}
//get Record frames data
@@ -221,7 +226,8 @@ int AmlogicCameraHardware::previewThread()
convert_rgb16_to_yuv420sp(frame,recordframe,width,height);
mDataCbTimestamp(systemTime(),CAMERA_MSG_VIDEO_FRAME, recordbuffer, mCallbackCookie);
#else
- NO IMPLEMENTS!!
+ //when use overlay, the preview format is the same as record
+ mDataCbTimestamp(systemTime(),CAMERA_MSG_VIDEO_FRAME, buffer, mCallbackCookie);
#endif
}
else
@@ -434,7 +440,6 @@ status_t AmlogicCameraHardware::setParameters(const CameraParameters& params)
}
mParameters = params;
- mCamera->SetParameters(mParameters);//set to the real hardware
initHeapLocked();
int w,h;
@@ -448,7 +453,7 @@ status_t AmlogicCameraHardware::setParameters(const CameraParameters& params)
sleep_times = TMP_SLEEP_TIMES;
}
- return NO_ERROR;
+ return mCamera->SetParameters(mParameters);//set to the real hardware
}
CameraParameters AmlogicCameraHardware::getParameters() const
@@ -544,7 +549,7 @@ int SYS_disable_colorkey()
#ifdef AMLOGIC_MULTI_CAMERA_SUPPORT
extern "C" sp<CameraHardwareInterface> openCameraHardware(int CamId)
{
- LOGV("openCameraHardware with camid");
+ //LOGV("openCameraHardware with camid");
return AmlogicCameraHardware::createInstance(CamId);
}
#else
diff --git a/AmlogicCameraHardware.h b/AmlogicCameraHardware.h
index e61535c..3e6ad29 100755
--- a/AmlogicCameraHardware.h
+++ b/AmlogicCameraHardware.h
@@ -7,7 +7,7 @@
#include <binder/MemoryBase.h>
#include <binder/MemoryHeapBase.h>
-//#define AMLOGIC_CAMERA_OVERLAY_SUPPORT 1
+#define AMLOGIC_CAMERA_OVERLAY_SUPPORT 1
namespace android {
diff --git a/Android.mk b/Android.mk
index c37358c..395f5b6 100755
--- a/Android.mk
+++ b/Android.mk
@@ -9,7 +9,8 @@ LOCAL_SHARED_LIBRARIES := \
liblog \
libcamera_client \
libbinder \
- libjpeg
+ libjpeg \
+ libexif
ifeq ($(BOARD_HAVE_MULTI_CAMERAS),true)
LOCAL_CFLAGS += -DAMLOGIC_MULTI_CAMERA_SUPPORT
diff --git a/V4L2/V4L2Camera.cpp b/V4L2/V4L2Camera.cpp
index bf1815a..58a3bab 100755
--- a/V4L2/V4L2Camera.cpp
+++ b/V4L2/V4L2Camera.cpp
@@ -23,6 +23,7 @@ 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);
+int encode_jpeg(jpeg_enc_t* enc) ;
}
@@ -125,6 +126,10 @@ status_t V4L2Camera::InitParameters(CameraParameters& pParameters)
pParameters.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, "800x600");
pParameters.setPictureSize(800,600);
+ //must have >2 sizes and contain "0x0"
+ pParameters.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, "512x384,320x240,0x0");
+
+
pParameters.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,CameraParameters::FOCUS_MODE_AUTO);
pParameters.set(CameraParameters::KEY_FOCUS_MODE,CameraParameters::FOCUS_MODE_AUTO);
@@ -147,27 +152,37 @@ status_t V4L2Camera::InitParameters(CameraParameters& pParameters)
//pParameters.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,"auto,night,snow");
//pParameters.set(CameraParameters::KEY_SCENE_MODE,"auto");
-
-
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);
#if 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);
+
+ pParameters.set(CameraParameters::KEY_ZOOM_RATIOS,"100,120,140,160,180,200,220,280,300");
+ pParameters.set(CameraParameters::KEY_MAX_ZOOM,8); //think the zoom ratios as a array, the max zoom is the max index
+ pParameters.set(CameraParameters::KEY_ZOOM,0);//default should be 0
#endif
return NO_ERROR;
}
-//write parameter to v4l2 driver
+//write parameter to v4l2 driver,
+//check parameter if valid, if un-valid first should correct it ,and return the INVALID_OPERTIONA
status_t V4L2Camera::SetParameters(CameraParameters& pParameters)
{
+ status_t rtn = NO_ERROR;
+ //check zoom value
+ int zoom = pParameters.getInt(CameraParameters::KEY_ZOOM);
+ int maxzoom = pParameters.getInt(CameraParameters::KEY_MAX_ZOOM);
+ if((zoom > maxzoom) || (zoom < 0))
+ {
+ rtn = INVALID_OPERATION;
+ pParameters.set(CameraParameters::KEY_ZOOM, maxzoom);
+ }
+
m_hParameter = pParameters;
int preview_width, preview_height,preview_FrameRate;
const char *white_balance=NULL;
@@ -225,7 +240,7 @@ status_t V4L2Camera::SetParameters(CameraParameters& pParameters)
}
//LOGD("V4L2Camera::SetParameters");
- return NO_ERROR;
+ return rtn;
}
status_t V4L2Camera::StartPreview()
@@ -283,6 +298,17 @@ status_t V4L2Camera::GetRawFrame(uint8_t* framebuf)
LOGD("GetRawFraem index -1");
return NO_ERROR;
}
+extern "C" unsigned char* getExifBuf(const char* attributes);
+int V4L2Camera::GenExif(unsigned char** pExif,int* exifLen)
+{
+ char* DefaultTag = "5 Make=7 AmlogicModel=6 b09refDateTime=10 2011/03/23ImageWidth=3 800ImageLength=3 600";
+ unsigned char* exifinfo = getExifBuf(DefaultTag);
+ *exifLen = (exifinfo[0]<<8) | (exifinfo[1]);
+ LOGD("exiflen %d",exifLen);
+ *pExif = exifinfo+2;
+ return 1;
+}
+
status_t V4L2Camera::GetJpegFrame(uint8_t* framebuf)
{
if(m_iPicIdx!=-1)
@@ -294,6 +320,7 @@ status_t V4L2Camera::GetJpegFrame(uint8_t* framebuf)
enc.ibuff_size = pV4L2FrameSize[m_iPicIdx];
enc.obuff_size = pV4L2FrameSize[m_iPicIdx];
enc.quality = m_v4l2_qulity;
+ GenExif(&(enc.data_in_app1),&(enc.app1_data_size));
encode_jpeg(&enc);
}
else
@@ -302,7 +329,7 @@ status_t V4L2Camera::GetJpegFrame(uint8_t* framebuf)
}
-//===============================
+//=======================================================================================
//functions for set V4L2
status_t V4L2Camera::V4L2_BufferInit(int Buf_W,int Buf_H,int Buf_Num,int colorfmt)
{
@@ -312,9 +339,9 @@ status_t V4L2Camera::V4L2_BufferInit(int Buf_W,int Buf_H,int Buf_Num,int colorfm
hformat.fmt.pix.width = Buf_W;
hformat.fmt.pix.height = Buf_H;
hformat.fmt.pix.pixelformat = colorfmt;
-// LOGD("V4L2_BufferInit::Set Video Size %d,%d",Buf_W,Buf_H);
if (ioctl(m_iDevFd, VIDIOC_S_FMT, &hformat) == -1)
{
+ LOGE("V4L2_BufferInit VIDIOC_S_FMT fail");
return UNKNOWN_ERROR;
}
@@ -326,14 +353,14 @@ status_t V4L2Camera::V4L2_BufferInit(int Buf_W,int Buf_H,int Buf_Num,int colorfm
hbuf_req.count = Buf_Num; //just set two frames for hal have cache buffer
if (ioctl(m_iDevFd, VIDIOC_REQBUFS, &hbuf_req) == -1)
{
- LOGD("Req V4L2 buffer fail");
+ LOGE("V4L2_BufferInit VIDIOC_REQBUFS fail");
return UNKNOWN_ERROR;
}
else
{
if (hbuf_req.count < Buf_Num)
{
- LOGD("Req V4L2 buffer Fail");
+ LOGE("V4L2_BufferInit hbuf_req.count < Buf_Num");
return UNKNOWN_ERROR;
}
else//memmap these buffer to user space
@@ -351,7 +378,7 @@ status_t V4L2Camera::V4L2_BufferInit(int Buf_W,int Buf_H,int Buf_Num,int colorfm
hbuf_query.index = i;
if (ioctl(m_iDevFd, VIDIOC_QUERYBUF, &hbuf_query) == -1)
{
- LOGD("Memap V4L2 buffer Fail");
+ LOGE("Memap V4L2 buffer Fail");
return UNKNOWN_ERROR;
}
@@ -360,13 +387,13 @@ status_t V4L2Camera::V4L2_BufferInit(int Buf_W,int Buf_H,int Buf_Num,int colorfm
pV4L2Frames[i] = mmap(NULL,pV4L2FrameSize[i],PROT_READ | PROT_WRITE,MAP_SHARED,m_iDevFd,hbuf_query.m.offset);
if(pV4L2Frames[i] == MAP_FAILED)
{
- LOGD("Memap V4L2 buffer Fail");
+ LOGE("Memap V4L2 buffer Fail");
return UNKNOWN_ERROR;
}
//enqueue buffer
if (ioctl(m_iDevFd, VIDIOC_QBUF, &hbuf_query) == -1)
{
- LOGD("GetPreviewFrame nque buffer fail");
+ LOGE("GetPreviewFrame nque buffer fail");
return UNKNOWN_ERROR;
}
}
@@ -406,26 +433,24 @@ status_t V4L2Camera::V4L2_BufferEnQue(int idx)
hbuf_query.index = idx;
if (ioctl(m_iDevFd, VIDIOC_QBUF, &hbuf_query) == -1)
{
- LOGD("V4L2_BufferEnQue fail");
+ LOGE("V4L2_BufferEnQue fail");
return UNKNOWN_ERROR;
}
- //LOGD("V4L2_BufferEnQue success");
return NO_ERROR;
}
int V4L2Camera::V4L2_BufferDeQue()
{
-// LOGD("V4L2_BufferDeQue ");
v4l2_buffer hbuf_query;
memset(&hbuf_query,0,sizeof(v4l2_buffer));
hbuf_query.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
hbuf_query.memory = V4L2_MEMORY_MMAP;//加和不加index有什么区别?
if (ioctl(m_iDevFd, VIDIOC_DQBUF, &hbuf_query) == -1)
{
- LOGD("V4L2_StreamGet Deque buffer fail");
+ LOGE("V4L2_StreamGet Deque buffer fail");
return UNKNOWN_ERROR;
}
- //LOGD("V4L2_StreamGet bufferidx %d\n",hbuf_query.index);
+
assert (hbuf_query.index < m_V4L2BufNum);
return hbuf_query.index;
}
@@ -435,19 +460,16 @@ status_t V4L2Camera::V4L2_StreamOn()
//LOGD("V4L2_StreamOn");
int stream_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(m_iDevFd, VIDIOC_STREAMON, &stream_type) == -1)
- LOGD("V4L2_StreamOn Fail");
- //LOGD("V4L2_StreamOn Succes");
+ LOGE("V4L2_StreamOn Fail");
+
return NO_ERROR;
}
status_t V4L2Camera::V4L2_StreamOff()
{
- //LOGD("V4L2_StreamOff");
int stream_type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(m_iDevFd, VIDIOC_STREAMOFF, &stream_type) == -1)
- LOGD("V4L2_StreamOff Fail");
- //else
- //LOGD("V4L2_StreamOff Success");
+ LOGE("V4L2_StreamOff Fail");
return NO_ERROR;
}
diff --git a/V4L2/V4L2Camera.h b/V4L2/V4L2Camera.h
index 1335801..eefb63b 100755
--- a/V4L2/V4L2Camera.h
+++ b/V4L2/V4L2Camera.h
@@ -41,6 +41,7 @@ protected:
status_t V4L2_StreamOn();
status_t V4L2_StreamOff();
+ int GenExif(unsigned char** pExif,int* exifLen);
void** pV4L2Frames;
diff --git a/jpegenc/amljpeg_enc.c b/jpegenc/amljpeg_enc.c
index 5d44138..d982d6b 100755
--- a/jpegenc/amljpeg_enc.c
+++ b/jpegenc/amljpeg_enc.c
@@ -1,3 +1,10 @@
+/****************************************************
+*
+* api to encoder rgb data into jpeg format.
+* 01/27/2011.
+* kasin.li@amlogic.com
+*
+*****************************************************/
#include"amljpeg_enc.h"
#include <stdio.h>
@@ -81,7 +88,10 @@ int encode_jpeg(jpeg_enc_t* enc)
jpeg_set_quality(&cinfo, enc->quality, TRUE);
jpeg_start_compress(&cinfo, TRUE);
-
+
+ if(enc->data_in_app1)
+ jpeg_write_marker(&cinfo,0xe1,enc->data_in_app1,enc->app1_data_size);
+
row_stride = enc->width * 3;
/* processing. */
@@ -95,4 +105,40 @@ int encode_jpeg(jpeg_enc_t* enc)
return dest.data_size;
}
+/* example. */
+#ifdef ENC_TEST
+
+#define iwidth 1280
+#define iheight 720
+#define buf_size (iwidth*iheight)
+char jpeg_dat[buf_size*3];
+int main() {
+ FILE* fp;
+ int data_size,i;
+ jpeg_enc_t enc;
+
+ enc.width=iwidth;
+ enc.height=iheight;
+ enc.quality=75;
+ enc.idata = jpeg_dat;
+ enc.ibuff_size = buf_size*3;
+ enc.odata = jpeg_dat;
+ enc.obuff_size = buf_size*3;
+
+ fp=fopen("test1.jpeg","wb");
+ if(!fp) {
+ printf(" open error\n");
+ exit(1);
+ }
+ for(i=0;i<buf_size*3;i+=3) {
+ jpeg_dat[i]=0;
+ jpeg_dat[i+1]=0;
+ jpeg_dat[i+2]=0xff;
+ }
+ data_size=encode_jpeg(&enc);
+ fwrite(jpeg_dat,1,data_size,fp);
+ fclose(fp);
+ return 0;
+}
+#endif
diff --git a/jpegenc/amljpeg_enc.h b/jpegenc/amljpeg_enc.h
index e2523fd..3f90e6e 100755
--- a/jpegenc/amljpeg_enc.h
+++ b/jpegenc/amljpeg_enc.h
@@ -8,6 +8,8 @@ typedef struct {
unsigned char* idata;
unsigned char* odata;
+ unsigned char* data_in_app1;
+ int app1_data_size;
int ibuff_size;
int obuff_size;
} jpeg_enc_t;