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_ResizeYUV420toBGR565.c
197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief    Contain video library function
207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note     This file has a Combo filter function
217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *           -# Resizes YUV420 and converts to RGR565 with rotation
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_ResizeBilinearYUV420toBGR565(void *pContext, M4VIFI_ImagePlane *pPlaneIn,
357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                                                                  M4VIFI_ImagePlane *pPlaneOut)
367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @brief   Resize YUV420 plane and converts to BGR565 with +90 rotation.
377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @note    Basic sturture 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 *                  Compute the four corresponding R G B values
437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *                  Place the R G B in the ouput plane in rotated fashion
447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *              end loop column
457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          end loop row
467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          For resizing bilinear interpolation linearly interpolates along
477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          each row, and then uses that result in a linear interpolation down each column.
487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          Each estimated pixel in the output image is a weighted
497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          combination of its four neighbours. The ratio of compression
507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *          or dilatation is estimated using input and output sizes.
517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pPlaneIn: (IN) Pointer to YUV plane buffer
527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pContext: (IN) Context Pointer
537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @param   pPlaneOut: (OUT) Pointer to BGR565 Plane
547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4VIFI_OK: there is no error
557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4VIFI_ILLEGAL_FRAME_HEIGHT: YUV Plane height is ODD
567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi * @return  M4VIFI_ILLEGAL_FRAME_WIDTH:  YUV Plane width is ODD
577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi *********************************************************************************************
587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi*/
597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray KundargiM4VIFI_UInt8    M4VIFI_ResizeBilinearYUV420toBGR565(void* pContext,
607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                                 M4VIFI_ImagePlane *pPlaneIn,
617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                                 M4VIFI_ImagePlane *pPlaneOut)
627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi{
637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    *pu8_data_in[PLANES], *pu8_data_in1[PLANES],*pu8_data_out;
647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   *pu32_rgb_data_current, *pu32_rgb_data_next, *pu32_rgb_data_start;
657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_width_in[PLANES], u32_width_out, u32_height_in[PLANES], u32_height_out;
677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_stride_in[PLANES];
687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_stride_out, u32_stride2_out, u32_width2_RGB, u32_height2_RGB;
697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_x_inc[PLANES], u32_y_inc[PLANES];
707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_x_accum_Y, u32_x_accum_U, u32_x_accum_start;
717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_y_accum_Y, u32_y_accum_U;
727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_x_frac_Y, u32_x_frac_U, u32_y_frac_Y,u32_y_frac_U;
737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_Int32    U_32, V_32, Y_32, Yval_32;
747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    u8_Red, u8_Green, u8_Blue;
757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_row, u32_col;
767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_plane;
787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_rgb_temp1, u32_rgb_temp2;
797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_rgb_temp3,u32_rgb_temp4;
807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt32   u32_check_size;
817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    *pu8_src_top_Y,*pu8_src_top_U,*pu8_src_top_V ;
837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    M4VIFI_UInt8    *pu8_src_bottom_Y, *pu8_src_bottom_U, *pu8_src_bottom_V;
847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Check for the YUV width and height are even */
867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_check_size = IS_EVEN(pPlaneIn[0].u_height);
877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if( u32_check_size == FALSE )
887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VIFI_ILLEGAL_FRAME_HEIGHT;
907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_check_size = IS_EVEN(pPlaneIn[0].u_width);
927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (u32_check_size == FALSE )
937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        return M4VIFI_ILLEGAL_FRAME_WIDTH;
957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Make the ouput width and height as even */
987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pPlaneOut->u_height = pPlaneOut->u_height & 0xFFFFFFFE;
997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pPlaneOut->u_width = pPlaneOut->u_width & 0xFFFFFFFE;
1007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pPlaneOut->u_stride = pPlaneOut->u_stride & 0xFFFFFFFC;
1017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Assignment of output pointer */
1037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pu8_data_out    = pPlaneOut->pac_data + pPlaneOut->u_topleft;
1047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Assignment of output width(rotated) */
1057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_width_out   = pPlaneOut->u_width;
1067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Assignment of output height(rotated) */
1077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_height_out  = pPlaneOut->u_height;
1087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_width2_RGB  = pPlaneOut->u_width >> 1;
1107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_height2_RGB = pPlaneOut->u_height >> 1;
1117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_stride_out = pPlaneOut->u_stride >> 1;
1137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_stride2_out = pPlaneOut->u_stride >> 2;
1147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for(u32_plane = 0; u32_plane < PLANES; u32_plane++)
1167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Set the working pointers at the beginning of the input/output data field */
1187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pu8_data_in[u32_plane] = pPlaneIn[u32_plane].pac_data + pPlaneIn[u32_plane].u_topleft;
1197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Get the memory jump corresponding to a row jump */
1217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_stride_in[u32_plane] = pPlaneIn[u32_plane].u_stride;
1227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Set the bounds of the active image */
1247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_width_in[u32_plane] = pPlaneIn[u32_plane].u_width;
1257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_height_in[u32_plane] = pPlaneIn[u32_plane].u_height;
1267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute horizontal ratio between src and destination width for Y Plane. */
1287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (u32_width_out >= u32_width_in[YPlane])
1297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_inc[YPlane]   = ((u32_width_in[YPlane]-1) * MAX_SHORT) / (u32_width_out-1);
1317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
1337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_inc[YPlane]   = (u32_width_in[YPlane] * MAX_SHORT) / (u32_width_out);
1357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute vertical ratio between src and destination height for Y Plane.*/
1387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (u32_height_out >= u32_height_in[YPlane])
1397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_inc[YPlane]   = ((u32_height_in[YPlane]-1) * MAX_SHORT) / (u32_height_out-1);
1417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
1437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_inc[YPlane] = (u32_height_in[YPlane] * MAX_SHORT) / (u32_height_out);
1457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute horizontal ratio between src and destination width for U and V Planes. */
1487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (u32_width2_RGB >= u32_width_in[UPlane])
1497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_inc[UPlane]   = ((u32_width_in[UPlane]-1) * MAX_SHORT) / (u32_width2_RGB-1);
1517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
1537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_inc[UPlane]   = (u32_width_in[UPlane] * MAX_SHORT) / (u32_width2_RGB);
1557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /* Compute vertical ratio between src and destination height for U and V Planes. */
1587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (u32_height2_RGB >= u32_height_in[UPlane])
1607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_inc[UPlane]   = ((u32_height_in[UPlane]-1) * MAX_SHORT) / (u32_height2_RGB-1);
1627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
1647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_inc[UPlane]  = (u32_height_in[UPlane] * MAX_SHORT) / (u32_height2_RGB);
1667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_y_inc[VPlane] = u32_y_inc[UPlane];
1697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    u32_x_inc[VPlane] = u32_x_inc[UPlane];
1707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
1727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Calculate initial accumulator value : u32_y_accum_start.
1737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_start is coded on 15 bits,and represents a value between 0 and 0.5
1747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
1757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (u32_y_inc[YPlane] > MAX_SHORT)
1767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /*
1787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Keep the fractionnal part, assimung that integer  part is coded on the 16 high bits,
1797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            and the fractionnal on the 15 low bits
1807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        */
1817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_Y = u32_y_inc[YPlane] & 0xffff;
1827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_U = u32_y_inc[UPlane] & 0xffff;
1837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (!u32_y_accum_Y)
1857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
1867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum_Y = MAX_SHORT;
1877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum_U = MAX_SHORT;
1887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
1897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_Y >>= 1;
1907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_U >>= 1;
1917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
1937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
1947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_Y = 0;
1957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_U = 0;
1967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
1987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
1997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
2007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Calculate initial accumulator value : u32_x_accum_start.
2017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_accum_start is coded on 15 bits, and represents a value between 0 and 0.5
2027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
2037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    if (u32_x_inc[YPlane] > MAX_SHORT)
2047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_accum_start = u32_x_inc[YPlane] & 0xffff;
2067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (!u32_x_accum_start)
2087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
2097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_start = MAX_SHORT;
2107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_accum_start >>= 1;
2137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    else
2157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_accum_start = 0;
2177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }
2187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    pu32_rgb_data_start = (M4VIFI_UInt32*)pu8_data_out;
2207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    /*
2227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        Bilinear interpolation linearly interpolates along each row, and then uses that
2237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        result in a linear interpolation donw each column. Each estimated pixel in the
2247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        output image is a weighted combination of its four neighbours according to the formula :
2257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray 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)
2267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        with  R(x) = / x+1  -1 =< x =< 0 \ 1-x  0 =< x =< 1 and a (resp. b) weighting coefficient
2277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        is the distance from the nearest neighbor in the p (resp. q) direction
2287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    */
2297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    for (u32_row = u32_height_out; u32_row != 0; u32_row -= 2)
2307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    {
2317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_accum_Y = u32_x_accum_start;
2327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_x_accum_U = u32_x_accum_start;
2337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Vertical weight factor */
2357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_frac_Y = (u32_y_accum_Y >> 12) & 15;
2367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_frac_U = (u32_y_accum_U >> 12) & 15;
2377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* RGB current line position pointer */
2397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pu32_rgb_data_current = pu32_rgb_data_start ;
2407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* RGB next line position pointer */
2427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pu32_rgb_data_next    = pu32_rgb_data_current + (u32_stride2_out);
2437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Y Plane next row pointer */
2457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pu8_data_in1[YPlane] = pu8_data_in[YPlane];
2467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_rgb_temp3 = u32_y_accum_Y + (u32_y_inc[YPlane]);
2487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (u32_rgb_temp3 >> 16)
2497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
2507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_data_in1[YPlane] =  pu8_data_in[YPlane] +
2517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                (u32_rgb_temp3 >> 16) * (u32_stride_in[YPlane]);
2527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_rgb_temp3 &= 0xffff;
2537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
2547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_rgb_temp4 = (u32_rgb_temp3 >> 12) & 15;
2557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        for (u32_col = u32_width_out; u32_col != 0; u32_col -= 2)
2577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
2587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Input Y plane elements */
2607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_top_Y = pu8_data_in[YPlane] + (u32_x_accum_Y >> 16);
2617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_bottom_Y = pu8_src_top_Y + u32_stride_in[YPlane];
2627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Input U Plane elements */
2647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_top_U = pu8_data_in[UPlane] + (u32_x_accum_U >> 16);
2657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_bottom_U = pu8_src_top_U + u32_stride_in[UPlane];
2667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_top_V = pu8_data_in[VPlane] + (u32_x_accum_U >> 16);
2687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_bottom_V = pu8_src_top_V + u32_stride_in[VPlane];
2697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Horizontal weight factor for Y plane */
2717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_frac_Y = (u32_x_accum_Y >> 12)&15;
2727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Horizontal weight factor for U and V planes */
2737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_frac_U = (u32_x_accum_U >> 12)&15;
2747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Weighted combination */
2767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            U_32 = (((pu8_src_top_U[0]*(16-u32_x_frac_U) + pu8_src_top_U[1]*u32_x_frac_U)
2777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(16-u32_y_frac_U) + (pu8_src_bottom_U[0]*(16-u32_x_frac_U)
2787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + pu8_src_bottom_U[1]*u32_x_frac_U)*u32_y_frac_U ) >> 8);
2797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            V_32 = (((pu8_src_top_V[0]*(16-u32_x_frac_U) + pu8_src_top_V[1]*u32_x_frac_U)
2817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(16-u32_y_frac_U)+ (pu8_src_bottom_V[0]*(16-u32_x_frac_U)
2827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + pu8_src_bottom_V[1]*u32_x_frac_U)*u32_y_frac_U ) >> 8);
2837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Y_32 = (((pu8_src_top_Y[0]*(16-u32_x_frac_Y) + pu8_src_top_Y[1]*u32_x_frac_Y)
2857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(16-u32_y_frac_Y) + (pu8_src_bottom_Y[0]*(16-u32_x_frac_Y)
2867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + pu8_src_bottom_Y[1]*u32_x_frac_Y)*u32_y_frac_Y ) >> 8);
2877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_U += (u32_x_inc[UPlane]);
2897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* YUV to RGB */
2917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef __RGB_V1__
2927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32 = Y_32*37;
2937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* __RGB_V1__v */
2947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32 = Y_32*0x2568;
2957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif /* __RGB_V1__v */
2967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    DEMATRIX(u8_Red,u8_Green,u8_Blue,Yval_32,U_32,V_32);
2987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
2997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Pack 8 bit R,G,B to RGB565 */
3007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef  LITTLE_ENDIAN
3017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    u32_rgb_temp1 = PACK_BGR565(0,u8_Red,u8_Green,u8_Blue);
3027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* LITTLE_ENDIAN */
3037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    u32_rgb_temp1 = PACK_BGR565(16,u8_Red,u8_Green,u8_Blue);
3047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif  /* LITTLE_ENDIAN */
3057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_top_Y = pu8_data_in1[YPlane]+(u32_x_accum_Y >> 16);
3087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_bottom_Y = pu8_src_top_Y + u32_stride_in[YPlane];
3097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Weighted combination */
3117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Y_32 = (((pu8_src_top_Y[0]*(16-u32_x_frac_Y) + pu8_src_top_Y[1]*u32_x_frac_Y)
3127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(16-u32_rgb_temp4) + (pu8_src_bottom_Y[0]*(16-u32_x_frac_Y)
3137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + pu8_src_bottom_Y[1]*u32_x_frac_Y)*u32_rgb_temp4 ) >> 8);
3147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_Y += u32_x_inc[YPlane];
3167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Horizontal weight factor */
3187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_frac_Y = (u32_x_accum_Y >> 12)&15;
3197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* YUV to RGB */
3217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef __RGB_V1__
3227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32 = Y_32*37;
3237c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* __RGB_V1__v */
3247c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32 = Y_32*0x2568;
3257c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif  /* __RGB_V1__v */
3267c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3277c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            DEMATRIX(u8_Red,u8_Green,u8_Blue,Yval_32,U_32,V_32);
3287c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3297c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Pack 8 bit R,G,B to RGB565 */
3307c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef  LITTLE_ENDIAN
3317c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    u32_rgb_temp2 = PACK_BGR565(0,u8_Red,u8_Green,u8_Blue);
3327c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* LITTLE_ENDIAN */
3337c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    u32_rgb_temp2 = PACK_BGR565(16,u8_Red,u8_Green,u8_Blue);
3347c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif  /* LITTLE_ENDIAN */
3357c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3367c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3377c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_top_Y = pu8_data_in[YPlane] + (u32_x_accum_Y >> 16) ;
3387c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_bottom_Y = pu8_src_top_Y + u32_stride_in[YPlane];
3397c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3407c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Weighted combination */
3417c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Y_32 = (((pu8_src_top_Y[0]*(16-u32_x_frac_Y) + pu8_src_top_Y[1]*u32_x_frac_Y)
3427c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(16-u32_y_frac_Y) + (pu8_src_bottom_Y[0]*(16-u32_x_frac_Y)
3437c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + pu8_src_bottom_Y[1]*u32_x_frac_Y)*u32_y_frac_Y ) >> 8);
3447c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3457c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* YUV to RGB */
3467c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef __RGB_V1__
3477c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32 = Y_32*37;
3487c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* __RGB_V1__v */
3497c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32 = Y_32*0x2568;
3507c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif  /* __RGB_V1__v */
3517c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3527c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            DEMATRIX(u8_Red,u8_Green,u8_Blue,Yval_32,U_32,V_32);
3537c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3547c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Pack 8 bit R,G,B to RGB565 */
3557c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef  LITTLE_ENDIAN
3567c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(pu32_rgb_data_current)++ = u32_rgb_temp1 |
3577c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                        PACK_BGR565(16,u8_Red,u8_Green,u8_Blue);
3587c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* LITTLE_ENDIAN */
3597c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(pu32_rgb_data_current)++ = u32_rgb_temp1 |
3607c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                        PACK_BGR565(0,u8_Red,u8_Green,u8_Blue);
3617c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif  /* LITTLE_ENDIAN */
3627c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3637c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3647c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_top_Y = pu8_data_in1[YPlane]+ (u32_x_accum_Y >> 16);
3657c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_src_bottom_Y = pu8_src_top_Y + u32_stride_in[YPlane];
3667c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3677c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Weighted combination */
3687c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            Y_32 = (((pu8_src_top_Y[0]*(16-u32_x_frac_Y) + pu8_src_top_Y[1]*u32_x_frac_Y)
3697c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(16-u32_rgb_temp4) + (pu8_src_bottom_Y[0]*(16-u32_x_frac_Y)
3707c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    + pu8_src_bottom_Y[1]*u32_x_frac_Y)*u32_rgb_temp4 )>>8);
3717c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3727c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_x_accum_Y += u32_x_inc[YPlane];
3737c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* YUV to RGB */
3747c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef __RGB_V1__
3757c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32=Y_32*37;
3767c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* __RGB_V1__v */
3777c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    Yval_32=Y_32*0x2568;
3787c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif  /* __RGB_V1__v */
3797c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3807c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            DEMATRIX(u8_Red,u8_Green,u8_Blue,Yval_32,U_32,V_32);
3817c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3827c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            /* Pack 8 bit R,G,B to RGB565 */
3837c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #ifdef  LITTLE_ENDIAN
3847c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(pu32_rgb_data_next)++ = u32_rgb_temp2 |
3857c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                        PACK_BGR565(16,u8_Red,u8_Green,u8_Blue);
3867c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #else   /* LITTLE_ENDIAN */
3877c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                    *(pu32_rgb_data_next)++ = u32_rgb_temp2 |
3887c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                        PACK_BGR565(0,u8_Red,u8_Green,u8_Blue);
3897c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            #endif  /* LITTLE_ENDIAN */
3907c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3917c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }   /* End of horizontal scanning */
3927c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3937c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_Y  =  u32_rgb_temp3 + (u32_y_inc[YPlane]);
3947c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        u32_y_accum_U += (u32_y_inc[UPlane]);
3957c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
3967c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* Y plane row update */
3977c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (u32_y_accum_Y >> 16)
3987c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
3997c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_data_in[YPlane] =  pu8_data_in1[YPlane] +
4007c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                ((u32_y_accum_Y >> 16) * (u32_stride_in[YPlane]));
4017c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum_Y &= 0xffff;
4027c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4037c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        else
4047c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4057c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_data_in[YPlane] = pu8_data_in1[YPlane];
4067c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4077c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* U and V planes row update */
4087c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        if (u32_y_accum_U >> 16)
4097c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        {
4107c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_data_in[UPlane] =  pu8_data_in[UPlane] +
4117c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                (u32_y_accum_U >> 16) * (u32_stride_in[UPlane]);
4127c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            pu8_data_in[VPlane] =  pu8_data_in[VPlane] +
4137c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi                                                (u32_y_accum_U >> 16) * (u32_stride_in[VPlane]);
4147c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi            u32_y_accum_U &= 0xffff;
4157c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        }
4167c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        /* BGR pointer Update */
4177c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi        pu32_rgb_data_start += u32_stride_out;
4187c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
4197c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    }   /* End of vertical scanning */
4207c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi    return M4VIFI_OK;
4217c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi}
4227c9d8018755adf1857571125ba1b3598c96ea506Dharmaray Kundargi
423