/* * Copyright (C) 2009 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. */ #include #include "SEC_OMX_Def.h" #include "SecFimc.h" #include "HardwareConverter.h" HardwareConverter::HardwareConverter() { SecFimc* handle_fimc = new SecFimc(); mSecFimc = (void *)handle_fimc; if (handle_fimc->create(SecFimc::DEV_0, SecFimc::MODE_MULTI_BUF, 1) == false) bHWconvert_flag = 0; else bHWconvert_flag = 1; } HardwareConverter::~HardwareConverter() { SecFimc* handle_fimc = (SecFimc*)mSecFimc; handle_fimc->destroy(); delete mSecFimc; } bool HardwareConverter::convert( void * src_addr, void *dst_addr, OMX_COLOR_FORMATTYPE src_format, int32_t width, int32_t height, OMX_COLOR_FORMATTYPE dst_format) { SecFimc* handle_fimc = (SecFimc*)mSecFimc; int rotate_value = 0; unsigned int src_crop_x = 0; unsigned int src_crop_y = 0; unsigned int src_crop_width = width; unsigned int src_crop_height = height; unsigned int dst_crop_x = 0; unsigned int dst_crop_y = 0; unsigned int dst_crop_width = width; unsigned int dst_crop_height = height; void **src_addr_array = (void **)src_addr; void **dst_addr_array = (void **)dst_addr; unsigned int src_har_format = OMXtoHarPixelFomrat(src_format); unsigned int dst_har_format = OMXtoHarPixelFomrat(dst_format); // set post processor configuration if (!handle_fimc->setSrcParams(width, height, src_crop_x, src_crop_y, &src_crop_width, &src_crop_height, src_har_format)) { ALOGE("%s:: setSrcParms() failed", __func__); return false; } if (!handle_fimc->setSrcAddr((unsigned int)src_addr_array[0], (unsigned int)src_addr_array[1], (unsigned int)src_addr_array[1], src_har_format)) { ALOGE("%s:: setSrcPhyAddr() failed", __func__); return false; } if (!handle_fimc->setRotVal(rotate_value)) { ALOGE("%s:: setRotVal() failed", __func__); return false; } if (!handle_fimc->setDstParams(width, height, dst_crop_x, dst_crop_y, &dst_crop_width, &dst_crop_height, dst_har_format)) { ALOGE("%s:: setDstParams() failed", __func__); return false; } switch (dst_format) { case OMX_COLOR_FormatYUV420SemiPlanar: if (!handle_fimc->setDstAddr((unsigned int)(dst_addr_array[0]), (unsigned int)(dst_addr_array[1]), (unsigned int)(dst_addr_array[1]))) { ALOGE("%s:: setDstPhyAddr() failed", __func__); return false; } break; case OMX_COLOR_FormatYUV420Planar: default: if (!handle_fimc->setDstAddr((unsigned int)(dst_addr_array[0]), (unsigned int)(dst_addr_array[1]), (unsigned int)(dst_addr_array[2]))) { ALOGE("%s:: setDstPhyAddr() failed", __func__); return false; } break; } if (!handle_fimc->draw(0, 0)) { ALOGE("%s:: handleOneShot() failed", __func__); return false; } return true; } unsigned int HardwareConverter::OMXtoHarPixelFomrat(OMX_COLOR_FORMATTYPE omx_format) { unsigned int hal_format = 0; switch (omx_format) { case OMX_COLOR_FormatYUV420Planar: hal_format = HAL_PIXEL_FORMAT_YCbCr_420_P; break; case OMX_COLOR_FormatYUV420SemiPlanar: hal_format = HAL_PIXEL_FORMAT_YCbCr_420_SP; break; case OMX_SEC_COLOR_FormatNV12TPhysicalAddress: hal_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED; break; default: hal_format = HAL_PIXEL_FORMAT_YCbCr_420_P; break; } return hal_format; }