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