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