blob: 1e3931e764860bca777828f5e7a4f263a2abac5d [file] [log] [blame]
/*
* 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.
*/
/*#define LOG_NDEBUG 0 */
#define LOG_TAG "ExynosCameraPPLibcsc"
#include "ExynosCameraPPLibcsc.h"
#define CSC_HW_PROPERTY_DEFAULT ((CSC_HW_PROPERTY_TYPE)2) /* Not fixed mode */
#define CSC_MEMORY_TYPE CSC_MEMORY_DMABUF /* (CSC_MEMORY_USERPTR) */
ExynosCameraPPLibcsc::~ExynosCameraPPLibcsc()
{
}
status_t ExynosCameraPPLibcsc::m_create(void)
{
status_t ret = NO_ERROR;
// create your own library.
CSC_METHOD cscMethod = CSC_METHOD_HW;
m_csc = csc_init(cscMethod);
if (m_csc == NULL) {
CLOGE("csc_init() fail");
return INVALID_OPERATION;
}
csc_set_hw_property(m_csc, m_property, m_nodeNum);
return ret;
}
status_t ExynosCameraPPLibcsc::m_destroy(void)
{
status_t ret = NO_ERROR;
// destroy your own library.
if (m_csc != NULL)
csc_deinit(m_csc);
m_csc = NULL;
return ret;
}
status_t ExynosCameraPPLibcsc::m_draw(ExynosCameraImage *srcImage,
ExynosCameraImage *dstImage,
__unused ExynosCameraParameters *params)
{
status_t ret = NO_ERROR;
// draw your own library.
switch (srcImage[0].rect.fullH) {
case V4L2_PIX_FMT_NV21:
srcImage[0].rect.fullH = ALIGN_UP(srcImage[0].rect.fullH, 2);
break;
default:
srcImage[0].rect.fullH = ALIGN_UP(srcImage[0].rect.fullH, GSCALER_IMG_ALIGN);
break;
}
csc_set_src_format(m_csc,
ALIGN_UP(srcImage[0].rect.fullW, GSCALER_IMG_ALIGN),
srcImage[0].rect.fullH,
srcImage[0].rect.x, srcImage[0].rect.y, srcImage[0].rect.w, srcImage[0].rect.h,
V4L2_PIX_2_HAL_PIXEL_FORMAT(srcImage[0].rect.colorFormat),
0);
csc_set_dst_format(m_csc,
dstImage[0].rect.fullW, dstImage[0].rect.fullH,
dstImage[0].rect.x, dstImage[0].rect.y, dstImage[0].rect.w, dstImage[0].rect.h,
V4L2_PIX_2_HAL_PIXEL_FORMAT(dstImage[0].rect.colorFormat),
0);
csc_set_src_buffer(m_csc,
(void **)srcImage[0].buf.fd, CSC_MEMORY_TYPE);
csc_set_dst_buffer(m_csc,
(void **)dstImage[0].buf.fd, CSC_MEMORY_TYPE);
ret = csc_convert_with_rotation(m_csc, dstImage[0].rotation, dstImage[0].flipH, dstImage[0].flipV);
if (ret != NO_ERROR) {
CLOGE("csc_convert_with_rotation() fail");
return INVALID_OPERATION;
}
return ret;
}
void ExynosCameraPPLibcsc::m_init(void)
{
m_csc = NULL;
m_property = CSC_HW_PROPERTY_FIXED_NODE;
m_srcImageCapacity.setNumOfImage(1);
m_srcImageCapacity.addColorFormat(V4L2_PIX_FMT_NV12M);
m_srcImageCapacity.addColorFormat(V4L2_PIX_FMT_NV21M);
m_srcImageCapacity.addColorFormat(V4L2_PIX_FMT_NV12);
m_srcImageCapacity.addColorFormat(V4L2_PIX_FMT_NV21);
m_srcImageCapacity.addColorFormat(V4L2_PIX_FMT_YVU420M);
m_srcImageCapacity.addColorFormat(V4L2_PIX_FMT_YVU420);
m_srcImageCapacity.addColorFormat(V4L2_PIX_FMT_YUYV);
m_dstImageCapacity.setNumOfImage(1);
m_dstImageCapacity.addColorFormat(V4L2_PIX_FMT_NV12M);
m_dstImageCapacity.addColorFormat(V4L2_PIX_FMT_NV21M);
m_dstImageCapacity.addColorFormat(V4L2_PIX_FMT_NV12);
m_dstImageCapacity.addColorFormat(V4L2_PIX_FMT_NV21);
m_dstImageCapacity.addColorFormat(V4L2_PIX_FMT_YVU420M);
m_dstImageCapacity.addColorFormat(V4L2_PIX_FMT_YVU420);
m_dstImageCapacity.addColorFormat(V4L2_PIX_FMT_YUYV);
}