18e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
2430ce5c32361119ed81a62c918be6afbdd053eddhding * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3430ce5c32361119ed81a62c918be6afbdd053eddhding * Copyright (c) Imagination Technologies Limited, UK
48e9a21e730449c10cac6e6f69d255611c93f63c2hding *
5430ce5c32361119ed81a62c918be6afbdd053eddhding * Permission is hereby granted, free of charge, to any person obtaining a
6430ce5c32361119ed81a62c918be6afbdd053eddhding * copy of this software and associated documentation files (the
7430ce5c32361119ed81a62c918be6afbdd053eddhding * "Software"), to deal in the Software without restriction, including
8430ce5c32361119ed81a62c918be6afbdd053eddhding * without limitation the rights to use, copy, modify, merge, publish,
9430ce5c32361119ed81a62c918be6afbdd053eddhding * distribute, sub license, and/or sell copies of the Software, and to
10430ce5c32361119ed81a62c918be6afbdd053eddhding * permit persons to whom the Software is furnished to do so, subject to
11430ce5c32361119ed81a62c918be6afbdd053eddhding * the following conditions:
12430ce5c32361119ed81a62c918be6afbdd053eddhding *
13430ce5c32361119ed81a62c918be6afbdd053eddhding * The above copyright notice and this permission notice (including the
14430ce5c32361119ed81a62c918be6afbdd053eddhding * next paragraph) shall be included in all copies or substantial portions
15430ce5c32361119ed81a62c918be6afbdd053eddhding * of the Software.
16430ce5c32361119ed81a62c918be6afbdd053eddhding *
17430ce5c32361119ed81a62c918be6afbdd053eddhding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18430ce5c32361119ed81a62c918be6afbdd053eddhding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19430ce5c32361119ed81a62c918be6afbdd053eddhding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20430ce5c32361119ed81a62c918be6afbdd053eddhding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21430ce5c32361119ed81a62c918be6afbdd053eddhding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22430ce5c32361119ed81a62c918be6afbdd053eddhding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23430ce5c32361119ed81a62c918be6afbdd053eddhding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
248e9a21e730449c10cac6e6f69d255611c93f63c2hding *
258e9a21e730449c10cac6e6f69d255611c93f63c2hding * Authors:
268e9a21e730449c10cac6e6f69d255611c93f63c2hding *    Edward Lin <edward.lin@intel.com>
278e9a21e730449c10cac6e6f69d255611c93f63c2hding *
288e9a21e730449c10cac6e6f69d255611c93f63c2hding */
298e9a21e730449c10cac6e6f69d255611c93f63c2hding
308e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <unistd.h>
318e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <stdio.h>
328e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <memory.h>
338e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "hwdefs/topazhp_core_regs.h"
348e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "hwdefs/topaz_vlc_regs.h"
358e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "hwdefs/topazhp_multicore_regs.h"
368e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "hwdefs/topazhp_multicore_regs_old.h"
378e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_drv_video.h"
38430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_cmdbuf.h"
39430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_hostbias.h"
408e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_drv_debug.h"
41cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan#include <stdlib.h>
428e9a21e730449c10cac6e6f69d255611c93f63c2hding
438e9a21e730449c10cac6e6f69d255611c93f63c2hding#define UNINIT_PARAM 0xCDCDCDCD
448e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TOPAZHP_DEFAULT_bZeroDetectionDisable IMG_FALSE
458e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TH_SKIP_IPE                      6
468e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TH_INTER                           60
478e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TH_INTER_QP                    10
488e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TH_INTER_MAX_LEVEL      1500
498e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TH_SKIP_SPE                     6
508e9a21e730449c10cac6e6f69d255611c93f63c2hding
518e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TOPAZHP_DEFAULT_uTHInter                           TH_INTER
528e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TOPAZHP_DEFAULT_uTHInterQP                      TH_INTER_QP
538e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TOPAZHP_DEFAULT_uTHInterMaxLevel		     TH_INTER_MAX_LEVEL
548e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TOPAZHP_DEFAULT_uTHSkipIPE                      TH_SKIP_IPE
558e9a21e730449c10cac6e6f69d255611c93f63c2hding#define TOPAZHP_DEFAULT_uTHSkipSPE                      TH_SKIP_SPE
568e9a21e730449c10cac6e6f69d255611c93f63c2hding
578e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MIN_32_REV 0x00030200
588e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MAX_32_REV 0x00030299
598e9a21e730449c10cac6e6f69d255611c93f63c2hding// New MP4 Lambda table
60cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanstatic IMG_UINT8 MPEG4_QPLAMBDA_MAP[31] = {
61cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    0,  0,  1,  2,  3,
62cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    3,  4,  4,  5,  5,
63cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    6,  6,  7,  7,  8,
64cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    8,  9,  9,  10, 10,
65cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    11, 11, 11, 11, 12,
66cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    12, 12, 12, 13, 13, 13
678e9a21e730449c10cac6e6f69d255611c93f63c2hding};
688e9a21e730449c10cac6e6f69d255611c93f63c2hding
69cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanstatic IMG_UINT8 H263_QPLAMBDA_MAP[31] = {
70cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    0, 0, 1, 1, 2,
71cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    2, 3, 3, 4, 4,
72cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    4, 5, 5, 5, 6,
73cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    6, 6, 7, 7, 7,
74cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    7, 8, 8, 8, 8,
75cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    9, 9, 9, 9, 10,10
76cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan};
778e9a21e730449c10cac6e6f69d255611c93f63c2hding
788e9a21e730449c10cac6e6f69d255611c93f63c2hding// new H.264 Lambda
798e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT8 H264_QPLAMBDA_MAP_SAD[40] = {
808e9a21e730449c10cac6e6f69d255611c93f63c2hding    2, 2, 2, 2, 3, 3, 4, 4,
818e9a21e730449c10cac6e6f69d255611c93f63c2hding    4, 5, 5, 5, 5, 5, 6, 6,
828e9a21e730449c10cac6e6f69d255611c93f63c2hding    6, 7, 7, 7, 8, 8, 9, 11,
838e9a21e730449c10cac6e6f69d255611c93f63c2hding    13, 14, 15, 17, 20, 23, 27, 31,
848e9a21e730449c10cac6e6f69d255611c93f63c2hding    36, 41, 51, 62, 74, 79, 85, 91
858e9a21e730449c10cac6e6f69d255611c93f63c2hding};
868e9a21e730449c10cac6e6f69d255611c93f63c2hding
878e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT8 H264_QPLAMBDA_MAP_SATD_TABLES[][52] = {
888e9a21e730449c10cac6e6f69d255611c93f63c2hding    //table 0
898e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
908e9a21e730449c10cac6e6f69d255611c93f63c2hding        8,  8,  8,  8,  8,  8,  8,
918e9a21e730449c10cac6e6f69d255611c93f63c2hding        8,  8,  8,  8,  8,  8,  8,
928e9a21e730449c10cac6e6f69d255611c93f63c2hding        8,  8,  8,  9,  9,     10, 10,
938e9a21e730449c10cac6e6f69d255611c93f63c2hding        11, 11, 12, 12, 13,     13, 14,
948e9a21e730449c10cac6e6f69d255611c93f63c2hding        14, 15, 15, 16, 17,     18, 20,
958e9a21e730449c10cac6e6f69d255611c93f63c2hding        21, 23, 25, 27, 30,     32, 38,
968e9a21e730449c10cac6e6f69d255611c93f63c2hding        44, 50, 56, 63, 67,     72, 77,
978e9a21e730449c10cac6e6f69d255611c93f63c2hding        82, 87, 92
988e9a21e730449c10cac6e6f69d255611c93f63c2hding    },
998e9a21e730449c10cac6e6f69d255611c93f63c2hding};
1008e9a21e730449c10cac6e6f69d255611c93f63c2hding
1018e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT32 H264_DIRECT_BIAS[27] = {
1028e9a21e730449c10cac6e6f69d255611c93f63c2hding    24, 24, 24, 24, 24, 24, 24, 24, 36,
1038e9a21e730449c10cac6e6f69d255611c93f63c2hding    48, 48, 60, 60, 72, 72, 84, 96, 108,
1048e9a21e730449c10cac6e6f69d255611c93f63c2hding    200, 324, 384, 528, 672, 804, 924, 1044, 1104
1058e9a21e730449c10cac6e6f69d255611c93f63c2hding};
1068e9a21e730449c10cac6e6f69d255611c93f63c2hding
1078e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT32 H264_INTRA8_SCALE[27] = {
1088e9a21e730449c10cac6e6f69d255611c93f63c2hding    (234 + 8) >> 4, (231 + 8) >> 4,
1098e9a21e730449c10cac6e6f69d255611c93f63c2hding    (226 + 8) >> 4, (221 + 8) >> 4,
1108e9a21e730449c10cac6e6f69d255611c93f63c2hding    (217 + 8) >> 4, (213 + 8) >> 4,
1118e9a21e730449c10cac6e6f69d255611c93f63c2hding    (210 + 8) >> 4, (207 + 8) >> 4,
1128e9a21e730449c10cac6e6f69d255611c93f63c2hding    (204 + 8) >> 4, (202 + 8) >> 4,
1138e9a21e730449c10cac6e6f69d255611c93f63c2hding    (200 + 8) >> 4, (199 + 8) >> 4,
1148e9a21e730449c10cac6e6f69d255611c93f63c2hding    (197 + 8) >> 4, (197 + 8) >> 4,
1158e9a21e730449c10cac6e6f69d255611c93f63c2hding    (196 + 8) >> 4, (196 + 8) >> 4,
1168e9a21e730449c10cac6e6f69d255611c93f63c2hding    (197 + 8) >> 4, (197 + 8) >> 4,
1178e9a21e730449c10cac6e6f69d255611c93f63c2hding    (198 + 8) >> 4, (200 + 8) >> 4,
1188e9a21e730449c10cac6e6f69d255611c93f63c2hding    (202 + 8) >> 4, (204 + 8) >> 4,
1198e9a21e730449c10cac6e6f69d255611c93f63c2hding    (207 + 8) >> 4, (210 + 8) >> 4,
1208e9a21e730449c10cac6e6f69d255611c93f63c2hding    (213 + 8) >> 4, (217 + 8) >> 4,
1218e9a21e730449c10cac6e6f69d255611c93f63c2hding    (217 + 8) >> 4
1228e9a21e730449c10cac6e6f69d255611c93f63c2hding};
1238e9a21e730449c10cac6e6f69d255611c93f63c2hding
1248e9a21e730449c10cac6e6f69d255611c93f63c2hding/***********************************************************************************
1258e9a21e730449c10cac6e6f69d255611c93f63c2hding* Function Name : H264InterBias
1268e9a21e730449c10cac6e6f69d255611c93f63c2hding* Inputs                                : ui8QP
1278e9a21e730449c10cac6e6f69d255611c93f63c2hding* Outputs                               :
1288e9a21e730449c10cac6e6f69d255611c93f63c2hding* Returns                               : IMG_INT16
1298e9a21e730449c10cac6e6f69d255611c93f63c2hding* Description           : return the Inter Bias Value to use for the given QP
1308e9a21e730449c10cac6e6f69d255611c93f63c2hding  ************************************************************************************/
1318e9a21e730449c10cac6e6f69d255611c93f63c2hding
1328e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT16 H264_InterIntraBias[27] = {
1338e9a21e730449c10cac6e6f69d255611c93f63c2hding    20, 20, 20, 20, 20, 20, 50,
1348e9a21e730449c10cac6e6f69d255611c93f63c2hding    100, 210, 420, 420, 445, 470,
1358e9a21e730449c10cac6e6f69d255611c93f63c2hding    495, 520, 535, 550, 570, 715,
1368e9a21e730449c10cac6e6f69d255611c93f63c2hding    860, 900, 1000, 1200, 1400,
1378e9a21e730449c10cac6e6f69d255611c93f63c2hding    1600, 1800, 2000
1388e9a21e730449c10cac6e6f69d255611c93f63c2hding};
1398e9a21e730449c10cac6e6f69d255611c93f63c2hding
140430ce5c32361119ed81a62c918be6afbdd053eddhdingstatic IMG_INT16 tng__H264ES_inter_bias(IMG_INT8 i8QP)
1418e9a21e730449c10cac6e6f69d255611c93f63c2hding{
1428e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (i8QP < 1) {
1438e9a21e730449c10cac6e6f69d255611c93f63c2hding        i8QP = 1;
1448e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1458e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (i8QP > 51) {
1468e9a21e730449c10cac6e6f69d255611c93f63c2hding        i8QP = 51;
1478e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1488e9a21e730449c10cac6e6f69d255611c93f63c2hding
1498e9a21e730449c10cac6e6f69d255611c93f63c2hding    //return aui16InterBiasValues[i8QP-36];
1508e9a21e730449c10cac6e6f69d255611c93f63c2hding    return H264_InterIntraBias[(i8QP+1)>>1];
1518e9a21e730449c10cac6e6f69d255611c93f63c2hding}
1528e9a21e730449c10cac6e6f69d255611c93f63c2hding
1538e9a21e730449c10cac6e6f69d255611c93f63c2hding/*****************************************************************************
1548e9a21e730449c10cac6e6f69d255611c93f63c2hding *  Function Name      : CalculateDCScaler
1558e9a21e730449c10cac6e6f69d255611c93f63c2hding *  Inputs             : iQP, bChroma
1568e9a21e730449c10cac6e6f69d255611c93f63c2hding *  Outputs            : iDCScaler
1578e9a21e730449c10cac6e6f69d255611c93f63c2hding *  Returns            : IMG_INT
1588e9a21e730449c10cac6e6f69d255611c93f63c2hding *  Description        : Calculates either the Luma or Chroma DC scaler from the quantization scaler
1598e9a21e730449c10cac6e6f69d255611c93f63c2hding *******************************************************************************/
1608e9a21e730449c10cac6e6f69d255611c93f63c2hdingIMG_INT
1618e9a21e730449c10cac6e6f69d255611c93f63c2hdingCalculateDCScaler(IMG_INT iQP, IMG_BOOL bChroma)
1628e9a21e730449c10cac6e6f69d255611c93f63c2hding{
1638e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT     iDCScaler;
1648e9a21e730449c10cac6e6f69d255611c93f63c2hding    if(!bChroma)
1658e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
1668e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (iQP > 0 && iQP < 5)
1678e9a21e730449c10cac6e6f69d255611c93f63c2hding        {
1688e9a21e730449c10cac6e6f69d255611c93f63c2hding            iDCScaler = 8;
1698e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
1708e9a21e730449c10cac6e6f69d255611c93f63c2hding        else if (iQP > 4 &&     iQP     < 9)
1718e9a21e730449c10cac6e6f69d255611c93f63c2hding        {
1728e9a21e730449c10cac6e6f69d255611c93f63c2hding            iDCScaler = 2 * iQP;
1738e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
1748e9a21e730449c10cac6e6f69d255611c93f63c2hding        else if (iQP > 8 &&     iQP     < 25)
1758e9a21e730449c10cac6e6f69d255611c93f63c2hding        {
1768e9a21e730449c10cac6e6f69d255611c93f63c2hding            iDCScaler = iQP + 8;
1778e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
1788e9a21e730449c10cac6e6f69d255611c93f63c2hding        else
1798e9a21e730449c10cac6e6f69d255611c93f63c2hding        {
1808e9a21e730449c10cac6e6f69d255611c93f63c2hding            iDCScaler = 2 * iQP -16;
1818e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
1828e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1838e9a21e730449c10cac6e6f69d255611c93f63c2hding    else
1848e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
1858e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (iQP > 0 && iQP < 5)
1868e9a21e730449c10cac6e6f69d255611c93f63c2hding        {
1878e9a21e730449c10cac6e6f69d255611c93f63c2hding            iDCScaler = 8;
1888e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
1898e9a21e730449c10cac6e6f69d255611c93f63c2hding        else if (iQP > 4 &&     iQP     < 25)
1908e9a21e730449c10cac6e6f69d255611c93f63c2hding        {
1918e9a21e730449c10cac6e6f69d255611c93f63c2hding            iDCScaler = (iQP + 13) / 2;
1928e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
1938e9a21e730449c10cac6e6f69d255611c93f63c2hding        else
1948e9a21e730449c10cac6e6f69d255611c93f63c2hding        {
1958e9a21e730449c10cac6e6f69d255611c93f63c2hding            iDCScaler = iQP - 6;
1968e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
1978e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1988e9a21e730449c10cac6e6f69d255611c93f63c2hding    return iDCScaler;
1998e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2008e9a21e730449c10cac6e6f69d255611c93f63c2hding
2018e9a21e730449c10cac6e6f69d255611c93f63c2hding/**************************************************************************************************
2028e9a21e730449c10cac6e6f69d255611c93f63c2hding* Function:		MPEG4_GenerateBiasTables
2038e9a21e730449c10cac6e6f69d255611c93f63c2hding* Description:	Genereate the bias tables for MPEG4
2048e9a21e730449c10cac6e6f69d255611c93f63c2hding*
2058e9a21e730449c10cac6e6f69d255611c93f63c2hding***************************************************************************************************/
2068e9a21e730449c10cac6e6f69d255611c93f63c2hdingvoid
207430ce5c32361119ed81a62c918be6afbdd053eddhdingtng__MPEG4ES_generate_bias_tables(
2088e9a21e730449c10cac6e6f69d255611c93f63c2hding	context_ENC_p ctx)
2098e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2108e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT16 n;
2118e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT16 iX;
2128e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 ui32RegVal;
2138e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT8 uiDCScaleL,uiDCScaleC,uiLambda;
2148e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 uDirectVecBias,iInterMBBias,iIntra16Bias;
2158e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BIAS_PARAMS *psBiasParams = &(ctx->sBiasParams);
2168e9a21e730449c10cac6e6f69d255611c93f63c2hding
2178db61a0583ecc81f700e0cf13631b21f0b774a73hding    ctx->sBiasTables.ui32LritcCacheChunkConfig = F_ENCODE(ctx->uChunksPerMb, INTEL_CH_PM) |
2188db61a0583ecc81f700e0cf13631b21f0b774a73hding						 F_ENCODE(ctx->uMaxChunks, INTEL_CH_MX) |
2198db61a0583ecc81f700e0cf13631b21f0b774a73hding						 F_ENCODE(ctx->uMaxChunks - ctx->uPriorityChunks, INTEL_CH_PY);
2208e9a21e730449c10cac6e6f69d255611c93f63c2hding
2218e9a21e730449c10cac6e6f69d255611c93f63c2hding
2228e9a21e730449c10cac6e6f69d255611c93f63c2hding    for(n=31;n>=1;n--)
2238e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
2248e9a21e730449c10cac6e6f69d255611c93f63c2hding	iX = n-12;
2258e9a21e730449c10cac6e6f69d255611c93f63c2hding	if(iX < 0)
2268e9a21e730449c10cac6e6f69d255611c93f63c2hding	{
2278e9a21e730449c10cac6e6f69d255611c93f63c2hding	    iX = 0;
2288e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
2298e9a21e730449c10cac6e6f69d255611c93f63c2hding	// Dont Write QP Values To ESB -- IPE will write these values
2308e9a21e730449c10cac6e6f69d255611c93f63c2hding	// Update the quantization parameter which includes doing Lamda and the Chroma QP
2318e9a21e730449c10cac6e6f69d255611c93f63c2hding
2328e9a21e730449c10cac6e6f69d255611c93f63c2hding	uiDCScaleL = CalculateDCScaler(n, IMG_FALSE);
2338e9a21e730449c10cac6e6f69d255611c93f63c2hding	uiDCScaleC = CalculateDCScaler(n, IMG_TRUE);
2348e9a21e730449c10cac6e6f69d255611c93f63c2hding	uiLambda = psBiasParams->uLambdaSAD ? psBiasParams->uLambdaSAD : MPEG4_QPLAMBDA_MAP[n - 1];
2358e9a21e730449c10cac6e6f69d255611c93f63c2hding
2368e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal = uiDCScaleL;
2378e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal |= (uiDCScaleC)<<8;
2388e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal |= (uiLambda)<<16;
2398e9a21e730449c10cac6e6f69d255611c93f63c2hding	ctx->sBiasTables.aui32LambdaBias[n] = ui32RegVal;
2408e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
2418e9a21e730449c10cac6e6f69d255611c93f63c2hding
242cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    for(n=31;n>=1;n-=2) {
243cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        if(psBiasParams->bRCEnable || psBiasParams->bRCBiases) {
244cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            uDirectVecBias = psBiasParams->uTHSkipIPE * uiLambda;
245cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iInterMBBias    = psBiasParams->uTHInter * (n - psBiasParams->uTHInterQP);
246cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            //if(iInterMBBias < 0)
247cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            //    iInterMBBias	= 0;
248cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            if(iInterMBBias > psBiasParams->uTHInterMaxLevel)
249cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                iInterMBBias	= psBiasParams->uTHInterMaxLevel;
250cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iIntra16Bias = 0;
251cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        } else {
252cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            uDirectVecBias  = psBiasParams->uIPESkipVecBias;
253cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iInterMBBias    = psBiasParams->iInterMBBias;
254cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iIntra16Bias    = psBiasParams->iIntra16Bias;
255cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        }
256cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan
257cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.aui32IntraBias[n] = iIntra16Bias;
258cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.aui32InterBias_P[n] = iInterMBBias;
259cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.aui32DirectBias_P[n] = uDirectVecBias;
2608e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
2618e9a21e730449c10cac6e6f69d255611c93f63c2hding
2628e9a21e730449c10cac6e6f69d255611c93f63c2hding    if(psBiasParams->bRCEnable || psBiasParams->bRCBiases)
263cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.ui32sz1 = psBiasParams->uisz1;
2648e9a21e730449c10cac6e6f69d255611c93f63c2hding    else
265cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.ui32sz1 = psBiasParams->uisz2;
2668e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2678e9a21e730449c10cac6e6f69d255611c93f63c2hding
2688e9a21e730449c10cac6e6f69d255611c93f63c2hding/**************************************************************************************************
2698e9a21e730449c10cac6e6f69d255611c93f63c2hding* Function:		H263_GenerateBiasTables
2708e9a21e730449c10cac6e6f69d255611c93f63c2hding* Description:	Genereate the bias tables for H.263
2718e9a21e730449c10cac6e6f69d255611c93f63c2hding*
2728e9a21e730449c10cac6e6f69d255611c93f63c2hding***************************************************************************************************/
2738e9a21e730449c10cac6e6f69d255611c93f63c2hdingvoid
274430ce5c32361119ed81a62c918be6afbdd053eddhdingtng__H263ES_generate_bias_tables(
2758e9a21e730449c10cac6e6f69d255611c93f63c2hding	context_ENC_p ctx)
2768e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2778e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT16 n;
2788e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT16 iX;
2798e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 ui32RegVal;
2808e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT8 uiDCScaleL,uiDCScaleC,uiLambda;
2818e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 uDirectVecBias,iInterMBBias,iIntra16Bias;
2828e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BIAS_PARAMS * psBiasParams = &(ctx->sBiasParams);
2838e9a21e730449c10cac6e6f69d255611c93f63c2hding
2848db61a0583ecc81f700e0cf13631b21f0b774a73hding    ctx->sBiasTables.ui32LritcCacheChunkConfig = F_ENCODE(ctx->uChunksPerMb, INTEL_CH_PM) |
2858db61a0583ecc81f700e0cf13631b21f0b774a73hding						 F_ENCODE(ctx->uMaxChunks, INTEL_CH_MX) |
2868db61a0583ecc81f700e0cf13631b21f0b774a73hding						 F_ENCODE(ctx->uMaxChunks - ctx->uPriorityChunks, INTEL_CH_PY);
2878e9a21e730449c10cac6e6f69d255611c93f63c2hding
2888e9a21e730449c10cac6e6f69d255611c93f63c2hding    for(n=31;n>=1;n--)
2898e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
2908e9a21e730449c10cac6e6f69d255611c93f63c2hding	iX = n-12;
2918e9a21e730449c10cac6e6f69d255611c93f63c2hding	if(iX < 0)
2928e9a21e730449c10cac6e6f69d255611c93f63c2hding	{
2938e9a21e730449c10cac6e6f69d255611c93f63c2hding	    iX = 0;
2948e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
2958e9a21e730449c10cac6e6f69d255611c93f63c2hding	// Dont Write QP Values To ESB -- IPE will write these values
2968e9a21e730449c10cac6e6f69d255611c93f63c2hding	// Update the quantization parameter which includes doing Lamda and the Chroma QP
2978e9a21e730449c10cac6e6f69d255611c93f63c2hding
2988e9a21e730449c10cac6e6f69d255611c93f63c2hding	uiDCScaleL	= CalculateDCScaler(n, IMG_FALSE);
2998e9a21e730449c10cac6e6f69d255611c93f63c2hding	uiDCScaleC	= CalculateDCScaler(n, IMG_TRUE);
3008e9a21e730449c10cac6e6f69d255611c93f63c2hding	uiLambda	= psBiasParams->uLambdaSAD ? psBiasParams->uLambdaSAD : H263_QPLAMBDA_MAP[n - 1];
3018e9a21e730449c10cac6e6f69d255611c93f63c2hding
3028e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal=uiDCScaleL;
3038e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal |= (uiDCScaleC)<<8;
3048e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal |= (uiLambda)<<16;
3058e9a21e730449c10cac6e6f69d255611c93f63c2hding
3068e9a21e730449c10cac6e6f69d255611c93f63c2hding   	ctx->sBiasTables.aui32LambdaBias[n] = ui32RegVal;
3078e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
3088e9a21e730449c10cac6e6f69d255611c93f63c2hding
309cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    for(n=31;n>=1;n-=2) {
310cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        if(psBiasParams->bRCEnable || psBiasParams->bRCBiases) {
311cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            uDirectVecBias = psBiasParams->uTHSkipIPE * uiLambda;
312cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iInterMBBias    = psBiasParams->uTHInter * (n - psBiasParams->uTHInterQP);
313cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            //if(iInterMBBias < 0)
314cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            //    iInterMBBias	= 0;
315cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            if(iInterMBBias > psBiasParams->uTHInterMaxLevel)
316cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                iInterMBBias	= psBiasParams->uTHInterMaxLevel;
317cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iIntra16Bias = 0;
318cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        } else {
319cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            uDirectVecBias  = psBiasParams->uIPESkipVecBias;
320cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iInterMBBias    = psBiasParams->iInterMBBias;
321cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            iIntra16Bias    = psBiasParams->iIntra16Bias;
322cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        }
3238e9a21e730449c10cac6e6f69d255611c93f63c2hding
324cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.aui32IntraBias[n] = iIntra16Bias;
325cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.aui32InterBias_P[n] = iInterMBBias;
326cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.aui32DirectBias_P[n] = uDirectVecBias;
3278e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
3288e9a21e730449c10cac6e6f69d255611c93f63c2hding
3298e9a21e730449c10cac6e6f69d255611c93f63c2hding    if(psBiasParams->bRCEnable || psBiasParams->bRCBiases)
330cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.ui32sz1 = psBiasParams->uisz1;
3318e9a21e730449c10cac6e6f69d255611c93f63c2hding    else
332cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan        ctx->sBiasTables.ui32sz1 = psBiasParams->uisz2;
3338e9a21e730449c10cac6e6f69d255611c93f63c2hding}
3348e9a21e730449c10cac6e6f69d255611c93f63c2hding
3358e9a21e730449c10cac6e6f69d255611c93f63c2hding/**************************************************************************************************
3368e9a21e730449c10cac6e6f69d255611c93f63c2hding* Function:             H264_GenerateBiasTables
3378e9a21e730449c10cac6e6f69d255611c93f63c2hding* Description:  Generate the bias tables for H.264
3388e9a21e730449c10cac6e6f69d255611c93f63c2hding*
3398e9a21e730449c10cac6e6f69d255611c93f63c2hding***************************************************************************************************/
340430ce5c32361119ed81a62c918be6afbdd053eddhdingstatic void tng__H264ES_generate_bias_tables(context_ENC_p ctx)
3418e9a21e730449c10cac6e6f69d255611c93f63c2hding{
3428e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT32 n;
3438e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 ui32RegVal;
34413149b728d681c33e036a3e26b1b61d5a8b78204edward lin    IMG_UINT32 iIntra16Bias, uisz2, uIntra8Scale, uDirectVecBias_P, iInterMBBias_P, uDirectVecBias_B, iInterMBBias_B;
3458e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BIAS_PARAMS * psBiasParams = &(ctx->sBiasParams);
3468e9a21e730449c10cac6e6f69d255611c93f63c2hding
3478e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BYTE PVR_QP_SCALE_CR[52] = {
3488e9a21e730449c10cac6e6f69d255611c93f63c2hding        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
3498e9a21e730449c10cac6e6f69d255611c93f63c2hding        12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
3508e9a21e730449c10cac6e6f69d255611c93f63c2hding        28, 29, 29, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 37,
3518e9a21e730449c10cac6e6f69d255611c93f63c2hding        37, 38, 38, 38, 39, 39, 39, 39
3528e9a21e730449c10cac6e6f69d255611c93f63c2hding    };
3538e9a21e730449c10cac6e6f69d255611c93f63c2hding
3548e9a21e730449c10cac6e6f69d255611c93f63c2hding    ctx->sBiasTables.ui32LritcCacheChunkConfig =
3558db61a0583ecc81f700e0cf13631b21f0b774a73hding        F_ENCODE(ctx->uChunksPerMb, INTEL_CH_PM) |
3568db61a0583ecc81f700e0cf13631b21f0b774a73hding        F_ENCODE(ctx->uMaxChunks, INTEL_CH_MX) |
3578db61a0583ecc81f700e0cf13631b21f0b774a73hding        F_ENCODE(ctx->uMaxChunks - ctx->uPriorityChunks, INTEL_CH_PY);
3588e9a21e730449c10cac6e6f69d255611c93f63c2hding
3598e9a21e730449c10cac6e6f69d255611c93f63c2hding    uIntra8Scale = 0;
3608e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (n = 51; n >= 0; n--) {
3618e9a21e730449c10cac6e6f69d255611c93f63c2hding        IMG_INT32  iX;
3628e9a21e730449c10cac6e6f69d255611c93f63c2hding        IMG_UINT32 uiLambdaSAD, uiLambdaSATD;
3638e9a21e730449c10cac6e6f69d255611c93f63c2hding
3648e9a21e730449c10cac6e6f69d255611c93f63c2hding        iX = n - 12;
3658e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (iX < 0) iX = 0;
3668e9a21e730449c10cac6e6f69d255611c93f63c2hding
3678e9a21e730449c10cac6e6f69d255611c93f63c2hding        uiLambdaSAD  = H264_QPLAMBDA_MAP_SAD[iX];
3688e9a21e730449c10cac6e6f69d255611c93f63c2hding        uiLambdaSATD = H264_QPLAMBDA_MAP_SATD_TABLES[psBiasParams->uLambdaSATDTable][n];
3698e9a21e730449c10cac6e6f69d255611c93f63c2hding
3708e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (psBiasParams->uLambdaSAD  != 0) uiLambdaSAD  = psBiasParams->uLambdaSAD;
3718e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (psBiasParams->uLambdaSATD != 0) uiLambdaSATD = psBiasParams->uLambdaSATD;
3728e9a21e730449c10cac6e6f69d255611c93f63c2hding
3738e9a21e730449c10cac6e6f69d255611c93f63c2hding        // Dont Write QP Values To ESB -- IPE will write these values
3748e9a21e730449c10cac6e6f69d255611c93f63c2hding        // Update the quantization parameter which includes doing Lamda and the Chroma QP
3758e9a21e730449c10cac6e6f69d255611c93f63c2hding        ui32RegVal = PVR_QP_SCALE_CR[n];
3768e9a21e730449c10cac6e6f69d255611c93f63c2hding        ui32RegVal |= (uiLambdaSATD) << 8; //SATD lambda
3778e9a21e730449c10cac6e6f69d255611c93f63c2hding        ui32RegVal |= (uiLambdaSAD) << 16; //SAD lambda
3788e9a21e730449c10cac6e6f69d255611c93f63c2hding
3798e9a21e730449c10cac6e6f69d255611c93f63c2hding        ctx->sBiasTables.aui32LambdaBias[n] = ui32RegVal;
3808e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
3818e9a21e730449c10cac6e6f69d255611c93f63c2hding
3828e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (n = 52; n >= 0; n -= 2) {
3838e9a21e730449c10cac6e6f69d255611c93f63c2hding        IMG_INT8 qp = n;
3848e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (qp > 51) qp = 51;
3858e9a21e730449c10cac6e6f69d255611c93f63c2hding
3868e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (psBiasParams->bRCEnable || psBiasParams->bRCBiases) {
387430ce5c32361119ed81a62c918be6afbdd053eddhding            iInterMBBias_P  = tng__H264ES_inter_bias(qp);
3888e9a21e730449c10cac6e6f69d255611c93f63c2hding            uDirectVecBias_P  = H264_DIRECT_BIAS[n/2];
3898e9a21e730449c10cac6e6f69d255611c93f63c2hding
3908e9a21e730449c10cac6e6f69d255611c93f63c2hding            iInterMBBias_B  = iInterMBBias_P;
3918e9a21e730449c10cac6e6f69d255611c93f63c2hding            uDirectVecBias_B  = uDirectVecBias_P  ;
3928e9a21e730449c10cac6e6f69d255611c93f63c2hding
3938e9a21e730449c10cac6e6f69d255611c93f63c2hding            iIntra16Bias    = 0;
3948e9a21e730449c10cac6e6f69d255611c93f63c2hding            uIntra8Scale    = H264_INTRA8_SCALE[n/2] - 8;
3958e9a21e730449c10cac6e6f69d255611c93f63c2hding
3968e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (psBiasParams->uDirectVecBias != UNINIT_PARAM)
3978e9a21e730449c10cac6e6f69d255611c93f63c2hding                uDirectVecBias_B  = psBiasParams->uDirectVecBias;
3988e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (psBiasParams->iInterMBBiasB != UNINIT_PARAM)
3998e9a21e730449c10cac6e6f69d255611c93f63c2hding                iInterMBBias_B    = psBiasParams->iInterMBBiasB;
4008e9a21e730449c10cac6e6f69d255611c93f63c2hding
4018e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (psBiasParams->uIPESkipVecBias != UNINIT_PARAM)
4028e9a21e730449c10cac6e6f69d255611c93f63c2hding                uDirectVecBias_P  = psBiasParams->uIPESkipVecBias;
4038e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (psBiasParams->iInterMBBias != UNINIT_PARAM)
4048e9a21e730449c10cac6e6f69d255611c93f63c2hding                iInterMBBias_P    = psBiasParams->iInterMBBias;
4058e9a21e730449c10cac6e6f69d255611c93f63c2hding
4068e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (psBiasParams->iIntra16Bias != UNINIT_PARAM) iIntra16Bias    = psBiasParams->iIntra16Bias;
4078e9a21e730449c10cac6e6f69d255611c93f63c2hding        } else {
4088e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (psBiasParams->uDirectVecBias == UNINIT_PARAM || psBiasParams->iInterMBBiasB == UNINIT_PARAM) {
4098e9a21e730449c10cac6e6f69d255611c93f63c2hding                drv_debug_msg(VIDEO_DEBUG_GENERAL, "ERROR: Bias for B pictures not set up ... uDirectVecBias = 0x%x, iInterMBBiasB = 0x%x\n", psBiasParams->uDirectVecBias, psBiasParams->iInterMBBiasB);
4108e9a21e730449c10cac6e6f69d255611c93f63c2hding                abort();
4118e9a21e730449c10cac6e6f69d255611c93f63c2hding            }
4128e9a21e730449c10cac6e6f69d255611c93f63c2hding            uDirectVecBias_B  = psBiasParams->uDirectVecBias;
4138e9a21e730449c10cac6e6f69d255611c93f63c2hding            iInterMBBias_B    = psBiasParams->iInterMBBiasB;
4148e9a21e730449c10cac6e6f69d255611c93f63c2hding
4158e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (psBiasParams->uIPESkipVecBias == UNINIT_PARAM || psBiasParams->iInterMBBias == UNINIT_PARAM) {
4168e9a21e730449c10cac6e6f69d255611c93f63c2hding                drv_debug_msg(VIDEO_DEBUG_GENERAL, "ERROR: Bias for I/P pictures not set up ... uIPESkipVecBias = 0x%x, iInterMBBias = 0x%x\n", psBiasParams->uIPESkipVecBias, psBiasParams->iInterMBBias);
4178e9a21e730449c10cac6e6f69d255611c93f63c2hding                abort();
4188e9a21e730449c10cac6e6f69d255611c93f63c2hding            }
4198e9a21e730449c10cac6e6f69d255611c93f63c2hding            uDirectVecBias_P  = psBiasParams->uIPESkipVecBias;
4208e9a21e730449c10cac6e6f69d255611c93f63c2hding            iInterMBBias_P    = psBiasParams->iInterMBBias;
4218e9a21e730449c10cac6e6f69d255611c93f63c2hding
4228e9a21e730449c10cac6e6f69d255611c93f63c2hding            iIntra16Bias    = psBiasParams->iIntra16Bias;
42313149b728d681c33e036a3e26b1b61d5a8b78204edward lin            uisz2   = psBiasParams->uisz2;
4248e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
4258e9a21e730449c10cac6e6f69d255611c93f63c2hding
4268e9a21e730449c10cac6e6f69d255611c93f63c2hding#ifdef BRN_30029
4278e9a21e730449c10cac6e6f69d255611c93f63c2hding        //adjust the intra8x8 bias so that we don't do anything silly when 8x8 mode is not in use.
4288e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (ctx->ui32PredCombControl & F_ENCODE(1, TOPAZHP_CR_INTRA8X8_DISABLE)) {
4298e9a21e730449c10cac6e6f69d255611c93f63c2hding            iIntra16Bias |= 0x7fff << 16;
4308e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
4318e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
4328e9a21e730449c10cac6e6f69d255611c93f63c2hding//      drv_debug_msg(VIDEO_DEBUG_GENERAL, "qp %d, iIntra16Bias %d, iInterMBBias %d, uDirectVecBias %d\n", qp, iIntra16Bias, iInterMBBias, uDirectVecBias);
4338e9a21e730449c10cac6e6f69d255611c93f63c2hding        ctx->sBiasTables.aui32IntraBias[n] = iIntra16Bias;
4348e9a21e730449c10cac6e6f69d255611c93f63c2hding        ctx->sBiasTables.aui32InterBias_P[n] = iInterMBBias_P;
4358e9a21e730449c10cac6e6f69d255611c93f63c2hding        ctx->sBiasTables.aui32DirectBias_P[n] = uDirectVecBias_P;
4368e9a21e730449c10cac6e6f69d255611c93f63c2hding        ctx->sBiasTables.aui32InterBias_B[n] = iInterMBBias_B;
4378e9a21e730449c10cac6e6f69d255611c93f63c2hding        ctx->sBiasTables.aui32DirectBias_B[n] = uDirectVecBias_B;
4388e9a21e730449c10cac6e6f69d255611c93f63c2hding        ctx->sBiasTables.aui32IntraScale[n] = uIntra8Scale;
4398e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
4408e9a21e730449c10cac6e6f69d255611c93f63c2hding
4418e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (psBiasParams->bRCEnable || psBiasParams->bRCBiases)
44213149b728d681c33e036a3e26b1b61d5a8b78204edward lin        ctx->sBiasTables.ui32sz1 = psBiasParams->uisz1;
4438e9a21e730449c10cac6e6f69d255611c93f63c2hding    else
44413149b728d681c33e036a3e26b1b61d5a8b78204edward lin        ctx->sBiasTables.ui32sz1 = psBiasParams->uisz2;
4458e9a21e730449c10cac6e6f69d255611c93f63c2hding
4468e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (psBiasParams->bZeroDetectionDisable) {
44713149b728d681c33e036a3e26b1b61d5a8b78204edward lin        ctx->sBiasTables.ui32RejectThresholdH264 = F_ENCODE(0, INTEL_H264_ConfigReg1)
44813149b728d681c33e036a3e26b1b61d5a8b78204edward lin                | F_ENCODE(0, INTEL_H264_ConfigReg2);
4498e9a21e730449c10cac6e6f69d255611c93f63c2hding    } else {
45013149b728d681c33e036a3e26b1b61d5a8b78204edward lin        ctx->sBiasTables.ui32RejectThresholdH264 = F_ENCODE(psBiasParams->uzb4, INTEL_H264_ConfigReg1)
45113149b728d681c33e036a3e26b1b61d5a8b78204edward lin                | F_ENCODE(psBiasParams->uzb8, INTEL_H264_ConfigReg2);
4528e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
4538e9a21e730449c10cac6e6f69d255611c93f63c2hding}
4548e9a21e730449c10cac6e6f69d255611c93f63c2hding
4558e9a21e730449c10cac6e6f69d255611c93f63c2hding
4568e9a21e730449c10cac6e6f69d255611c93f63c2hding/**************************************************************************************************
4578e9a21e730449c10cac6e6f69d255611c93f63c2hding* Function:             VIDEO_GenerateBias
4588e9a21e730449c10cac6e6f69d255611c93f63c2hding* Description:  Generate the bias tables
4598e9a21e730449c10cac6e6f69d255611c93f63c2hding*
4608e9a21e730449c10cac6e6f69d255611c93f63c2hding***************************************************************************************************/
461430ce5c32361119ed81a62c918be6afbdd053eddhdingVAStatus tng__generate_bias(context_ENC_p ctx)
4628e9a21e730449c10cac6e6f69d255611c93f63c2hding{
4638e9a21e730449c10cac6e6f69d255611c93f63c2hding    assert(ctx);
4648e9a21e730449c10cac6e6f69d255611c93f63c2hding
4658e9a21e730449c10cac6e6f69d255611c93f63c2hding    switch (ctx->eStandard) {
4668e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_H264:
467430ce5c32361119ed81a62c918be6afbdd053eddhding            tng__H264ES_generate_bias_tables(ctx);
4688e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
4698e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_H263:
470430ce5c32361119ed81a62c918be6afbdd053eddhding            tng__H263ES_generate_bias_tables(ctx);
4718e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
4728e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_MPEG4:
473430ce5c32361119ed81a62c918be6afbdd053eddhding	    tng__MPEG4ES_generate_bias_tables(ctx);
4748e9a21e730449c10cac6e6f69d255611c93f63c2hding	    break;
4758e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
4768e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_MPEG2:
4778e9a21e730449c10cac6e6f69d255611c93f63c2hding                MPEG2_GenerateBiasTables(ctx, psBiasParams);
4788e9a21e730449c10cac6e6f69d255611c93f63c2hding                break;
4798e9a21e730449c10cac6e6f69d255611c93f63c2hding*/
4808e9a21e730449c10cac6e6f69d255611c93f63c2hding        default:
4818e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
4828e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
4838e9a21e730449c10cac6e6f69d255611c93f63c2hding
4848e9a21e730449c10cac6e6f69d255611c93f63c2hding    return VA_STATUS_SUCCESS;
4858e9a21e730449c10cac6e6f69d255611c93f63c2hding}
4868e9a21e730449c10cac6e6f69d255611c93f63c2hding
4878e9a21e730449c10cac6e6f69d255611c93f63c2hding//load bias
4888e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT H264_LAMBDA_COEFFS[4][3] = {
4898e9a21e730449c10cac6e6f69d255611c93f63c2hding	{175, -10166, 163244 },	 //SATD Lambda High
4908e9a21e730449c10cac6e6f69d255611c93f63c2hding	{ 16,   -236,   8693 },  //SATD Lambda Low
4918e9a21e730449c10cac6e6f69d255611c93f63c2hding	{198, -12240, 198865 },	 //SAD Lambda High
4928e9a21e730449c10cac6e6f69d255611c93f63c2hding	{ 12,   -176,   1402 },  //SAD Lambda Low
4938e9a21e730449c10cac6e6f69d255611c93f63c2hding};
4948e9a21e730449c10cac6e6f69d255611c93f63c2hding
4958e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT MPEG4_LAMBDA_COEFFS[3] = {
4968e9a21e730449c10cac6e6f69d255611c93f63c2hding	0, 458, 1030
4978e9a21e730449c10cac6e6f69d255611c93f63c2hding};
4988e9a21e730449c10cac6e6f69d255611c93f63c2hding
4998e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic IMG_INT H263_LAMBDA_COEFFS[3] = {
5008e9a21e730449c10cac6e6f69d255611c93f63c2hding	0, 333, 716
5018e9a21e730449c10cac6e6f69d255611c93f63c2hding};
5028e9a21e730449c10cac6e6f69d255611c93f63c2hding
503430ce5c32361119ed81a62c918be6afbdd053eddhdingstatic void tng__H263ES_load_bias_tables(
5048e9a21e730449c10cac6e6f69d255611c93f63c2hding    context_ENC_p ctx,
505cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    IMG_FRAME_TYPE __maybe_unused eFrameType)
5068e9a21e730449c10cac6e6f69d255611c93f63c2hding{
5078e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT32 n;
508e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 ui32RegVal;
5098e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 count = 0, cmd_word = 0;
510430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_p cmdbuf = ctx->obj_context->tng_cmdbuf;
5118e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BIAS_TABLES* psBiasTables = &(ctx->sBiasTables);
5128e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 *pCount;
513e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 ui8Pipe;
5148e9a21e730449c10cac6e6f69d255611c93f63c2hding
5158e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmd_word = (MTX_CMDID_SW_WRITEREG & MTX_CMDWORD_ID_MASK) << MTX_CMDWORD_ID_SHIFT;
5168e9a21e730449c10cac6e6f69d255611c93f63c2hding    *cmdbuf->cmd_idx++ = cmd_word;
5178e9a21e730449c10cac6e6f69d255611c93f63c2hding    pCount = cmdbuf->cmd_idx;
5188e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_idx++;
5198e9a21e730449c10cac6e6f69d255611c93f63c2hding
5208e9a21e730449c10cac6e6f69d255611c93f63c2hding    ctx->ui32CoreRev = 0x00030401;
5218e9a21e730449c10cac6e6f69d255611c93f63c2hding
522e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
523430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, TOPAZHP_CR_SEQUENCER_CONFIG, 0, psBiasTables->ui32SeqConfigInit);
5248e9a21e730449c10cac6e6f69d255611c93f63c2hding
5258e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ctx->ui32CoreRev <= MAX_32_REV)
5268e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
5278e9a21e730449c10cac6e6f69d255611c93f63c2hding	for(n=31;n>=1;n--)
5288e9a21e730449c10cac6e6f69d255611c93f63c2hding	{
5298e9a21e730449c10cac6e6f69d255611c93f63c2hding	    //FIXME: Zhaohan, missing register TOPAZHP_TOP_CR_LAMBDA_DC_TABLE
530430ce5c32361119ed81a62c918be6afbdd053eddhding	    //tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_LAMBDA_DC_TABLE, 0, psBiasTables->aui32LambdaBias[n]);
5318e9a21e730449c10cac6e6f69d255611c93f63c2hding	}
5328e9a21e730449c10cac6e6f69d255611c93f63c2hding    } else {
5338e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal = (((H263_LAMBDA_COEFFS[0]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00));
5348e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal |= (((H263_LAMBDA_COEFFS[1]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00));
535430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_0, 0, ui32RegVal);
5368e9a21e730449c10cac6e6f69d255611c93f63c2hding
5378e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal = (((H263_LAMBDA_COEFFS[2]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01));
538430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_0, 0, ui32RegVal);
5398e9a21e730449c10cac6e6f69d255611c93f63c2hding
5408e9a21e730449c10cac6e6f69d255611c93f63c2hding	ui32RegVal = 0x3f;
541430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_0, 0, ui32RegVal);
5428e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5438e9a21e730449c10cac6e6f69d255611c93f63c2hding
5448e9a21e730449c10cac6e6f69d255611c93f63c2hding    for(n=31;n>=1;n-=2)
5458e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
546430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_BIAS_TABLE, 0, psBiasTables->aui32IntraBias[n]);
547430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_P[n]);
548430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_P[n]);
5498e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5508e9a21e730449c10cac6e6f69d255611c93f63c2hding
551e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
55213149b728d681c33e036a3e26b1b61d5a8b78204edward lin	tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_SZ, 0, psBiasTables->ui32sz1);
5538e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5548e9a21e730449c10cac6e6f69d255611c93f63c2hding
555e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
5568db61a0583ecc81f700e0cf13631b21f0b774a73hding        tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_CHCF, 0, psBiasTables->ui32LritcCacheChunkConfig);
5578e9a21e730449c10cac6e6f69d255611c93f63c2hding
5588e9a21e730449c10cac6e6f69d255611c93f63c2hding    *pCount = count;
5598e9a21e730449c10cac6e6f69d255611c93f63c2hding}
5608e9a21e730449c10cac6e6f69d255611c93f63c2hding
561430ce5c32361119ed81a62c918be6afbdd053eddhdingstatic void tng__MPEG4_load_bias_tables(context_ENC_p ctx)
5628e9a21e730449c10cac6e6f69d255611c93f63c2hding{
5638e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT32 n;
564e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 ui32RegVal;
5658e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 count = 0, cmd_word = 0;
566430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_p cmdbuf = ctx->obj_context->tng_cmdbuf;
5678e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BIAS_TABLES* psBiasTables = &(ctx->sBiasTables);
5688e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 *pCount;
569e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT8 ui8Pipe;
5708e9a21e730449c10cac6e6f69d255611c93f63c2hding
5718e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmd_word = (MTX_CMDID_SW_WRITEREG & MTX_CMDWORD_ID_MASK) << MTX_CMDWORD_ID_SHIFT;
5728e9a21e730449c10cac6e6f69d255611c93f63c2hding    *cmdbuf->cmd_idx++ = cmd_word;
5738e9a21e730449c10cac6e6f69d255611c93f63c2hding    pCount = cmdbuf->cmd_idx;
5748e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_idx++;
5758e9a21e730449c10cac6e6f69d255611c93f63c2hding
5768e9a21e730449c10cac6e6f69d255611c93f63c2hding    ctx->ui32CoreRev = 0x00030401;
5778e9a21e730449c10cac6e6f69d255611c93f63c2hding
578e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
579430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, TOPAZHP_CR_SEQUENCER_CONFIG, 0, psBiasTables->ui32SeqConfigInit);
5808e9a21e730449c10cac6e6f69d255611c93f63c2hding
5818e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ctx->ui32CoreRev <= MAX_32_REV) {
5828e9a21e730449c10cac6e6f69d255611c93f63c2hding        for (n=31; n >= 1; n--) {
5838e9a21e730449c10cac6e6f69d255611c93f63c2hding	    //FIXME: Zhaohan, missing register TOPAZHP_TOP_CR_LAMBDA_DC_TABLE
584430ce5c32361119ed81a62c918be6afbdd053eddhding            //tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_LAMBDA_DC_TABLE, 0, psBiasTables->aui32LambdaBias[n]);
5858e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
5868e9a21e730449c10cac6e6f69d255611c93f63c2hding    } else {
5878e9a21e730449c10cac6e6f69d255611c93f63c2hding	    //ui32RegVal = MPEG4_LAMBDA_COEFFS[0]| (MPEG4_LAMBDA_COEFFS[1]<<8);
5888e9a21e730449c10cac6e6f69d255611c93f63c2hding	    ui32RegVal = (((MPEG4_LAMBDA_COEFFS[0]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00));
5898e9a21e730449c10cac6e6f69d255611c93f63c2hding	    ui32RegVal |= (((MPEG4_LAMBDA_COEFFS[1]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00));
5908e9a21e730449c10cac6e6f69d255611c93f63c2hding
591430ce5c32361119ed81a62c918be6afbdd053eddhding	    tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_0, 0, ui32RegVal);
5928e9a21e730449c10cac6e6f69d255611c93f63c2hding	    //ui32RegVal = MPEG4_LAMBDA_COEFFS[2];
5938e9a21e730449c10cac6e6f69d255611c93f63c2hding	    ui32RegVal = (((MPEG4_LAMBDA_COEFFS[2]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01));
5948e9a21e730449c10cac6e6f69d255611c93f63c2hding
595430ce5c32361119ed81a62c918be6afbdd053eddhding	    tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_0, 0, ui32RegVal);
5968e9a21e730449c10cac6e6f69d255611c93f63c2hding
5978e9a21e730449c10cac6e6f69d255611c93f63c2hding	    ui32RegVal = 0x3f;
598430ce5c32361119ed81a62c918be6afbdd053eddhding	    tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_0, 0, ui32RegVal);
5998e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6008e9a21e730449c10cac6e6f69d255611c93f63c2hding
6018e9a21e730449c10cac6e6f69d255611c93f63c2hding    for(n=31;n>=1;n-=2)
6028e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
603430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_BIAS_TABLE, 0, psBiasTables->aui32IntraBias[n]);
604430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_P[n]);
605430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_P[n]);
6068e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6078e9a21e730449c10cac6e6f69d255611c93f63c2hding
608e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
60913149b728d681c33e036a3e26b1b61d5a8b78204edward lin	tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_SZ, 0, psBiasTables->ui32sz1);
6108e9a21e730449c10cac6e6f69d255611c93f63c2hding
6118e9a21e730449c10cac6e6f69d255611c93f63c2hding	//VLC RSize is fcode - 1 and only done for mpeg4 AND mpeg2 not H263
612430ce5c32361119ed81a62c918be6afbdd053eddhding	tng_cmdbuf_insert_reg_write(TOPAZ_VLC_REG, TOPAZ_VLC_CR_VLC_MPEG4_CFG, 0, F_ENCODE(psBiasTables->ui32FCode - 1, TOPAZ_VLC_CR_RSIZE));
6138e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6148e9a21e730449c10cac6e6f69d255611c93f63c2hding
615e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
6168db61a0583ecc81f700e0cf13631b21f0b774a73hding        tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_CHCF, 0, psBiasTables->ui32LritcCacheChunkConfig);
6178e9a21e730449c10cac6e6f69d255611c93f63c2hding
6188e9a21e730449c10cac6e6f69d255611c93f63c2hding    *pCount = count;
6198e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6208e9a21e730449c10cac6e6f69d255611c93f63c2hding
621430ce5c32361119ed81a62c918be6afbdd053eddhdingstatic void tng__H264ES_load_bias_tables(
6228e9a21e730449c10cac6e6f69d255611c93f63c2hding    context_ENC_p ctx,
6238e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_FRAME_TYPE eFrameType)
6248e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6258e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_INT32 n;
6268e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 ui32RegVal;
6278e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BIAS_TABLES* psBiasTables = &(ctx->sBiasTables);
628430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_p cmdbuf = ctx->obj_context->tng_cmdbuf;
6298e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 count = 0, cmd_word = 0;
6308e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 *pCount;
631e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 ui8Pipe;
63296b0e013cefb77a845b6533d4c2ecf6f0aa429fcedward lin    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: start\n", __FUNCTION__);
6338e9a21e730449c10cac6e6f69d255611c93f63c2hding
6348e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmd_word = (MTX_CMDID_SW_WRITEREG & MTX_CMDWORD_ID_MASK) << MTX_CMDWORD_ID_SHIFT;
6358e9a21e730449c10cac6e6f69d255611c93f63c2hding    *cmdbuf->cmd_idx++ = cmd_word;
6368e9a21e730449c10cac6e6f69d255611c93f63c2hding    pCount = cmdbuf->cmd_idx;
6378e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_idx++;
6388e9a21e730449c10cac6e6f69d255611c93f63c2hding
6398e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasTables->ui32SeqConfigInit = 0x40038412;
6408e9a21e730449c10cac6e6f69d255611c93f63c2hding
641e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
642430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, TOPAZHP_CR_SEQUENCER_CONFIG, 0, psBiasTables->ui32SeqConfigInit);
6438e9a21e730449c10cac6e6f69d255611c93f63c2hding
6448e9a21e730449c10cac6e6f69d255611c93f63c2hding    ctx->ui32CoreRev = 0x00030401;
6458e9a21e730449c10cac6e6f69d255611c93f63c2hding
6468e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ctx->ui32CoreRev <= MAX_32_REV) {
6478e9a21e730449c10cac6e6f69d255611c93f63c2hding        for (n=51; n >= 0; n--) {
6488e9a21e730449c10cac6e6f69d255611c93f63c2hding	    //FIXME: Zhaohan, missing register TOPAZHP_TOP_CR_LAMBDA_DC_TABLE
649430ce5c32361119ed81a62c918be6afbdd053eddhding            //tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_LAMBDA_DC_TABLE, 0, psBiasTables->aui32LambdaBias[n]);
6508e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
6518e9a21e730449c10cac6e6f69d255611c93f63c2hding    } else {
6528e9a21e730449c10cac6e6f69d255611c93f63c2hding        //Load the lambda coeffs
6538e9a21e730449c10cac6e6f69d255611c93f63c2hding        for (n = 0; n < 4; n++) {
6548e9a21e730449c10cac6e6f69d255611c93f63c2hding            //ui32RegVal = H264_LAMBDA_COEFFS[n][0]| (H264_LAMBDA_COEFFS[n][1]<<8);
6558e9a21e730449c10cac6e6f69d255611c93f63c2hding            ui32RegVal = (((H264_LAMBDA_COEFFS[n][0]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00));
6568e9a21e730449c10cac6e6f69d255611c93f63c2hding            ui32RegVal |= (((H264_LAMBDA_COEFFS[n][1]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00));
6578e9a21e730449c10cac6e6f69d255611c93f63c2hding
658430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_0, 0, ui32RegVal);
659430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_1, 0, ui32RegVal);
660430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_2, 0, ui32RegVal);
6618e9a21e730449c10cac6e6f69d255611c93f63c2hding
6628e9a21e730449c10cac6e6f69d255611c93f63c2hding            //ui32RegVal = H264_LAMBDA_COEFFS[n][2];
6638e9a21e730449c10cac6e6f69d255611c93f63c2hding            ui32RegVal = (((H264_LAMBDA_COEFFS[n][2]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01));
6648e9a21e730449c10cac6e6f69d255611c93f63c2hding
665430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_0, 0, ui32RegVal);
666430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_1, 0, ui32RegVal);
667430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_2, 0, ui32RegVal);
6688e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
6698e9a21e730449c10cac6e6f69d255611c93f63c2hding        ui32RegVal = 29 |(29<<6);
670430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_0, 0, ui32RegVal);
671430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_1, 0, ui32RegVal);
672430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_2, 0, ui32RegVal);
6738e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6748e9a21e730449c10cac6e6f69d255611c93f63c2hding
6758e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (n=52;n>=0;n-=2) {
6768e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (eFrameType == IMG_INTER_B) {
677430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_B[n]);
678430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_B[n]);
6798e9a21e730449c10cac6e6f69d255611c93f63c2hding        } else {
680430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_P[n]);
681430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_P[n]);
6828e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
683430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_BIAS_TABLE, 0, psBiasTables->aui32IntraBias[n]);
684430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_SCALE_TABLE, 0, psBiasTables->aui32IntraScale[n]);
6858e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6868e9a21e730449c10cac6e6f69d255611c93f63c2hding
6878e9a21e730449c10cac6e6f69d255611c93f63c2hding    //aui32HpCoreRegId[ui32Pipe]
688e26d82700f9514cc175d2b54733ebdeb8824922ehding    for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
68913149b728d681c33e036a3e26b1b61d5a8b78204edward lin        tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_SZ, 0, psBiasTables->ui32sz1);
6908db61a0583ecc81f700e0cf13631b21f0b774a73hding        tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_H264_RT, 0, psBiasTables->ui32RejectThresholdH264);
6918e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6928e9a21e730449c10cac6e6f69d255611c93f63c2hding
693430ce5c32361119ed81a62c918be6afbdd053eddhding//    tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_FIRMWARE_REG_1, (MTX_SCRATCHREG_TOMTX<<2), ui32BuffersReg);
694430ce5c32361119ed81a62c918be6afbdd053eddhding//    tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_FIRMWARE_REG_1, (MTX_SCRATCHREG_TOHOST<<2),ui32ToHostReg);
6958e9a21e730449c10cac6e6f69d255611c93f63c2hding
6968e9a21e730449c10cac6e6f69d255611c93f63c2hding    // now setup the LRITC chache priority
6978e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
6988e9a21e730449c10cac6e6f69d255611c93f63c2hding        //aui32HpCoreRegId[ui32Pipe]
699e26d82700f9514cc175d2b54733ebdeb8824922ehding        for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
7008db61a0583ecc81f700e0cf13631b21f0b774a73hding            tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_CHCF, 0, psBiasTables->ui32LritcCacheChunkConfig);
7018e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
7028e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
70396b0e013cefb77a845b6533d4c2ecf6f0aa429fcedward lin    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: count = %d\n", __FUNCTION__, (int)count);
7048e9a21e730449c10cac6e6f69d255611c93f63c2hding
7058e9a21e730449c10cac6e6f69d255611c93f63c2hding    *pCount = count;
7068e9a21e730449c10cac6e6f69d255611c93f63c2hding}
7078e9a21e730449c10cac6e6f69d255611c93f63c2hding
708430ce5c32361119ed81a62c918be6afbdd053eddhdingVAStatus tng_load_bias(context_ENC_p ctx, IMG_FRAME_TYPE eFrameType)
7098e9a21e730449c10cac6e6f69d255611c93f63c2hding{
7108e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_STANDARD eStandard = ctx->eStandard;
7118e9a21e730449c10cac6e6f69d255611c93f63c2hding
7128e9a21e730449c10cac6e6f69d255611c93f63c2hding    switch (eStandard) {
7138e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_H264:
714430ce5c32361119ed81a62c918be6afbdd053eddhding            tng__H264ES_load_bias_tables(ctx, eFrameType); //IMG_INTER_P);
7158e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
7168e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_H263:
717430ce5c32361119ed81a62c918be6afbdd053eddhding            tng__H263ES_load_bias_tables(ctx, eFrameType); //IMG_INTER_P);
7188e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
7198e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_MPEG4:
720430ce5c32361119ed81a62c918be6afbdd053eddhding            tng__MPEG4_load_bias_tables(ctx);
7218e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
7228e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
7238e9a21e730449c10cac6e6f69d255611c93f63c2hding        case IMG_STANDARD_MPEG2:
724430ce5c32361119ed81a62c918be6afbdd053eddhding            tng__MPEG2_LoadBiasTables(psBiasTables);
7258e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
7268e9a21e730449c10cac6e6f69d255611c93f63c2hding*/
7278e9a21e730449c10cac6e6f69d255611c93f63c2hding        default:
7288e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
7298e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
7308e9a21e730449c10cac6e6f69d255611c93f63c2hding
7318e9a21e730449c10cac6e6f69d255611c93f63c2hding    return VA_STATUS_SUCCESS;
7328e9a21e730449c10cac6e6f69d255611c93f63c2hding}
7338e9a21e730449c10cac6e6f69d255611c93f63c2hding
734430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_init_bias_params(context_ENC_p ctx)
7358e9a21e730449c10cac6e6f69d255611c93f63c2hding{
7368e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_BIAS_PARAMS * psBiasParams = &(ctx->sBiasParams);
7378e9a21e730449c10cac6e6f69d255611c93f63c2hding    memset(psBiasParams, 0, sizeof(IMG_BIAS_PARAMS));
7388e9a21e730449c10cac6e6f69d255611c93f63c2hding    //default
7398e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uLambdaSAD = 0;
7408e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uLambdaSATD = 0;
7418e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uLambdaSATDTable = 0;
7428e9a21e730449c10cac6e6f69d255611c93f63c2hding
7438e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->bRCEnable = ctx->sRCParams.bRCEnable;
7448e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->bRCBiases = IMG_TRUE;
7458e9a21e730449c10cac6e6f69d255611c93f63c2hding
7468e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->iIntra16Bias = UNINIT_PARAM;
7478e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->iInterMBBias = UNINIT_PARAM;
7488e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->iInterMBBiasB = UNINIT_PARAM;
7498e9a21e730449c10cac6e6f69d255611c93f63c2hding
7508e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uDirectVecBias = UNINIT_PARAM;
7518e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uIPESkipVecBias = UNINIT_PARAM;
7528e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uSPESkipVecBias = 0;      //not in spec
7538e9a21e730449c10cac6e6f69d255611c93f63c2hding
75413149b728d681c33e036a3e26b1b61d5a8b78204edward lin    psBiasParams->uisz1 = 6;
75513149b728d681c33e036a3e26b1b61d5a8b78204edward lin    psBiasParams->uisz2 = 6;
7568e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->bZeroDetectionDisable = TOPAZHP_DEFAULT_bZeroDetectionDisable;
7578e9a21e730449c10cac6e6f69d255611c93f63c2hding
75813149b728d681c33e036a3e26b1b61d5a8b78204edward lin    psBiasParams->uzb4 = 6;
75913149b728d681c33e036a3e26b1b61d5a8b78204edward lin    psBiasParams->uzb8 = 4;
7608e9a21e730449c10cac6e6f69d255611c93f63c2hding
7618e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uTHInter = TOPAZHP_DEFAULT_uTHInter;
7628e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uTHInterQP = TOPAZHP_DEFAULT_uTHInterQP;
7638e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uTHInterMaxLevel = TOPAZHP_DEFAULT_uTHInterMaxLevel;
7648e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uTHSkipIPE = TOPAZHP_DEFAULT_uTHSkipIPE;
7658e9a21e730449c10cac6e6f69d255611c93f63c2hding    psBiasParams->uTHSkipSPE = TOPAZHP_DEFAULT_uTHSkipSPE;
7668e9a21e730449c10cac6e6f69d255611c93f63c2hding}
767