summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmilian Peev <epeev@mm-sol.com>2012-05-02 12:18:12 +0300
committerEino-Ville Talvala <etalvala@google.com>2012-05-07 11:35:33 -0700
commit34584fdcd6df03674b6b7a0f51e29b9bd452e50b (patch)
treee5b45a19c19e341a38cb5669a2be1bd1089cec70
parentfa5e7c8bbfcd2d444e9fe21bcf63e4a7c070a57f (diff)
downloadhardware_ti_omap4-34584fdcd6df03674b6b7a0f51e29b9bd452e50b.zip
hardware_ti_omap4-34584fdcd6df03674b6b7a0f51e29b9bd452e50b.tar.gz
hardware_ti_omap4-34584fdcd6df03674b6b7a0f51e29b9bd452e50b.tar.bz2
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.cpp43
-rwxr-xr-xcamera/OMXCameraAdapter/OMXCameraAdapter.cpp10
2 files changed, 46 insertions, 7 deletions
diff --git a/camera/AppCallbackNotifier.cpp b/camera/AppCallbackNotifier.cpp
index 63ed000..678b719 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 b3fcf67..180b441 100755
--- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
+++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp
@@ -429,13 +429,9 @@ status_t OMXCameraAdapter::setParameters(const CameraParameters &params)
///@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;