diff options
author | Emilian Peev <epeev@mm-sol.com> | 2012-05-02 12:18:12 +0300 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2012-05-07 11:35:33 -0700 |
commit | baed3f89bba1cbd3720656f7125f25705be38db7 (patch) | |
tree | ade727b6ec805073b3cb472c4857e27d2a212f91 | |
parent | d8bf3dc07ef357eb0761cfdacab458f2358907aa (diff) | |
download | omap4xxx-omapzoom-baed3f89bba1cbd3720656f7125f25705be38db7.tar.gz |
CameraHal: Add support for YUY2 preview callbacks
- The currently used Gralloc buffers for preview
are limited to only NV12 pixelformat. In order
to support this type of preview callbacks,
CameraHal will internally convert from NV12 to
YUY2.
Bug: 6419136
Change-Id: I879e32d4b2142bdd0a1f89fe7c5496d250039b73
Signed-off-by: Emilian Peev <epeev@mm-sol.com>
-rw-r--r-- | camera/AppCallbackNotifier.cpp | 43 | ||||
-rwxr-xr-x | camera/OMXCameraAdapter/OMXCameraAdapter.cpp | 10 |
2 files changed, 46 insertions, 7 deletions
diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp index 63ed0005..678b7195 100644 --- a/camera/AppCallbackNotifier.cpp +++ b/camera/AppCallbackNotifier.cpp @@ -473,6 +473,49 @@ static void copy2Dto1D(void *dst, if (pixelFormat!=NULL) { if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { bytesPerPixel = 2; + bufferSrc = ( unsigned char * ) y_uv[0] + offset; + uint32_t xOff = offset % stride; + uint32_t yOff = offset / stride; + uint8_t *bufferSrcUV = ((uint8_t*)y_uv[1] + (stride/2)*yOff + xOff); + uint8_t *bufferSrcUVEven = bufferSrcUV; + + uint8_t *bufferDstY = ( uint8_t * ) dst; + uint8_t *bufferDstU = bufferDstY + 1; + uint8_t *bufferDstV = bufferDstY + 3; + + // going to convert from NV12 here and return + for ( int i = 0 ; i < height; i ++ ) { + for ( int j = 0 ; j < width / 2 ; j++ ) { + + // Y + *bufferDstY = *bufferSrc; + bufferSrc++; + bufferDstY += 2; + + *bufferDstY = *bufferSrc; + bufferSrc++; + bufferDstY += 2; + + // V + *bufferDstV = *(bufferSrcUV + 1); + bufferDstV += 4; + + // U + *bufferDstU = *bufferSrcUV; + bufferDstU += 4; + + bufferSrcUV += 2; + } + if ( i % 2 ) { + bufferSrcUV += ( stride - width); + bufferSrcUVEven = bufferSrcUV; + } else { + bufferSrcUV = bufferSrcUVEven; + } + bufferSrc += ( stride - width); + } + + return; } else if (strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || strcmp(pixelFormat, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) { bytesPerPixel = 1; diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp index b3fcf671..180b4412 100755 --- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp +++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp @@ -429,13 +429,9 @@ status_t OMXCameraAdapter::setParameters(const CameraParameters ¶ms) ///@todo Include more camera parameters if ( (valstr = params.getPreviewFormat()) != NULL ) { - if (strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) - { - CAMHAL_LOGDA("CbYCrY format selected"); - pixFormat = OMX_COLOR_FormatCbYCrY; - } - else if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || - strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0) + if(strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420SP) == 0 || + strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV420P) == 0 || + strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { CAMHAL_LOGDA("YUV420SP format selected"); pixFormat = OMX_COLOR_FormatYUV420SemiPlanar; |