summaryrefslogtreecommitdiff
path: root/libexynosutils
diff options
context:
space:
mode:
authorJiho Chang <jiho04.chang@samsung.com>2012-03-24 05:52:01 +0900
committerDima Zavin <dima@android.com>2012-04-06 13:52:32 -0700
commit61bc154d7285f4dd0c28a7c74e9b3154445e209b (patch)
tree82908f268bc5c0b5c8a1321e21276607dd3a4208 /libexynosutils
parent80b3e6c2d2e0f3d1412a6b25a9a8ea4766d8017e (diff)
downloadexynos5-61bc154d7285f4dd0c28a7c74e9b3154445e209b.tar.gz
hardware: exynos5: add initial libexynosutils
Change-Id: I891c7589482e5aaeac847bb5255f2b401a99f8e7 Signed-off-by: Jiho Chang <jiho04.chang@samsung.com>
Diffstat (limited to 'libexynosutils')
-rw-r--r--libexynosutils/Android.mk38
-rw-r--r--libexynosutils/ExynosMutex.cpp243
-rw-r--r--libexynosutils/ExynosMutex.h155
-rw-r--r--libexynosutils/exynos4_format.c284
-rw-r--r--libexynosutils/exynos4_format_v4l2.c292
-rw-r--r--libexynosutils/exynos5_format_v4l2.c377
-rw-r--r--libexynosutils/exynos_format.h159
7 files changed, 1548 insertions, 0 deletions
diff --git a/libexynosutils/Android.mk b/libexynosutils/Android.mk
new file mode 100644
index 0000000..aa973a7
--- /dev/null
+++ b/libexynosutils/Android.mk
@@ -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
index 0000000..f1a8cce
--- /dev/null
+++ b/libexynosutils/ExynosMutex.cpp
@@ -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
index 0000000..d2f346e
--- /dev/null
+++ b/libexynosutils/ExynosMutex.h
@@ -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
index 0000000..e8899a9
--- /dev/null
+++ b/libexynosutils/exynos4_format.c
@@ -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
index 0000000..1fad6de
--- /dev/null
+++ b/libexynosutils/exynos4_format_v4l2.c
@@ -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
index 0000000..2b65dd1
--- /dev/null
+++ b/libexynosutils/exynos5_format_v4l2.c
@@ -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
index 0000000..86062a2
--- /dev/null
+++ b/libexynosutils/exynos_format.h
@@ -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