19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * SDL - Simple DirectMedia Layer 39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * CELL BE Support for PS3 Framebuffer 49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Copyright (C) 2008, 2009 International Business Machines Corporation 59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * This library is free software; you can redistribute it and/or modify it 79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * under the terms of the GNU Lesser General Public License as published 89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * by the Free Software Foundation; either version 2.1 of the License, or 99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * (at your option) any later version. 109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * This library is distributed in the hope that it will be useful, but 129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * WITHOUT ANY WARRANTY; without even the implied warranty of 139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Lesser General Public License for more details. 159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * You should have received a copy of the GNU Lesser General Public 179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * License along with this library; if not, write to the Free Software 189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * USA 209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Martin Lowinski <lowinski [at] de [dot] ibm [ibm] com> 229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Dirk Herrendoerfer <d.herrendoerfer [at] de [dot] ibm [dot] com> 239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * SPE code based on research by: 249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Rene Becker 259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * Thimo Emmerich 269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "spu_common.h" 299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <spu_intrinsics.h> 319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <spu_mfcio.h> 329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall// Debugging 349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//#define DEBUG 359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef DEBUG 379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define deprintf(fmt, args... ) \ 389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall fprintf( stdout, fmt, ##args ); \ 399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall fflush( stdout ); 409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#else 419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define deprintf( fmt, args... ) 429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif 439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstruct scale_parms_t parms __attribute__((aligned(128))); 459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* A maximum of 8 lines Y, therefore 4 lines V, 4 lines U are stored 479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * there might be the need to retrieve misaligned data, adjust 489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * incoming v and u plane to be able to handle this (add 128) 499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallunsigned char y_plane[2][(MAX_HDTV_WIDTH+128)*4] __attribute__((aligned(128))); 519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallunsigned char v_plane[2][(MAX_HDTV_WIDTH+128)*2] __attribute__((aligned(128))); 529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallunsigned char u_plane[2][(MAX_HDTV_WIDTH+128)*2] __attribute__((aligned(128))); 539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* temp-buffer for scaling: 4 lines Y, therefore 2 lines V, 2 lines U */ 559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallunsigned char scaled_y_plane[2][MAX_HDTV_WIDTH*2] __attribute__((aligned(128))); 569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallunsigned char scaled_v_plane[2][MAX_HDTV_WIDTH/2] __attribute__((aligned(128))); 579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallunsigned char scaled_u_plane[2][MAX_HDTV_WIDTH/2] __attribute__((aligned(128))); 589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* some vectors needed by the float to int conversion */ 609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic const vector float vec_255 = { 255.0f, 255.0f, 255.0f, 255.0f }; 619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallstatic const vector float vec_0_1 = { 0.1f, 0.1f, 0.1f, 0.1f }; 629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid bilinear_scale_line_w8(unsigned char* src, unsigned char* dst_, unsigned int dst_width, vector float vf_x_scale, vector float vf_NSweight, unsigned int src_linestride); 649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid bilinear_scale_line_w16(unsigned char* src, unsigned char* dst_, unsigned int dst_width, vector float vf_x_scale, vector float vf_NSweight, unsigned int src_linestride); 659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw16_dstw16(); 679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw16_dstw32(); 689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw32_dstw16(); 699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw32_dstw32(); 709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallint main( unsigned long long spe_id __attribute__((unused)), unsigned long long argp ) 729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall{ 739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall deprintf("[SPU] bilin_scaler_spu is up... (on SPE #%llu)\n", spe_id); 749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /* DMA transfer for the input parameters */ 759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall spu_mfcdma32(&parms, (unsigned int)argp, sizeof(struct scale_parms_t), TAG_INIT, MFC_GET_CMD); 769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG(TAG_INIT); 779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall deprintf("[SPU] Scale %ux%u to %ux%u\n", parms.src_pixel_width, parms.src_pixel_height, 799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall parms.dst_pixel_width, parms.dst_pixel_height); 809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(parms.src_pixel_width & 0x1f) { 829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(parms.dst_pixel_width & 0x1F) { 839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall deprintf("[SPU] Using scale_srcw16_dstw16\n"); 849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scale_srcw16_dstw16(); 859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } else { 869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall deprintf("[SPU] Using scale_srcw16_dstw32\n"); 879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scale_srcw16_dstw32(); 889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } else { 909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall if(parms.dst_pixel_width & 0x1F) { 919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall deprintf("[SPU] Using scale_srcw32_dstw16\n"); 929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scale_srcw32_dstw16(); 939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } else { 949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall deprintf("[SPU] Using scale_srcw32_dstw32\n"); 959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scale_srcw32_dstw32(); 969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall deprintf("[SPU] bilin_scaler_spu... done!\n"); 999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return 0; 1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * vfloat_to_vuint() 1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * converts a float vector to an unsinged int vector using saturated 1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * arithmetic 1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param vec_s float vector for conversion 1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @returns converted unsigned int vector 1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallinline static vector unsigned int vfloat_to_vuint(vector float vec_s) { 1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int select_1 = spu_cmpgt(vec_0_1, vec_s); 1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vec_s = spu_sel(vec_s, vec_0_1, select_1); 1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int select_2 = spu_cmpgt(vec_s, vec_255); 1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vec_s = spu_sel(vec_s, vec_255, select_2); 1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall return spu_convtu(vec_s,0); 1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scale_srcw16_dstw16() 1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * processes an input image of width 16 1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scaling is done to a width 16 1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * result stored in RAM 1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw16_dstw16() { 1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // extract parameters 1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr = (unsigned char *)parms.dstBuffer; 1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_width = parms.src_pixel_width; 1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_height = parms.src_pixel_height; 1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_width = parms.dst_pixel_width; 1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_height = parms.dst_pixel_height; 1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // YVU 1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_y = src_width; 1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_y = src_width<<1; 1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_vu = src_width>>1; 1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_vu = src_width; 1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaled YVU 1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int scaled_src_linestride_y = dst_width; 1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // ram addresses 1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_y = parms.y_plane; 1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_v = parms.v_plane; 1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_u = parms.u_plane; 1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // for handling misalignment, addresses are precalculated 1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* precalc_src_addr_v = src_addr_v; 1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* precalc_src_addr_u = src_addr_u; 1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_picture_size = dst_width*dst_height; 1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Sizes for destination 1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_y = dst_width<<1; 1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_vu = dst_width>>1; 1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform address calculation for Y, V and U in main memory with dst_addr as base 1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_y = dst_addr; 1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_v = dst_addr + dst_picture_size; 1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_u = dst_addr_main_memory_v +(dst_picture_size>>2); 1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate scale factors 1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_x_scale = spu_splats( (float)src_width/(float)dst_width ); 1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float y_scale = (float)src_height/(float)dst_height; 1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // double buffered processing 1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // buffer switching 1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_src_idx = 0; 1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_dst_idx = 0; 1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_src_idx, next_dst_idx; 1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines y as output, upper and lowerline 1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_upper = 0; 1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_y_upper; 1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_lower, next_interpl_y_lower; 1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // only 1 line v/u output, both planes have the same dimension 1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_vu = 0; 1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_vu; 1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // weights, calculated in every loop iteration 1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_upper = { 0.0f, 0.0f, 0.0f, 0.0f }; 1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_y_upper; 1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_lower, vf_next_NSweight_y_lower; 1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_vu = { 0.0f, 0.0f, 0.0f, 0.0f }; 1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_vu; 1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the src picture 1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_upper = 0.0f, next_src_y_upper; 1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_lower, next_src_y_lower; 1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_vu = 0.0f, next_src_vu; 1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the dst picture 1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_y=0, dst_vu=0; 2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // offset for the v and u plane to handle misalignement 2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_lsoff_v = 0, next_lsoff_v; 2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_lsoff_u = 0, next_lsoff_u; 2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate lower line indices 2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = ((float)curr_interpl_y_upper+1)*y_scale; 2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = (unsigned int)curr_src_y_lower; 2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower line weight 2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = spu_splats( curr_src_y_lower-(float)curr_interpl_y_lower ); 2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // start partially double buffered processing 2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get initial data, 2 sets of y, 1 set v, 1 set u 2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx], (unsigned int) src_addr_y, src_dbl_linestride_y, RETR_BUF, 0, 0 ); 2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx]+src_dbl_linestride_y, 2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(curr_interpl_y_lower*src_linestride_y), 2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF, 2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[curr_src_idx], (unsigned int) src_addr_v, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[curr_src_idx], (unsigned int) src_addr_u, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall /* iteration loop 2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * within each iteration 4 lines y, 2 lines v, 2 lines u are retrieved 2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * the scaled output is 2 lines y, 1 line v, 1 line u 2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * the yuv2rgb-converted output is stored to RAM 2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for( dst_vu=0; dst_vu<(dst_height>>1)-1; dst_vu++ ) { 2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_y = dst_vu<<1; 2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate next indices 2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_vu = ((float)dst_vu+1)*y_scale; 2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_upper = ((float)dst_y+2)*y_scale; 2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_lower = ((float)dst_y+3)*y_scale; 2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_vu = (unsigned int) next_src_vu; 2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_upper = (unsigned int) next_src_y_upper; 2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_lower = (unsigned int) next_src_y_lower; 2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate weight NORTH-SOUTH 2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_vu = spu_splats( next_src_vu-(float)next_interpl_vu ); 2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_upper = spu_splats( next_src_y_upper-(float)next_interpl_y_upper ); 2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_lower = spu_splats( next_src_y_lower-(float)next_interpl_y_lower ); 2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get next lines 2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_idx = curr_src_idx^1; 2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_dst_idx = curr_dst_idx^1; 2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 4 lines y 2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx], 2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_upper*src_linestride_y), 2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx]+src_dbl_linestride_y, 2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_lower*src_linestride_y), 2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines v 2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall precalc_src_addr_v = src_addr_v+(next_interpl_vu*src_linestride_vu); 2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_lsoff_v = ((unsigned int)precalc_src_addr_v)&0x0F; 2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[next_src_idx], 2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ((unsigned int) precalc_src_addr_v)&0xFFFFFFF0, 2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu+(next_lsoff_v<<1), 2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines u 2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall precalc_src_addr_u = src_addr_u+(next_interpl_vu*src_linestride_vu); 2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_lsoff_u = ((unsigned int)precalc_src_addr_u)&0x0F; 2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[next_src_idx], 2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ((unsigned int) precalc_src_addr_u)&0xFFFFFFF0, 2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu+(next_lsoff_v<<1), 2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( v_plane[curr_src_idx]+curr_lsoff_v, 2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( u_plane[curr_src_idx]+curr_lsoff_u, 3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Store the result back to main memory into a destination buffer in YUV format 3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int)dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int)dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int)dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // update for next cycle 3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_idx = next_src_idx; 3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_dst_idx = next_dst_idx; 3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_upper = next_interpl_y_upper; 3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = next_interpl_y_lower; 3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_vu = next_interpl_vu; 3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper = vf_curr_NSweight_y_upper; 3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = vf_curr_NSweight_y_lower; 3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu = vf_next_NSweight_vu; 3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_upper = next_src_y_upper; 3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = next_src_y_lower; 3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_vu = next_src_vu; 3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_lsoff_v = next_lsoff_v; 3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_lsoff_u = next_lsoff_u; 3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( v_plane[curr_src_idx]+curr_lsoff_v, 3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( u_plane[curr_src_idx]+curr_lsoff_u, 3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Store the result back to main memory into a destination buffer in YUV format 3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int)dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int)dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int)dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // wait for completion 4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scale_srcw16_dstw32() 4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * processes an input image of width 16 4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scaling is done to a width 32 4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * yuv2rgb conversion on a width of 32 4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * result stored in RAM 4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw16_dstw32() { 4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // extract parameters 4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr = (unsigned char *)parms.dstBuffer; 4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_width = parms.src_pixel_width; 4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_height = parms.src_pixel_height; 4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_width = parms.dst_pixel_width; 4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_height = parms.dst_pixel_height; 4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // YVU 4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_y = src_width; 4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_y = src_width<<1; 4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_vu = src_width>>1; 4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_vu = src_width; 4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaled YVU 4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int scaled_src_linestride_y = dst_width; 4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // ram addresses 4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_y = parms.y_plane; 4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_v = parms.v_plane; 4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_u = parms.u_plane; 4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_picture_size = dst_width*dst_height; 4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Sizes for destination 4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_y = dst_width<<1; 4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_vu = dst_width>>1; 4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform address calculation for Y, V and U in main memory with dst_addr as base 4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_y = dst_addr; 4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_v = dst_addr + dst_picture_size; 4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_u = dst_addr_main_memory_v +(dst_picture_size>>2); 4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // for handling misalignment, addresses are precalculated 4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* precalc_src_addr_v = src_addr_v; 4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* precalc_src_addr_u = src_addr_u; 4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate scale factors 4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_x_scale = spu_splats( (float)src_width/(float)dst_width ); 4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float y_scale = (float)src_height/(float)dst_height; 4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // double buffered processing 4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // buffer switching 4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_src_idx = 0; 4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_dst_idx = 0; 4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_src_idx, next_dst_idx; 4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines y as output, upper and lowerline 4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_upper = 0; 4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_y_upper; 4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_lower, next_interpl_y_lower; 4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // only 1 line v/u output, both planes have the same dimension 4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_vu = 0; 4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_vu; 4919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // weights, calculated in every loop iteration 4939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_upper = { 0.0f, 0.0f, 0.0f, 0.0f }; 4949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_y_upper; 4959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_lower, vf_next_NSweight_y_lower; 4969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_vu = { 0.0f, 0.0f, 0.0f, 0.0f }; 4979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_vu; 4989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 4999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the src picture 5009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_upper = 0.0f, next_src_y_upper; 5019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_lower, next_src_y_lower; 5029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_vu = 0.0f, next_src_vu; 5039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the dst picture 5059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_y=0, dst_vu=0; 5069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // offset for the v and u plane to handle misalignement 5089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_lsoff_v = 0, next_lsoff_v; 5099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_lsoff_u = 0, next_lsoff_u; 5109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate lower line idices 5129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = ((float)curr_interpl_y_upper+1)*y_scale; 5139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = (unsigned int)curr_src_y_lower; 5149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower line weight 5159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = spu_splats( curr_src_y_lower-(float)curr_interpl_y_lower ); 5169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // start partially double buffered processing 5199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get initial data, 2 sets of y, 1 set v, 1 set u 5209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx], (unsigned int) src_addr_y, src_dbl_linestride_y, RETR_BUF, 0, 0 ); 5219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx]+src_dbl_linestride_y, 5229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(curr_interpl_y_lower*src_linestride_y), 5239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 5249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF, 5259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 5269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[curr_src_idx], (unsigned int) src_addr_v, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 5279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[curr_src_idx], (unsigned int) src_addr_u, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 5289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // iteration loop 5309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // within each iteration 4 lines y, 2 lines v, 2 lines u are retrieved 5319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // the scaled output is 2 lines y, 1 line v, 1 line u 5329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // the yuv2rgb-converted output is stored to RAM 5339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for( dst_vu=0; dst_vu<(dst_height>>1)-1; dst_vu++ ) { 5349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_y = dst_vu<<1; 5359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate next indices 5379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_vu = ((float)dst_vu+1)*y_scale; 5389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_upper = ((float)dst_y+2)*y_scale; 5399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_lower = ((float)dst_y+3)*y_scale; 5409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_vu = (unsigned int) next_src_vu; 5429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_upper = (unsigned int) next_src_y_upper; 5439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_lower = (unsigned int) next_src_y_lower; 5449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate weight NORTH-SOUTH 5469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_vu = spu_splats( next_src_vu-(float)next_interpl_vu ); 5479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_upper = spu_splats( next_src_y_upper-(float)next_interpl_y_upper ); 5489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_lower = spu_splats( next_src_y_lower-(float)next_interpl_y_lower ); 5499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get next lines 5519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_idx = curr_src_idx^1; 5529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_dst_idx = curr_dst_idx^1; 5539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 4 lines y 5559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx], 5569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_upper*src_linestride_y), 5579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 5589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 5599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 5609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx]+src_dbl_linestride_y, 5619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_lower*src_linestride_y), 5629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 5639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 5649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 5659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines v 5679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall precalc_src_addr_v = src_addr_v+(next_interpl_vu*src_linestride_vu); 5689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_lsoff_v = ((unsigned int)precalc_src_addr_v)&0x0F; 5699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[next_src_idx], 5709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ((unsigned int) precalc_src_addr_v)&0xFFFFFFF0, 5719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu+(next_lsoff_v<<1), 5729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 5739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 5749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines u 5759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall precalc_src_addr_u = src_addr_u+(next_interpl_vu*src_linestride_vu); 5769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_lsoff_u = ((unsigned int)precalc_src_addr_u)&0x0F; 5779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[next_src_idx], 5789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ((unsigned int) precalc_src_addr_u)&0xFFFFFFF0, 5799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu+(next_lsoff_v<<1), 5809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 5819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 5829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 5849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 5859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 5869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 5879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 5889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 5899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 5909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 5919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 5929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 5939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 5949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 5959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 5969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 5979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 5989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 5999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 6009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 6019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( v_plane[curr_src_idx]+curr_lsoff_v, 6029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 6039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 6049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 6059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 6069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 6079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 6089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( u_plane[curr_src_idx]+curr_lsoff_u, 6099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 6109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 6119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 6129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 6139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 6149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 6169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 6179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 6199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 6209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 6219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 6229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 6239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 6259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 6269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 6279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 6289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 6299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 6319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 6329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 6339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 6349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 6359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 6379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 6389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 6399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 6409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 6419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 6429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // update for next cycle 6459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_idx = next_src_idx; 6469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_dst_idx = next_dst_idx; 6479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_upper = next_interpl_y_upper; 6499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = next_interpl_y_lower; 6509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_vu = next_interpl_vu; 6519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper = vf_curr_NSweight_y_upper; 6539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = vf_curr_NSweight_y_lower; 6549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu = vf_next_NSweight_vu; 6559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_upper = next_src_y_upper; 6579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = next_src_y_lower; 6589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_vu = next_src_vu; 6599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_lsoff_v = next_lsoff_v; 6619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_lsoff_u = next_lsoff_u; 6629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 6639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 6679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 6699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 6709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 6719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 6729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 6739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 6749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 6759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 6769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 6779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 6789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 6799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 6809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 6819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 6829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 6839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 6849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( v_plane[curr_src_idx]+curr_lsoff_v, 6859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 6869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 6879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 6889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 6899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 6909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 6919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w8( u_plane[curr_src_idx]+curr_lsoff_u, 6929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 6939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 6949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 6959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 6969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 6979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 6989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 6999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 7009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 7029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 7039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 7049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 7059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 7069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 7089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 7099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 7109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 7119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 7129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 7149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 7159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 7169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 7179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 7189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 7209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 7219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 7229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 7239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 7249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // wait for completion 7269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 7279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 7289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 7299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 7329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scale_srcw32_dstw16() 7339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 7349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * processes an input image of width 32 7359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scaling is done to a width 16 7369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * yuv2rgb conversion on a width of 16 7379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * result stored in RAM 7389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 7399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw32_dstw16() { 7409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // extract parameters 7419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr = (unsigned char *)parms.dstBuffer; 7429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_width = parms.src_pixel_width; 7449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_height = parms.src_pixel_height; 7459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_width = parms.dst_pixel_width; 7469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_height = parms.dst_pixel_height; 7479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // YVU 7499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_y = src_width; 7509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_y = src_width<<1; 7519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_vu = src_width>>1; 7529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_vu = src_width; 7539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaled YVU 7549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int scaled_src_linestride_y = dst_width; 7559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // ram addresses 7579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_y = parms.y_plane; 7589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_v = parms.v_plane; 7599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_u = parms.u_plane; 7609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_picture_size = dst_width*dst_height; 7629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Sizes for destination 7649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_y = dst_width<<1; 7659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_vu = dst_width>>1; 7669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform address calculation for Y, V and U in main memory with dst_addr as base 7689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_y = dst_addr; 7699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_v = dst_addr + dst_picture_size; 7709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_u = dst_addr_main_memory_v +(dst_picture_size>>2); 7719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate scale factors 7739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_x_scale = spu_splats( (float)src_width/(float)dst_width ); 7749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float y_scale = (float)src_height/(float)dst_height; 7759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // double buffered processing 7779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // buffer switching 7789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_src_idx = 0; 7799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_dst_idx = 0; 7809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_src_idx, next_dst_idx; 7819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines y as output, upper and lowerline 7839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_upper = 0; 7849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_y_upper; 7859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_lower, next_interpl_y_lower; 7869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // only 1 line v/u output, both planes have the same dimension 7879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_vu = 0; 7889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_vu; 7899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // weights, calculated in every loop iteration 7919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_upper = { 0.0f, 0.0f, 0.0f, 0.0f }; 7929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_y_upper; 7939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_lower, vf_next_NSweight_y_lower; 7949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_vu = { 0.0f, 0.0f, 0.0f, 0.0f }; 7959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_vu; 7969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 7979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the src picture 7989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_upper = 0.0f, next_src_y_upper; 7999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_lower, next_src_y_lower; 8009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_vu = 0.0f, next_src_vu; 8019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the dst picture 8039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_y=0, dst_vu=0; 8049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate lower line idices 8069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = ((float)curr_interpl_y_upper+1)*y_scale; 8079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = (unsigned int)curr_src_y_lower; 8089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower line weight 8099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = spu_splats( curr_src_y_lower-(float)curr_interpl_y_lower ); 8109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // start partially double buffered processing 8139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get initial data, 2 sets of y, 1 set v, 1 set u 8149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx], (unsigned int) src_addr_y, src_dbl_linestride_y, RETR_BUF, 0, 0 ); 8159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx]+src_dbl_linestride_y, 8169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(curr_interpl_y_lower*src_linestride_y), 8179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 8189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF, 8199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 8209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[curr_src_idx], (unsigned int) src_addr_v, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 8219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[curr_src_idx], (unsigned int) src_addr_u, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 8229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // iteration loop 8249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // within each iteration 4 lines y, 2 lines v, 2 lines u are retrieved 8259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // the scaled output is 2 lines y, 1 line v, 1 line u 8269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // the yuv2rgb-converted output is stored to RAM 8279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for( dst_vu=0; dst_vu<(dst_height>>1)-1; dst_vu++ ) { 8289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_y = dst_vu<<1; 8299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate next indices 8319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_vu = ((float)dst_vu+1)*y_scale; 8329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_upper = ((float)dst_y+2)*y_scale; 8339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_lower = ((float)dst_y+3)*y_scale; 8349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_vu = (unsigned int) next_src_vu; 8369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_upper = (unsigned int) next_src_y_upper; 8379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_lower = (unsigned int) next_src_y_lower; 8389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate weight NORTH-SOUTH 8409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_vu = spu_splats( next_src_vu-(float)next_interpl_vu ); 8419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_upper = spu_splats( next_src_y_upper-(float)next_interpl_y_upper ); 8429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_lower = spu_splats( next_src_y_lower-(float)next_interpl_y_lower ); 8439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get next lines 8459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_idx = curr_src_idx^1; 8469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_dst_idx = curr_dst_idx^1; 8479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 4 lines y 8499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx], 8509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_upper*src_linestride_y), 8519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 8529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 8539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 8549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx]+src_dbl_linestride_y, 8559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_lower*src_linestride_y), 8569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 8579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 8589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 8599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines v 8619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[next_src_idx], 8629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_v+(next_interpl_vu*src_linestride_vu), 8639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu, 8649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 8659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 8669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines u 8679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[next_src_idx], 8689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_u+(next_interpl_vu*src_linestride_vu), 8699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu, 8709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 8719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 8729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 8749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 8759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 8769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 8779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 8789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 8799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 8809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 8819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 8829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 8839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 8849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 8859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 8869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 8879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 8889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 8899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 8909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 8919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( v_plane[curr_src_idx], 8929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 8939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 8949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 8959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 8969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 8979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 8989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( u_plane[curr_src_idx], 8999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 9009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 9019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 9029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 9039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 9049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 9069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 9079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 9099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 9109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 9119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 9129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 9139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 9159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 9169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 9179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 9189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 9199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 9219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 9229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 9239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 9249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 9259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 9279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 9289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 9299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 9309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 9319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 9329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // update for next cycle 9359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_idx = next_src_idx; 9369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_dst_idx = next_dst_idx; 9379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_upper = next_interpl_y_upper; 9399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = next_interpl_y_lower; 9409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_vu = next_interpl_vu; 9419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper = vf_curr_NSweight_y_upper; 9439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = vf_curr_NSweight_y_lower; 9449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu = vf_next_NSweight_vu; 9459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_upper = next_src_y_upper; 9479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = next_src_y_lower; 9489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_vu = next_src_vu; 9499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 9509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 9549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 9569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 9579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 9589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 9599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 9609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 9619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 9629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 9639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 9649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 9659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 9669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 9679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 9689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 9699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 9709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 9719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( v_plane[curr_src_idx], 9729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 9739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 9749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 9759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 9769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 9779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 9789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( u_plane[curr_src_idx], 9799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 9809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 9819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 9829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 9839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 9849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 9879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 9889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 9909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 9919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 9929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 9939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 9949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 9959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 9969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 9979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 9989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 9999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 10009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 10029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 10039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 10049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 10059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 10069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 10089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 10099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 10109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 10119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 10129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // wait for completion 10149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 10159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 10169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 10179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/** 10209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scale_srcw32_dstw32() 10219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 10229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * processes an input image of width 32 10239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scaling is done to a width 32 10249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * yuv2rgb conversion on a width of 32 10259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * result stored in RAM 10269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 10279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid scale_srcw32_dstw32() { 10289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // extract parameters 10299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr = (unsigned char *)parms.dstBuffer; 10309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_width = parms.src_pixel_width; 10329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_height = parms.src_pixel_height; 10339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_width = parms.dst_pixel_width; 10349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_height = parms.dst_pixel_height; 10359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // YVU 10379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_y = src_width; 10389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_y = src_width<<1; 10399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_linestride_vu = src_width>>1; 10409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int src_dbl_linestride_vu = src_width; 10419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaled YVU 10439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int scaled_src_linestride_y = dst_width; 10449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // ram addresses 10469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_y = parms.y_plane; 10479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_v = parms.v_plane; 10489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* src_addr_u = parms.u_plane; 10499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_picture_size = dst_width*dst_height; 10519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Sizes for destination 10539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_y = dst_width<<1; 10549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_dbl_linestride_vu = dst_width>>1; 10559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform address calculation for Y, V and U in main memory with dst_addr as base 10579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_y = dst_addr; 10589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_v = dst_addr + dst_picture_size; 10599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst_addr_main_memory_u = dst_addr_main_memory_v +(dst_picture_size>>2); 10609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate scale factors 10629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_x_scale = spu_splats( (float)src_width/(float)dst_width ); 10639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float y_scale = (float)src_height/(float)dst_height; 10649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // double buffered processing 10669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // buffer switching 10679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_src_idx = 0; 10689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_dst_idx = 0; 10699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_src_idx, next_dst_idx; 10709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines y as output, upper and lowerline 10729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_upper = 0; 10739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_y_upper; 10749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_y_lower, next_interpl_y_lower; 10759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // only 1 line v/u output, both planes have the same dimension 10769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int curr_interpl_vu = 0; 10779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int next_interpl_vu; 10789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // weights, calculated in every loop iteration 10809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_upper = { 0.0f, 0.0f, 0.0f, 0.0f }; 10819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_y_upper; 10829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_y_lower, vf_next_NSweight_y_lower; 10839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_curr_NSweight_vu = { 0.0f, 0.0f, 0.0f, 0.0f }; 10849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_next_NSweight_vu; 10859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the src picture 10879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_upper = 0.0f, next_src_y_upper; 10889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_y_lower, next_src_y_lower; 10899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall float curr_src_vu = 0.0f, next_src_vu; 10909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // line indices for the dst picture 10929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_y=0, dst_vu=0; 10939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 10949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate lower line idices 10959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = ((float)curr_interpl_y_upper+1)*y_scale; 10969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = (unsigned int)curr_src_y_lower; 10979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower line weight 10989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = spu_splats( curr_src_y_lower-(float)curr_interpl_y_lower ); 10999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // start partially double buffered processing 11029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get initial data, 2 sets of y, 1 set v, 1 set u 11039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx], (unsigned int) src_addr_y, src_dbl_linestride_y, RETR_BUF, 0, 0 ); 11049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[curr_src_idx]+src_dbl_linestride_y, 11059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(curr_interpl_y_lower*src_linestride_y), 11069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 11079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF, 11089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 11099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[curr_src_idx], (unsigned int) src_addr_v, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 11109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[curr_src_idx], (unsigned int) src_addr_u, src_dbl_linestride_vu, RETR_BUF, 0, 0 ); 11119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // iteration loop 11139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // within each iteration 4 lines y, 2 lines v, 2 lines u are retrieved 11149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // the scaled output is 2 lines y, 1 line v, 1 line u 11159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // the yuv2rgb-converted output is stored to RAM 11169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for( dst_vu=0; dst_vu<(dst_height>>1)-1; dst_vu++ ) { 11179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_y = dst_vu<<1; 11189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate next indices 11209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_vu = ((float)dst_vu+1)*y_scale; 11219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_upper = ((float)dst_y+2)*y_scale; 11229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_y_lower = ((float)dst_y+3)*y_scale; 11239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_vu = (unsigned int) next_src_vu; 11259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_upper = (unsigned int) next_src_y_upper; 11269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_interpl_y_lower = (unsigned int) next_src_y_lower; 11279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate weight NORTH-SOUTH 11299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_vu = spu_splats( next_src_vu-(float)next_interpl_vu ); 11309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_upper = spu_splats( next_src_y_upper-(float)next_interpl_y_upper ); 11319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_next_NSweight_y_lower = spu_splats( next_src_y_lower-(float)next_interpl_y_lower ); 11329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get next lines 11349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_src_idx = curr_src_idx^1; 11359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall next_dst_idx = curr_dst_idx^1; 11369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 4 lines y 11389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx], 11399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_upper*src_linestride_y), 11409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 11419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 11429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 11439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( y_plane[next_src_idx]+src_dbl_linestride_y, 11449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_y+(next_interpl_y_lower*src_linestride_y), 11459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_y, 11469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 11479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 11489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines v 11509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( v_plane[next_src_idx], 11519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_v+(next_interpl_vu*src_linestride_vu), 11529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu, 11539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 11549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 11559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 2 lines u 11569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_get( u_plane[next_src_idx], 11579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) src_addr_u+(next_interpl_vu*src_linestride_vu), 11589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_dbl_linestride_vu, 11599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall RETR_BUF+next_src_idx, 11609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 11619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 11639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 11659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 11669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 11679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 11689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 11699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 11709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 11719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 11729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 11739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 11749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 11759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 11769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 11779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 11789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 11799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 11809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( v_plane[curr_src_idx], 11819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 11829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 11839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 11849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 11859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 11869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 11879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( u_plane[curr_src_idx], 11889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 11899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 11909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 11919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 11929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 11939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 11969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Store the result back to main memory into a destination buffer in YUV format 11979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 11989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 11999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 12019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 12029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 12039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 12049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 12059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 12079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 12089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 12099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 12109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 12119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 12139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 12149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 12159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 12169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 12179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 12199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 12209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 12219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 12229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 12239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 12249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // update for next cycle 12279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_idx = next_src_idx; 12289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_dst_idx = next_dst_idx; 12299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_upper = next_interpl_y_upper; 12319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_y_lower = next_interpl_y_lower; 12329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_interpl_vu = next_interpl_vu; 12339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper = vf_curr_NSweight_y_upper; 12359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower = vf_curr_NSweight_y_lower; 12369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu = vf_next_NSweight_vu; 12379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_upper = next_src_y_upper; 12399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_y_lower = next_src_y_lower; 12409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall curr_src_vu = next_src_vu; 12419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 12429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (RETR_BUF+curr_src_idx) ); 12469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scaling 12489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_upper 12499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx], 12509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx], 12519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 12529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 12539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_upper, 12549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 12559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line y_lower 12569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( y_plane[curr_src_idx]+src_dbl_linestride_y, 12579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_y_plane[curr_src_idx]+scaled_src_linestride_y, 12589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width, 12599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 12609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_y_lower, 12619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_y ); 12629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line v 12639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( v_plane[curr_src_idx], 12649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_v_plane[curr_src_idx], 12659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 12669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 12679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 12689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 12699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // work line u 12709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall bilinear_scale_line_w16( u_plane[curr_src_idx], 12719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall scaled_u_plane[curr_src_idx], 12729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_width>>1, 12739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_x_scale, 12749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_curr_NSweight_vu, 12759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall src_linestride_vu ); 12769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Store the result back to main memory into a destination buffer in YUV format 12799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 12809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 12819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // Perform three DMA transfers to 3 different locations in the main memory! 12839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_width: Pixel width of destination image 12849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_addr: Destination address in main memory 12859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_vu: Counter which is incremented one by one 12869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // dst_y: Counter which is twice larger than dst_vu (dst_y = 2*dst_vu) 12879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_y_plane[curr_src_idx], // What from local store (addr) 12899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_y + (dst_vu*dst_dbl_linestride_y), // Destination in main memory (addr) 12909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_y, // Two Y lines (depending on the widht of the destination resolution) 12919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 12929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 12939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 12949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_v_plane[curr_src_idx], // What from local store (addr) 12959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_v + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 12969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two V lines (depending on the widht of the destination resolution) 12979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 12989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 12999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall mfc_put( scaled_u_plane[curr_src_idx], // What from local store (addr) 13019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (unsigned int) dst_addr_main_memory_u + (dst_vu*dst_dbl_linestride_vu), // Destination in main memory (addr) 13029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst_dbl_linestride_vu, // Two U lines (depending on the widht of the destination resolution) 13039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall STR_BUF+curr_dst_idx, // Tag 13049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0, 0 ); 13059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // wait for completion 13079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall DMA_WAIT_TAG( (STR_BUF+curr_dst_idx) ); 13089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //--------------------------------------------------------------------------------------------- 13099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 13109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 13139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * bilinear_scale_line_w8() 13149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 13159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * processes a line of yuv-input, width has to be a multiple of 8 13169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scaled yuv-output is written to local store buffer 13179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 13189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param src buffer for 2 lines input 13199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param dst_ buffer for 1 line output 13209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param dst_width the width of the destination line 13219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param vf_x_scale a float vector, at each entry is the x_scale-factor 13229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param vf_NSweight a float vector, at each position is the weight NORTH/SOUTH for the current line 13239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param src_linestride the stride of the srcline 13249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 13259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid bilinear_scale_line_w8( unsigned char* src, unsigned char* dst_, unsigned int dst_width, vector float vf_x_scale, vector float vf_NSweight, unsigned int src_linestride ) { 13269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst = dst_; 13289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_x; 13309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for( dst_x=0; dst_x<dst_width; dst_x+=8) { 13319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // address calculation for loading the 4 surrounding pixel of each calculated 13329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // destination pixel 13339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_tmp = spu_splats( dst_x ); 13349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower range->first 4 pixel 13359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // upper range->next 4 pixel 13369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_inc_dst_x_lower_range = { 0, 1, 2, 3 }; 13379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_inc_dst_x_upper_range = { 4, 5, 6, 7 }; 13389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_lower_range = spu_add( vui_dst_x_tmp, vui_inc_dst_x_lower_range ); 13399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_upper_range = spu_add( vui_dst_x_tmp, vui_inc_dst_x_upper_range ); 13409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate weight EAST-WEST 13429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_dst_x_lower_range = spu_convtf( vui_dst_x_lower_range, 0 ); 13439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_dst_x_upper_range = spu_convtf( vui_dst_x_upper_range, 0 ); 13449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_src_x_lower_range = spu_mul( vf_dst_x_lower_range, vf_x_scale ); 13459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_src_x_upper_range = spu_mul( vf_dst_x_upper_range, vf_x_scale ); 13469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_interpl_x_lower_range = spu_convtu( vf_src_x_lower_range, 0 ); 13479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_interpl_x_upper_range = spu_convtu( vf_src_x_upper_range, 0 ); 13489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_interpl_x_lower_range = spu_convtf( vui_interpl_x_lower_range, 0 ); 13499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_interpl_x_upper_range = spu_convtf( vui_interpl_x_upper_range, 0 ); 13509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWweight_lower_range = spu_sub( vf_src_x_lower_range, vf_interpl_x_lower_range ); 13519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWweight_upper_range = spu_sub( vf_src_x_upper_range, vf_interpl_x_upper_range ); 13529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate address offset 13549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 13559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // pixel NORTH WEST 13569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNW_lower_range = vui_interpl_x_lower_range; 13579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNW_upper_range = vui_interpl_x_upper_range; 13589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // pixel NORTH EAST-->(offpixelNW+1) 13609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_add_1 = { 1, 1, 1, 1 }; 13619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNE_lower_range = spu_add( vui_off_pixelNW_lower_range, vui_add_1 ); 13629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNE_upper_range = spu_add( vui_off_pixelNW_upper_range, vui_add_1 ); 13639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // SOUTH-WEST-->(offpixelNW+src_linestride) 13659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_srclinestride = spu_splats( src_linestride ); 13669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSW_lower_range = spu_add( vui_srclinestride, vui_off_pixelNW_lower_range ); 13679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSW_upper_range = spu_add( vui_srclinestride, vui_off_pixelNW_upper_range ); 13689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // SOUTH-EAST-->(offpixelNW+src_linestride+1) 13709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSE_lower_range = spu_add( vui_srclinestride, vui_off_pixelNE_lower_range ); 13719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSE_upper_range = spu_add( vui_srclinestride, vui_off_pixelNE_upper_range ); 13729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate each address 13749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_src_ls = spu_splats( (unsigned int) src ); 13759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNW_lower_range = spu_add( vui_src_ls, vui_off_pixelNW_lower_range ); 13769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNW_upper_range = spu_add( vui_src_ls, vui_off_pixelNW_upper_range ); 13779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNE_lower_range = spu_add( vui_src_ls, vui_off_pixelNE_lower_range ); 13789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNE_upper_range = spu_add( vui_src_ls, vui_off_pixelNE_upper_range ); 13799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSW_lower_range = spu_add( vui_src_ls, vui_off_pixelSW_lower_range ); 13819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSW_upper_range = spu_add( vui_src_ls, vui_off_pixelSW_upper_range ); 13829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSE_lower_range = spu_add( vui_src_ls, vui_off_pixelSE_lower_range ); 13839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSE_upper_range = spu_add( vui_src_ls, vui_off_pixelSE_upper_range ); 13849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 13859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get each pixel 13869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 13879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scalar load, afterwards insertion into the right position 13889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // NORTH WEST 13899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char null_vector = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 13909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NW_lower_range = spu_insert( 13919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_lower_range, 0 )), null_vector, 3 ); 13929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_lower_range = spu_insert( 13939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_lower_range, 1 )), 13949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_lower_range, 7 ); 13959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_lower_range = spu_insert( 13969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_lower_range, 2 )), 13979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_lower_range, 11 ); 13989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_lower_range = spu_insert( 13999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_lower_range, 3 )), 14009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_lower_range, 15 ); 14019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NW_upper_range = spu_insert( 14039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_upper_range, 0 )), null_vector, 3 ); 14049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_upper_range = spu_insert( 14059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_upper_range, 1 )), 14069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_upper_range, 7 ); 14079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_upper_range = spu_insert( 14089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_upper_range, 2 )), 14099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_upper_range, 11 ); 14109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_upper_range = spu_insert( 14119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_upper_range, 3 )), 14129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_upper_range, 15 ); 14139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // NORTH EAST 14159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NE_lower_range = spu_insert( 14169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_lower_range, 0 )), null_vector, 3 ); 14179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_lower_range = spu_insert( 14189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_lower_range, 1 )), 14199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_lower_range, 7 ); 14209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_lower_range = spu_insert( 14219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_lower_range, 2 )), 14229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_lower_range, 11 ); 14239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_lower_range = spu_insert( 14249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_lower_range, 3 )), 14259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_lower_range, 15 ); 14269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NE_upper_range = spu_insert( 14289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_upper_range, 0 )), null_vector, 3 ); 14299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_upper_range = spu_insert( 14309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_upper_range, 1 )), 14319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_upper_range, 7 ); 14329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_upper_range = spu_insert( 14339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_upper_range, 2 )), 14349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_upper_range, 11 ); 14359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_upper_range = spu_insert( 14369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_upper_range, 3 )), 14379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_upper_range, 15 ); 14389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // SOUTH WEST 14419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SW_lower_range = spu_insert( 14429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_lower_range, 0 )), null_vector, 3 ); 14439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_lower_range = spu_insert( 14449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_lower_range, 1 )), 14459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_lower_range, 7 ); 14469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_lower_range = spu_insert( 14479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_lower_range, 2 )), 14489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_lower_range, 11 ); 14499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_lower_range = spu_insert( 14509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_lower_range, 3 )), 14519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_lower_range, 15 ); 14529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SW_upper_range = spu_insert( 14549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_upper_range, 0 )), null_vector, 3 ); 14559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_upper_range = spu_insert( 14569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_upper_range, 1 )), 14579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_upper_range, 7 ); 14589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_upper_range = spu_insert( 14599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_upper_range, 2 )), 14609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_upper_range, 11 ); 14619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_upper_range = spu_insert( 14629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_upper_range, 3 )), 14639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_upper_range, 15 ); 14649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // SOUTH EAST 14669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SE_lower_range = spu_insert( 14679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_lower_range, 0 )), null_vector, 3 ); 14689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_lower_range = spu_insert( 14699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_lower_range, 1 )), 14709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_lower_range, 7 ); 14719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_lower_range = spu_insert( 14729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_lower_range, 2 )), 14739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_lower_range, 11 ); 14749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_lower_range = spu_insert( 14759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_lower_range, 3 )), 14769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_lower_range, 15 ); 14779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SE_upper_range = spu_insert( 14799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_upper_range, 0 )), null_vector, 3 ); 14809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_upper_range = spu_insert( 14819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_upper_range, 1 )), 14829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_upper_range, 7 ); 14839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_upper_range = spu_insert( 14849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_upper_range, 2 )), 14859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_upper_range, 11 ); 14869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_upper_range = spu_insert( 14879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_upper_range, 3 )), 14889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_upper_range, 15 ); 14899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // convert to float 14929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NW_lower_range = spu_convtf( (vector unsigned int) vuc_pixel_NW_lower_range, 0 ); 14939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NW_upper_range = spu_convtf( (vector unsigned int) vuc_pixel_NW_upper_range, 0 ); 14949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SW_lower_range = spu_convtf( (vector unsigned int) vuc_pixel_SW_lower_range, 0 ); 14969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SW_upper_range = spu_convtf( (vector unsigned int) vuc_pixel_SW_upper_range, 0 ); 14979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 14989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NE_lower_range = spu_convtf( (vector unsigned int) vuc_pixel_NE_lower_range, 0 ); 14999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NE_upper_range = spu_convtf( (vector unsigned int) vuc_pixel_NE_upper_range, 0 ); 15009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SE_lower_range = spu_convtf( (vector unsigned int) vuc_pixel_SE_lower_range, 0 ); 15029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SE_upper_range = spu_convtf( (vector unsigned int) vuc_pixel_SE_upper_range, 0 ); 15039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first linear interpolation: EWtop 15079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // EWtop = NW + EWweight*(NE-NW) 15089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 15099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower range 15109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_lower_range_tmp = spu_sub( vf_pixel_NE_lower_range, vf_pixel_NW_lower_range ); 15119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_lower_range = spu_madd( vf_EWweight_lower_range, 15129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_lower_range_tmp, 15139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_NW_lower_range ); 15149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // upper range 15169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_upper_range_tmp = spu_sub( vf_pixel_NE_upper_range, vf_pixel_NW_upper_range ); 15179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_upper_range = spu_madd( vf_EWweight_upper_range, 15189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_upper_range_tmp, 15199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_NW_upper_range ); 15209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second linear interpolation: EWbottom 15249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // EWbottom = SW + EWweight*(SE-SW) 15259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 15269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower range 15279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_lower_range_tmp = spu_sub( vf_pixel_SE_lower_range, vf_pixel_SW_lower_range ); 15289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_lower_range = spu_madd( vf_EWweight_lower_range, 15299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWbottom_lower_range_tmp, 15309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_SW_lower_range ); 15319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // upper range 15339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_upper_range_tmp = spu_sub( vf_pixel_SE_upper_range, vf_pixel_SW_upper_range ); 15349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_upper_range = spu_madd( vf_EWweight_upper_range, 15359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWbottom_upper_range_tmp, 15369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_SW_upper_range ); 15379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third linear interpolation: the bilinear interpolated value 15419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // result = EWtop + NSweight*(EWbottom-EWtop); 15429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 15439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // lower range 15449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_lower_range_tmp = spu_sub( vf_EWbottom_lower_range, vf_EWtop_lower_range ); 15459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_lower_range = spu_madd( vf_NSweight, 15469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_result_lower_range_tmp, 15479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_lower_range ); 15489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // upper range 15509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_upper_range_tmp = spu_sub( vf_EWbottom_upper_range, vf_EWtop_upper_range ); 15519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_upper_range = spu_madd( vf_NSweight, 15529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_result_upper_range_tmp, 15539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_upper_range ); 15549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // convert back: using saturated arithmetic 15579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_result_lower_range = vfloat_to_vuint( vf_result_lower_range ); 15589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_result_upper_range = vfloat_to_vuint( vf_result_upper_range ); 15599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // merge results->lower,upper 15619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_mask_merge_result = { 0x03, 0x07, 0x0B, 0x0F, 15629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x13, 0x17, 0x1B, 0x1F, 15639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x00, 0x00, 0x00, 0x00, 15649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x00, 0x00, 0x00, 0x00 }; 15659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_result = spu_shuffle( (vector unsigned char) vui_result_lower_range, 15679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (vector unsigned char) vui_result_upper_range, 15689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_mask_merge_result ); 15699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // partial storing 15719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_mask_out = { 0x00, 0x00, 0x00, 0x00, 15729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x00, 0x00, 0x00, 0x00, 15739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0xFF, 0xFF, 0xFF, 0xFF, 15749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0xFF, 0xFF, 0xFF, 0xFF }; 15759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get currently stored data 15789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_orig = *((vector unsigned char*)dst); 15799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // clear currently stored data 15819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_orig = spu_and( vuc_orig, 15829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall spu_rlqwbyte( vuc_mask_out, ((unsigned int)dst)&0x0F) ); 15839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // rotate result according to storing address 15859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_result = spu_rlqwbyte( vuc_result, ((unsigned int)dst)&0x0F ); 15869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // store result 15889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((vector unsigned char*)dst) = spu_or( vuc_result, 15899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_orig ); 15909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst += 8; 15919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 15929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 15939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 15959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/* 15969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * bilinear_scale_line_w16() 15979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 15989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * processes a line of yuv-input, width has to be a multiple of 16 15999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * scaled yuv-output is written to local store buffer 16009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * 16019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param src buffer for 2 lines input 16029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param dst_ buffer for 1 line output 16039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param dst_width the width of the destination line 16049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param vf_x_scale a float vector, at each entry is the x_scale-factor 16059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param vf_NSweight a float vector, at each position is the weight NORTH/SOUTH for the current line 16069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall * @param src_linestride the stride of the srcline 16079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */ 16089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid bilinear_scale_line_w16( unsigned char* src, unsigned char* dst_, unsigned int dst_width, vector float vf_x_scale, vector float vf_NSweight, unsigned int src_linestride ) { 16099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned char* dst = dst_; 16119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall unsigned int dst_x; 16139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall for( dst_x=0; dst_x<dst_width; dst_x+=16) { 16149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // address calculation for loading the 4 surrounding pixel of each calculated 16159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // destination pixel 16169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_tmp = spu_splats( dst_x ); 16179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // parallelised processing 16189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range->pixel 1 2 3 4 16199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range->pixel 5 6 7 8 16209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third range->pixel 9 10 11 12 16219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // fourth range->pixel 13 14 15 16 16229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_inc_dst_x_first_range = { 0, 1, 2, 3 }; 16239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_inc_dst_x_second_range = { 4, 5, 6, 7 }; 16249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_inc_dst_x_third_range = { 8, 9, 10, 11 }; 16259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_inc_dst_x_fourth_range = { 12, 13, 14, 15 }; 16269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_first_range = spu_add( vui_dst_x_tmp, vui_inc_dst_x_first_range ); 16279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_second_range = spu_add( vui_dst_x_tmp, vui_inc_dst_x_second_range ); 16289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_third_range = spu_add( vui_dst_x_tmp, vui_inc_dst_x_third_range ); 16299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_dst_x_fourth_range = spu_add( vui_dst_x_tmp, vui_inc_dst_x_fourth_range ); 16309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate weight EAST-WEST 16329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_dst_x_first_range = spu_convtf( vui_dst_x_first_range, 0 ); 16339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_dst_x_second_range = spu_convtf( vui_dst_x_second_range, 0 ); 16349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_dst_x_third_range = spu_convtf( vui_dst_x_third_range, 0 ); 16359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_dst_x_fourth_range = spu_convtf( vui_dst_x_fourth_range, 0 ); 16369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_src_x_first_range = spu_mul( vf_dst_x_first_range, vf_x_scale ); 16379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_src_x_second_range = spu_mul( vf_dst_x_second_range, vf_x_scale ); 16389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_src_x_third_range = spu_mul( vf_dst_x_third_range, vf_x_scale ); 16399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_src_x_fourth_range = spu_mul( vf_dst_x_fourth_range, vf_x_scale ); 16409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_interpl_x_first_range = spu_convtu( vf_src_x_first_range, 0 ); 16419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_interpl_x_second_range = spu_convtu( vf_src_x_second_range, 0 ); 16429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_interpl_x_third_range = spu_convtu( vf_src_x_third_range, 0 ); 16439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_interpl_x_fourth_range = spu_convtu( vf_src_x_fourth_range, 0 ); 16449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_interpl_x_first_range = spu_convtf( vui_interpl_x_first_range, 0 ); 16459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_interpl_x_second_range = spu_convtf( vui_interpl_x_second_range, 0 ); 16469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_interpl_x_third_range = spu_convtf( vui_interpl_x_third_range, 0 ); 16479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_interpl_x_fourth_range = spu_convtf( vui_interpl_x_fourth_range, 0 ); 16489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWweight_first_range = spu_sub( vf_src_x_first_range, vf_interpl_x_first_range ); 16499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWweight_second_range = spu_sub( vf_src_x_second_range, vf_interpl_x_second_range ); 16509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWweight_third_range = spu_sub( vf_src_x_third_range, vf_interpl_x_third_range ); 16519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWweight_fourth_range = spu_sub( vf_src_x_fourth_range, vf_interpl_x_fourth_range ); 16529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate address offset 16549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 16559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // pixel NORTH WEST 16569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNW_first_range = vui_interpl_x_first_range; 16579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNW_second_range = vui_interpl_x_second_range; 16589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNW_third_range = vui_interpl_x_third_range; 16599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNW_fourth_range = vui_interpl_x_fourth_range; 16609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // pixel NORTH EAST-->(offpixelNW+1) 16629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_add_1 = { 1, 1, 1, 1 }; 16639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNE_first_range = spu_add( vui_off_pixelNW_first_range, vui_add_1 ); 16649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNE_second_range = spu_add( vui_off_pixelNW_second_range, vui_add_1 ); 16659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNE_third_range = spu_add( vui_off_pixelNW_third_range, vui_add_1 ); 16669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelNE_fourth_range = spu_add( vui_off_pixelNW_fourth_range, vui_add_1 ); 16679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // SOUTH-WEST-->(offpixelNW+src_linestride) 16699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_srclinestride = spu_splats( src_linestride ); 16709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSW_first_range = spu_add( vui_srclinestride, vui_off_pixelNW_first_range ); 16719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSW_second_range = spu_add( vui_srclinestride, vui_off_pixelNW_second_range ); 16729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSW_third_range = spu_add( vui_srclinestride, vui_off_pixelNW_third_range ); 16739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSW_fourth_range = spu_add( vui_srclinestride, vui_off_pixelNW_fourth_range ); 16749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // SOUTH-EAST-->(offpixelNW+src_linestride+1) 16769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSE_first_range = spu_add( vui_srclinestride, vui_off_pixelNE_first_range ); 16779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSE_second_range = spu_add( vui_srclinestride, vui_off_pixelNE_second_range ); 16789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSE_third_range = spu_add( vui_srclinestride, vui_off_pixelNE_third_range ); 16799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_off_pixelSE_fourth_range = spu_add( vui_srclinestride, vui_off_pixelNE_fourth_range ); 16809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // calculate each address 16829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_src_ls = spu_splats( (unsigned int) src ); 16839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNW_first_range = spu_add( vui_src_ls, vui_off_pixelNW_first_range ); 16849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNW_second_range = spu_add( vui_src_ls, vui_off_pixelNW_second_range ); 16859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNW_third_range = spu_add( vui_src_ls, vui_off_pixelNW_third_range ); 16869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNW_fourth_range = spu_add( vui_src_ls, vui_off_pixelNW_fourth_range ); 16879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNE_first_range = spu_add( vui_src_ls, vui_off_pixelNE_first_range ); 16899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNE_second_range = spu_add( vui_src_ls, vui_off_pixelNE_second_range ); 16909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNE_third_range = spu_add( vui_src_ls, vui_off_pixelNE_third_range ); 16919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelNE_fourth_range = spu_add( vui_src_ls, vui_off_pixelNE_fourth_range ); 16929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSW_first_range = spu_add( vui_src_ls, vui_off_pixelSW_first_range ); 16949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSW_second_range = spu_add( vui_src_ls, vui_off_pixelSW_second_range ); 16959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSW_third_range = spu_add( vui_src_ls, vui_off_pixelSW_third_range ); 16969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSW_fourth_range = spu_add( vui_src_ls, vui_off_pixelSW_fourth_range ); 16979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 16989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSE_first_range = spu_add( vui_src_ls, vui_off_pixelSE_first_range ); 16999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSE_second_range = spu_add( vui_src_ls, vui_off_pixelSE_second_range ); 17009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSE_third_range = spu_add( vui_src_ls, vui_off_pixelSE_third_range ); 17019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_addr_pixelSE_fourth_range = spu_add( vui_src_ls, vui_off_pixelSE_fourth_range ); 17029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 17039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 17049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // get each pixel 17059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 17069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // scalar load, afterwards insertion into the right position 17079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // NORTH WEST 17089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 17099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char null_vector = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; 17109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NW_first_range = spu_insert( 17119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_first_range, 0 )), null_vector, 3 ); 17129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_first_range = spu_insert( 17139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_first_range, 1 )), 17149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_first_range, 7 ); 17159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_first_range = spu_insert( 17169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_first_range, 2 )), 17179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_first_range, 11 ); 17189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_first_range = spu_insert( 17199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_first_range, 3 )), 17209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_first_range, 15 ); 17219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range 17229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NW_second_range = spu_insert( 17239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_second_range, 0 )), null_vector, 3 ); 17249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_second_range = spu_insert( 17259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_second_range, 1 )), 17269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_second_range, 7 ); 17279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_second_range = spu_insert( 17289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_second_range, 2 )), 17299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_second_range, 11 ); 17309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_second_range = spu_insert( 17319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_second_range, 3 )), 17329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_second_range, 15 ); 17339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third range 17349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NW_third_range = spu_insert( 17359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_third_range, 0 )), null_vector, 3 ); 17369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_third_range = spu_insert( 17379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_third_range, 1 )), 17389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_third_range, 7 ); 17399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_third_range = spu_insert( 17409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_third_range, 2 )), 17419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_third_range, 11 ); 17429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_third_range = spu_insert( 17439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_third_range, 3 )), 17449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_third_range, 15 ); 17459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // fourth range 17469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NW_fourth_range = spu_insert( 17479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_fourth_range, 0 )), null_vector, 3 ); 17489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_fourth_range = spu_insert( 17499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_fourth_range, 1 )), 17509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_fourth_range, 7 ); 17519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_fourth_range = spu_insert( 17529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_fourth_range, 2 )), 17539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_fourth_range, 11 ); 17549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_fourth_range = spu_insert( 17559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNW_fourth_range, 3 )), 17569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NW_fourth_range, 15 ); 17579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 17589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // NORTH EAST 17599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 17609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NE_first_range = spu_insert( 17619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_first_range, 0 )), null_vector, 3 ); 17629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_first_range = spu_insert( 17639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_first_range, 1 )), 17649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_first_range, 7 ); 17659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_first_range = spu_insert( 17669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_first_range, 2 )), 17679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_first_range, 11 ); 17689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_first_range = spu_insert( 17699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_first_range, 3 )), 17709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_first_range, 15 ); 17719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range 17729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NE_second_range = spu_insert( 17739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_second_range, 0 )), null_vector, 3 ); 17749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_second_range = spu_insert( 17759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_second_range, 1 )), 17769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_second_range, 7 ); 17779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_second_range = spu_insert( 17789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_second_range, 2 )), 17799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_second_range, 11 ); 17809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_second_range = spu_insert( 17819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_second_range, 3 )), 17829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_second_range, 15 ); 17839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third range 17849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NE_third_range = spu_insert( 17859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_third_range, 0 )), null_vector, 3 ); 17869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_third_range = spu_insert( 17879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_third_range, 1 )), 17889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_third_range, 7 ); 17899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_third_range = spu_insert( 17909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_third_range, 2 )), 17919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_third_range, 11 ); 17929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_third_range = spu_insert( 17939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_third_range, 3 )), 17949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_third_range, 15 ); 17959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // fourth range 17969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_NE_fourth_range = spu_insert( 17979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_fourth_range, 0 )), null_vector, 3 ); 17989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_fourth_range = spu_insert( 17999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_fourth_range, 1 )), 18009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_fourth_range, 7 ); 18019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_fourth_range = spu_insert( 18029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_fourth_range, 2 )), 18039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_fourth_range, 11 ); 18049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_fourth_range = spu_insert( 18059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelNE_fourth_range, 3 )), 18069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_NE_fourth_range, 15 ); 18079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 18089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // SOUTH WEST 18099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 18109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SW_first_range = spu_insert( 18119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_first_range, 0 )), null_vector, 3 ); 18129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_first_range = spu_insert( 18139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_first_range, 1 )), 18149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_first_range, 7 ); 18159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_first_range = spu_insert( 18169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_first_range, 2 )), 18179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_first_range, 11 ); 18189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_first_range = spu_insert( 18199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_first_range, 3 )), 18209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_first_range, 15 ); 18219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range 18229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SW_second_range = spu_insert( 18239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_second_range, 0 )), null_vector, 3 ); 18249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_second_range = spu_insert( 18259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_second_range, 1 )), 18269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_second_range, 7 ); 18279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_second_range = spu_insert( 18289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_second_range, 2 )), 18299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_second_range, 11 ); 18309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_second_range = spu_insert( 18319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_second_range, 3 )), 18329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_second_range, 15 ); 18339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third range 18349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SW_third_range = spu_insert( 18359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_third_range, 0 )), null_vector, 3 ); 18369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_third_range = spu_insert( 18379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_third_range, 1 )), 18389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_third_range, 7 ); 18399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_third_range = spu_insert( 18409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_third_range, 2 )), 18419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_third_range, 11 ); 18429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_third_range = spu_insert( 18439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_third_range, 3 )), 18449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_third_range, 15 ); 18459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // fourth range 18469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SW_fourth_range = spu_insert( 18479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_fourth_range, 0 )), null_vector, 3 ); 18489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_fourth_range = spu_insert( 18499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_fourth_range, 1 )), 18509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_fourth_range, 7 ); 18519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_fourth_range = spu_insert( 18529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_fourth_range, 2 )), 18539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_fourth_range, 11 ); 18549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_fourth_range = spu_insert( 18559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSW_fourth_range, 3 )), 18569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SW_fourth_range, 15 ); 18579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 18589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // NORTH EAST 18599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 18609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SE_first_range = spu_insert( 18619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_first_range, 0 )), null_vector, 3 ); 18629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_first_range = spu_insert( 18639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_first_range, 1 )), 18649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_first_range, 7 ); 18659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_first_range = spu_insert( 18669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_first_range, 2 )), 18679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_first_range, 11 ); 18689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_first_range = spu_insert( 18699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_first_range, 3 )), 18709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_first_range, 15 ); 18719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range 18729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SE_second_range = spu_insert( 18739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_second_range, 0 )), null_vector, 3 ); 18749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_second_range = spu_insert( 18759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_second_range, 1 )), 18769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_second_range, 7 ); 18779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_second_range = spu_insert( 18789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_second_range, 2 )), 18799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_second_range, 11 ); 18809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_second_range = spu_insert( 18819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_second_range, 3 )), 18829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_second_range, 15 ); 18839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third range 18849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SE_third_range = spu_insert( 18859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_third_range, 0 )), null_vector, 3 ); 18869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_third_range = spu_insert( 18879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_third_range, 1 )), 18889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_third_range, 7 ); 18899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_third_range = spu_insert( 18909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_third_range, 2 )), 18919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_third_range, 11 ); 18929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_third_range = spu_insert( 18939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_third_range, 3 )), 18949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_third_range, 15 ); 18959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // fourth range 18969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_pixel_SE_fourth_range = spu_insert( 18979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_fourth_range, 0 )), null_vector, 3 ); 18989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_fourth_range = spu_insert( 18999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_fourth_range, 1 )), 19009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_fourth_range, 7 ); 19019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_fourth_range = spu_insert( 19029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_fourth_range, 2 )), 19039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_fourth_range, 11 ); 19049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_fourth_range = spu_insert( 19059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((unsigned char*) spu_extract( vui_addr_pixelSE_fourth_range, 3 )), 19069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_pixel_SE_fourth_range, 15 ); 19079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // convert to float 19119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NW_first_range = spu_convtf( (vector unsigned int) vuc_pixel_NW_first_range, 0 ); 19129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NW_second_range = spu_convtf( (vector unsigned int) vuc_pixel_NW_second_range, 0 ); 19139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NW_third_range = spu_convtf( (vector unsigned int) vuc_pixel_NW_third_range, 0 ); 19149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NW_fourth_range = spu_convtf( (vector unsigned int) vuc_pixel_NW_fourth_range, 0 ); 19159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NE_first_range = spu_convtf( (vector unsigned int) vuc_pixel_NE_first_range, 0 ); 19179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NE_second_range = spu_convtf( (vector unsigned int) vuc_pixel_NE_second_range, 0 ); 19189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NE_third_range = spu_convtf( (vector unsigned int) vuc_pixel_NE_third_range, 0 ); 19199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_NE_fourth_range = spu_convtf( (vector unsigned int) vuc_pixel_NE_fourth_range, 0 ); 19209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SW_first_range = spu_convtf( (vector unsigned int) vuc_pixel_SW_first_range, 0 ); 19229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SW_second_range = spu_convtf( (vector unsigned int) vuc_pixel_SW_second_range, 0 ); 19239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SW_third_range = spu_convtf( (vector unsigned int) vuc_pixel_SW_third_range, 0 ); 19249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SW_fourth_range = spu_convtf( (vector unsigned int) vuc_pixel_SW_fourth_range, 0 ); 19259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SE_first_range = spu_convtf( (vector unsigned int) vuc_pixel_SE_first_range, 0 ); 19279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SE_second_range = spu_convtf( (vector unsigned int) vuc_pixel_SE_second_range, 0 ); 19289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SE_third_range = spu_convtf( (vector unsigned int) vuc_pixel_SE_third_range, 0 ); 19299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_pixel_SE_fourth_range = spu_convtf( (vector unsigned int) vuc_pixel_SE_fourth_range, 0 ); 19309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first linear interpolation: EWtop 19329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // EWtop = NW + EWweight*(NE-NW) 19339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 19349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 19359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_first_range_tmp = spu_sub( vf_pixel_NE_first_range, vf_pixel_NW_first_range ); 19369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_first_range = spu_madd( vf_EWweight_first_range, 19379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_first_range_tmp, 19389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_NW_first_range ); 19399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range 19419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_second_range_tmp = spu_sub( vf_pixel_NE_second_range, vf_pixel_NW_second_range ); 19429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_second_range = spu_madd( vf_EWweight_second_range, 19439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_second_range_tmp, 19449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_NW_second_range ); 19459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third range 19479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_third_range_tmp = spu_sub( vf_pixel_NE_third_range, vf_pixel_NW_third_range ); 19489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_third_range = spu_madd( vf_EWweight_third_range, 19499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_third_range_tmp, 19509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_NW_third_range ); 19519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // fourth range 19539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_fourth_range_tmp = spu_sub( vf_pixel_NE_fourth_range, vf_pixel_NW_fourth_range ); 19549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWtop_fourth_range = spu_madd( vf_EWweight_fourth_range, 19559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_fourth_range_tmp, 19569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_NW_fourth_range ); 19579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second linear interpolation: EWbottom 19619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // EWbottom = SW + EWweight*(SE-SW) 19629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 19639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 19649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_first_range_tmp = spu_sub( vf_pixel_SE_first_range, vf_pixel_SW_first_range ); 19659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_first_range = spu_madd( vf_EWweight_first_range, 19669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWbottom_first_range_tmp, 19679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_SW_first_range ); 19689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range 19709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_second_range_tmp = spu_sub( vf_pixel_SE_second_range, vf_pixel_SW_second_range ); 19719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_second_range = spu_madd( vf_EWweight_second_range, 19729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWbottom_second_range_tmp, 19739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_SW_second_range ); 19749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 19759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_third_range_tmp = spu_sub( vf_pixel_SE_third_range, vf_pixel_SW_third_range ); 19769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_third_range = spu_madd( vf_EWweight_third_range, 19779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWbottom_third_range_tmp, 19789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_SW_third_range ); 19799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 19819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_fourth_range_tmp = spu_sub( vf_pixel_SE_fourth_range, vf_pixel_SW_fourth_range ); 19829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_EWbottom_fourth_range = spu_madd( vf_EWweight_fourth_range, 19839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWbottom_fourth_range_tmp, 19849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_pixel_SW_fourth_range ); 19859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third linear interpolation: the bilinear interpolated value 19899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // result = EWtop + NSweight*(EWbottom-EWtop); 19909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // 19919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // first range 19929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_first_range_tmp = spu_sub( vf_EWbottom_first_range, vf_EWtop_first_range ); 19939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_first_range = spu_madd( vf_NSweight, 19949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_result_first_range_tmp, 19959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_first_range ); 19969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 19979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // second range 19989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_second_range_tmp = spu_sub( vf_EWbottom_second_range, vf_EWtop_second_range ); 19999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_second_range = spu_madd( vf_NSweight, 20009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_result_second_range_tmp, 20019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_second_range ); 20029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // third range 20049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_third_range_tmp = spu_sub( vf_EWbottom_third_range, vf_EWtop_third_range ); 20059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_third_range = spu_madd( vf_NSweight, 20069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_result_third_range_tmp, 20079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_third_range ); 20089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // fourth range 20109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_fourth_range_tmp = spu_sub( vf_EWbottom_fourth_range, vf_EWtop_fourth_range ); 20119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector float vf_result_fourth_range = spu_madd( vf_NSweight, 20129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_result_fourth_range_tmp, 20139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vf_EWtop_fourth_range ); 20149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // convert back: using saturated arithmetic 20189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_result_first_range = vfloat_to_vuint( vf_result_first_range ); 20199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_result_second_range = vfloat_to_vuint( vf_result_second_range ); 20209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_result_third_range = vfloat_to_vuint( vf_result_third_range ); 20219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned int vui_result_fourth_range = vfloat_to_vuint( vf_result_fourth_range ); 20229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // merge results->lower,upper 20249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_mask_merge_result_first_second = { 0x03, 0x07, 0x0B, 0x0F, 20259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x13, 0x17, 0x1B, 0x1F, 20269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x00, 0x00, 0x00, 0x00, 20279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x00, 0x00, 0x00, 0x00 }; 20289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_mask_merge_result_third_fourth = { 0x00, 0x00, 0x00, 0x00, 20309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x00, 0x00, 0x00, 0x00, 20319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x03, 0x07, 0x0B, 0x0F, 20329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 0x13, 0x17, 0x1B, 0x1F }; 20339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_result_first_second = 20359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall spu_shuffle( (vector unsigned char) vui_result_first_range, 20369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (vector unsigned char) vui_result_second_range, 20379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_mask_merge_result_first_second ); 20389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vector unsigned char vuc_result_third_fourth = 20409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall spu_shuffle( (vector unsigned char) vui_result_third_range, 20419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall (vector unsigned char) vui_result_fourth_range, 20429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_mask_merge_result_third_fourth ); 20439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 20449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall // store result 20459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall *((vector unsigned char*)dst) = spu_or( vuc_result_first_second, 20469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall vuc_result_third_fourth ); 20479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall dst += 16; 20489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall } 20499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall} 20509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 2051