1*495ae853SAndroid Build Coastguard Worker /****************************************************************************** 2*495ae853SAndroid Build Coastguard Worker * 3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 4*495ae853SAndroid Build Coastguard Worker * 5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at: 8*495ae853SAndroid Build Coastguard Worker * 9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*495ae853SAndroid Build Coastguard Worker * 11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*495ae853SAndroid Build Coastguard Worker * limitations under the License. 16*495ae853SAndroid Build Coastguard Worker * 17*495ae853SAndroid Build Coastguard Worker ***************************************************************************** 18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*495ae853SAndroid Build Coastguard Worker */ 20*495ae853SAndroid Build Coastguard Worker 21*495ae853SAndroid Build Coastguard Worker /** 22*495ae853SAndroid Build Coastguard Worker ******************************************************************************* 23*495ae853SAndroid Build Coastguard Worker * @file 24*495ae853SAndroid Build Coastguard Worker * ih264e_globals.c 25*495ae853SAndroid Build Coastguard Worker * 26*495ae853SAndroid Build Coastguard Worker * @brief 27*495ae853SAndroid Build Coastguard Worker * Contains definitions of global variables used across the encoder 28*495ae853SAndroid Build Coastguard Worker * 29*495ae853SAndroid Build Coastguard Worker * @author 30*495ae853SAndroid Build Coastguard Worker * ittiam 31*495ae853SAndroid Build Coastguard Worker * 32*495ae853SAndroid Build Coastguard Worker * @remarks 33*495ae853SAndroid Build Coastguard Worker * 34*495ae853SAndroid Build Coastguard Worker ******************************************************************************* 35*495ae853SAndroid Build Coastguard Worker */ 36*495ae853SAndroid Build Coastguard Worker 37*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/ 38*495ae853SAndroid Build Coastguard Worker /* File Includes */ 39*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/ 40*495ae853SAndroid Build Coastguard Worker 41*495ae853SAndroid Build Coastguard Worker /* User Include Files */ 42*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h" 43*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h" 44*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h" 45*495ae853SAndroid Build Coastguard Worker #include "ih264e_globals.h" 46*495ae853SAndroid Build Coastguard Worker 47*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/ 48*495ae853SAndroid Build Coastguard Worker /* Global definitions */ 49*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/ 50*495ae853SAndroid Build Coastguard Worker 51*495ae853SAndroid Build Coastguard Worker /** 52*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 53*495ae853SAndroid Build Coastguard Worker * @brief lambda for varying quantizer scales that would be used to 54*495ae853SAndroid Build Coastguard Worker * compute the RD cost while deciding on the MB modes. 55*495ae853SAndroid Build Coastguard Worker * input : qp 56*495ae853SAndroid Build Coastguard Worker * output : lambda 57*495ae853SAndroid Build Coastguard Worker * @remarks lambda = 0.85 * pow(2, (qp - 12)/3), when SSD is used as metric 58*495ae853SAndroid Build Coastguard Worker * for computing distortion (Bit rate estimation for cost function of H.264/ 59*495ae853SAndroid Build Coastguard Worker * AVC by Mohd Golam Sarwer et. al.) If the use of distortion metric is SAD 60*495ae853SAndroid Build Coastguard Worker * rather than SSD in the stage of encoding, consider sqrt(lambda) simply to 61*495ae853SAndroid Build Coastguard Worker * adjust lambda for the lack of squaring operation in the error computation 62*495ae853SAndroid Build Coastguard Worker * (from rate distortion optimization for video compression by sullivan). 63*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 64*495ae853SAndroid Build Coastguard Worker */ 65*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_qp_lambdaIP[52]= 66*495ae853SAndroid Build Coastguard Worker { 67*495ae853SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 1, 68*495ae853SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 69*495ae853SAndroid Build Coastguard Worker 1, 2, 2, 2, 2, 3, 3, 3, 70*495ae853SAndroid Build Coastguard Worker 4, 4, 5, 5, 6, 7, 7, 8, 71*495ae853SAndroid Build Coastguard Worker 9, 10, 12, 13, 15, 17, 19, 21, 72*495ae853SAndroid Build Coastguard Worker 23, 26, 30, 33, 37, 42, 47, 53, 73*495ae853SAndroid Build Coastguard Worker 59, 66, 74, 83, 74*495ae853SAndroid Build Coastguard Worker }; 75*495ae853SAndroid Build Coastguard Worker 76*495ae853SAndroid Build Coastguard Worker /** 77*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 78*495ae853SAndroid Build Coastguard Worker * @brief lambda for varying quantizer scales that would be used to 79*495ae853SAndroid Build Coastguard Worker * compute the RD cost while deciding on the MB modes. 80*495ae853SAndroid Build Coastguard Worker * input : qp 81*495ae853SAndroid Build Coastguard Worker * output : lambda 82*495ae853SAndroid Build Coastguard Worker * @remarks lambda = max(2, min(4, pow(2, (qp - 12)/6))) * gu1_qp_lambdaIP[] 83*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 84*495ae853SAndroid Build Coastguard Worker */ 85*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_qp_lambdaB[52]= 86*495ae853SAndroid Build Coastguard Worker { 87*495ae853SAndroid Build Coastguard Worker 0, 0, 0, 0, 1, 1, 1, 1, 88*495ae853SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 2, 2, 89*495ae853SAndroid Build Coastguard Worker 2, 2, 3, 3, 3, 4, 4, 5, 90*495ae853SAndroid Build Coastguard Worker 5, 6, 7, 8, 10, 11, 13, 15, 91*495ae853SAndroid Build Coastguard Worker 17, 20, 22, 26, 30, 33, 37, 42, 92*495ae853SAndroid Build Coastguard Worker 47, 53, 59, 66, 74, 83, 94, 105, 93*495ae853SAndroid Build Coastguard Worker 118, 132, 149, 167, 94*495ae853SAndroid Build Coastguard Worker }; 95*495ae853SAndroid Build Coastguard Worker 96*495ae853SAndroid Build Coastguard Worker /** 97*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 98*495ae853SAndroid Build Coastguard Worker * @brief Lamda for varying quantizer scales that would be used to 99*495ae853SAndroid Build Coastguard Worker * compute the RD cost while deciding on the MB modes. 100*495ae853SAndroid Build Coastguard Worker * input : qp 101*495ae853SAndroid Build Coastguard Worker * output : lambda 102*495ae853SAndroid Build Coastguard Worker * @remarks lambda = pow(2, (qp - 12)/6) 103*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 104*495ae853SAndroid Build Coastguard Worker */ 105*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_qp0[52]= 106*495ae853SAndroid Build Coastguard Worker { 107*495ae853SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 108*495ae853SAndroid Build Coastguard Worker 0, 0, 0, 0, 1, 1, 1, 1, 109*495ae853SAndroid Build Coastguard Worker 2, 2, 2, 2, 3, 3, 3, 4, 110*495ae853SAndroid Build Coastguard Worker 4, 4, 5, 6, 6, 7, 8, 9, 111*495ae853SAndroid Build Coastguard Worker 10, 11, 13, 14, 16, 18, 20, 23, 112*495ae853SAndroid Build Coastguard Worker 25, 29, 32, 36, 40, 45, 51, 57, 113*495ae853SAndroid Build Coastguard Worker 64, 72, 81, 91, 114*495ae853SAndroid Build Coastguard Worker }; 115*495ae853SAndroid Build Coastguard Worker 116*495ae853SAndroid Build Coastguard Worker /** 117*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 118*495ae853SAndroid Build Coastguard Worker * @brief unsigned exp. goulumb codelengths to assign cost to a coefficient of 119*495ae853SAndroid Build Coastguard Worker * mb types. 120*495ae853SAndroid Build Coastguard Worker * input : Integer 121*495ae853SAndroid Build Coastguard Worker * output : codelength 122*495ae853SAndroid Build Coastguard Worker * @remarks Refer sec. 9-1 in h264 specification 123*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 124*495ae853SAndroid Build Coastguard Worker */ 125*495ae853SAndroid Build Coastguard Worker const UWORD8 u1_uev_codelength[32] = 126*495ae853SAndroid Build Coastguard Worker { 127*495ae853SAndroid Build Coastguard Worker 1, 3, 3, 5, 5, 5, 5, 7, 128*495ae853SAndroid Build Coastguard Worker 7, 7, 7, 7, 7, 7, 7, 9, 129*495ae853SAndroid Build Coastguard Worker 9, 9, 9, 9, 9, 9, 9, 9, 130*495ae853SAndroid Build Coastguard Worker 9, 9, 9, 9, 9, 9, 9, 11, 131*495ae853SAndroid Build Coastguard Worker }; 132*495ae853SAndroid Build Coastguard Worker 133*495ae853SAndroid Build Coastguard Worker /** 134*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 135*495ae853SAndroid Build Coastguard Worker * @brief Look up table to assign cost to a coefficient of a residual block 136*495ae853SAndroid Build Coastguard Worker * basing on its surrounding coefficients 137*495ae853SAndroid Build Coastguard Worker * input : Numbers of T1's 138*495ae853SAndroid Build Coastguard Worker * output : coeff_cost 139*495ae853SAndroid Build Coastguard Worker * @remarks Refer Section 2.3 Elimination of single coefficients in inter 140*495ae853SAndroid Build Coastguard Worker * macroblocks in document JVT-O079 141*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 142*495ae853SAndroid Build Coastguard Worker */ 143*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_coeff_cost[6] = 144*495ae853SAndroid Build Coastguard Worker { 145*495ae853SAndroid Build Coastguard Worker 3, 2, 2, 1, 1, 1 146*495ae853SAndroid Build Coastguard Worker }; 147*495ae853SAndroid Build Coastguard Worker 148*495ae853SAndroid Build Coastguard Worker /** 149*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 150*495ae853SAndroid Build Coastguard Worker * @brief Indices map to raster scan for luma 4x4 block 151*495ae853SAndroid Build Coastguard Worker * input : scan index 152*495ae853SAndroid Build Coastguard Worker * output : scan location 153*495ae853SAndroid Build Coastguard Worker * @remarks None 154*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 155*495ae853SAndroid Build Coastguard Worker */ 156*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_luma_scan_order[16] = 157*495ae853SAndroid Build Coastguard Worker { 158*495ae853SAndroid Build Coastguard Worker 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 159*495ae853SAndroid Build Coastguard Worker }; 160*495ae853SAndroid Build Coastguard Worker 161*495ae853SAndroid Build Coastguard Worker /** 162*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 163*495ae853SAndroid Build Coastguard Worker * @brief Indices map to raster scan for chroma AC block 164*495ae853SAndroid Build Coastguard Worker * input : scan index 165*495ae853SAndroid Build Coastguard Worker * output : scan location 166*495ae853SAndroid Build Coastguard Worker * @remarks None 167*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 168*495ae853SAndroid Build Coastguard Worker */ 169*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_chroma_scan_order[15] = 170*495ae853SAndroid Build Coastguard Worker { 171*495ae853SAndroid Build Coastguard Worker 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 172*495ae853SAndroid Build Coastguard Worker }; 173*495ae853SAndroid Build Coastguard Worker 174*495ae853SAndroid Build Coastguard Worker /** 175*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 176*495ae853SAndroid Build Coastguard Worker * @brief Indices map to raster scan for luma 4x4 dc block 177*495ae853SAndroid Build Coastguard Worker * input : scan index 178*495ae853SAndroid Build Coastguard Worker * output : scan location 179*495ae853SAndroid Build Coastguard Worker * @remarks : None 180*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 181*495ae853SAndroid Build Coastguard Worker */ 182*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_luma_scan_order_dc[16] = 183*495ae853SAndroid Build Coastguard Worker { 184*495ae853SAndroid Build Coastguard Worker 0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15 185*495ae853SAndroid Build Coastguard Worker }; 186*495ae853SAndroid Build Coastguard Worker 187*495ae853SAndroid Build Coastguard Worker /** 188*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 189*495ae853SAndroid Build Coastguard Worker * @brief Indices map to raster scan for chroma 2x2 dc block 190*495ae853SAndroid Build Coastguard Worker * input : scan index 191*495ae853SAndroid Build Coastguard Worker * output : scan location 192*495ae853SAndroid Build Coastguard Worker * @remarks None 193*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 194*495ae853SAndroid Build Coastguard Worker */ 195*495ae853SAndroid Build Coastguard Worker const UWORD8 gu1_chroma_scan_order_dc[4] = 196*495ae853SAndroid Build Coastguard Worker { 197*495ae853SAndroid Build Coastguard Worker 0, 1, 2, 3 198*495ae853SAndroid Build Coastguard Worker }; 199*495ae853SAndroid Build Coastguard Worker 200*495ae853SAndroid Build Coastguard Worker /** 201*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 202*495ae853SAndroid Build Coastguard Worker * @brief choice of motion vectors to be used during mv prediction 203*495ae853SAndroid Build Coastguard Worker * input : formatted reference idx comparison metric 204*495ae853SAndroid Build Coastguard Worker * output : mv prediction has to be median or a simple straight forward selec 205*495ae853SAndroid Build Coastguard Worker * tion from neighbors. 206*495ae853SAndroid Build Coastguard Worker * @remarks If only one of the candidate blocks has a reference frame equal to 207*495ae853SAndroid Build Coastguard Worker the current block then use the same block as the final predictor. A simple 208*495ae853SAndroid Build Coastguard Worker look up table to assist this mv prediction condition 209*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 210*495ae853SAndroid Build Coastguard Worker */ 211*495ae853SAndroid Build Coastguard Worker const WORD8 gi1_mv_pred_condition[8] = 212*495ae853SAndroid Build Coastguard Worker { 213*495ae853SAndroid Build Coastguard Worker -1, 0, 1, -1, 2, -1, -1, -1 214*495ae853SAndroid Build Coastguard Worker }; 215*495ae853SAndroid Build Coastguard Worker 216*495ae853SAndroid Build Coastguard Worker /** 217*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 218*495ae853SAndroid Build Coastguard Worker * @brief Translation of Qstep <-> QP 219*495ae853SAndroid Build Coastguard Worker * Qstep(QP) = Qstep(QP%6) * (2 ^ floor(QP/6)) 220*495ae853SAndroid Build Coastguard Worker * Qstep(QP, n = 0) {0.625, 0.6875, 0.8125, 0.875, 1.0, 1.125} for QP[0-5] 221*495ae853SAndroid Build Coastguard Worker * @remarks QPRange[0-51] & QstepRange[1 - 224]. 222*495ae853SAndroid Build Coastguard Worker ****************************************************************************** 223*495ae853SAndroid Build Coastguard Worker */ 224*495ae853SAndroid Build Coastguard Worker const UWORD8 gau1_h264_to_mpeg2_qmap[H264_QP_ELEM] = 225*495ae853SAndroid Build Coastguard Worker { 226*495ae853SAndroid Build Coastguard Worker 1, 1, 1, 1, 1, 1, 1, 1, 227*495ae853SAndroid Build Coastguard Worker 2, 2, 2, 2, 3, 3, 3, 4, 228*495ae853SAndroid Build Coastguard Worker 4, 5, 5, 6, 7, 7, 8, 9, 229*495ae853SAndroid Build Coastguard Worker 10, 11, 13, 14, 16, 18, 20, 22, 230*495ae853SAndroid Build Coastguard Worker 26, 28, 32, 36, 40, 44, 52, 56, 231*495ae853SAndroid Build Coastguard Worker 64, 72, 80, 88, 104, 112, 128, 144, 232*495ae853SAndroid Build Coastguard Worker 160, 176, 208, 224, 233*495ae853SAndroid Build Coastguard Worker }; 234*495ae853SAndroid Build Coastguard Worker const UWORD8 gau1_mpeg2_to_h264_qmap[MPEG2_QP_ELEM] = 235*495ae853SAndroid Build Coastguard Worker { 236*495ae853SAndroid Build Coastguard Worker 0, 4, 10, 13, 16, 18, 19, 21, 237*495ae853SAndroid Build Coastguard Worker 22, 23, 24, 25, 25, 26, 27, 27, 238*495ae853SAndroid Build Coastguard Worker 28, 28, 29, 30, 30, 30, 31, 31, 239*495ae853SAndroid Build Coastguard Worker 31, 32, 32, 32, 33, 33, 33, 34, 240*495ae853SAndroid Build Coastguard Worker 34, 34, 34, 35, 35, 36, 36, 36, 241*495ae853SAndroid Build Coastguard Worker 36, 36, 36, 37, 37, 37, 37, 37, 242*495ae853SAndroid Build Coastguard Worker 37, 38, 38, 38, 38, 38, 38, 39, 243*495ae853SAndroid Build Coastguard Worker 39, 39, 39, 39, 39, 40, 40, 40, 244*495ae853SAndroid Build Coastguard Worker 40, 40, 40, 40, 40, 41, 41, 41, 245*495ae853SAndroid Build Coastguard Worker 41, 42, 42, 42, 42, 42, 42, 42, 246*495ae853SAndroid Build Coastguard Worker 42, 42, 42, 42, 42, 43, 43, 43, 247*495ae853SAndroid Build Coastguard Worker 43, 43, 43, 43, 43, 43, 43, 43, 248*495ae853SAndroid Build Coastguard Worker 43, 44, 44, 44, 44, 44, 44, 44, 249*495ae853SAndroid Build Coastguard Worker 44, 44, 44, 44, 44, 45, 45, 45, 250*495ae853SAndroid Build Coastguard Worker 45, 45, 45, 45, 45, 45, 45, 45, 251*495ae853SAndroid Build Coastguard Worker 45, 46, 46, 46, 46, 46, 46, 46, 252*495ae853SAndroid Build Coastguard Worker 46, 46, 46, 46, 46, 46, 46, 46, 253*495ae853SAndroid Build Coastguard Worker 46, 47, 47, 47, 47, 47, 47, 47, 254*495ae853SAndroid Build Coastguard Worker 47, 48, 48, 48, 48, 48, 48, 48, 255*495ae853SAndroid Build Coastguard Worker 48, 48, 48, 48, 48, 48, 48, 48, 256*495ae853SAndroid Build Coastguard Worker 48, 48, 48, 48, 48, 48, 48, 48, 257*495ae853SAndroid Build Coastguard Worker 48, 49, 49, 49, 49, 49, 49, 49, 258*495ae853SAndroid Build Coastguard Worker 49, 49, 49, 49, 49, 49, 49, 49, 259*495ae853SAndroid Build Coastguard Worker 49, 49, 49, 49, 49, 49, 49, 49, 260*495ae853SAndroid Build Coastguard Worker 49, 50, 50, 50, 50, 50, 50, 50, 261*495ae853SAndroid Build Coastguard Worker 50, 50, 50, 50, 50, 50, 50, 50, 262*495ae853SAndroid Build Coastguard Worker 50, 50, 50, 50, 50, 50, 50, 50, 263*495ae853SAndroid Build Coastguard Worker 50, 51, 51, 51, 51, 51, 51, 51, 264*495ae853SAndroid Build Coastguard Worker 51, 51, 51, 51, 51, 51, 51, 51, 265*495ae853SAndroid Build Coastguard Worker 51, 51, 51, 51, 51, 51, 51, 51, 266*495ae853SAndroid Build Coastguard Worker 51, 52, 52, 52, 52, 52, 52, 52, 267*495ae853SAndroid Build Coastguard Worker 52, 52, 52, 52, 52, 52, 52, 52, 268*495ae853SAndroid Build Coastguard Worker }; 269*495ae853SAndroid Build Coastguard Worker 270