1925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix/* 2925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * Copyright (c) Imagination Technologies Limited, UK 4925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * 5925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * Permission is hereby granted, free of charge, to any person obtaining a 6925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * copy of this software and associated documentation files (the 7925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * "Software"), to deal in the Software without restriction, including 8925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * without limitation the rights to use, copy, modify, merge, publish, 9925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * distribute, sub license, and/or sell copies of the Software, and to 10925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * permit persons to whom the Software is furnished to do so, subject to 11925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * the following conditions: 12925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * 13925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * The above copyright notice and this permission notice (including the 14925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * next paragraph) shall be included in all copies or substantial portions 15925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * of the Software. 16925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * 17925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix */ 25925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 26925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix/* 27925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * Authors: 28925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix * Li Zeng <li.zeng@intel.com> 29925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix */ 30925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#include "tng_vld_dec.h" 31925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#include "psb_drv_debug.h" 32925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#include <math.h> 33925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#include "hwdefs/reg_io2.h" 34925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#include "hwdefs/msvdx_offsets.h" 35925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#include "hwdefs/msvdx_cmds_io2.h" 36925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 37925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#define SCC_MAXTAP 9 38925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#define SCC_MAXINTPT 16 39925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 40925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshixstatic float tng_calculate_coeff_bessi0(float x) 41925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix{ 42925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float ax,ans; 43925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float y; 44925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 45925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ax = (float)fabs(x); 46925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (ax < 3.75) 47925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 48925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix y = (float)(x / 3.75); 49925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix y *= y; 50925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ans = (float)(1.0 + y * (3.5156229 + y * (3.0899424 + y * (1.2067492 51925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix + y * (0.2659732 + y * (0.360768e-1 + y * 0.45813e-2)))))); 52925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 53925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix else 54925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 55925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix y = (float)(3.75 / ax); 56925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ans = (float)((float)((sqrt(ax) / sqrt(ax)) * (0.39894228 + y * (0.1328592e-1 57925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix + y * (0.225319e-2 + y * (-0.157565e-2 + y * (0.916281e-2 58925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix +y * (-0.2057706e-1 + y * (0.2635537e-1 + y * (-0.1647633e-1 59925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix + y * 0.392377e-2)))))))))); 60925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 61925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix return ans; 62925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix} 63925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 64925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshixstatic float tng_calculate_coeff_sync_func( float fi, 65925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float ft, 66925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float fI, 67925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float fT, 68925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float fScale) 69925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix{ 70925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix const float cfPI = 3.1415926535897f; 71925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float fx, fIBeta, fBeta, fTempval, fSincfunc; 72925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 73925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* Kaiser window */ 74925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fx = ((ft * fI + fi) - (fT * fI / 2)) / (fT * fI / 2); 75925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fBeta = 2.0f; 76925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fIBeta = 1.0f/(tng_calculate_coeff_bessi0(fBeta)); 77925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fTempval = tng_calculate_coeff_bessi0(fBeta * (float)sqrt(1.0f - fx * fx)) * fIBeta; 78925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 79925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* Sinc function */ 80925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if ((fT / 2 - ft - fi / fI) == 0) 81925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 82925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fSincfunc = 1.0f; 83925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 84925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix else 85925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 86925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fx = 0.9f * fScale * cfPI * (fT / 2 - (ft + fi / fI)); 87925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fSincfunc = (float)(sin(fx) / fx); 88925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 89925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 90925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix return fSincfunc*fTempval; 91925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix} 92925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 93925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix/* 94925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix****************************************************************************** 95925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 96925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix @Description 97925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 98925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix Calculates MSVDX scaler coefficients 99925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 100925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix @Input fPitch : Scale pitch 101925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 102925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix @Output Table : Table of coefficients 103925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 104925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix @Input I : Number of intpt? ( table dimension) 105925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 106925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix @Input T : Number of taps (table dimension) 107925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 108925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix******************************************************************************/ 109925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshixstatic void tng_calculate_scaler_coeff( float fPitch, 110925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_UINT8 Table[SCC_MAXTAP][SCC_MAXINTPT], 111925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_UINT32 I, 112925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_UINT32 T) 113925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix{ 114925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* Due to the nature of the function we will only ever want to calculate the first half of the */ 115925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* taps and the middle one (is this really a tap ?) as the seconda half are derived from the */ 116925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* first half as the function is symetrical. */ 117925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float fScale = 1.0f / fPitch; 118925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_UINT32 i, t; 119cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan float flTable[SCC_MAXTAP][SCC_MAXINTPT]; 120925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_INT32 nTotal; 121925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float ftotal; 122925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_INT32 val; 123925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_INT32 mT, mI; /* mirrored / middle Values for I and T */ 124925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 125cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan memset(flTable, 0.0, SCC_MAXTAP * SCC_MAXINTPT); 126cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan 127925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (fScale > 1.0f) 128925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 129925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix fScale = 1.0f; 130925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 131925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 132925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (i = 0; i < I; i++) 133925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 134925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (t = 0; t < T; t++) 135925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 136925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix flTable[t][i] = 0.0; 137925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 138925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 139925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 140925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (i = 0;i < I; i++) 141925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 142925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (t = 0; t < T; t++) 143925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 144925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix flTable[t][i] = tng_calculate_coeff_sync_func((float)i, (float)t, 145925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix (float)I, (float)T, fScale); 146925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 147925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 148925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 149925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (T>2) 150925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 151925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (t = 0; t < ((T / 2) + (T % 2)); t++) 152925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 153925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (i=0 ; i < I; i++) 154925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 155925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* copy the table around the centrepoint */ 156925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix mT = ((T - 1) - t) + (I - i) / I; 157925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix mI = (I - i) % I; 158925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (((IMG_UINT32)mI < I) && ((IMG_UINT32)mT < T) && 159925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ((t < ((T / 2) + (T % 2) - 1)) || ((I - i) > ((T % 2) * (I / 2))))) 160925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 161925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix flTable[mT][mI] = flTable[t][i]; 162925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 163925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 164925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 165925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 166925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* the middle value */ 167925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix mT = T / 2; 168925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if ((T % 2) != 0) 169925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 170925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix mI = I/2; 171925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 172925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix else 173925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 174925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix mI = 0; 175925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 176925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix flTable[mT][mI] = tng_calculate_coeff_sync_func( 177925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix (float) mI, (float) mT, 178925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix (float) I, (float) T, fScale); 179925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 180925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 181925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* normalize this interpolation point, and convert to 2.6 format trucating the result */ 182925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (i = 0; i < I; i++) 183925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 184925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix nTotal = 0; 185925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (ftotal = 0,t = 0; t < T; t++) 186925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 187925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ftotal += flTable[t][i]; 188925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 189925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (t = 0; t < T; t++) 190925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 191925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix val = (IMG_UINT32) ((flTable[t][i] * 64.0f) / ftotal); 192925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix Table[t][i] = (IMG_UINT8) val; 193925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix nTotal += val; 194925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 195925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if ((i <= (I / 2)) || (T <= 2)) /* normalize any floating point errors */ 196925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 197925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix nTotal -= 64; 198925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if ((i == (I / 2)) && (T > 2)) 199925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 200925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix nTotal /= 2; 201925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 202925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 203925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* subtract the error from the I Point in the first tap */ 204925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* ( this will not get mirrored, as it would go off the end ). */ 205925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix Table[0][i] = (IMG_UINT8)(Table[0][i] - (IMG_UINT8) nTotal); 206925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 207925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 208925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 209925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* copy the normalised table around the centrepoint */ 210925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (T > 2) 211925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 212925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for ( t = 0; t < ((T / 2) + (T % 2)); t++) 213925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 214925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (i = 0; i < I; i++) 215925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 216925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix mT = ((T - 1) - t) + (I - i) / I; 217925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix mI = (I - i) % I; 218925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix if (((IMG_UINT32)mI < I) && ((IMG_UINT32)mT < T) && ((t < ((T / 2) + (T % 2) - 1)) || ((I - i) > ((T % 2) * (I / 2))))) 219925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 220925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix Table[mT][mI] = Table[t][i]; 221925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 222925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 223925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 224925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 225925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix} 226925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 227925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshixvoid tng_calculate_scaler_coff_reg(object_context_p obj_context) 228925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix{ 229925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 2304d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng object_surface_p src_surface = obj_context->current_render_target; 2314d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng 232925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* If the surfaces are smaller that the size the object was constructed with, then we need to downscale */ 233925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float fHorzPitch; 234925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix float fVertPitch; 235925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix int scale_acc = 11; 236925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix int i; 237925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 2384d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#ifndef PSBVIDEO_MFLD 2394d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng scale_acc = 12; 2404d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng#endif 2414d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng 2424d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "content crop is %dx%d", 243a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->driver_data->render_rect.width, obj_context->driver_data->render_rect.height); 2444d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "scaling dest is %dx%d", 245a7634d944fe745c4061b4b5c0d425cc585b923a2mahongpe obj_context->current_render_target->width_s, obj_context->current_render_target->height_s); 246925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* The unscaled dimensions in the pitch calculation below MUST match the Display Width and Height sent to the hardware */ 247e202f2ee721bf555410fd0cd4d5e2e2cb951f83fLi Zeng fHorzPitch = obj_context->driver_data->render_rect.width / (float) obj_context->current_render_target->width_s; 248e202f2ee721bf555410fd0cd4d5e2e2cb951f83fLi Zeng fVertPitch = obj_context->driver_data->render_rect.height / (float) obj_context->current_render_target->height_s; 249925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 250925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_UINT32 reg_value; 251925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_UINT8 calc_table[4][16]; 252925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 253925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix tng_calculate_scaler_coeff(fHorzPitch, calc_table, 16, 4); 254925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (i = 0; i < 4; i++) 255925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 256925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix unsigned int j = 1 + 2 * i; 257925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 258925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix reg_value = 0; 259925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_LUMA_COEFFICIENTS, HOR_LUMA_COEFF_3, calc_table[0][j]); 260925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_LUMA_COEFFICIENTS, HOR_LUMA_COEFF_2, calc_table[1][j]); 261925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_LUMA_COEFFICIENTS, HOR_LUMA_COEFF_1, calc_table[2][j]); 262925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_LUMA_COEFFICIENTS, HOR_LUMA_COEFF_0, calc_table[3][j]); 263925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 264925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ctx->scaler_coeff_reg[/* Luma */ 0][/* Hori */ 0][i] = reg_value; 265925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 266925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix reg_value = 0; 267925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_CHROMA_COEFFICIENTS, HOR_CHROMA_COEFF_3, calc_table[0][j]); 268925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_CHROMA_COEFFICIENTS, HOR_CHROMA_COEFF_2, calc_table[1][j]); 269925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_CHROMA_COEFFICIENTS, HOR_CHROMA_COEFF_1, calc_table[2][j]); 270925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, HORIZONTAL_CHROMA_COEFFICIENTS, HOR_CHROMA_COEFF_0, calc_table[3][j]); 271925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 272925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ctx->scaler_coeff_reg[/* Chroma */ 1][/* H */ 0][i] = reg_value; 273925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 274925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 275925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix tng_calculate_scaler_coeff(fVertPitch, calc_table, 16, 4); 276925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for (i = 0; i < 4; i++) 277925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 278925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix unsigned int j = 1+2*i; 279925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 280925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix reg_value = 0; 281925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_LUMA_COEFFICIENTS, VER_LUMA_COEFF_3, calc_table[0][j]); 282925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_LUMA_COEFFICIENTS, VER_LUMA_COEFF_2, calc_table[1][j]); 283925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_LUMA_COEFFICIENTS, VER_LUMA_COEFF_1, calc_table[2][j]); 284925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_LUMA_COEFFICIENTS, VER_LUMA_COEFF_0, calc_table[3][j]); 285925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 286925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ctx->scaler_coeff_reg[/* L */ 0][/* Verti */ 1][i] = reg_value; 287925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 288925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix reg_value = 0; 289925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_CHROMA_COEFFICIENTS, VER_CHROMA_COEFF_3, calc_table[0][j]); 290925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_CHROMA_COEFFICIENTS, VER_CHROMA_COEFF_2,calc_table[1][j]); 291925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_CHROMA_COEFFICIENTS, VER_CHROMA_COEFF_1, calc_table[2][j]); 292925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD(reg_value, MSVDX_CMDS, VERTICAL_CHROMA_COEFFICIENTS, VER_CHROMA_COEFF_0, calc_table[3][j]); 293925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 294925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ctx->scaler_coeff_reg[/* C */ 1][ /* V */ 1][i] = reg_value; 295925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 296925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 297925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* VXD can only downscale from the original display size. */ 298925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix IMG_ASSERT(fHorzPitch >= 1 && fVertPitch >= 1); 299925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 300925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#ifdef PSBVIDEO_MRFL_DEC 301925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix scale_acc = 12; 302925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix#endif 303925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 304925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ctx->h_scaler_ctrl = 0; 305925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(ctx->h_scaler_ctrl, MSVDX_CMDS, HORIZONTAL_SCALE_CONTROL, HORIZONTAL_SCALE_PITCH, (int)(fHorzPitch * (1 << scale_acc))); 306925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(ctx->h_scaler_ctrl, MSVDX_CMDS, HORIZONTAL_SCALE_CONTROL, HORIZONTAL_INITIAL_POS, (int)(fHorzPitch * 0.5f * (1 << scale_acc))); 307925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 308925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix ctx->v_scaler_ctrl = 0; 309925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(ctx->v_scaler_ctrl, MSVDX_CMDS, VERTICAL_SCALE_CONTROL, VERTICAL_SCALE_PITCH, (int)(fVertPitch * (1 << scale_acc) + 0.5) ); 310925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix REGIO_WRITE_FIELD_LITE(ctx->v_scaler_ctrl, MSVDX_CMDS, VERTICAL_SCALE_CONTROL, VERTICAL_INITIAL_POS, (int)(fVertPitch * 0.5 * (1 << scale_acc) + 0.5)); 311925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix} 312925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 313925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshixvoid tng_ved_write_scale_reg(object_context_p obj_context) 314925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix{ 315925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix uint32_t cmd = 0; 316925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 317925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix context_DEC_p ctx = (context_DEC_p) obj_context->format_data; 3184d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng object_surface_p src_surface = obj_context->current_render_target; 319925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix unsigned int lc, hv, x; 320925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 321925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* setup scaling coeffs */ 3224d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng if (obj_context->scaling_update) { 323925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix tng_calculate_scaler_coff_reg(obj_context); 3244d06c1febaa800c6a9efb9908a2c6233472c7464Li Zeng obj_context->scaling_update = 0; 325925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 326925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 327925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 328925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, SCALED_DISPLAY_SIZE)); 329925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 330925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix cmd = 0; 331e202f2ee721bf555410fd0cd4d5e2e2cb951f83fLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SCALED_DISPLAY_SIZE, SCALE_DISPLAY_WIDTH, obj_context->driver_data->render_rect.width - 1); 332e202f2ee721bf555410fd0cd4d5e2e2cb951f83fLi Zeng REGIO_WRITE_FIELD_LITE(cmd, MSVDX_CMDS, SCALED_DISPLAY_SIZE, SCALE_DISPLAY_HEIGHT, obj_context->driver_data->render_rect.height - 1); 333925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_write(cmdbuf, cmd); 334925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_write(cmdbuf, ctx->h_scaler_ctrl ); 335925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_write(cmdbuf, ctx->v_scaler_ctrl ); //58 336925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_end(cmdbuf); 337925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 338925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix 339925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix /* Write the Coefficeients */ 340925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 341925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_start(cmdbuf, RENDEC_REGISTER_OFFSET(MSVDX_CMDS, HORIZONTAL_LUMA_COEFFICIENTS)); 342925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for(lc=0 ; lc<2 ; lc++) 343925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 344925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for(hv=0 ; hv<2 ; hv++) 345925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 346925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix for(x=0 ; x<4 ; x++) 347925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix { 348925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_write(cmdbuf, ctx->scaler_coeff_reg[lc][hv][x]); 349925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 350925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 351925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 352925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix psb_cmdbuf_rendec_end(cmdbuf); 353925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix } 354925e65d1ed4a080e83ea5fcaea1c3c802e427e6cpingshix} 355