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     M4VIFI_ResizeYUV420toYUV420.c
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Contain video library function
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note     This file has a Resize filter function
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *           -# Generic resizing of YUV420 (Planar) image
227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ******************************************************************************
237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Prototypes of functions, and type definitions */
267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include    "M4VIFI_FiltersAPI.h"
277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Macro definitions */
287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include    "M4VIFI_Defines.h"
297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* Clip table declaration */
307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi#include    "M4VIFI_Clip.h"
317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/**
337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ***********************************************************************************************
347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * M4VIFI_UInt8 M4VIFI_ResizeBilinearRGB888toRGB888(void *pUserData, M4VIFI_ImagePlane *pPlaneIn,
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                                                  M4VIFI_ImagePlane *pPlaneOut)
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Resizes YUV420 Planar plane.
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Basic structure of the function
387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          Loop on each row (step 2)
397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *              Loop on each column (step 2)
407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                  Get four Y samples and 1 U & V sample
417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                  Resize the Y with corresponing U and V samples
427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                  Place the YUV in the ouput plane
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *              end loop column
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          end loop row
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          For resizing bilinear interpolation linearly interpolates along
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          each row, and then uses that result in a linear interpolation down each column.
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          Each estimated pixel in the output image is a weighted
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          combination of its four neighbours. The ratio of compression
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          or dilatation is estimated using input and output sizes.
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pUserData: (IN) User Data
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pPlaneIn: (IN) Pointer to YUV420 (Planar) plane buffer
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pPlaneOut: (OUT) Pointer to YUV420 (Planar) plane
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4VIFI_OK: there is no error
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4VIFI_ILLEGAL_FRAME_HEIGHT: Error in height
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4VIFI_ILLEGAL_FRAME_WIDTH:  Error in width
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi ***********************************************************************************************
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VIFI_UInt8    M4VIFI_ResizeBilinearRGB888toRGB888(void *pUserData,
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                                M4VIFI_ImagePlane *pPlaneIn,
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                                M4VIFI_ImagePlane *pPlaneOut)
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    *pu8_data_in;
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    *pu8_data_out;
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_width_in, u32_width_out, u32_height_in, u32_height_out;
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_stride_in, u32_stride_out;
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_x_inc, u32_y_inc;
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_x_accum, u32_y_accum, u32_x_accum_start;
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_width, u32_height;
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_y_frac;
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_x_frac;
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_Rtemp_value,u32_Gtemp_value,u32_Btemp_value;
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    *pu8_src_top;
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    *pu8_src_bottom;
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32    i32_b00, i32_g00, i32_r00;
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32    i32_b01, i32_g01, i32_r01;
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32    i32_b02, i32_g02, i32_r02;
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32    i32_b03, i32_g03, i32_r03;
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check for the YUV width and height are even */
801ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma    if ((IS_EVEN(pPlaneIn->u_height) == FALSE)    ||
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (IS_EVEN(pPlaneOut->u_height) == FALSE))
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VIFI_ILLEGAL_FRAME_HEIGHT;
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
861ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma    if ((IS_EVEN(pPlaneIn->u_width) == FALSE) ||
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        (IS_EVEN(pPlaneOut->u_width) == FALSE))
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VIFI_ILLEGAL_FRAME_WIDTH;
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Set the working pointers at the beginning of the input/output data field */
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pu8_data_in     = (M4VIFI_UInt8*)(pPlaneIn->pac_data + pPlaneIn->u_topleft);
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pu8_data_out    = (M4VIFI_UInt8*)(pPlaneOut->pac_data + pPlaneOut->u_topleft);
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Get the memory jump corresponding to a row jump */
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_stride_in   = pPlaneIn->u_stride;
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_stride_out  = pPlaneOut->u_stride;
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Set the bounds of the active image */
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_width_in    = pPlaneIn->u_width;
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_height_in   = pPlaneIn->u_height;
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_width_out   = pPlaneOut->u_width;
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_height_out  = pPlaneOut->u_height;
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Compute horizontal ratio between src and destination width.*/
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (u32_width_out >= u32_width_in)
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_inc   = ((u32_width_in-1) * MAX_SHORT) / (u32_width_out-1);
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_inc   = (u32_width_in * MAX_SHORT) / (u32_width_out);
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Compute vertical ratio between src and destination height.*/
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (u32_height_out >= u32_height_in)
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_inc   = ((u32_height_in - 1) * MAX_SHORT) / (u32_height_out-1);
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_inc = (u32_height_in * MAX_SHORT) / (u32_height_out);
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Calculate initial accumulator value : u32_y_accum_start.
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_start is coded on 15 bits, and represents a value between 0 and 0.5
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        */
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (u32_y_inc >= MAX_SHORT)
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /*
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                Keep the fractionnal part, assimung that integer  part is coded
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                on the 16 high bits and the fractionnal on the 15 low bits
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            */
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum = u32_y_inc & 0xffff;
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!u32_y_accum)
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_y_accum = MAX_SHORT;
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum >>= 1;
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum = 0;
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Calculate initial accumulator value : u32_x_accum_start.
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_start is coded on 15 bits, and represents a value between 0 and 0.5
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        */
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (u32_x_inc >= MAX_SHORT)
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_start = u32_x_inc & 0xffff;
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (!u32_x_accum_start)
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_x_accum_start = MAX_SHORT;
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_start >>= 1;
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_start = 0;
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_height = u32_height_out;
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Bilinear interpolation linearly interpolates along each row, and then uses that
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        result in a linear interpolation donw each column. Each estimated pixel in the
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        output image is a weighted combination of its four neighbours according to the formula:
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        F(p',q')=f(p,q)R(-a)R(b)+f(p,q-1)R(-a)R(b-1)+f(p+1,q)R(1-a)R(b)+f(p+&,q+1)R(1-a)R(b-1)
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        with  R(x) = / x+1  -1 =< x =< 0 \ 1-x  0 =< x =< 1 and a (resp. b)weighting coefficient
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        is the distance from the nearest neighbor in the p (resp. q) direction
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        */
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        do { /* Scan all the row */
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Vertical weight factor */
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_frac = (u32_y_accum>>12)&15;
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Reinit accumulator */
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum = u32_x_accum_start;
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_width = u32_width_out;
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            do { /* Scan along each row */
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pu8_src_top = pu8_data_in + (u32_x_accum >> 16)*3;
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pu8_src_bottom = pu8_src_top + (u32_stride_in);
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_x_frac = (u32_x_accum >> 12)&15; /* Horizontal weight factor */
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1991ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                if ((u32_width == 1) && (u32_width_in == u32_width_out)) {
2001ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    /*
2011ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       When input height is equal to output height and input width
2021ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       equal to output width, replicate the corner pixels for
2031ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       interpolation
2041ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    */
2051ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    if ((u32_height == 1) && (u32_height_in == u32_height_out)) {
2061ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b00,i32_g00,i32_r00,pu8_src_top,0);
2071ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b01,i32_g01,i32_r01,pu8_src_top,0);
2081ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b02,i32_g02,i32_r02,pu8_src_top,0);
2091ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b03,i32_g03,i32_r03,pu8_src_top,0);
2101ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    }
2111ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    /*
2121ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       When input height is not equal to output height and
2131ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       input width equal to output width, replicate the
2141ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       column for interpolation
2151ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    */
2161ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    else {
2171ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b00,i32_g00,i32_r00,pu8_src_top,0);
2181ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b01,i32_g01,i32_r01,pu8_src_top,0);
2191ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b02,i32_g02,i32_r02,pu8_src_bottom,0);
2201ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b03,i32_g03,i32_r03,pu8_src_bottom,0);
2211ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    }
2221ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                } else {
2231ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    /*
2241ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       When input height is equal to output height and
2251ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       input width not equal to output width, replicate the
2261ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                       row for interpolation
2271ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    */
2281ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    if ((u32_height == 1) && (u32_height_in == u32_height_out)) {
2291ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b00,i32_g00,i32_r00,pu8_src_top,0);
2301ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b01,i32_g01,i32_r01,pu8_src_top,3);
2311ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b02,i32_g02,i32_r02,pu8_src_top,0);
2321ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b03,i32_g03,i32_r03,pu8_src_top,3);
2331ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    } else {
2341ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b00,i32_g00,i32_r00,pu8_src_top,0);
2351ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b01,i32_g01,i32_r01,pu8_src_top,3);
2361ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b02,i32_g02,i32_r02,pu8_src_bottom,0);
2371ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                        GET_RGB24(i32_b03,i32_g03,i32_r03,pu8_src_bottom,3);
2381ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                    }
2391ea8583c990170b94cdca0f9a248d61961c3520fDheeraj Sharma                }
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_Rtemp_value = (M4VIFI_UInt8)(((i32_r00*(16-u32_x_frac) +
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 i32_r01*u32_x_frac)*(16-u32_y_frac) +
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (i32_r02*(16-u32_x_frac) +
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 i32_r03*u32_x_frac)*u32_y_frac )>>8);
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_Gtemp_value = (M4VIFI_UInt8)(((i32_g00*(16-u32_x_frac) +
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 i32_g01*u32_x_frac)*(16-u32_y_frac) +
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (i32_g02*(16-u32_x_frac) +
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 i32_g03*u32_x_frac)*u32_y_frac )>>8);
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_Btemp_value =  (M4VIFI_UInt8)(((i32_b00*(16-u32_x_frac) +
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 i32_b01*u32_x_frac)*(16-u32_y_frac) +
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                (i32_b02*(16-u32_x_frac) +
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                 i32_b03*u32_x_frac)*u32_y_frac )>>8);
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pu8_data_out++ = u32_Btemp_value ;
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pu8_data_out++ = u32_Gtemp_value ;
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                *pu8_data_out++ = u32_Rtemp_value ;
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                /* Update horizontal accumulator */
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_x_accum += u32_x_inc;
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            } while(--u32_width);
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            //pu16_data_out = pu16_data_out + (u32_stride_out>>1) - (u32_width_out);
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Update vertical accumulator */
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum += u32_y_inc;
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            if (u32_y_accum>>16)
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            {
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                pu8_data_in = pu8_data_in + (u32_y_accum >> 16) * (u32_stride_in) ;
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                u32_y_accum &= 0xffff;
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            }
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        } while(--u32_height);
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4VIFI_OK;
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi/* End of file M4VIFI_ResizeRGB565toRGB565.c */
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
279