diff options
author | Jiho Chang <jiho04.chang@samsung.com> | 2012-03-24 05:52:01 +0900 |
---|---|---|
committer | Dima Zavin <dima@android.com> | 2012-04-06 13:52:32 -0700 |
commit | 61bc154d7285f4dd0c28a7c74e9b3154445e209b (patch) | |
tree | 82908f268bc5c0b5c8a1321e21276607dd3a4208 /libexynosutils | |
parent | 80b3e6c2d2e0f3d1412a6b25a9a8ea4766d8017e (diff) | |
download | exynos5-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.mk | 38 | ||||
-rw-r--r-- | libexynosutils/ExynosMutex.cpp | 243 | ||||
-rw-r--r-- | libexynosutils/ExynosMutex.h | 155 | ||||
-rw-r--r-- | libexynosutils/exynos4_format.c | 284 | ||||
-rw-r--r-- | libexynosutils/exynos4_format_v4l2.c | 292 | ||||
-rw-r--r-- | libexynosutils/exynos5_format_v4l2.c | 377 | ||||
-rw-r--r-- | libexynosutils/exynos_format.h | 159 |
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 |