Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
      3  * Copyright (c) Imagination Technologies Limited, UK
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sub license, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     20  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
     21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  *
     25  * Authors:
     26  *    Edward Lin <edward.lin (at) intel.com>
     27  *
     28  */
     29 
     30 #include <unistd.h>
     31 #include <stdio.h>
     32 #include <memory.h>
     33 #include "hwdefs/topazhp_core_regs.h"
     34 #include "hwdefs/topaz_vlc_regs.h"
     35 #include "hwdefs/topazhp_multicore_regs.h"
     36 #include "hwdefs/topazhp_multicore_regs_old.h"
     37 #include "psb_drv_video.h"
     38 #include "tng_cmdbuf.h"
     39 #include "tng_hostbias.h"
     40 #include "psb_drv_debug.h"
     41 #include <stdlib.h>
     42 
     43 #define UNINIT_PARAM 0xCDCDCDCD
     44 #define TOPAZHP_DEFAULT_bZeroDetectionDisable IMG_FALSE
     45 #define TH_SKIP_IPE                      6
     46 #define TH_INTER                           60
     47 #define TH_INTER_QP                    10
     48 #define TH_INTER_MAX_LEVEL      1500
     49 #define TH_SKIP_SPE                     6
     50 
     51 #define TOPAZHP_DEFAULT_uTHInter                           TH_INTER
     52 #define TOPAZHP_DEFAULT_uTHInterQP                      TH_INTER_QP
     53 #define TOPAZHP_DEFAULT_uTHInterMaxLevel		     TH_INTER_MAX_LEVEL
     54 #define TOPAZHP_DEFAULT_uTHSkipIPE                      TH_SKIP_IPE
     55 #define TOPAZHP_DEFAULT_uTHSkipSPE                      TH_SKIP_SPE
     56 
     57 #define MIN_32_REV 0x00030200
     58 #define MAX_32_REV 0x00030299
     59 // New MP4 Lambda table
     60 static IMG_UINT8 MPEG4_QPLAMBDA_MAP[31] = {
     61     0,  0,  1,  2,  3,
     62     3,  4,  4,  5,  5,
     63     6,  6,  7,  7,  8,
     64     8,  9,  9,  10, 10,
     65     11, 11, 11, 11, 12,
     66     12, 12, 12, 13, 13, 13
     67 };
     68 
     69 static IMG_UINT8 H263_QPLAMBDA_MAP[31] = {
     70     0, 0, 1, 1, 2,
     71     2, 3, 3, 4, 4,
     72     4, 5, 5, 5, 6,
     73     6, 6, 7, 7, 7,
     74     7, 8, 8, 8, 8,
     75     9, 9, 9, 9, 10,10
     76 };
     77 
     78 // new H.264 Lambda
     79 static IMG_INT8 H264_QPLAMBDA_MAP_SAD[40] = {
     80     2, 2, 2, 2, 3, 3, 4, 4,
     81     4, 5, 5, 5, 5, 5, 6, 6,
     82     6, 7, 7, 7, 8, 8, 9, 11,
     83     13, 14, 15, 17, 20, 23, 27, 31,
     84     36, 41, 51, 62, 74, 79, 85, 91
     85 };
     86 
     87 static IMG_INT8 H264_QPLAMBDA_MAP_SATD_TABLES[][52] = {
     88     //table 0
     89     {
     90         8,  8,  8,  8,  8,  8,  8,
     91         8,  8,  8,  8,  8,  8,  8,
     92         8,  8,  8,  9,  9,     10, 10,
     93         11, 11, 12, 12, 13,     13, 14,
     94         14, 15, 15, 16, 17,     18, 20,
     95         21, 23, 25, 27, 30,     32, 38,
     96         44, 50, 56, 63, 67,     72, 77,
     97         82, 87, 92
     98     },
     99 };
    100 
    101 static IMG_INT32 H264_DIRECT_BIAS[27] = {
    102     24, 24, 24, 24, 24, 24, 24, 24, 36,
    103     48, 48, 60, 60, 72, 72, 84, 96, 108,
    104     200, 324, 384, 528, 672, 804, 924, 1044, 1104
    105 };
    106 
    107 static IMG_INT32 H264_INTRA8_SCALE[27] = {
    108     (234 + 8) >> 4, (231 + 8) >> 4,
    109     (226 + 8) >> 4, (221 + 8) >> 4,
    110     (217 + 8) >> 4, (213 + 8) >> 4,
    111     (210 + 8) >> 4, (207 + 8) >> 4,
    112     (204 + 8) >> 4, (202 + 8) >> 4,
    113     (200 + 8) >> 4, (199 + 8) >> 4,
    114     (197 + 8) >> 4, (197 + 8) >> 4,
    115     (196 + 8) >> 4, (196 + 8) >> 4,
    116     (197 + 8) >> 4, (197 + 8) >> 4,
    117     (198 + 8) >> 4, (200 + 8) >> 4,
    118     (202 + 8) >> 4, (204 + 8) >> 4,
    119     (207 + 8) >> 4, (210 + 8) >> 4,
    120     (213 + 8) >> 4, (217 + 8) >> 4,
    121     (217 + 8) >> 4
    122 };
    123 
    124 /***********************************************************************************
    125 * Function Name : H264InterBias
    126 * Inputs                                : ui8QP
    127 * Outputs                               :
    128 * Returns                               : IMG_INT16
    129 * Description           : return the Inter Bias Value to use for the given QP
    130   ************************************************************************************/
    131 
    132 static IMG_INT16 H264_InterIntraBias[27] = {
    133     20, 20, 20, 20, 20, 20, 50,
    134     100, 210, 420, 420, 445, 470,
    135     495, 520, 535, 550, 570, 715,
    136     860, 900, 1000, 1200, 1400,
    137     1600, 1800, 2000
    138 };
    139 
    140 static IMG_INT16 tng__H264ES_inter_bias(IMG_INT8 i8QP)
    141 {
    142     if (i8QP < 1) {
    143         i8QP = 1;
    144     }
    145     if (i8QP > 51) {
    146         i8QP = 51;
    147     }
    148 
    149     //return aui16InterBiasValues[i8QP-36];
    150     return H264_InterIntraBias[(i8QP+1)>>1];
    151 }
    152 
    153 /*****************************************************************************
    154  *  Function Name      : CalculateDCScaler
    155  *  Inputs             : iQP, bChroma
    156  *  Outputs            : iDCScaler
    157  *  Returns            : IMG_INT
    158  *  Description        : Calculates either the Luma or Chroma DC scaler from the quantization scaler
    159  *******************************************************************************/
    160 IMG_INT
    161 CalculateDCScaler(IMG_INT iQP, IMG_BOOL bChroma)
    162 {
    163     IMG_INT     iDCScaler;
    164     if(!bChroma)
    165     {
    166         if (iQP > 0 && iQP < 5)
    167         {
    168             iDCScaler = 8;
    169         }
    170         else if (iQP > 4 &&     iQP     < 9)
    171         {
    172             iDCScaler = 2 * iQP;
    173         }
    174         else if (iQP > 8 &&     iQP     < 25)
    175         {
    176             iDCScaler = iQP + 8;
    177         }
    178         else
    179         {
    180             iDCScaler = 2 * iQP -16;
    181         }
    182     }
    183     else
    184     {
    185         if (iQP > 0 && iQP < 5)
    186         {
    187             iDCScaler = 8;
    188         }
    189         else if (iQP > 4 &&     iQP     < 25)
    190         {
    191             iDCScaler = (iQP + 13) / 2;
    192         }
    193         else
    194         {
    195             iDCScaler = iQP - 6;
    196         }
    197     }
    198     return iDCScaler;
    199 }
    200 
    201 /**************************************************************************************************
    202 * Function:		MPEG4_GenerateBiasTables
    203 * Description:	Genereate the bias tables for MPEG4
    204 *
    205 ***************************************************************************************************/
    206 void
    207 tng__MPEG4ES_generate_bias_tables(
    208 	context_ENC_p ctx)
    209 {
    210     IMG_INT16 n;
    211     IMG_INT16 iX;
    212     IMG_UINT32 ui32RegVal;
    213     IMG_UINT8 uiDCScaleL,uiDCScaleC,uiLambda;
    214     IMG_UINT32 uDirectVecBias,iInterMBBias,iIntra16Bias;
    215     IMG_BIAS_PARAMS *psBiasParams = &(ctx->sBiasParams);
    216 
    217     ctx->sBiasTables.ui32LritcCacheChunkConfig = F_ENCODE(ctx->uChunksPerMb, INTEL_CH_PM) |
    218 						 F_ENCODE(ctx->uMaxChunks, INTEL_CH_MX) |
    219 						 F_ENCODE(ctx->uMaxChunks - ctx->uPriorityChunks, INTEL_CH_PY);
    220 
    221 
    222     for(n=31;n>=1;n--)
    223     {
    224 	iX = n-12;
    225 	if(iX < 0)
    226 	{
    227 	    iX = 0;
    228 	}
    229 	// Dont Write QP Values To ESB -- IPE will write these values
    230 	// Update the quantization parameter which includes doing Lamda and the Chroma QP
    231 
    232 	uiDCScaleL = CalculateDCScaler(n, IMG_FALSE);
    233 	uiDCScaleC = CalculateDCScaler(n, IMG_TRUE);
    234 	uiLambda = psBiasParams->uLambdaSAD ? psBiasParams->uLambdaSAD : MPEG4_QPLAMBDA_MAP[n - 1];
    235 
    236 	ui32RegVal = uiDCScaleL;
    237 	ui32RegVal |= (uiDCScaleC)<<8;
    238 	ui32RegVal |= (uiLambda)<<16;
    239 	ctx->sBiasTables.aui32LambdaBias[n] = ui32RegVal;
    240     }
    241 
    242     for(n=31;n>=1;n-=2) {
    243         if(psBiasParams->bRCEnable || psBiasParams->bRCBiases) {
    244             uDirectVecBias = psBiasParams->uTHSkipIPE * uiLambda;
    245             iInterMBBias    = psBiasParams->uTHInter * (n - psBiasParams->uTHInterQP);
    246             //if(iInterMBBias < 0)
    247             //    iInterMBBias	= 0;
    248             if(iInterMBBias > psBiasParams->uTHInterMaxLevel)
    249                 iInterMBBias	= psBiasParams->uTHInterMaxLevel;
    250             iIntra16Bias = 0;
    251         } else {
    252             uDirectVecBias  = psBiasParams->uIPESkipVecBias;
    253             iInterMBBias    = psBiasParams->iInterMBBias;
    254             iIntra16Bias    = psBiasParams->iIntra16Bias;
    255         }
    256 
    257         ctx->sBiasTables.aui32IntraBias[n] = iIntra16Bias;
    258         ctx->sBiasTables.aui32InterBias_P[n] = iInterMBBias;
    259         ctx->sBiasTables.aui32DirectBias_P[n] = uDirectVecBias;
    260     }
    261 
    262     if(psBiasParams->bRCEnable || psBiasParams->bRCBiases)
    263         ctx->sBiasTables.ui32sz1 = psBiasParams->uisz1;
    264     else
    265         ctx->sBiasTables.ui32sz1 = psBiasParams->uisz2;
    266 }
    267 
    268 /**************************************************************************************************
    269 * Function:		H263_GenerateBiasTables
    270 * Description:	Genereate the bias tables for H.263
    271 *
    272 ***************************************************************************************************/
    273 void
    274 tng__H263ES_generate_bias_tables(
    275 	context_ENC_p ctx)
    276 {
    277     IMG_INT16 n;
    278     IMG_INT16 iX;
    279     IMG_UINT32 ui32RegVal;
    280     IMG_UINT8 uiDCScaleL,uiDCScaleC,uiLambda;
    281     IMG_UINT32 uDirectVecBias,iInterMBBias,iIntra16Bias;
    282     IMG_BIAS_PARAMS * psBiasParams = &(ctx->sBiasParams);
    283 
    284     ctx->sBiasTables.ui32LritcCacheChunkConfig = F_ENCODE(ctx->uChunksPerMb, INTEL_CH_PM) |
    285 						 F_ENCODE(ctx->uMaxChunks, INTEL_CH_MX) |
    286 						 F_ENCODE(ctx->uMaxChunks - ctx->uPriorityChunks, INTEL_CH_PY);
    287 
    288     for(n=31;n>=1;n--)
    289     {
    290 	iX = n-12;
    291 	if(iX < 0)
    292 	{
    293 	    iX = 0;
    294 	}
    295 	// Dont Write QP Values To ESB -- IPE will write these values
    296 	// Update the quantization parameter which includes doing Lamda and the Chroma QP
    297 
    298 	uiDCScaleL	= CalculateDCScaler(n, IMG_FALSE);
    299 	uiDCScaleC	= CalculateDCScaler(n, IMG_TRUE);
    300 	uiLambda	= psBiasParams->uLambdaSAD ? psBiasParams->uLambdaSAD : H263_QPLAMBDA_MAP[n - 1];
    301 
    302 	ui32RegVal=uiDCScaleL;
    303 	ui32RegVal |= (uiDCScaleC)<<8;
    304 	ui32RegVal |= (uiLambda)<<16;
    305 
    306    	ctx->sBiasTables.aui32LambdaBias[n] = ui32RegVal;
    307     }
    308 
    309     for(n=31;n>=1;n-=2) {
    310         if(psBiasParams->bRCEnable || psBiasParams->bRCBiases) {
    311             uDirectVecBias = psBiasParams->uTHSkipIPE * uiLambda;
    312             iInterMBBias    = psBiasParams->uTHInter * (n - psBiasParams->uTHInterQP);
    313             //if(iInterMBBias < 0)
    314             //    iInterMBBias	= 0;
    315             if(iInterMBBias > psBiasParams->uTHInterMaxLevel)
    316                 iInterMBBias	= psBiasParams->uTHInterMaxLevel;
    317             iIntra16Bias = 0;
    318         } else {
    319             uDirectVecBias  = psBiasParams->uIPESkipVecBias;
    320             iInterMBBias    = psBiasParams->iInterMBBias;
    321             iIntra16Bias    = psBiasParams->iIntra16Bias;
    322         }
    323 
    324         ctx->sBiasTables.aui32IntraBias[n] = iIntra16Bias;
    325         ctx->sBiasTables.aui32InterBias_P[n] = iInterMBBias;
    326         ctx->sBiasTables.aui32DirectBias_P[n] = uDirectVecBias;
    327     }
    328 
    329     if(psBiasParams->bRCEnable || psBiasParams->bRCBiases)
    330         ctx->sBiasTables.ui32sz1 = psBiasParams->uisz1;
    331     else
    332         ctx->sBiasTables.ui32sz1 = psBiasParams->uisz2;
    333 }
    334 
    335 /**************************************************************************************************
    336 * Function:             H264_GenerateBiasTables
    337 * Description:  Generate the bias tables for H.264
    338 *
    339 ***************************************************************************************************/
    340 static void tng__H264ES_generate_bias_tables(context_ENC_p ctx)
    341 {
    342     IMG_INT32 n;
    343     IMG_UINT32 ui32RegVal;
    344     IMG_UINT32 iIntra16Bias, uisz2, uIntra8Scale, uDirectVecBias_P, iInterMBBias_P, uDirectVecBias_B, iInterMBBias_B;
    345     IMG_BIAS_PARAMS * psBiasParams = &(ctx->sBiasParams);
    346 
    347     IMG_BYTE PVR_QP_SCALE_CR[52] = {
    348         0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
    349         12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
    350         28, 29, 29, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 37,
    351         37, 38, 38, 38, 39, 39, 39, 39
    352     };
    353 
    354     ctx->sBiasTables.ui32LritcCacheChunkConfig =
    355         F_ENCODE(ctx->uChunksPerMb, INTEL_CH_PM) |
    356         F_ENCODE(ctx->uMaxChunks, INTEL_CH_MX) |
    357         F_ENCODE(ctx->uMaxChunks - ctx->uPriorityChunks, INTEL_CH_PY);
    358 
    359     uIntra8Scale = 0;
    360     for (n = 51; n >= 0; n--) {
    361         IMG_INT32  iX;
    362         IMG_UINT32 uiLambdaSAD, uiLambdaSATD;
    363 
    364         iX = n - 12;
    365         if (iX < 0) iX = 0;
    366 
    367         uiLambdaSAD  = H264_QPLAMBDA_MAP_SAD[iX];
    368         uiLambdaSATD = H264_QPLAMBDA_MAP_SATD_TABLES[psBiasParams->uLambdaSATDTable][n];
    369 
    370         if (psBiasParams->uLambdaSAD  != 0) uiLambdaSAD  = psBiasParams->uLambdaSAD;
    371         if (psBiasParams->uLambdaSATD != 0) uiLambdaSATD = psBiasParams->uLambdaSATD;
    372 
    373         // Dont Write QP Values To ESB -- IPE will write these values
    374         // Update the quantization parameter which includes doing Lamda and the Chroma QP
    375         ui32RegVal = PVR_QP_SCALE_CR[n];
    376         ui32RegVal |= (uiLambdaSATD) << 8; //SATD lambda
    377         ui32RegVal |= (uiLambdaSAD) << 16; //SAD lambda
    378 
    379         ctx->sBiasTables.aui32LambdaBias[n] = ui32RegVal;
    380     }
    381 
    382     for (n = 52; n >= 0; n -= 2) {
    383         IMG_INT8 qp = n;
    384         if (qp > 51) qp = 51;
    385 
    386         if (psBiasParams->bRCEnable || psBiasParams->bRCBiases) {
    387             iInterMBBias_P  = tng__H264ES_inter_bias(qp);
    388             uDirectVecBias_P  = H264_DIRECT_BIAS[n/2];
    389 
    390             iInterMBBias_B  = iInterMBBias_P;
    391             uDirectVecBias_B  = uDirectVecBias_P  ;
    392 
    393             iIntra16Bias    = 0;
    394             uIntra8Scale    = H264_INTRA8_SCALE[n/2] - 8;
    395 
    396             if (psBiasParams->uDirectVecBias != UNINIT_PARAM)
    397                 uDirectVecBias_B  = psBiasParams->uDirectVecBias;
    398             if (psBiasParams->iInterMBBiasB != UNINIT_PARAM)
    399                 iInterMBBias_B    = psBiasParams->iInterMBBiasB;
    400 
    401             if (psBiasParams->uIPESkipVecBias != UNINIT_PARAM)
    402                 uDirectVecBias_P  = psBiasParams->uIPESkipVecBias;
    403             if (psBiasParams->iInterMBBias != UNINIT_PARAM)
    404                 iInterMBBias_P    = psBiasParams->iInterMBBias;
    405 
    406             if (psBiasParams->iIntra16Bias != UNINIT_PARAM) iIntra16Bias    = psBiasParams->iIntra16Bias;
    407         } else {
    408             if (psBiasParams->uDirectVecBias == UNINIT_PARAM || psBiasParams->iInterMBBiasB == UNINIT_PARAM) {
    409                 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);
    410                 abort();
    411             }
    412             uDirectVecBias_B  = psBiasParams->uDirectVecBias;
    413             iInterMBBias_B    = psBiasParams->iInterMBBiasB;
    414 
    415             if (psBiasParams->uIPESkipVecBias == UNINIT_PARAM || psBiasParams->iInterMBBias == UNINIT_PARAM) {
    416                 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);
    417                 abort();
    418             }
    419             uDirectVecBias_P  = psBiasParams->uIPESkipVecBias;
    420             iInterMBBias_P    = psBiasParams->iInterMBBias;
    421 
    422             iIntra16Bias    = psBiasParams->iIntra16Bias;
    423             uisz2   = psBiasParams->uisz2;
    424         }
    425 
    426 #ifdef BRN_30029
    427         //adjust the intra8x8 bias so that we don't do anything silly when 8x8 mode is not in use.
    428         if (ctx->ui32PredCombControl & F_ENCODE(1, TOPAZHP_CR_INTRA8X8_DISABLE)) {
    429             iIntra16Bias |= 0x7fff << 16;
    430         }
    431 #endif
    432 //      drv_debug_msg(VIDEO_DEBUG_GENERAL, "qp %d, iIntra16Bias %d, iInterMBBias %d, uDirectVecBias %d\n", qp, iIntra16Bias, iInterMBBias, uDirectVecBias);
    433         ctx->sBiasTables.aui32IntraBias[n] = iIntra16Bias;
    434         ctx->sBiasTables.aui32InterBias_P[n] = iInterMBBias_P;
    435         ctx->sBiasTables.aui32DirectBias_P[n] = uDirectVecBias_P;
    436         ctx->sBiasTables.aui32InterBias_B[n] = iInterMBBias_B;
    437         ctx->sBiasTables.aui32DirectBias_B[n] = uDirectVecBias_B;
    438         ctx->sBiasTables.aui32IntraScale[n] = uIntra8Scale;
    439     }
    440 
    441     if (psBiasParams->bRCEnable || psBiasParams->bRCBiases)
    442         ctx->sBiasTables.ui32sz1 = psBiasParams->uisz1;
    443     else
    444         ctx->sBiasTables.ui32sz1 = psBiasParams->uisz2;
    445 
    446     if (psBiasParams->bZeroDetectionDisable) {
    447         ctx->sBiasTables.ui32RejectThresholdH264 = F_ENCODE(0, INTEL_H264_ConfigReg1)
    448                 | F_ENCODE(0, INTEL_H264_ConfigReg2);
    449     } else {
    450         ctx->sBiasTables.ui32RejectThresholdH264 = F_ENCODE(psBiasParams->uzb4, INTEL_H264_ConfigReg1)
    451                 | F_ENCODE(psBiasParams->uzb8, INTEL_H264_ConfigReg2);
    452     }
    453 }
    454 
    455 
    456 /**************************************************************************************************
    457 * Function:             VIDEO_GenerateBias
    458 * Description:  Generate the bias tables
    459 *
    460 ***************************************************************************************************/
    461 VAStatus tng__generate_bias(context_ENC_p ctx)
    462 {
    463     assert(ctx);
    464 
    465     switch (ctx->eStandard) {
    466         case IMG_STANDARD_H264:
    467             tng__H264ES_generate_bias_tables(ctx);
    468             break;
    469         case IMG_STANDARD_H263:
    470             tng__H263ES_generate_bias_tables(ctx);
    471             break;
    472         case IMG_STANDARD_MPEG4:
    473 	    tng__MPEG4ES_generate_bias_tables(ctx);
    474 	    break;
    475 /*
    476         case IMG_STANDARD_MPEG2:
    477                 MPEG2_GenerateBiasTables(ctx, psBiasParams);
    478                 break;
    479 */
    480         default:
    481             break;
    482     }
    483 
    484     return VA_STATUS_SUCCESS;
    485 }
    486 
    487 //load bias
    488 static IMG_INT H264_LAMBDA_COEFFS[4][3] = {
    489 	{175, -10166, 163244 },	 //SATD Lambda High
    490 	{ 16,   -236,   8693 },  //SATD Lambda Low
    491 	{198, -12240, 198865 },	 //SAD Lambda High
    492 	{ 12,   -176,   1402 },  //SAD Lambda Low
    493 };
    494 
    495 static IMG_INT MPEG4_LAMBDA_COEFFS[3] = {
    496 	0, 458, 1030
    497 };
    498 
    499 static IMG_INT H263_LAMBDA_COEFFS[3] = {
    500 	0, 333, 716
    501 };
    502 
    503 static void tng__H263ES_load_bias_tables(
    504     context_ENC_p ctx,
    505     IMG_FRAME_TYPE __maybe_unused eFrameType)
    506 {
    507     IMG_INT32 n;
    508     IMG_UINT32 ui32RegVal;
    509     IMG_UINT32 count = 0, cmd_word = 0;
    510     tng_cmdbuf_p cmdbuf = ctx->obj_context->tng_cmdbuf;
    511     IMG_BIAS_TABLES* psBiasTables = &(ctx->sBiasTables);
    512     IMG_UINT32 *pCount;
    513     IMG_UINT32 ui8Pipe;
    514 
    515     cmd_word = (MTX_CMDID_SW_WRITEREG & MTX_CMDWORD_ID_MASK) << MTX_CMDWORD_ID_SHIFT;
    516     *cmdbuf->cmd_idx++ = cmd_word;
    517     pCount = cmdbuf->cmd_idx;
    518     cmdbuf->cmd_idx++;
    519 
    520     ctx->ui32CoreRev = 0x00030401;
    521 
    522     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
    523         tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, TOPAZHP_CR_SEQUENCER_CONFIG, 0, psBiasTables->ui32SeqConfigInit);
    524 
    525     if (ctx->ui32CoreRev <= MAX_32_REV)
    526     {
    527 	for(n=31;n>=1;n--)
    528 	{
    529 	    //FIXME: Zhaohan, missing register TOPAZHP_TOP_CR_LAMBDA_DC_TABLE
    530 	    //tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_LAMBDA_DC_TABLE, 0, psBiasTables->aui32LambdaBias[n]);
    531 	}
    532     } else {
    533 	ui32RegVal = (((H263_LAMBDA_COEFFS[0]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00));
    534 	ui32RegVal |= (((H263_LAMBDA_COEFFS[1]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00));
    535 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_0, 0, ui32RegVal);
    536 
    537 	ui32RegVal = (((H263_LAMBDA_COEFFS[2]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01));
    538 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_0, 0, ui32RegVal);
    539 
    540 	ui32RegVal = 0x3f;
    541 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_0, 0, ui32RegVal);
    542     }
    543 
    544     for(n=31;n>=1;n-=2)
    545     {
    546 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_BIAS_TABLE, 0, psBiasTables->aui32IntraBias[n]);
    547 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_P[n]);
    548 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_P[n]);
    549     }
    550 
    551     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
    552 	tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_SZ, 0, psBiasTables->ui32sz1);
    553     }
    554 
    555     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
    556         tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_CHCF, 0, psBiasTables->ui32LritcCacheChunkConfig);
    557 
    558     *pCount = count;
    559 }
    560 
    561 static void tng__MPEG4_load_bias_tables(context_ENC_p ctx)
    562 {
    563     IMG_INT32 n;
    564     IMG_UINT32 ui32RegVal;
    565     IMG_UINT32 count = 0, cmd_word = 0;
    566     tng_cmdbuf_p cmdbuf = ctx->obj_context->tng_cmdbuf;
    567     IMG_BIAS_TABLES* psBiasTables = &(ctx->sBiasTables);
    568     IMG_UINT32 *pCount;
    569     IMG_UINT8 ui8Pipe;
    570 
    571     cmd_word = (MTX_CMDID_SW_WRITEREG & MTX_CMDWORD_ID_MASK) << MTX_CMDWORD_ID_SHIFT;
    572     *cmdbuf->cmd_idx++ = cmd_word;
    573     pCount = cmdbuf->cmd_idx;
    574     cmdbuf->cmd_idx++;
    575 
    576     ctx->ui32CoreRev = 0x00030401;
    577 
    578     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
    579         tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, TOPAZHP_CR_SEQUENCER_CONFIG, 0, psBiasTables->ui32SeqConfigInit);
    580 
    581     if (ctx->ui32CoreRev <= MAX_32_REV) {
    582         for (n=31; n >= 1; n--) {
    583 	    //FIXME: Zhaohan, missing register TOPAZHP_TOP_CR_LAMBDA_DC_TABLE
    584             //tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_LAMBDA_DC_TABLE, 0, psBiasTables->aui32LambdaBias[n]);
    585         }
    586     } else {
    587 	    //ui32RegVal = MPEG4_LAMBDA_COEFFS[0]| (MPEG4_LAMBDA_COEFFS[1]<<8);
    588 	    ui32RegVal = (((MPEG4_LAMBDA_COEFFS[0]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00));
    589 	    ui32RegVal |= (((MPEG4_LAMBDA_COEFFS[1]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00));
    590 
    591 	    tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_0, 0, ui32RegVal);
    592 	    //ui32RegVal = MPEG4_LAMBDA_COEFFS[2];
    593 	    ui32RegVal = (((MPEG4_LAMBDA_COEFFS[2]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01));
    594 
    595 	    tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_0, 0, ui32RegVal);
    596 
    597 	    ui32RegVal = 0x3f;
    598 	    tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_0, 0, ui32RegVal);
    599     }
    600 
    601     for(n=31;n>=1;n-=2)
    602     {
    603 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_BIAS_TABLE, 0, psBiasTables->aui32IntraBias[n]);
    604 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_P[n]);
    605 	tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_P[n]);
    606     }
    607 
    608     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
    609 	tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_SZ, 0, psBiasTables->ui32sz1);
    610 
    611 	//VLC RSize is fcode - 1 and only done for mpeg4 AND mpeg2 not H263
    612 	tng_cmdbuf_insert_reg_write(TOPAZ_VLC_REG, TOPAZ_VLC_CR_VLC_MPEG4_CFG, 0, F_ENCODE(psBiasTables->ui32FCode - 1, TOPAZ_VLC_CR_RSIZE));
    613     }
    614 
    615     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
    616         tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_CHCF, 0, psBiasTables->ui32LritcCacheChunkConfig);
    617 
    618     *pCount = count;
    619 }
    620 
    621 static void tng__H264ES_load_bias_tables(
    622     context_ENC_p ctx,
    623     IMG_FRAME_TYPE eFrameType)
    624 {
    625     IMG_INT32 n;
    626     IMG_UINT32 ui32RegVal;
    627     IMG_BIAS_TABLES* psBiasTables = &(ctx->sBiasTables);
    628     tng_cmdbuf_p cmdbuf = ctx->obj_context->tng_cmdbuf;
    629     IMG_UINT32 count = 0, cmd_word = 0;
    630     IMG_UINT32 *pCount;
    631     IMG_UINT32 ui8Pipe;
    632     drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: start\n", __FUNCTION__);
    633 
    634     cmd_word = (MTX_CMDID_SW_WRITEREG & MTX_CMDWORD_ID_MASK) << MTX_CMDWORD_ID_SHIFT;
    635     *cmdbuf->cmd_idx++ = cmd_word;
    636     pCount = cmdbuf->cmd_idx;
    637     cmdbuf->cmd_idx++;
    638 
    639     psBiasTables->ui32SeqConfigInit = 0x40038412;
    640 
    641     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++)
    642         tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, TOPAZHP_CR_SEQUENCER_CONFIG, 0, psBiasTables->ui32SeqConfigInit);
    643 
    644     ctx->ui32CoreRev = 0x00030401;
    645 
    646     if (ctx->ui32CoreRev <= MAX_32_REV) {
    647         for (n=51; n >= 0; n--) {
    648 	    //FIXME: Zhaohan, missing register TOPAZHP_TOP_CR_LAMBDA_DC_TABLE
    649             //tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_LAMBDA_DC_TABLE, 0, psBiasTables->aui32LambdaBias[n]);
    650         }
    651     } else {
    652         //Load the lambda coeffs
    653         for (n = 0; n < 4; n++) {
    654             //ui32RegVal = H264_LAMBDA_COEFFS[n][0]| (H264_LAMBDA_COEFFS[n][1]<<8);
    655             ui32RegVal = (((H264_LAMBDA_COEFFS[n][0]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_00));
    656             ui32RegVal |= (((H264_LAMBDA_COEFFS[n][1]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_BETA_COEFF_CORE_00));
    657 
    658             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_0, 0, ui32RegVal);
    659             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_1, 0, ui32RegVal);
    660             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_ALPHA_COEFF_CORE_2, 0, ui32RegVal);
    661 
    662             //ui32RegVal = H264_LAMBDA_COEFFS[n][2];
    663             ui32RegVal = (((H264_LAMBDA_COEFFS[n][2]) << (SHIFT_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01)) & (MASK_TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_01));
    664 
    665             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_0, 0, ui32RegVal);
    666             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_1, 0, ui32RegVal);
    667             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_GAMMA_COEFF_CORE_2, 0, ui32RegVal);
    668         }
    669         ui32RegVal = 29 |(29<<6);
    670         tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_0, 0, ui32RegVal);
    671         tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_1, 0, ui32RegVal);
    672         tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_POLYNOM_CUTOFF_CORE_2, 0, ui32RegVal);
    673     }
    674 
    675     for (n=52;n>=0;n-=2) {
    676         if (eFrameType == IMG_INTER_B) {
    677             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_B[n]);
    678             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_B[n]);
    679         } else {
    680             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTER_BIAS_TABLE, 0, psBiasTables->aui32InterBias_P[n]);
    681             tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_DIRECT_BIAS_TABLE, 0, psBiasTables->aui32DirectBias_P[n]);
    682         }
    683         tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_BIAS_TABLE, 0, psBiasTables->aui32IntraBias[n]);
    684         tng_cmdbuf_insert_reg_write(TOPAZ_MULTICORE_REG, TOPAZHP_TOP_CR_INTRA_SCALE_TABLE, 0, psBiasTables->aui32IntraScale[n]);
    685     }
    686 
    687     //aui32HpCoreRegId[ui32Pipe]
    688     for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
    689         tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_SZ, 0, psBiasTables->ui32sz1);
    690         tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_H264_RT, 0, psBiasTables->ui32RejectThresholdH264);
    691     }
    692 
    693 //    tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_FIRMWARE_REG_1, (MTX_SCRATCHREG_TOMTX<<2), ui32BuffersReg);
    694 //    tng_cmdbuf_insert_reg_write(TOPAZHP_TOP_CR_FIRMWARE_REG_1, (MTX_SCRATCHREG_TOHOST<<2),ui32ToHostReg);
    695 
    696     // now setup the LRITC chache priority
    697     {
    698         //aui32HpCoreRegId[ui32Pipe]
    699         for (ui8Pipe = 0; ui8Pipe < ctx->ui8PipesToUse; ui8Pipe++) {
    700             tng_cmdbuf_insert_reg_write(TOPAZ_CORE_REG, INTEL_CHCF, 0, psBiasTables->ui32LritcCacheChunkConfig);
    701         }
    702     }
    703     drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: count = %d\n", __FUNCTION__, (int)count);
    704 
    705     *pCount = count;
    706 }
    707 
    708 VAStatus tng_load_bias(context_ENC_p ctx, IMG_FRAME_TYPE eFrameType)
    709 {
    710     IMG_STANDARD eStandard = ctx->eStandard;
    711 
    712     switch (eStandard) {
    713         case IMG_STANDARD_H264:
    714             tng__H264ES_load_bias_tables(ctx, eFrameType); //IMG_INTER_P);
    715             break;
    716         case IMG_STANDARD_H263:
    717             tng__H263ES_load_bias_tables(ctx, eFrameType); //IMG_INTER_P);
    718             break;
    719         case IMG_STANDARD_MPEG4:
    720             tng__MPEG4_load_bias_tables(ctx);
    721             break;
    722 /*
    723         case IMG_STANDARD_MPEG2:
    724             tng__MPEG2_LoadBiasTables(psBiasTables);
    725             break;
    726 */
    727         default:
    728             break;
    729     }
    730 
    731     return VA_STATUS_SUCCESS;
    732 }
    733 
    734 void tng_init_bias_params(context_ENC_p ctx)
    735 {
    736     IMG_BIAS_PARAMS * psBiasParams = &(ctx->sBiasParams);
    737     memset(psBiasParams, 0, sizeof(IMG_BIAS_PARAMS));
    738     //default
    739     psBiasParams->uLambdaSAD = 0;
    740     psBiasParams->uLambdaSATD = 0;
    741     psBiasParams->uLambdaSATDTable = 0;
    742 
    743     psBiasParams->bRCEnable = ctx->sRCParams.bRCEnable;
    744     psBiasParams->bRCBiases = IMG_TRUE;
    745 
    746     psBiasParams->iIntra16Bias = UNINIT_PARAM;
    747     psBiasParams->iInterMBBias = UNINIT_PARAM;
    748     psBiasParams->iInterMBBiasB = UNINIT_PARAM;
    749 
    750     psBiasParams->uDirectVecBias = UNINIT_PARAM;
    751     psBiasParams->uIPESkipVecBias = UNINIT_PARAM;
    752     psBiasParams->uSPESkipVecBias = 0;      //not in spec
    753 
    754     psBiasParams->uisz1 = 6;
    755     psBiasParams->uisz2 = 6;
    756     psBiasParams->bZeroDetectionDisable = TOPAZHP_DEFAULT_bZeroDetectionDisable;
    757 
    758     psBiasParams->uzb4 = 6;
    759     psBiasParams->uzb8 = 4;
    760 
    761     psBiasParams->uTHInter = TOPAZHP_DEFAULT_uTHInter;
    762     psBiasParams->uTHInterQP = TOPAZHP_DEFAULT_uTHInterQP;
    763     psBiasParams->uTHInterMaxLevel = TOPAZHP_DEFAULT_uTHInterMaxLevel;
    764     psBiasParams->uTHSkipIPE = TOPAZHP_DEFAULT_uTHSkipIPE;
    765     psBiasParams->uTHSkipSPE = TOPAZHP_DEFAULT_uTHSkipSPE;
    766 }
    767