summaryrefslogtreecommitdiff
authorjiyu.yang <jiyu.yang@amlogic.com>2012-09-11 05:02:54 (GMT)
committer jiyu.yang <jiyu.yang@amlogic.com>2012-09-11 05:04:57 (GMT)
commit6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e (patch)
treed4ac90eae5863efd08db53a9b09ba73ed0bf91b3
parent127fc4ace3c51be4e883de135c1387072aff3f9c (diff)
downloadcamera-6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e.zip
camera-6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e.tar.gz
camera-6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e.tar.bz2
yv12 support for media box(c code yuyv_to_yv12)
Diffstat
-rwxr-xr-xV4LCameraAdapter/V4LCameraAdapter.cpp23
-rwxr-xr-xutils/util.cpp41
-rwxr-xr-xutils/util.h1
3 files changed, 53 insertions, 12 deletions
diff --git a/V4LCameraAdapter/V4LCameraAdapter.cpp b/V4LCameraAdapter/V4LCameraAdapter.cpp
index bb35111..c687887 100755
--- a/V4LCameraAdapter/V4LCameraAdapter.cpp
+++ b/V4LCameraAdapter/V4LCameraAdapter.cpp
@@ -646,13 +646,7 @@ status_t V4LCameraAdapter::UseBuffersPreview(void* bufArr, int num)
int width, height;
mParams.getPreviewSize(&width, &height);
-#ifdef AMLOGIC_USB_CAMERA_SUPPORT
- ret = setBuffersFormat(width, height, V4L2_PIX_FMT_YUYV);//
- if( 0 > ret ){
- CAMHAL_LOGEB("VIDIOC_S_FMT failed: %s", strerror(errno));
- return BAD_VALUE;
- }
-#else
+
const char *pixfmtchar;
int pixfmt = V4L2_PIX_FMT_NV21;
@@ -666,8 +660,15 @@ status_t V4LCameraAdapter::UseBuffersPreview(void* bufArr, int num)
}else if(strcasecmp( pixfmtchar, "yuv422")==0){
pixfmt = V4L2_PIX_FMT_YUYV;
mPixelFormat = CameraFrame::PIXEL_FMT_YUYV;
-}
+ }
+#ifdef AMLOGIC_USB_CAMERA_SUPPORT
+ ret = setBuffersFormat(width, height, V4L2_PIX_FMT_YUYV);//
+ if( 0 > ret ){
+ CAMHAL_LOGEB("VIDIOC_S_FMT failed: %s", strerror(errno));
+ return BAD_VALUE;
+ }
+#else
setBuffersFormat(width, height, pixfmt);
#endif
//First allocate adapter internal buffers at V4L level for USB Cam
@@ -1344,8 +1345,12 @@ int V4LCameraAdapter::previewThread()
}else if(DEFAULT_PREVIEW_PIXEL_FORMAT == V4L2_PIX_FMT_NV21){ //420sp
frame.mLength = width*height*3/2;
#ifdef AMLOGIC_USB_CAMERA_SUPPORT
+ if ( CameraFrame::PIXEL_FMT_NV21 == mPixelFormat){
//convert yuyv to nv21
- yuyv422_to_nv21(src,dest,width,height);
+ yuyv422_to_nv21(src,dest,width,height);
+ }else{
+ yuyv_to_yv12( src, dest, width, height);
+ }
#else
if ( CameraFrame::PIXEL_FMT_NV21 == mPixelFormat){
memcpy(dest,src,frame.mLength);
diff --git a/utils/util.cpp b/utils/util.cpp
index 969e40f..6f06b37 100755
--- a/utils/util.cpp
+++ b/utils/util.cpp
@@ -5,6 +5,10 @@
#include <sys/types.h>
#include <sys/stat.h>
+#ifndef ALIGN
+#define ALIGN(b,w) (((b)+((w)-1))/(w)*(w))
+#endif
+
#ifdef AMLOGIC_USB_CAMERA_SUPPORT
#define swap_cbcr
static void convert_rgb16_to_nv21(uint8_t *rgb, uint8_t *yuv, int width, int height)
@@ -283,10 +287,41 @@ void convert_rgb24_to_rgb16(uint8_t *src, uint8_t *dst, int width, int height)
j += 2;
}
}
+void yuyv_to_yv12(unsigned char *src, unsigned char *dst, int width, int height)
+{
+ //width should be an even number.
+ //uv ALIGN 32.
+ int i,j,stride,c_stride,c_size,y_size,cb_offset,cr_offset;
+ unsigned char *dst_copy,*src_copy;
+
+ dst_copy = dst;
+ src_copy = src;
+
+ y_size = width*height;
+ c_stride = ALIGN(width/2, 16);
+ c_size = c_stride * height/2;
+ cr_offset = y_size;
+ cb_offset = y_size+c_size;
+
+ for(i=0;i< y_size;i++){
+ *dst++ = *src;
+ src += 2;
+ }
+
+ dst = dst_copy;
+ src = src_copy;
+
+ for(i=0;i<height;i+=2){
+ for(j=1;j<width*2;j+=4){//one line has 2*width bytes for yuyv.
+ //ceil(u1+u2)/2
+ *(dst+cr_offset+j/4)= (*(src+j+2) + *(src+j+2+width*2) + 1)/2;
+ *(dst+cb_offset+j/4)= (*(src+j) + *(src+j+width*2) + 1)/2;
+ }
+ dst += c_stride;
+ src += width*4;
+ }
+}
#else
-#ifndef ALIGN
-#define ALIGN(b,w) (((b)+((w)-1))/(w)*(w))
-#endif
void yv12_adjust_memcpy(unsigned char *dst, unsigned char *src, int width, int height)
{
//width should be an even number.
diff --git a/utils/util.h b/utils/util.h
index 6434dcb..a4f2fc9 100755
--- a/utils/util.h
+++ b/utils/util.h
@@ -8,4 +8,5 @@ void yuyv422_to_rgb16(unsigned char *from, unsigned char *to, int size);
void yuyv422_to_rgb24(unsigned char *buf, unsigned char *rgb, int width, int height);
void yuyv422_to_nv21(unsigned char *bufsrc, unsigned char *bufdest, int width, int height);
void yv12_adjust_memcpy(unsigned char *dst, unsigned char *src, int width, int height);
+void yuyv_to_yv12(unsigned char *src, unsigned char *dst, int width, int height);
#endif /* AML_CAMERA_HARDWARE_INCLUDE_*/