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