author | jiyu.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) |
commit | 6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e (patch) | |
tree | d4ac90eae5863efd08db53a9b09ba73ed0bf91b3 | |
parent | 127fc4ace3c51be4e883de135c1387072aff3f9c (diff) | |
download | camera-6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e.zip camera-6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e.tar.gz camera-6b0cec3cfd3059cf900180ffdb50eb8716d2eb9e.tar.bz2 |
yv12 support for media box(c code yuyv_to_yv12)
-rwxr-xr-x | V4LCameraAdapter/V4LCameraAdapter.cpp | 23 | ||||
-rwxr-xr-x | utils/util.cpp | 41 | ||||
-rwxr-xr-x | utils/util.h | 1 |
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_*/ |