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