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