17c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* 27c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Copyright (C) 2011 The Android Open Source Project 37c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 47c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Licensed under the Apache License, Version 2.0 (the "License"); 57c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * you may not use this file except in compliance with the License. 67c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * You may obtain a copy of the License at 77c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 87c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * http://www.apache.org/licenses/LICENSE-2.0 97c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * 107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Unless required by applicable law or agreed to in writing, software 117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * distributed under the License is distributed on an "AS IS" BASIS, 127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * See the License for the specific language governing permissions and 147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * limitations under the License. 157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************* 187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @file M4AIR_API.c 197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief Area of Interest Resizer API 207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ************************************************************************* 217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AIR_YUV420_FORMAT_SUPPORTED 247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4AIR_YUV420A_FORMAT_SUPPORTED 257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/************************* COMPILATION CHECKS ***************************/ 277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4AIR_YUV420_FORMAT_SUPPORTED 287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4AIR_BGR565_FORMAT_SUPPORTED 297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4AIR_RGB565_FORMAT_SUPPORTED 307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4AIR_BGR888_FORMAT_SUPPORTED 317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4AIR_RGB888_FORMAT_SUPPORTED 327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifndef M4AIR_JPG_FORMAT_SUPPORTED 337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#error "Please define at least one input format for the AIR component" 357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/******************************* INCLUDES *******************************/ 447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Types.h" 457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Error.h" 467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_CoreID.h" 477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Mutex.h" 487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4OSA_Memory.h" 497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4VIFI_FiltersAPI.h" 507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include "M4AIR_API.h" 517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/************************ M4AIR INTERNAL TYPES DEFINITIONS ***********************/ 537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * enum M4AIR_States 577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief The following enumeration defines the internal states of the AIR. 587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef enum 617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_kCreated, /**< State after M4AIR_create has been called */ 637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_kConfigured /**< State after M4AIR_configure has been called */ 647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}M4AIR_States; 657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * struct M4AIR_InternalContext 707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief The following structure is the internal context of the AIR. 717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargitypedef struct 747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_States m_state; /**< Internal state */ 767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_InputFormatType m_inputFormat; /**< Input format like YUV420Planar, 777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi RGB565, JPG, etc ... */ 787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_Params m_params; /**< Current input Parameter of the processing */ 797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 u32_x_inc[4]; /**< ratio between input and ouput width for YUV */ 807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 u32_y_inc[4]; /**< ratio between input and ouput height for YUV */ 817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 u32_x_accum_start[4]; /**< horizontal initial accumulator value */ 827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 u32_y_accum_start[4]; /**< Vertical initial accumulator value */ 837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 u32_x_accum[4]; /**< save of horizontal accumulator value */ 847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 u32_y_accum[4]; /**< save of vertical accumulator value */ 857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8* pu8_data_in[4]; /**< Save of input plane pointers 867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi in case of stripe mode */ 877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 m_procRows; /**< Number of processed rows, 887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi used in stripe mode only */ 897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool m_bOnlyCopy; /**< Flag to know if we just perform a copy 907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi or a bilinear interpolation */ 917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool m_bFlipX; /**< Depend on output orientation, used during 927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi processing to revert processing order in X 937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi coordinates */ 947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool m_bFlipY; /**< Depend on output orientation, used during 957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi processing to revert processing order in Y 967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi coordinates */ 977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Bool m_bRevertXY; /**< Depend on output orientation, used during 987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi processing to revert X and Y processing order 997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (+-90� rotation) */ 1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}M4AIR_InternalContext; 1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************************* MACROS *******************************/ 1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#define M4ERR_CHECK_NULL_RETURN_VALUE(retval, pointer)\ 1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if ((pointer) == M4OSA_NULL) return ((M4OSA_ERR)(retval)); 1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/********************** M4AIR PUBLIC API IMPLEMENTATION ********************/ 1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4AIR_create(M4OSA_Context* pContext,M4AIR_InputFormatType inputFormat) 1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function initialize an instance of the AIR. 1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext: (IN/OUT) Address of the context to create 1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param inputFormat: (IN) input format type. 1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: there is no error 1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). Invalid formatType 1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC: No more memory is available 1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AIR_create(M4OSA_Context* pContext,M4AIR_InputFormatType inputFormat) 1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_ERR err = M4NO_ERROR ; 1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_InternalContext* pC = M4OSA_NULL ; 1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check that the address on the context is not NULL */ 1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL ; 1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Internal Context creation */ 130694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu pC = (M4AIR_InternalContext*)M4OSA_32bitAlignedMalloc(sizeof(M4AIR_InternalContext), 1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR,(M4OSA_Char *)"AIR internal context") ; 1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_ALLOC, pC) ; 1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check if the input format is supported */ 1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(inputFormat) 1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4AIR_YUV420_FORMAT_SUPPORTED 1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4AIR_kYUV420P: 1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break ; 1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#ifdef M4AIR_YUV420A_FORMAT_SUPPORTED 1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4AIR_kYUV420AP: 1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break ; 1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#endif 1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi err = M4ERR_AIR_FORMAT_NOT_SUPPORTED; 1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi goto M4AIR_create_cleanup ; 1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Save input format and update state */ 1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_inputFormat = inputFormat; 1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_state = M4AIR_kCreated; 1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Return the context to the caller */ 1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = pC ; 1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4AIR_create_cleanup: 1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Error management : we destroy the context if needed */ 1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_NULL != pC) 1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 164694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pC) ; 1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pContext = M4OSA_NULL ; 1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return err ; 1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4AIR_cleanUp(M4OSA_Context pContext) 1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function destroys an instance of the AIR component 1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext: (IN) Context identifying the instance to destroy 1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: there is no error 1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). 1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_STATE: Internal state is incompatible with this function call. 1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AIR_cleanUp(M4OSA_Context pContext) 1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; 1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Check state */ 1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4AIR_kCreated != pC->m_state)&&(M4AIR_kConfigured != pC->m_state)) 1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 195694816d7291f17364502ac5d3319684a0b180860Shyam Pallapothu free(pC) ; 1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4AIR_configure(M4OSA_Context pContext, M4AIR_Params* pParams) 2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function will configure the AIR. 2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note It will set the input and output coordinates and sizes, 2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * and indicates if we will proceed in stripe or not. 2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * In case a M4AIR_get in stripe mode was on going, it will cancel this previous 2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * processing and reset the get process. 2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext: (IN) Context identifying the instance 2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pParams->m_bOutputStripe:(IN) Stripe mode. 2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pParams->m_inputCoord: (IN) X,Y coordinates of the first valid pixel in input. 2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pParams->m_inputSize: (IN) input ROI size. 2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pParams->m_outputSize: (IN) output size. 2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: there is no error 2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC: No more memory space to add a new effect. 2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). 2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_AIR_FORMAT_NOT_SUPPORTED: the requested input format is not supported. 2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AIR_configure(M4OSA_Context pContext, M4AIR_Params* pParams) 2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; 2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 i,u32_width_in, u32_width_out, u32_height_in, u32_height_out; 2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 nb_planes; 2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4AIR_kYUV420AP == pC->m_inputFormat) 2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nb_planes = 4; 2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nb_planes = 3; 2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Check state */ 2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4AIR_kCreated != pC->m_state)&&(M4AIR_kConfigured != pC->m_state)) 2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** Save parameters */ 2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_params = *pParams; 2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Check for the input&output width and height are even */ 2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ((pC->m_params.m_inputSize.m_height)&0x1) || 2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ((pC->m_params.m_inputSize.m_height)&0x1)) 2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_AIR_ILLEGAL_FRAME_SIZE; 2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( ((pC->m_params.m_inputSize.m_width)&0x1) || 2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ((pC->m_params.m_inputSize.m_width)&0x1)) 2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_AIR_ILLEGAL_FRAME_SIZE; 2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(((pC->m_params.m_inputSize.m_width) == (pC->m_params.m_outputSize.m_width)) 2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi &&((pC->m_params.m_inputSize.m_height) == (pC->m_params.m_outputSize.m_height))) 2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< No resize in this case, we will just copy input in output */ 2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bOnlyCopy = M4OSA_TRUE; 2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bOnlyCopy = M4OSA_FALSE; 2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Initialize internal variables used for resize filter */ 2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(i=0;i<nb_planes;i++) 2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_width_in = ((i==0)||(i==3))?pC->m_params.m_inputSize.m_width:\ 2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pC->m_params.m_inputSize.m_width+1)>>1; 2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_height_in = ((i==0)||(i==3))?pC->m_params.m_inputSize.m_height:\ 2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pC->m_params.m_inputSize.m_height+1)>>1; 2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_width_out = ((i==0)||(i==3))?pC->m_params.m_outputSize.m_width:\ 2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pC->m_params.m_outputSize.m_width+1)>>1; 2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_height_out = ((i==0)||(i==3))?pC->m_params.m_outputSize.m_height:\ 2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pC->m_params.m_outputSize.m_height+1)>>1; 2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute horizontal ratio between src and destination width.*/ 2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (u32_width_out >= u32_width_in) 2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_inc[i] = ((u32_width_in-1) * 0x10000) / (u32_width_out-1); 2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_inc[i] = (u32_width_in * 0x10000) / (u32_width_out); 2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Compute vertical ratio between src and destination height.*/ 2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (u32_height_out >= u32_height_in) 2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_inc[i] = ((u32_height_in - 1) * 0x10000) / (u32_height_out-1); 2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_inc[i] = (u32_height_in * 0x10000) / (u32_height_out); 3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Calculate initial accumulator value : u32_y_accum_start. 3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum_start is coded on 15 bits, and represents a value between 0 and 0.5 3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pC->u32_y_inc[i] >= 0x10000) 3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Keep the fractionnal part, assimung that integer part is coded 3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi on the 16 high bits and the fractionnal on the 15 low bits 3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum_start[i] = pC->u32_y_inc[i] & 0xffff; 3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (!pC->u32_y_accum_start[i]) 3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum_start[i] = 0x10000; 3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum_start[i] >>= 1; 3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum_start[i] = 0; 3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Take into account that Y coordinate can be odd 3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi in this case we have to put a 0.5 offset 3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for U and V plane as there a 2 times sub-sampled vs Y*/ 3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((pC->m_params.m_inputCoord.m_y&0x1)&&((i==1)||(i==2))) 3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum_start[i] += 0x8000; 3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* 3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi Calculate initial accumulator value : u32_x_accum_start. 3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum_start is coded on 15 bits, and represents a value between 3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 0 and 0.5 3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pC->u32_x_inc[i] >= 0x10000) 3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum_start[i] = pC->u32_x_inc[i] & 0xffff; 3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (!pC->u32_x_accum_start[i]) 3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum_start[i] = 0x10000; 3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum_start[i] >>= 1; 3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum_start[i] = 0; 3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Take into account that X coordinate can be odd 3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi in this case we have to put a 0.5 offset 3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for U and V plane as there a 2 times sub-sampled vs Y*/ 3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((pC->m_params.m_inputCoord.m_x&0x1)&&((i==1)||(i==2))) 3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum_start[i] += 0x8000; 3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Reset variable used for stripe mode */ 3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_procRows = 0; 3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Initialize var for X/Y processing order according to orientation */ 3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipX = M4OSA_FALSE; 3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipY = M4OSA_FALSE; 3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bRevertXY = M4OSA_FALSE; 3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi switch(pParams->m_outputOrientation) 3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationTopLeft: 3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationTopRight: 3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipX = M4OSA_TRUE; 3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationBottomRight: 3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipX = M4OSA_TRUE; 3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipY = M4OSA_TRUE; 3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationBottomLeft: 3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipY = M4OSA_TRUE; 3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationLeftTop: 3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bRevertXY = M4OSA_TRUE; 3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationRightTop: 3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bRevertXY = M4OSA_TRUE; 3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipY = M4OSA_TRUE; 3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationRightBottom: 3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bRevertXY = M4OSA_TRUE; 3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipX = M4OSA_TRUE; 3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipY = M4OSA_TRUE; 3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi case M4COMMON_kOrientationLeftBottom: 3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bRevertXY = M4OSA_TRUE; 3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_bFlipX = M4OSA_TRUE; 4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi break; 4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi default: 4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_PARAMETER; 4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Update state */ 4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_state = M4AIR_kConfigured; 4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/** 4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4OSA_ERR M4AIR_get(M4OSA_Context pContext, M4VIFI_ImagePlane* pIn, M4VIFI_ImagePlane* pOut) 4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief This function will provide the requested resized area of interest according to 4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * settings provided in M4AIR_configure. 4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note In case the input format type is JPEG, input plane(s) 4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * in pIn is not used. In normal mode, dimension specified in output plane(s) structure 4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * must be the same than the one specified in M4AIR_configure. In stripe mode, only the 4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * width will be the same, height will be taken as the stripe height (typically 16). 4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * In normal mode, this function is call once to get the full output picture. 4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * In stripe mode, it is called for each stripe till the whole picture has been 4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * retrieved,and the position of the output stripe in the output picture 4237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * is internally incremented at each step. 4247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * Any call to M4AIR_configure during stripe process will reset this one to the 4257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * beginning of the output picture. 4267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pContext: (IN) Context identifying the instance 4277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pIn: (IN) Plane structure containing input Plane(s). 4287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param pOut: (IN/OUT) Plane structure containing output Plane(s). 4297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4NO_ERROR: there is no error 4307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_ALLOC: No more memory space to add a new effect. 4317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return M4ERR_PARAMETER: pContext is M4OSA_NULL (debug only). 4327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ****************************************************************************** 4337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi */ 4347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4OSA_ERR M4AIR_get(M4OSA_Context pContext, M4VIFI_ImagePlane* pIn, M4VIFI_ImagePlane* pOut) 4357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{ 4367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4AIR_InternalContext* pC = (M4AIR_InternalContext*)pContext ; 4377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 i,j,k,u32_x_frac,u32_y_frac,u32_x_accum,u32_y_accum,u32_shift; 4387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 *pu8_data_in, *pu8_data_in_org, *pu8_data_in_tmp, *pu8_data_out; 4397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 *pu8_src_top; 4407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt8 *pu8_src_bottom; 4417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 u32_temp_value; 4427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_Int32 i32_tmp_offset; 4437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4OSA_UInt32 nb_planes; 4447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi M4ERR_CHECK_NULL_RETURN_VALUE(M4ERR_PARAMETER, pContext) ; 4487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Check state */ 4507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4AIR_kConfigured != pC->m_state) 4517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4ERR_STATE; 4537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4AIR_kYUV420AP == pC->m_inputFormat) 4567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nb_planes = 4; 4587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 4607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi nb_planes = 3; 4627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each Plane */ 4657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(i=0;i<nb_planes;i++) 4667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Set the working pointers at the beginning of the input/output data field */ 4697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_shift = ((i==0)||(i==3))?0:1; /**< Depend on Luma or Chroma */ 4717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if((M4OSA_FALSE == pC->m_params.m_bOutputStripe)\ 4737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ||((M4OSA_TRUE == pC->m_params.m_bOutputStripe)&&(0 == pC->m_procRows))) 4747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< For input, take care about ROI */ 4767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pIn[i].pac_data + pIn[i].u_topleft \ 4777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + (pC->m_params.m_inputCoord.m_x>>u32_shift) 4787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi + (pC->m_params.m_inputCoord.m_y >> u32_shift) * pIn[i].u_stride; 4797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** Go at end of line/column in case X/Y scanning is flipped */ 4817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == pC->m_bFlipX) 4827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in += ((pC->m_params.m_inputSize.m_width)>>u32_shift) -1 ; 4847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == pC->m_bFlipY) 4867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in += ((pC->m_params.m_inputSize.m_height>>u32_shift) -1)\ 4887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * pIn[i].u_stride; 4897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Initialize accumulators in case we are using it (bilinear interpolation) */ 4927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_FALSE == pC->m_bOnlyCopy) 4937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 4947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum[i] = pC->u32_x_accum_start[i]; 4957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum[i] = pC->u32_y_accum_start[i]; 4967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 4987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 4997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< In case of stripe mode for other than first stripe, we need to recover input 5027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pointer from internal context */ 5037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pC->pu8_data_in[i]; 5047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< In every mode, output data are at the beginning of the output plane */ 5077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out = pOut[i].pac_data + pOut[i].u_topleft; 5087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Initialize input offset applied after each pixel */ 5107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bFlipY) 5117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i32_tmp_offset = pIn[i].u_stride; 5137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi i32_tmp_offset = -pIn[i].u_stride; 5177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< In this case, no bilinear interpolation is needed as input and output dimensions 5207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi are the same */ 5217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if( M4OSA_TRUE == pC->m_bOnlyCopy) 5227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< No +-90� rotation */ 5247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bRevertXY) 5257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< No flip on X abscissa */ 5277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bFlipX) 5287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each row */ 5307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(j=0;j<pOut[i].u_height;j++) 5317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Copy one whole line */ 53332ed3f4dad00f8a65f7e6b38402c70d5341c57ebShyam Pallapothu memcpy((void *)pu8_data_out, (void *)pu8_data_in, 5347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pOut[i].u_width); 5357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Update pointers */ 5377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out += pOut[i].u_stride; 5387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bFlipY) 5397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in += pIn[i].u_stride; 5417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in -= pIn[i].u_stride; 5457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each row */ 5517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(j=0;j<pOut[i].u_height;j++) 5527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each pixel of 1 row */ 5547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 5557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = *pu8_data_in--; 5577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Update pointers */ 5607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out += (pOut[i].u_stride - pOut[i].u_width); 5617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in += pOut[i].u_width + i32_tmp_offset; 5637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Here we have a +-90� rotation */ 5687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each row */ 5727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(j=0;j<pOut[i].u_height;j++) 5737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in_tmp = pu8_data_in; 5757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each pixel of 1 row */ 5777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 5787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = *pu8_data_in_tmp; 5807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Update input pointer in order to go to next/past line */ 5827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in_tmp += i32_tmp_offset; 5837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 5857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Update pointers */ 5867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out += (pOut[i].u_stride - pOut[i].u_width); 5877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bFlipX) 5887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in ++; 5907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 5927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 5937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in --; 5947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 5987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Bilinear interpolation */ 5997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(3 != i) /**< other than alpha plane */ 6037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**No +-90� rotation */ 6057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bRevertXY) 6067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each row */ 6097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(j=0;j<pOut[i].u_height;j++) 6107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Vertical weight factor */ 6127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_frac = (pC->u32_y_accum[i]>>12)&15; 6137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Reinit horizontal weight factor */ 6157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum = pC->u32_x_accum_start[i]; 6167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == pC->m_bFlipX) 6207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 6237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 6247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal 6277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi weight factor */ 6287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = (pu8_data_in - (u32_x_accum >> 16)) -1 ; 6307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 6327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 6347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 6357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 6367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[1]*(16-u32_x_frac) + 6377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 6387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 6407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update horizontal accumulator */ 6427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum += pC->u32_x_inc[i]; 6437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 6497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 6507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal 6527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi weight factor */ 6537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = pu8_data_in + (u32_x_accum >> 16); 6557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 6577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 6597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 6607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 6617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[0]*(16-u32_x_frac) + 6627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 6637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 6657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update horizontal accumulator */ 6677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum += pC->u32_x_inc[i]; 6687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 6737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update vertical accumulator */ 6757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum[i] += pC->u32_y_inc[i]; 6767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pC->u32_y_accum[i]>>16) 6777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in + (pC->u32_y_accum[i] >> 16) * i32_tmp_offset; 6797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum[i] &= 0xffff; 6807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 6837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** +-90� rotation */ 6847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 6857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in_org = pu8_data_in; 6877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output row */ 6897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(j=0;j<pOut[i].u_height;j++) 6907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* horizontal weight factor */ 6927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_frac = (pC->u32_x_accum[i]>>12)&15; 6937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Reinit accumulator */ 6957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum = pC->u32_y_accum_start[i]; 6967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 6977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == pC->m_bFlipX) 6987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 6997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 7017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 7027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 7057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = (pu8_data_in - (pC->u32_x_accum[i] >> 16)) - 1; 7087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 7107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 7127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 7137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 7147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[1]*(16-u32_x_frac) + 7157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 7167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 7187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update vertical accumulator */ 7207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum += pC->u32_y_inc[i]; 7217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (u32_y_accum>>16) 7227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 7247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum &= 0xffff; 7257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 7307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 7327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 7337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 7367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = pu8_data_in + (pC->u32_x_accum[i] >> 16); 7387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 7407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 7427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 7437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 7447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[0]*(16-u32_x_frac) + 7457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 7467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 7487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update vertical accumulator */ 7507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum += pC->u32_y_inc[i]; 7517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (u32_y_accum>>16) 7527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 7547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum &= 0xffff; 7557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 7597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update horizontal accumulator */ 7617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum[i] += pC->u32_x_inc[i]; 7627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in_org; 7647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 7677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }/** 3 != i */ 7687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 7697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**No +-90� rotation */ 7717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bRevertXY) 7727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each row */ 7757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(j=0;j<pOut[i].u_height;j++) 7767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Vertical weight factor */ 7787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_frac = (pC->u32_y_accum[i]>>12)&15; 7797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Reinit horizontal weight factor */ 7817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum = pC->u32_x_accum_start[i]; 7827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == pC->m_bFlipX) 7867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 7897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 7907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 7917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal 7937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi weight factor */ 7947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = (pu8_data_in - (u32_x_accum >> 16)) -1 ; 7967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 7987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 7997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 8007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 8017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 8027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[1]*(16-u32_x_frac) + 8037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 8047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value= (u32_temp_value >> 7)*0xff; 8067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 8087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update horizontal accumulator */ 8107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum += pC->u32_x_inc[i]; 8117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 8177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 8187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_frac = (u32_x_accum >> 12)&15; /* Fraction of Horizontal 8207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi weight factor */ 8217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = pu8_data_in + (u32_x_accum >> 16); 8237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 8257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 8277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 8287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 8297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[0]*(16-u32_x_frac) + 8307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 8317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value= (u32_temp_value >> 7)*0xff; 8337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 8357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update horizontal accumulator */ 8377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_accum += pC->u32_x_inc[i]; 8387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 8437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update vertical accumulator */ 8457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum[i] += pC->u32_y_inc[i]; 8467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (pC->u32_y_accum[i]>>16) 8477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in + (pC->u32_y_accum[i] >> 16) * i32_tmp_offset; 8497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_y_accum[i] &= 0xffff; 8507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } /**< M4OSA_FALSE == pC->m_bRevertXY */ 8547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /** +-90� rotation */ 8557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 8567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in_org = pu8_data_in; 8587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output row */ 8607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(j=0;j<pOut[i].u_height;j++) 8617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* horizontal weight factor */ 8637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_x_frac = (pC->u32_x_accum[i]>>12)&15; 8647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Reinit accumulator */ 8667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum = pC->u32_y_accum_start[i]; 8677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == pC->m_bFlipX) 8697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 8727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 8737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 8767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = (pu8_data_in - (pC->u32_x_accum[i] >> 16)) - 1; 8797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 8817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 8837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[1]*(16-u32_x_frac) + 8847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[0]*u32_x_frac)*(16-u32_y_frac) + 8857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[1]*(16-u32_x_frac) + 8867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[0]*u32_x_frac)*u32_y_frac )>>8); 8877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value= (u32_temp_value >> 7)*0xff; 8897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 8917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 8927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update vertical accumulator */ 8937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum += pC->u32_y_inc[i]; 8947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (u32_y_accum>>16) 8957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 8967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 8977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum &= 0xffff; 8987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 8997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 9037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Loop on each output pixel in a row */ 9057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi for(k=0;k<pOut[i].u_width;k++) 9067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_frac = (u32_y_accum >> 12)&15; /* Vertical weight factor */ 9097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top = pu8_data_in + (pC->u32_x_accum[i] >> 16); 9117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom = pu8_src_top + i32_tmp_offset; 9137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Weighted combination */ 9157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value = (M4VIFI_UInt8)(((pu8_src_top[0]*(16-u32_x_frac) + 9167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_top[1]*u32_x_frac)*(16-u32_y_frac) + 9177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi (pu8_src_bottom[0]*(16-u32_x_frac) + 9187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_src_bottom[1]*u32_x_frac)*u32_y_frac )>>8); 9197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_temp_value= (u32_temp_value >> 7)*0xff; 9217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *pu8_data_out++ = (M4VIFI_UInt8)u32_temp_value; 9237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update vertical accumulator */ 9257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum += pC->u32_y_inc[i]; 9267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if (u32_y_accum>>16) 9277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * i32_tmp_offset; 9297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi u32_y_accum &= 0xffff; 9307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_out += pOut[i].u_stride - pOut[i].u_width; 9347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /* Update horizontal accumulator */ 9367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->u32_x_accum[i] += pC->u32_x_inc[i]; 9377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pu8_data_in = pu8_data_in_org; 9397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } /**< M4OSA_TRUE == pC->m_bRevertXY */ 9427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi }/** 3 == i */ 9437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< In case of stripe mode, save current input pointer */ 9457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_TRUE == pC->m_params.m_bOutputStripe) 9467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->pu8_data_in[i] = pu8_data_in; 9487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi /**< Update number of processed rows, reset it if we have finished 9527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi with the whole processing */ 9537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi pC->m_procRows += pOut[0].u_height; 9547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(M4OSA_FALSE == pC->m_bRevertXY) 9557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(pC->m_params.m_outputSize.m_height <= pC->m_procRows) pC->m_procRows = 0; 9577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi else 9597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi { 9607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi if(pC->m_params.m_outputSize.m_width <= pC->m_procRows) pC->m_procRows = 0; 9617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi } 9627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi return M4NO_ERROR ; 9647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi} 9667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 9687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi 969