hardware: exynos5: add initial libexynosutils
authorJiho Chang <jiho04.chang@samsung.com>
Fri, 23 Mar 2012 20:52:01 +0000 (05:52 +0900)
committerDima Zavin <dima@android.com>
Fri, 6 Apr 2012 20:52:32 +0000 (13:52 -0700)
Change-Id: I891c7589482e5aaeac847bb5255f2b401a99f8e7
Signed-off-by: Jiho Chang <jiho04.chang@samsung.com>
libexynosutils/Android.mk [new file with mode: 0644]
libexynosutils/ExynosMutex.cpp [new file with mode: 0644]
libexynosutils/ExynosMutex.h [new file with mode: 0644]
libexynosutils/exynos4_format.c [new file with mode: 0644]
libexynosutils/exynos4_format_v4l2.c [new file with mode: 0644]
libexynosutils/exynos5_format_v4l2.c [new file with mode: 0644]
libexynosutils/exynos_format.h [new file with mode: 0644]

diff --git a/libexynosutils/Android.mk b/libexynosutils/Android.mk
new file mode 100644 (file)
index 0000000..aa973a7
--- /dev/null
@@ -0,0 +1,38 @@
+# Copyright (C) 2008 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_SHARED_LIBRARIES := liblog libutils libcutils
+
+LOCAL_CFLAGS += -DEXYNOS_PLATFORM_ON_ANDROID
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
+LOCAL_C_INCLUDES += framework/base/include
+
+LOCAL_SRC_FILES := ExynosMutex.cpp
+
+LOCAL_MODULE_TAGS := eng
+LOCAL_MODULE := libexynosutils
+
+ifeq ($(TARGET_BOARD_PLATFORM), exynos5)
+LOCAL_SRC_FILES += exynos5_format_v4l2.c
+LOCAL_C_INCLUDES += \
+       $(LOCAL_PATH)/../include
+endif
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/libexynosutils/ExynosMutex.cpp b/libexynosutils/ExynosMutex.cpp
new file mode 100644 (file)
index 0000000..f1a8cce
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * Copyright@ Samsung Electronics Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*!
+ * \file      ExynosMutex.cpp
+ * \brief     source file for ExynosMutex
+ * \author    Sangwoo, Park(sw5771.park@samsung.com)
+ * \date      2011/06/15
+ *
+ * <b>Revision History: </b>
+ * - 2010/06/15 : Sangwoo, Park(sw5771.park@samsung.com) \n
+ *   Initial version
+ *
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "ExynosMutex"
+#include <utils/Log.h>
+
+#include <utils/threads.h>
+using namespace android;
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "ExynosMutex.h"
+
+//#define EXYNOS_MUTEX_DEBUG
+
+ExynosMutex::ExynosMutex(
+    int type,
+    char* name)
+{
+    int androidMutexType = 0;
+    m_mutex = NULL;
+    m_type = TYPE_BASE;
+
+    switch (type) {
+    case TYPE_PRIVATE:
+        androidMutexType = Mutex::PRIVATE;
+        break;
+    case TYPE_SHARED:
+        androidMutexType = Mutex::SHARED;
+        break;
+    default:
+        LOGE("%s::unmatched type(%d) fail", __func__, type);
+        break;
+    }
+
+    m_mutex = new Mutex(androidMutexType, name);
+    if (m_mutex == NULL) {
+        LOGE("%s::Mutex create fail", __func__);
+    }
+
+    m_type = type;
+    strcpy(m_name, name);
+}
+
+ExynosMutex::~ExynosMutex()
+{
+    if (m_mutex)
+        delete ((Mutex *)m_mutex);
+    m_mutex = NULL;
+}
+
+bool ExynosMutex::lock(
+    void)
+{
+#ifdef EXYNOS_MUTEX_DEBUG
+    LOGD("%s::%s'lock() start", __func__, m_name);
+#endif
+
+    if (m_mutex == NULL) {
+        LOGE("%s::Mutex create fail", __func__);
+        return false;
+    }
+
+    if (((Mutex *)m_mutex)->lock() != 0) {
+        LOGE("%s::m_core->lock() fail", __func__);
+        return false;
+    }
+
+#ifdef EXYNOS_MUTEX_DEBUG
+    LOGD("%s::%s'lock() end", __func__, m_name);
+#endif
+
+    return true;
+}
+
+bool ExynosMutex::unLock(
+    void)
+{
+#ifdef EXYNOS_MUTEX_DEBUG
+    LOGD("%s::%s'unlock() start", __func__, m_name);
+#endif
+
+    if (m_mutex == NULL) {
+        LOGE("%s::Mutex create fail", __func__);
+        return false;
+    }
+
+    ((Mutex *)m_mutex)->unlock();
+
+#ifdef EXYNOS_MUTEX_DEBUG
+    LOGD("%s::%s'unlock() end", __func__, m_name);
+#endif
+
+    return true;
+}
+
+bool ExynosMutex::tryLock(
+    void)
+{
+    int ret = 0;
+
+#ifdef EXYNOS_MUTEX_DEBUG
+    LOGD("%s::%s'trylock() start", __func__, m_name);
+#endif
+
+    if (m_mutex == NULL) {
+        LOGE("%s::Mutex create fail", __func__);
+        return false;
+    }
+
+    ret = ((Mutex *)m_mutex)->tryLock();
+
+#ifdef EXYNOS_MUTEX_DEBUG
+    LOGD("%s::%s'trylock() end", __func__, m_name);
+#endif
+
+    return (ret == 0) ? true : false;
+}
+
+int ExynosMutex::getType(
+    void)
+{
+    return m_type;
+}
+
+int ExynosMutex::getCreatedStatus(
+    void)
+{
+    if (m_mutex == NULL)
+        return STATUS_NOT_CREATED;
+    else
+        return STATUS_CREATED;
+}
+
+void *exynos_mutex_create(
+    int type,
+    char *name)
+{
+    ExynosMutex *mutex = new ExynosMutex(type, name);
+
+    return (void*)mutex;
+}
+
+bool exynos_mutex_destroy(
+    void *handle)
+{
+    if (handle == NULL) {
+        LOGE("%s::handle is null", __func__);
+        return false;
+    }
+
+    delete (ExynosMutex *)handle;
+
+    return true;
+}
+
+bool exynos_mutex_lock(
+    void *handle)
+{
+    if (handle == NULL) {
+        LOGE("%s::handle is null", __func__);
+        return false;
+    }
+
+    return ((ExynosMutex *)handle)->lock();
+
+}
+
+bool exynos_mutex_unlock(
+    void *handle)
+{
+    if (handle == NULL) {
+        LOGE("%s::handle is null", __func__);
+        return false;
+    }
+
+    return ((ExynosMutex *)handle)->unLock();
+
+}
+
+bool exynos_mutex_trylock(
+    void *handle)
+{
+    if (handle == NULL) {
+        LOGE("%s::handle is null", __func__);
+        return false;
+    }
+
+    return ((ExynosMutex *)handle)->tryLock();
+
+}
+
+int exynos_mutex_get_type(
+    void *handle)
+{
+    if (handle == NULL) {
+        LOGE("%s::handle is null", __func__);
+        return false;
+    }
+
+    return ((ExynosMutex *)handle)->getType();
+}
+
+int exynos_mutex_get_created_status(
+    void *handle)
+{
+    if (handle == NULL) {
+        LOGE("%s::handle is null", __func__);
+        return false;
+    }
+
+    return ((ExynosMutex *)handle)->getCreatedStatus();
+}
+
diff --git a/libexynosutils/ExynosMutex.h b/libexynosutils/ExynosMutex.h
new file mode 100644 (file)
index 0000000..d2f346e
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright@ Samsung Electronics Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*!
+ * \file      ExynosMutex.h
+ * \brief     header file for ExynosMutex
+ * \author    Sangwoo, Park(sw5771.park@samsung.com)
+ * \date      2011/06/15
+ *
+ * <b>Revision History: </b>
+ * - 2010/06/15 : Sangwoo, Park(sw5771.park@samsung.com) \n
+ *   Initial version
+ *
+ */
+
+/**
+ * @page ExynosMutex
+ *
+ * @section Introduction
+ * ExynosMutex is for locking and making thread-safe operation
+ *
+ * @section Copyright
+ *  Copyright (c) 2008-2011 Samsung Electronics Co., Ltd.All rights reserved. \n
+ *  Proprietary and Confidential
+ *
+ * @image html samsung.png
+ */
+
+#ifndef __EXYNOS_MUTEX_H__
+#define __EXYNOS_MUTEX_H__
+
+#ifdef __cplusplus
+
+//! ExynosMutex
+/*!
+ * \ingroup Exynos
+ */
+class ExynosMutex
+{
+public:
+    enum TYPE {
+        TYPE_BASE = 0,
+        TYPE_PRIVATE,  //!< within this process
+        TYPE_SHARED,   //!< within whole system
+        TYPE_MAX,
+    };
+
+    enum STATUS {
+        STATUS_NOT_CREATED = 0,
+        STATUS_CREATED
+    };
+
+public:
+    //! Constructor
+    ExynosMutex(int type, char* name);
+
+    //! Destructor
+    virtual ~ExynosMutex();
+
+    //! Lock Mutex
+    bool lock(void);
+
+    //! Unlock Mutex
+    bool unLock(void);
+
+    //! trylock Mutex
+    bool tryLock(void);
+
+    //! Get Mutex type
+    int getType(void);
+
+    //! Get Mutex created status
+    int getCreatedStatus(void);
+
+private:
+    void *m_mutex;
+
+    int   m_type;
+    char  m_name[128];
+
+public:
+    //! Autolock
+    /*!
+     * \ingroup ExynosMutex
+     */
+    class Autolock {
+    public:
+        //! Lock on constructor
+        inline Autolock(ExynosMutex& mutex) : mLock(mutex)  { mLock.lock(); }
+
+        //! Lock on constructor
+        inline Autolock(ExynosMutex* mutex) : mLock(*mutex) { mLock.lock(); }
+
+        //! Unlock on destructor
+        inline ~Autolock() { mLock.unLock(); }
+    private:
+        ExynosMutex& mLock;
+    };
+};
+
+extern "C" {
+#endif
+
+enum EXYNOS_MUTEX_TYPE {
+    EXYNOS_MUTEX_TYPE_BASE = 0,
+    EXYNOS_MUTEX_TYPE_PRIVATE,  //!< within this process
+    EXYNOS_MUTEX_TYPE_SHARED,   //!< within whole system
+    EXYNOS_MUTEX_TYPE_MAX,
+};
+
+enum EXYNOS_MUTEX_STATUS {
+    EXYNOS_MUTEX_STATUS_NOT_CREATED = 0,
+    EXYNOS_MUTEX_STATUS_CREATED
+};
+
+void *exynos_mutex_create(
+    int   type,
+    char *name);
+
+bool exynos_mutex_destroy(
+    void *handle);
+
+bool exynos_mutex_lock(
+    void *handle);
+
+bool exynos_mutex_unlock(
+    void *handle);
+
+bool exynos_mutex_trylock(
+    void *handle);
+
+int exynos_mutex_type(
+    void *handle);
+
+int exynos_mutex_get_created_status(
+    void *handle);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //__EXYNOS_MUTEX_H__
diff --git a/libexynosutils/exynos4_format.c b/libexynosutils/exynos4_format.c
new file mode 100644 (file)
index 0000000..e8899a9
--- /dev/null
@@ -0,0 +1,284 @@
+/*
+ * Copyright@ Samsung Electronics Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+#ifndef __EXYNOS4_FORMAT_H__
+#define __EXYNOS4_FORMAT_H__
+
+//---------------------------------------------------------//
+// Include
+//---------------------------------------------------------//
+#include <hardware/hardware.h>
+#include "exynos_format.h"
+#include <utils/Log.h>
+#include "videodev2.h"
+#include "videodev2_exynos.h"
+#include "videodev2_samsung.h"
+
+//---------------------------------------------------------//
+// Common function                                         //
+//---------------------------------------------------------//
+int HAL_PIXEL_FORMAT_2_V4L2_PIX(
+    int hal_pixel_format)
+{
+    int v4l2_pixel_format = -1;
+
+    switch (hal_pixel_format) {
+    case HAL_PIXEL_FORMAT_RGBA_8888:
+    case HAL_PIXEL_FORMAT_RGBX_8888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGB_888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB24;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGB_565:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB565;
+        break;
+
+    case HAL_PIXEL_FORMAT_BGRA_8888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGBA_5551:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB555X;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGBA_4444:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB444;
+        break;
+
+    case HAL_PIXEL_FORMAT_YV12:
+        v4l2_pixel_format = V4L2_PIX_FMT_YVU420;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_420_P:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUV420;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV61;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV12;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUYV;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_P:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUV422P;
+        break;
+
+    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_UYVY;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV16;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV21;
+        break;
+
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV12T;
+        break;
+
+   case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_YVYU;
+        break;
+
+   case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_VYUY;
+        break;
+
+    default:
+        LOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
+                __func__, hal_pixel_format);
+        break;
+    }
+
+    return v4l2_pixel_format;
+}
+
+int V4L2_PIX_2_HAL_PIXEL_FORMAT(
+    int v4l2_pixel_format)
+{
+    int hal_pixel_format = -1;
+
+    switch (v4l2_pixel_format) {
+    case V4L2_PIX_FMT_RGB32:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
+        break;
+
+    case V4L2_PIX_FMT_RGB24:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888;
+        break;
+
+    case V4L2_PIX_FMT_RGB565:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
+        break;
+
+    case V4L2_PIX_FMT_BGR32:
+        hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888;
+        break;
+
+    case V4L2_PIX_FMT_RGB555X:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_5551;
+        break;
+
+    case V4L2_PIX_FMT_RGB444:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_4444;
+        break;
+
+    case V4L2_PIX_FMT_YUV420:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
+        break;
+
+    case V4L2_PIX_FMT_YVU420:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YV12;
+        break;
+
+    case V4L2_PIX_FMT_NV16:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
+        break;
+
+    case V4L2_PIX_FMT_NV12:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
+        break;
+
+    case V4L2_PIX_FMT_YUYV:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
+        break;
+
+    case V4L2_PIX_FMT_YUV422P:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P;
+        break;
+
+    case V4L2_PIX_FMT_UYVY:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
+        break;
+
+    case V4L2_PIX_FMT_NV21:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
+        break;
+
+    case V4L2_PIX_FMT_NV12T:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED;
+        break;
+
+    case V4L2_PIX_FMT_NV61:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
+        break;
+
+    case V4L2_PIX_FMT_YVYU:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
+        break;
+
+    case V4L2_PIX_FMT_VYUY:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
+        break;
+
+    default:
+        LOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
+                __func__, v4l2_pixel_format);
+        break;
+    }
+
+    return hal_pixel_format;
+}
+
+unsigned int FRAME_SIZE(
+    int hal_pixel_format,
+    int width,
+    int height)
+{
+    unsigned int frame_size = 0;
+    unsigned int size       = 0;
+
+    switch (hal_pixel_format) {
+    // 16bpp
+    case HAL_PIXEL_FORMAT_RGB_565:
+    case HAL_PIXEL_FORMAT_RGBA_5551:
+    case HAL_PIXEL_FORMAT_RGBA_4444:
+        frame_size = GET_16BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 24bpp
+    case HAL_PIXEL_FORMAT_RGB_888:
+        frame_size = GET_24BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 32bpp
+    case HAL_PIXEL_FORMAT_RGBA_8888:
+    case HAL_PIXEL_FORMAT_BGRA_8888:
+    case HAL_PIXEL_FORMAT_RGBX_8888:
+        frame_size = GET_32BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 12bpp
+    case HAL_PIXEL_FORMAT_YV12:
+    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P:
+    case HAL_PIXEL_FORMAT_YCbCr_420_I:
+    case HAL_PIXEL_FORMAT_CbYCrY_420_I:
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+        size = width * height;
+        frame_size = size + ((size >> 2) << 1);
+        break;
+
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))
+                     + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height >> 1));
+        break;
+
+    // 16bpp
+    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_YCbCr_422_P:
+    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+        frame_size = GET_16BPP_FRAME_SIZE(width, height);
+        break;
+
+    default:
+        LOGD("%s::no matching source colorformat(0x%x), w(%d), h(%d) fail\n",
+                __func__, hal_pixel_format, width, height);
+        break;
+    }
+
+    return frame_size;
+}
+
+#endif
diff --git a/libexynosutils/exynos4_format_v4l2.c b/libexynosutils/exynos4_format_v4l2.c
new file mode 100644 (file)
index 0000000..1fad6de
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ * Copyright@ Samsung Electronics Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*
+ * @file        exynos4_format_v4l2.c
+ *
+ * @brief       exynos format convertion for "exynos4 v4l2"
+ *
+ * @author      shinwon.lee(shinwon.lee@samsung.com)
+ *
+ * Revision History:
+ * - 2012/03/06 : shinwon lee(shinwon.lee@samsung.com)
+ *
+ */
+
+
+#ifndef __EXYNOS4_FORMAT_V4L2_H__
+#define __EXYNOS4_FORMAT_V4L2_H__
+
+//---------------------------------------------------------//
+// Include
+//---------------------------------------------------------//
+#include <hardware/hardware.h>
+#include "exynos_format.h"
+#include <utils/Log.h>
+#include "videodev2.h"
+#include "videodev2_exynos.h"
+
+int HAL_PIXEL_FORMAT_2_V4L2_PIX(
+    int hal_pixel_format)
+{
+    int v4l2_pixel_format = -1;
+
+    switch (hal_pixel_format) {
+    case HAL_PIXEL_FORMAT_RGBA_8888:
+    case HAL_PIXEL_FORMAT_RGBX_8888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGB_888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB24;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGB_565:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB565;
+        break;
+
+    case HAL_PIXEL_FORMAT_BGRA_8888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGBA_5551:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB555X;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGBA_4444:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB444;
+        break;
+
+    case HAL_PIXEL_FORMAT_YV12:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUV420M;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV61;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV12M;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUYV;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_P:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUV422P;
+        break;
+
+    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_UYVY;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV16;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV21;
+        break;
+
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV12MT;
+        break;
+
+   case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_YVYU;
+        break;
+
+   case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_VYUY;
+        break;
+
+    default:
+        LOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
+                __func__, hal_pixel_format);
+        break;
+    }
+
+    return v4l2_pixel_format;
+}
+
+int V4L2_PIX_2_HAL_PIXEL_FORMAT(
+    int v4l2_pixel_format)
+{
+    int hal_pixel_format = -1;
+
+    switch (v4l2_pixel_format) {
+    case V4L2_PIX_FMT_RGB32:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
+        break;
+
+    case V4L2_PIX_FMT_RGB24:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888;
+        break;
+
+    case V4L2_PIX_FMT_RGB565:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
+        break;
+
+    case V4L2_PIX_FMT_BGR32:
+        hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888;
+        break;
+
+    case V4L2_PIX_FMT_RGB555X:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_5551;
+        break;
+
+    case V4L2_PIX_FMT_RGB444:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_4444;
+        break;
+
+    case V4L2_PIX_FMT_YUV420:
+    case V4L2_PIX_FMT_YUV420M:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
+        break;
+
+    case V4L2_PIX_FMT_YVU420:
+    case V4L2_PIX_FMT_YVU420M:
+         hal_pixel_format = HAL_PIXEL_FORMAT_YV12;
+         break;
+
+    case V4L2_PIX_FMT_NV16:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
+        break;
+
+    case V4L2_PIX_FMT_NV12:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
+        break;
+
+    case V4L2_PIX_FMT_YUYV:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
+        break;
+
+    case V4L2_PIX_FMT_YUV422P:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P;
+        break;
+
+    case V4L2_PIX_FMT_UYVY:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
+        break;
+
+    case V4L2_PIX_FMT_NV21:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
+        break;
+
+    case V4L2_PIX_FMT_NV12MT:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED;
+        break;
+
+    case V4L2_PIX_FMT_NV61:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
+        break;
+
+    case V4L2_PIX_FMT_YVYU:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
+        break;
+
+    case V4L2_PIX_FMT_VYUY:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
+        break;
+
+    default:
+        LOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
+                __func__, v4l2_pixel_format);
+        break;
+    }
+
+    return hal_pixel_format;
+}
+
+unsigned int FRAME_SIZE(
+    int hal_pixel_format,
+    int width,
+    int height)
+{
+    unsigned int frame_size = 0;
+    unsigned int size       = 0;
+
+    switch (hal_pixel_format) {
+    // 16bpp
+    case HAL_PIXEL_FORMAT_RGB_565:
+    case HAL_PIXEL_FORMAT_RGBA_5551:
+    case HAL_PIXEL_FORMAT_RGBA_4444:
+        frame_size = GET_16BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 24bpp
+    case HAL_PIXEL_FORMAT_RGB_888:
+        frame_size = GET_24BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 32bpp
+    case HAL_PIXEL_FORMAT_RGBA_8888:
+    case HAL_PIXEL_FORMAT_BGRA_8888:
+    case HAL_PIXEL_FORMAT_RGBX_8888:
+        frame_size = GET_32BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 12bpp
+    case HAL_PIXEL_FORMAT_YV12:
+    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P:
+    case HAL_PIXEL_FORMAT_YCbCr_420_I:
+    case HAL_PIXEL_FORMAT_CbYCrY_420_I:
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+        size = w * h;
+        frame_size = size + ((size >> 2) << 1);
+        break;
+
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))
+                     + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height >> 1));
+        break;
+
+    // 16bpp
+    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_YCbCr_422_P:
+    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+        frame_size = GET_16BPP_FRAME_SIZE(width, height);
+        break;
+
+    default:
+        LOGD("%s::no matching source colorformat(0x%x), w(%d), h(%d) fail\n",
+                __func__, hal_pixel_format, width, height);
+        break;
+    }
+
+    return frame_size;
+}
+
+#endif
diff --git a/libexynosutils/exynos5_format_v4l2.c b/libexynosutils/exynos5_format_v4l2.c
new file mode 100644 (file)
index 0000000..2b65dd1
--- /dev/null
@@ -0,0 +1,377 @@
+/*
+ * Copyright@ Samsung Electronics Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+/*
+ * file exynos5_format_v4l2.c
+ * author Sangwoo, Park(sw5771.park@samsung.com)
+ * date 2011/06/02
+ *
+ * Revision History:
+ * - 2010/06/03 : Sangwoo, Park(sw5771.park@samsung.com)
+ * Initial version
+ *
+ * - 2011/12/07 : Hyeonmyeong Choi( hyeon.choi@samsung.com)
+ * Add V4L2_PIX_FMT_YVU420M
+ *
+ * - 2012/03/06 : shinwon lee(shinwon.lee@samsung.com)
+ * Merge to libexynosutils
+ *
+ */
+
+#ifndef __EXYNOS5_FORMAT_V4L2_H__
+#define __EXYNOS5_FORMAT_V4L2_H__
+
+//---------------------------------------------------------//
+// Include
+//---------------------------------------------------------//
+#include <hardware/hardware.h>
+#include "exynos_format.h"
+#include "s5p_fimc_v4l2.h"
+#include <utils/Log.h>
+#include "videodev2.h"
+#include "videodev2_exynos.h"
+
+int HAL_PIXEL_FORMAT_2_V4L2_PIX(
+    int hal_pixel_format)
+{
+    int v4l2_pixel_format = -1;
+
+    switch (hal_pixel_format) {
+    case HAL_PIXEL_FORMAT_RGBA_8888:
+    case HAL_PIXEL_FORMAT_RGBX_8888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB32;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGB_888:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB24;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGB_565:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB565;
+        break;
+
+    case HAL_PIXEL_FORMAT_BGRA_8888:
+        v4l2_pixel_format = V4L2_PIX_FMT_BGR32;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGBA_5551:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB555X;
+        break;
+
+    case HAL_PIXEL_FORMAT_RGBA_4444:
+        v4l2_pixel_format = V4L2_PIX_FMT_RGB444;
+        break;
+
+    case HAL_PIXEL_FORMAT_YV12:
+        v4l2_pixel_format = V4L2_PIX_FMT_YVU420M;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_420_P:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUV420M;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV61;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV12M;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUYV;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCbCr_422_P:
+        v4l2_pixel_format = V4L2_PIX_FMT_YUV422P;
+        break;
+
+    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_UYVY;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV16;
+        break;
+
+    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV21M;
+        break;
+
+   case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
+        break;
+
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        v4l2_pixel_format = V4L2_PIX_FMT_NV12MT_16X16;
+        break;
+
+   case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_YVYU;
+        break;
+
+   case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+        v4l2_pixel_format = V4L2_PIX_FMT_VYUY;
+        break;
+
+    default:
+        LOGE("%s::unmatched HAL_PIXEL_FORMAT color_space(0x%x)\n",
+                __func__, hal_pixel_format);
+        break;
+    }
+
+    return v4l2_pixel_format;
+}
+
+int V4L2_PIX_2_HAL_PIXEL_FORMAT(
+    int v4l2_pixel_format)
+{
+    int hal_pixel_format = -1;
+
+    switch (v4l2_pixel_format) {
+    case V4L2_PIX_FMT_RGB32:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_8888;
+        break;
+
+    case V4L2_PIX_FMT_RGB24:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGB_888;
+        break;
+
+    case V4L2_PIX_FMT_RGB565:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGB_565;
+        break;
+
+    case V4L2_PIX_FMT_BGR32:
+        hal_pixel_format = HAL_PIXEL_FORMAT_BGRA_8888;
+        break;
+
+    case V4L2_PIX_FMT_RGB555X:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_5551;
+        break;
+
+    case V4L2_PIX_FMT_RGB444:
+        hal_pixel_format = HAL_PIXEL_FORMAT_RGBA_4444;
+        break;
+
+    case V4L2_PIX_FMT_YUV420:
+    case V4L2_PIX_FMT_YUV420M:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
+        break;
+
+    case V4L2_PIX_FMT_YVU420:
+    case V4L2_PIX_FMT_YVU420M:
+         hal_pixel_format = HAL_PIXEL_FORMAT_YV12;
+         break;
+
+    case V4L2_PIX_FMT_NV16:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP;
+        break;
+
+    case V4L2_PIX_FMT_NV12:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP;
+        break;
+
+    case V4L2_PIX_FMT_NV12M:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP;
+        break;
+
+    case V4L2_PIX_FMT_YUYV:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I;
+        break;
+
+    case V4L2_PIX_FMT_YUV422P:
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_422_P;
+        break;
+
+    case V4L2_PIX_FMT_UYVY:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I;
+        break;
+
+    case V4L2_PIX_FMT_NV21:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP;
+        break;
+    case V4L2_PIX_FMT_NV12MT_16X16:
+
+        hal_pixel_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED;
+        break;
+
+    case V4L2_PIX_FMT_NV61:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP;
+        break;
+
+    case V4L2_PIX_FMT_YVYU:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I;
+        break;
+
+    case V4L2_PIX_FMT_VYUY:
+        hal_pixel_format = HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I;
+        break;
+
+    default:
+        LOGE("%s::unmatched V4L2_PIX color_space(%d)\n",
+                __func__, v4l2_pixel_format);
+        break;
+    }
+
+    return hal_pixel_format;
+}
+
+unsigned int FRAME_SIZE(
+    int hal_pixel_format,
+    int width,
+    int height)
+{
+    unsigned int frame_size = 0;
+    unsigned int size       = 0;
+
+    switch (hal_pixel_format) {
+    // 16bpp
+    case HAL_PIXEL_FORMAT_RGB_565:
+    case HAL_PIXEL_FORMAT_RGBA_5551:
+    case HAL_PIXEL_FORMAT_RGBA_4444:
+        frame_size = GET_16BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 24bpp
+    case HAL_PIXEL_FORMAT_RGB_888:
+        frame_size = GET_24BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 32bpp
+    case HAL_PIXEL_FORMAT_RGBA_8888:
+    case HAL_PIXEL_FORMAT_BGRA_8888:
+    case HAL_PIXEL_FORMAT_RGBX_8888:
+        frame_size = GET_32BPP_FRAME_SIZE(width, height);
+        break;
+
+    // 12bpp
+    case HAL_PIXEL_FORMAT_YV12:
+    case HAL_PIXEL_FORMAT_YCbCr_420_P:
+    case HAL_PIXEL_FORMAT_YCbCr_420_I:
+    case HAL_PIXEL_FORMAT_CbYCrY_420_I:
+        size = ALIGN(width, 16) * ALIGN(height, 16);
+        frame_size = size + 2 * ALIGN(width >> 1, 8) * ALIGN(height >> 1, 8);
+        break;
+
+    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP:
+        size = ALIGN(ALIGN(width, 16) * ALIGN(height, 16), 2048);
+        frame_size = size + ALIGN(ALIGN(width, 16) * ALIGN(height >> 1, 8), 2048);
+        break;
+
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        frame_size =   ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height))
+                     + ALIGN_TO_8KB(ALIGN_TO_128B(width) * ALIGN_TO_32B(height >> 1));
+        break;
+
+    // 16bpp
+    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_YCbCr_422_P:
+    case HAL_PIXEL_FORMAT_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I:
+    case HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I:
+        frame_size = GET_16BPP_FRAME_SIZE(width, height);
+        break;
+
+    default:
+        LOGD("%s::no matching source colorformat(0x%x), width(%d), h(%d) fail\n",
+                __func__, hal_pixel_format, width, height);
+        break;
+    }
+
+    return frame_size;
+}
+
+int V4L2_PIX_2_YUV_INFO(unsigned int v4l2_pixel_format, unsigned int * bpp, unsigned int * planes)
+{
+    switch (v4l2_pixel_format) {
+    case V4L2_PIX_FMT_NV12:
+        *bpp    = 12;
+        *planes = 1;
+        break;
+    case V4L2_PIX_FMT_NV21:
+    case V4L2_PIX_FMT_NV21X:
+    case V4L2_PIX_FMT_NV12M:
+    case V4L2_PIX_FMT_NV21M:
+        *bpp    = 12;
+        *planes = 2;
+        break;
+    case V4L2_PIX_FMT_YUV420:
+    case V4L2_PIX_FMT_YUV420M:
+    case V4L2_PIX_FMT_YVU420M:
+        *bpp    = 12;
+        *planes = 3;
+        break;
+    case V4L2_PIX_FMT_YUYV:
+    case V4L2_PIX_FMT_YVYU:
+    case V4L2_PIX_FMT_UYVY:
+    case V4L2_PIX_FMT_VYUY:
+        *bpp    = 16;
+        *planes = 1;
+        break;
+    case V4L2_PIX_FMT_NV16:
+    case V4L2_PIX_FMT_NV61:
+    case V4L2_PIX_FMT_NV16X:
+    case V4L2_PIX_FMT_NV61X:
+        *bpp    = 16;
+        *planes = 2;
+        break;
+    case V4L2_PIX_FMT_YUV422P:
+        *bpp    = 16;
+        *planes = 3;
+        break;
+    default:
+        return -1;
+        break;
+    }
+
+    return 0;
+}
+
+unsigned int get_yuv_bpp(unsigned int v4l2_pixel_format)
+{
+    unsigned int bpp, planes;
+
+    if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
+        bpp = -1;
+
+    return bpp;
+}
+
+unsigned int get_yuv_planes(unsigned int v4l2_pixel_format)
+{
+    unsigned int bpp, planes;
+
+    if (V4L2_PIX_2_YUV_INFO(v4l2_pixel_format, &bpp, &planes) < 0)
+        planes = -1;
+
+    return planes;
+}
+#endif
diff --git a/libexynosutils/exynos_format.h b/libexynosutils/exynos_format.h
new file mode 100644 (file)
index 0000000..86062a2
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * Copyright@ Samsung Electronics Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+#ifndef _EXYNOS_FORMAT_H_
+#define _EXYNOS_FORMAT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+    HAL_PIXEL_FORMAT_YCbCr_422_P                = 0x100,
+    HAL_PIXEL_FORMAT_YCbCr_420_P                = 0x101,
+    HAL_PIXEL_FORMAT_YCbCr_420_I                = 0x102,
+    HAL_PIXEL_FORMAT_CbYCrY_422_I               = 0x103,
+    HAL_PIXEL_FORMAT_CbYCrY_420_I               = 0x104,
+    HAL_PIXEL_FORMAT_YCbCr_420_SP               = 0x105,
+    HAL_PIXEL_FORMAT_YCrCb_422_SP               = 0x106,
+    HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED         = 0x107,
+    HAL_PIXEL_FORMAT_ARGB888                    = 0x108,
+    // support custom format for zero copy
+    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP        = 0x110,
+    HAL_PIXEL_FORMAT_CUSTOM_YCrCb_420_SP        = 0x111,
+    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED  = 0x112,
+    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_SP        = 0x113,
+    HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_SP        = 0x114,
+    HAL_PIXEL_FORMAT_CUSTOM_YCbCr_422_I         = 0x115,
+    HAL_PIXEL_FORMAT_CUSTOM_YCrCb_422_I         = 0x116,
+    HAL_PIXEL_FORMAT_CUSTOM_CbYCrY_422_I        = 0x117,
+    HAL_PIXEL_FORMAT_CUSTOM_CrYCbY_422_I        = 0x118,
+    HAL_PIXEL_FORMAT_CUSTOM_CbYCr_422_I         = 0x11B,
+    HAL_PIXEL_FORMAT_CUSTOM_MAX
+};
+
+struct ADDRS {
+    unsigned int addr_y;
+    unsigned int addr_cbcr;
+    unsigned int buf_idx;
+    unsigned int reserved;
+};
+
+/* 12  Y/CbCr 4:2:0 64x32 macroblocks */
+#define V4L2_PIX_FMT_NV12T    v4l2_fourcc('T', 'V', '1', '2')
+
+#define ALIGN(x, a)       (((x) + (a) - 1) & ~((a) - 1))
+#define ALIGN_TO_32B(x)   ((((x) + (1 <<  5) - 1) >>  5) <<  5)
+#define ALIGN_TO_128B(x)  ((((x) + (1 <<  7) - 1) >>  7) <<  7)
+#define ALIGN_TO_8KB(x)   ((((x) + (1 << 13) - 1) >> 13) << 13)
+
+#define GET_32BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 2)
+#define GET_24BPP_FRAME_SIZE(w, h)  (((w) * (h)) * 3)
+#define GET_16BPP_FRAME_SIZE(w, h)  (((w) * (h)) << 1)
+
+/*
+ * Convert hal_pixel_format to v4l2_pixel_format.
+ *
+ * @param hal_pixel_format
+ *   hal_pixel_format[in]
+ *
+ * @return
+ *   v4l2_pixel_format
+ */
+int HAL_PIXEL_FORMAT_2_V4L2_PIX(
+    int hal_pixel_format);
+
+/*
+ * Convert v4l2_pixel_format to hal_pixel_format.
+ *
+ * @param v4l2_pixel_format
+ *   v4l2_pixel_format[in]
+ *
+ * @return
+ *   hal_pixel_format
+ */
+int V4L2_PIX_2_HAL_PIXEL_FORMAT(
+    int v4l2_pixel_format);
+
+/*
+ * Get frame_size of hal_pixel_format.
+ *
+ * @param hal_pixel_format
+ *   hal_pixel_format[in]
+ *
+ * @param width
+ *   width[in]
+ *
+ * @param height
+ *   height[in]
+ *
+ * @return
+ *   frame_size
+ */
+unsigned int FRAME_SIZE(
+    int hal_pixel_format,
+    int width,
+    int height);
+
+/*
+ * Get bpp and plane of v4l2_pixel_format.
+ *
+ * @param v4l2_pixel_format
+ *   v4l2_pixel_format[in]
+ *
+ * @param bpp
+ *   address of bpp[out]
+ *
+ * @param planes
+ *   address of planes[out]
+ *
+ * @return
+ *   error code
+ */
+int V4L2_PIX_2_YUV_INFO(
+    unsigned int  v4l2_pixel_format,
+    unsigned int *bpp,
+    unsigned int *planes);
+
+/*
+ * Get bpp of v4l2_pixel_format.
+ *
+ * @param v4l2_pixel_format
+ *   v4l2_pixel_format[in]
+ *
+ * @return
+ *   bpp
+ */
+unsigned int get_yuv_bpp(
+    unsigned int v4l2_pixel_format);
+
+/*
+ * Get plane of v4l2_pixel_format.
+ *
+ * @param v4l2_pixel_format
+ *   v4l2_pixel_format[in]
+ *
+ * @return
+ *   num of plane
+ */
+unsigned int get_yuv_planes(
+    unsigned int v4l2_pixel_format);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif