q_matrix.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:29k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  *************************************************************************************
  3.  * file q_matrix.c
  4.  *
  5.  * brief
  6.  *    read q_matrix parameters from input file: q_matrix.cfg
  7.  *
  8.  *************************************************************************************
  9.  */
  10. #include "global.h"
  11. #include "memalloc.h"
  12. extern char *GetConfigFileContent (char *Filename, int error_type);
  13. #define MAX_ITEMS_TO_PARSE  1000
  14. const int quant_coef[6][4][4] = {
  15.   {{13107, 8066,13107, 8066},{ 8066, 5243, 8066, 5243},{13107, 8066,13107, 8066},{ 8066, 5243, 8066, 5243}},
  16.   {{11916, 7490,11916, 7490},{ 7490, 4660, 7490, 4660},{11916, 7490,11916, 7490},{ 7490, 4660, 7490, 4660}},
  17.   {{10082, 6554,10082, 6554},{ 6554, 4194, 6554, 4194},{10082, 6554,10082, 6554},{ 6554, 4194, 6554, 4194}},
  18.   {{ 9362, 5825, 9362, 5825},{ 5825, 3647, 5825, 3647},{ 9362, 5825, 9362, 5825},{ 5825, 3647, 5825, 3647}},
  19.   {{ 8192, 5243, 8192, 5243},{ 5243, 3355, 5243, 3355},{ 8192, 5243, 8192, 5243},{ 5243, 3355, 5243, 3355}},
  20.   {{ 7282, 4559, 7282, 4559},{ 4559, 2893, 4559, 2893},{ 7282, 4559, 7282, 4559},{ 4559, 2893, 4559, 2893}}
  21. };
  22. const int dequant_coef[6][4][4] = {
  23.   {{10, 13, 10, 13},{ 13, 16, 13, 16},{10, 13, 10, 13},{ 13, 16, 13, 16}},
  24.   {{11, 14, 11, 14},{ 14, 18, 14, 18},{11, 14, 11, 14},{ 14, 18, 14, 18}},
  25.   {{13, 16, 13, 16},{ 16, 20, 16, 20},{13, 16, 13, 16},{ 16, 20, 16, 20}},
  26.   {{14, 18, 14, 18},{ 18, 23, 18, 23},{14, 18, 14, 18},{ 18, 23, 18, 23}},
  27.   {{16, 20, 16, 20},{ 20, 25, 20, 25},{16, 20, 16, 20},{ 20, 25, 20, 25}},
  28.   {{18, 23, 18, 23},{ 23, 29, 23, 29},{18, 23, 18, 23},{ 23, 29, 23, 29}}
  29. };
  30. const int quant_coef8[6][8][8] =
  31. {
  32.   {
  33.     {13107, 12222,  16777,  12222,  13107,  12222,  16777,  12222},
  34.     {12222, 11428,  15481,  11428,  12222,  11428,  15481,  11428},
  35.     {16777, 15481,  20972,  15481,  16777,  15481,  20972,  15481},
  36.     {12222, 11428,  15481,  11428,  12222,  11428,  15481,  11428},
  37.     {13107, 12222,  16777,  12222,  13107,  12222,  16777,  12222},
  38.     {12222, 11428,  15481,  11428,  12222,  11428,  15481,  11428},
  39.     {16777, 15481,  20972,  15481,  16777,  15481,  20972,  15481},
  40.     {12222, 11428,  15481,  11428,  12222,  11428,  15481,  11428}
  41.   },
  42.   {
  43.     {11916, 11058,  14980,  11058,  11916,  11058,  14980,  11058},
  44.     {11058, 10826,  14290,  10826,  11058,  10826,  14290,  10826},
  45.     {14980, 14290,  19174,  14290,  14980,  14290,  19174,  14290},
  46.     {11058, 10826,  14290,  10826,  11058,  10826,  14290,  10826},
  47.     {11916, 11058,  14980,  11058,  11916,  11058,  14980,  11058},
  48.     {11058, 10826,  14290,  10826,  11058,  10826,  14290,  10826},
  49.     {14980, 14290,  19174,  14290,  14980,  14290,  19174,  14290},
  50.     {11058, 10826,  14290,  10826,  11058,  10826,  14290,  10826}
  51.   },
  52.   {
  53.     {10082, 9675, 12710,  9675, 10082,  9675, 12710,  9675},
  54.     {9675,  8943, 11985,  8943, 9675, 8943, 11985,  8943},
  55.     {12710, 11985,  15978,  11985,  12710,  11985,  15978,  11985},
  56.     {9675,  8943, 11985,  8943, 9675, 8943, 11985,  8943},
  57.     {10082, 9675, 12710,  9675, 10082,  9675, 12710,  9675},
  58.     {9675,  8943, 11985,  8943, 9675, 8943, 11985,  8943},
  59.     {12710, 11985,  15978,  11985,  12710,  11985,  15978,  11985},
  60.     {9675,  8943, 11985,  8943, 9675, 8943, 11985,  8943}
  61.   },
  62.   {
  63.     {9362,  8931, 11984,  8931, 9362, 8931, 11984,  8931},
  64.     {8931,  8228, 11259,  8228, 8931, 8228, 11259,  8228},
  65.     {11984, 11259,  14913,  11259,  11984,  11259,  14913,  11259},
  66.     {8931,  8228, 11259,  8228, 8931, 8228, 11259,  8228},
  67.     {9362,  8931, 11984,  8931, 9362, 8931, 11984,  8931},
  68.     {8931,  8228, 11259,  8228, 8931, 8228, 11259,  8228},
  69.     {11984, 11259,  14913,  11259,  11984,  11259,  14913,  11259},
  70.     {8931,  8228, 11259,  8228, 8931, 8228, 11259,  8228}
  71.   },
  72.   {
  73.     {8192,  7740, 10486,  7740, 8192, 7740, 10486,  7740},
  74.     {7740,  7346, 9777, 7346, 7740, 7346, 9777, 7346},
  75.     {10486, 9777, 13159,  9777, 10486,  9777, 13159,  9777},
  76.     {7740,  7346, 9777, 7346, 7740, 7346, 9777, 7346},
  77.     {8192,  7740, 10486,  7740, 8192, 7740, 10486,  7740},
  78.     {7740,  7346, 9777, 7346, 7740, 7346, 9777, 7346},
  79.     {10486, 9777, 13159,  9777, 10486,  9777, 13159,  9777},
  80.     {7740,  7346, 9777, 7346, 7740, 7346, 9777, 7346}
  81.   },
  82.   {
  83.     {7282,  6830, 9118, 6830, 7282, 6830, 9118, 6830},
  84.     {6830,  6428, 8640, 6428, 6830, 6428, 8640, 6428},
  85.     {9118,  8640, 11570,  8640, 9118, 8640, 11570,  8640},
  86.     {6830,  6428, 8640, 6428, 6830, 6428, 8640, 6428},
  87.     {7282,  6830, 9118, 6830, 7282, 6830, 9118, 6830},
  88.     {6830,  6428, 8640, 6428, 6830, 6428, 8640, 6428},
  89.     {9118,  8640, 11570,  8640, 9118, 8640, 11570,  8640},
  90.     {6830,  6428, 8640, 6428, 6830, 6428, 8640, 6428}
  91.   }
  92. };
  93. const int dequant_coef8[6][8][8] =
  94. {
  95.   {
  96.     {20,  19, 25, 19, 20, 19, 25, 19},
  97.     {19,  18, 24, 18, 19, 18, 24, 18},
  98.     {25,  24, 32, 24, 25, 24, 32, 24},
  99.     {19,  18, 24, 18, 19, 18, 24, 18},
  100.     {20,  19, 25, 19, 20, 19, 25, 19},
  101.     {19,  18, 24, 18, 19, 18, 24, 18},
  102.     {25,  24, 32, 24, 25, 24, 32, 24},
  103.     {19,  18, 24, 18, 19, 18, 24, 18}
  104.   },
  105.   {
  106.     {22,  21, 28, 21, 22, 21, 28, 21},
  107.     {21,  19, 26, 19, 21, 19, 26, 19},
  108.     {28,  26, 35, 26, 28, 26, 35, 26},
  109.     {21,  19, 26, 19, 21, 19, 26, 19},
  110.     {22,  21, 28, 21, 22, 21, 28, 21},
  111.     {21,  19, 26, 19, 21, 19, 26, 19},
  112.     {28,  26, 35, 26, 28, 26, 35, 26},
  113.     {21,  19, 26, 19, 21, 19, 26, 19}
  114.   },
  115.   {
  116.     {26,  24, 33, 24, 26, 24, 33, 24},
  117.     {24,  23, 31, 23, 24, 23, 31, 23},
  118.     {33,  31, 42, 31, 33, 31, 42, 31},
  119.     {24,  23, 31, 23, 24, 23, 31, 23},
  120.     {26,  24, 33, 24, 26, 24, 33, 24},
  121.     {24,  23, 31, 23, 24, 23, 31, 23},
  122.     {33,  31, 42, 31, 33, 31, 42, 31},
  123.     {24,  23, 31, 23, 24, 23, 31, 23}
  124.   },
  125.   {
  126.     {28,  26, 35, 26, 28, 26, 35, 26},
  127.     {26,  25, 33, 25, 26, 25, 33, 25},
  128.     {35,  33, 45, 33, 35, 33, 45, 33},
  129.     {26,  25, 33, 25, 26, 25, 33, 25},
  130.     {28,  26, 35, 26, 28, 26, 35, 26},
  131.     {26,  25, 33, 25, 26, 25, 33, 25},
  132.     {35,  33, 45, 33, 35, 33, 45, 33},
  133.     {26,  25, 33, 25, 26, 25, 33, 25}
  134.   },
  135.   {
  136.     {32,  30, 40, 30, 32, 30, 40, 30},
  137.     {30,  28, 38, 28, 30, 28, 38, 28},
  138.     {40,  38, 51, 38, 40, 38, 51, 38},
  139.     {30,  28, 38, 28, 30, 28, 38, 28},
  140.     {32,  30, 40, 30, 32, 30, 40, 30},
  141.     {30,  28, 38, 28, 30, 28, 38, 28},
  142.     {40,  38, 51, 38, 40, 38, 51, 38},
  143.     {30,  28, 38, 28, 30, 28, 38, 28}
  144.   },
  145.   {
  146.     {36,  34, 46, 34, 36, 34, 46, 34},
  147.     {34,  32, 43, 32, 34, 32, 43, 32},
  148.     {46,  43, 58, 43, 46, 43, 58, 43},
  149.     {34,  32, 43, 32, 34, 32, 43, 32},
  150.     {36,  34, 46, 34, 36, 34, 46, 34},
  151.     {34,  32, 43, 32, 34, 32, 43, 32},
  152.     {46,  43, 58, 43, 46, 43, 58, 43},
  153.     {34,  32, 43, 32, 34, 32, 43, 32}
  154.   }
  155. };
  156. int matrix4x4_check[6] = {0, 0, 0, 0, 0, 0};
  157. int matrix8x8_check[6] = {0, 0, 0, 0, 0, 0};
  158. static const char MatrixType4x4[6][20] =
  159. {
  160.   "INTRA4X4_LUMA",
  161.   "INTRA4X4_CHROMAU",
  162.   "INTRA4X4_CHROMAV",
  163.   "INTER4X4_LUMA",
  164.   "INTER4X4_CHROMAU",
  165.   "INTER4X4_CHROMAV"
  166. };
  167. static const char MatrixType8x8[6][20] =
  168. {
  169.   "INTRA8X8_LUMA",
  170.   "INTER8X8_LUMA",
  171.   "INTRA8X8_CHROMAU",  // only for 4:4:4
  172.   "INTER8X8_CHROMAU",  // only for 4:4:4
  173.   "INTRA8X8_CHROMAV",  // only for 4:4:4
  174.   "INTER8X8_CHROMAV"   // only for 4:4:4
  175. };
  176. int *****LevelScale4x4Comp;
  177. int *****LevelScale8x8Comp;
  178. int *****InvLevelScale4x4Comp;
  179. int *****InvLevelScale8x8Comp;
  180. short ScalingList4x4input[6][16];
  181. short ScalingList8x8input[6][64];
  182. short ScalingList4x4[6][16];
  183. short ScalingList8x8[6][64];
  184. short UseDefaultScalingMatrix4x4Flag[6];
  185. short UseDefaultScalingMatrix8x8Flag[6];
  186. int *qp_per_matrix;
  187. int *qp_rem_matrix;
  188. static const short Quant_intra_default[16] =
  189. {
  190.  6,13,20,28,
  191. 13,20,28,32,
  192. 20,28,32,37,
  193. 28,32,37,42
  194. };
  195. static const short Quant_inter_default[16] =
  196. {
  197. 10,14,20,24,
  198. 14,20,24,27,
  199. 20,24,27,30,
  200. 24,27,30,34
  201. };
  202. static const short Quant8_intra_default[64] =
  203. {
  204.  6,10,13,16,18,23,25,27,
  205. 10,11,16,18,23,25,27,29,
  206. 13,16,18,23,25,27,29,31,
  207. 16,18,23,25,27,29,31,33,
  208. 18,23,25,27,29,31,33,36,
  209. 23,25,27,29,31,33,36,38,
  210. 25,27,29,31,33,36,38,40,
  211. 27,29,31,33,36,38,40,42
  212. };
  213. static const short Quant8_inter_default[64] =
  214. {
  215.  9,13,15,17,19,21,22,24,
  216. 13,13,17,19,21,22,24,25,
  217. 15,17,19,21,22,24,25,27,
  218. 17,19,21,22,24,25,27,28,
  219. 19,21,22,24,25,27,28,30,
  220. 21,22,24,25,27,28,30,32,
  221. 22,24,25,27,28,30,32,33,
  222. 24,25,27,28,30,32,33,35
  223. };
  224. /*!
  225.  ***********************************************************************
  226.  * brief
  227.  *    Check the parameter name.
  228.  * param s
  229.  *    parameter name string
  230.  * param type
  231.  *    4x4 or 8x8 matrix type
  232.  * return
  233.  *    the index number if the string is a valid parameter name,         n
  234.  *    -1 for error
  235.  ***********************************************************************
  236.  */
  237. int CheckParameterName (char *s, int *type)
  238. {
  239.   int i = 0;
  240.   *type = 0;
  241.   while ((MatrixType4x4[i] != NULL) && (i<6))
  242.   {
  243.     if (0==strcmp (MatrixType4x4[i], s))
  244.       return i;
  245.     else
  246.       i++;
  247.   }
  248.   i = 0;
  249.   *type = 1;
  250.   while ((MatrixType8x8[i] != NULL) && (i<6))
  251.   {
  252.     if (0==strcmp (MatrixType8x8[i], s))
  253.       return i;
  254.     else
  255.       i++;
  256.   }
  257.   return -1;
  258. }
  259. /*!
  260.  ***********************************************************************
  261.  * brief
  262.  *    Parse the Q matrix values read from cfg file.
  263.  * param buf
  264.  *    buffer to be parsed
  265.  * param bufsize
  266.  *    buffer size of buffer
  267.  ***********************************************************************
  268.  */
  269. void ParseMatrix (char *buf, int bufsize)
  270. {
  271.   char *items[MAX_ITEMS_TO_PARSE];
  272.   int MapIdx;
  273.   int item = 0;
  274.   int InString = 0, InItem = 0;
  275.   char *p = buf;
  276.   char *bufend = &buf[bufsize];
  277.   int IntContent;
  278.   int i, j, range, type, cnt;
  279.   short *ScalingList;
  280.   while (p < bufend)
  281.   {
  282.     switch (*p)
  283.     {
  284.       case 13:
  285.         p++;
  286.         break;
  287.       case '#':                 // Found comment
  288.         *p = '';              // Replace '#' with '' in case of comment immediately following integer or string
  289.         while (*p != 'n' && p < bufend)  // Skip till EOL or EOF, whichever comes first
  290.           p++;
  291.         InString = 0;
  292.         InItem = 0;
  293.         break;
  294.       case 'n':
  295.         InItem = 0;
  296.         InString = 0;
  297.         *p++='';
  298.         break;
  299.       case ' ':
  300.       case 't':              // Skip whitespace, leave state unchanged
  301.         if (InString)
  302.           p++;
  303.         else
  304.         {                     // Terminate non-strings once whitespace is found
  305.           *p++ = '';
  306.           InItem = 0;
  307.         }
  308.         break;
  309.       case '"':               // Begin/End of String
  310.         *p++ = '';
  311.         if (!InString)
  312.         {
  313.           items[item++] = p;
  314.           InItem = ~InItem;
  315.         }
  316.         else
  317.           InItem = 0;
  318.         InString = ~InString; // Toggle
  319.         break;
  320.       case ',':
  321.         p++;
  322.         InItem = 0;
  323.         break;
  324.       default:
  325.         if (!InItem)
  326.         {
  327.           items[item++] = p;
  328.           InItem = ~InItem;
  329.         }
  330.         p++;
  331.     }
  332.   }
  333.   item--;
  334.   for (i=0; i<item; i+=cnt)
  335.   {
  336.     cnt=0;
  337.     if (0 > (MapIdx = CheckParameterName (items[i+cnt], &type)))
  338.     {
  339.       snprintf (errortext, ET_SIZE, " Parsing error in config file: Parameter Name '%s' not recognized.", items[i+cnt]);
  340.       error (errortext, 300);
  341.     }
  342.     cnt++;
  343.     if (strcmp ("=", items[i+cnt]))
  344.     {
  345.       snprintf (errortext, ET_SIZE, " Parsing error in config file: '=' expected as the second token in each item.");
  346.       error (errortext, 300);
  347.     }
  348.     cnt++;
  349.     if (!type) //4x4 Matrix
  350.     {
  351.       range = 16;
  352.       ScalingList = ScalingList4x4input[MapIdx];
  353.       matrix4x4_check[MapIdx] = 1; //to indicate matrix found in cfg file
  354.     }
  355.     else //8x8 matrix
  356.     {
  357.       range = 64;
  358.       ScalingList = ScalingList8x8input[MapIdx];
  359.       matrix8x8_check[MapIdx] = 1; //to indicate matrix found in cfg file
  360.     }
  361.     for(j=0; j<range; j++)
  362.     {
  363.       if (1 != sscanf (items[i+cnt+j], "%d", &IntContent))
  364.       {
  365.         snprintf (errortext, ET_SIZE, " Parsing error: Expected numerical value for Parameter of %s, found '%s'.", items[i], items[i+cnt+j]);
  366.         error (errortext, 300);
  367.       }
  368.       ScalingList[j] = (short)IntContent; //save value in matrix
  369.     }
  370.     cnt+=j;
  371.     printf (".");
  372.   }
  373. }
  374. /*!
  375.  ***********************************************************************
  376.  * brief
  377.  *    Check Q Matrix values. If invalid values found in matrix,
  378.  *    whole matrix will be patch with default value 16.
  379.  ***********************************************************************
  380.  */
  381. void PatchMatrix(void)
  382. {
  383.   short *ScalingList;
  384.   int i, cnt, fail;
  385.   for(i=0; i<6; i++)
  386.   {
  387.     if(params->ScalingListPresentFlag[i])
  388.     {
  389.       ScalingList=ScalingList4x4input[i];
  390.       if(matrix4x4_check[i])
  391.       {
  392.         fail=0;
  393.         for(cnt=0; cnt<16; cnt++)
  394.         {
  395.           if(ScalingList[cnt]<0 || ScalingList[cnt]>255) // ScalingList[0]=0 to indicate use default matrix
  396.           {
  397.             fail=1;
  398.             break;
  399.           }
  400.         }
  401.         if(fail) //value of matrix exceed range
  402.         {
  403.           printf("n%s value exceed range. (Value must be 1 to 255)n", MatrixType4x4[i]);
  404.           printf("Setting default values for this matrix.");
  405.           if(i>2)
  406.             memcpy(ScalingList, Quant_inter_default, sizeof(short)*16);
  407.           else
  408.             memcpy(ScalingList, Quant_intra_default, sizeof(short)*16);
  409.         }
  410.       }
  411.       else //matrix not found, pad with default value
  412.       {
  413.         printf("n%s matrix definition not found. Setting default values.", MatrixType4x4[i]);
  414.         if(i>2)
  415.           memcpy(ScalingList, Quant_inter_default, sizeof(short)*16);
  416.         else
  417.           memcpy(ScalingList, Quant_intra_default, sizeof(short)*16);
  418.       }
  419.     }
  420.     if(params->ScalingListPresentFlag[i+6])
  421.     {
  422.       ScalingList=ScalingList8x8input[i];
  423.       if(matrix8x8_check[i])
  424.       {
  425.         fail=0;
  426.         for(cnt=0; cnt<64; cnt++)
  427.         {
  428.           if(ScalingList[cnt]<0 || ScalingList[cnt]>255) // ScalingList[0]=0 to indicate use default matrix
  429.           {
  430.             fail=1;
  431.             break;
  432.           }
  433.         }
  434.         if(fail) //value of matrix exceed range
  435.         {
  436.           printf("n%s value exceed range. (Value must be 1 to 255)n", MatrixType8x8[i]);
  437.           printf("Setting default values for this matrix.");
  438.           if(i==1 || i==3 || i==5)
  439.             memcpy(ScalingList, Quant8_inter_default, sizeof(short)*64);
  440.           else
  441.             memcpy(ScalingList, Quant8_intra_default, sizeof(short)*64);
  442.         }
  443.       }
  444.       else //matrix not found, pad with default value
  445.       {
  446.         printf("n%s matrix definition not found. Setting default values.", MatrixType8x8[i]);
  447.         if(i==1 || i==3 || i==5)
  448.           memcpy(ScalingList, Quant8_inter_default, sizeof(short)*64);
  449.         else
  450.           memcpy(ScalingList, Quant8_intra_default, sizeof(short)*64);
  451.       }
  452.     }
  453.   }
  454. }
  455. /*!
  456.  ***********************************************************************
  457.  * brief
  458.  *    Allocate Q matrix arrays
  459.  ***********************************************************************
  460.  */
  461. void allocate_QMatrix (void)
  462. {
  463.   int bitdepth_qp_scale = 6*(params->output.bit_depth[0] - 8);
  464.   int i;
  465.   if ((qp_per_matrix = (int*)malloc((MAX_QP + 1 +  bitdepth_qp_scale)*sizeof(int))) == NULL)
  466.     no_mem_exit("init_global_buffers: qp_per_matrix");
  467.   if ((qp_rem_matrix = (int*)malloc((MAX_QP + 1 +  bitdepth_qp_scale)*sizeof(int))) == NULL)
  468.     no_mem_exit("init_global_buffers: qp_per_matrix");
  469.   for (i = 0; i < MAX_QP + bitdepth_qp_scale + 1; i++)
  470.   {
  471.     qp_per_matrix[i] = i / 6;
  472.     qp_rem_matrix[i] = i % 6;
  473.   }
  474.   get_mem5Dint(&LevelScale4x4Comp,    3, 2, 6, 4, 4);
  475.   get_mem5Dint(&LevelScale8x8Comp,    3, 2, 6, 8, 8);
  476.   get_mem5Dint(&InvLevelScale4x4Comp, 3, 2, 6, 4, 4);
  477.   get_mem5Dint(&InvLevelScale8x8Comp, 3, 2, 6, 8, 8);
  478. }
  479. /*!
  480.  ***********************************************************************
  481.  * brief
  482.  *    Free Q matrix arrays
  483.  ***********************************************************************
  484.  */
  485. void free_QMatrix ()
  486. {
  487.   free(qp_rem_matrix);
  488.   free(qp_per_matrix);
  489.   free_mem5Dint(LevelScale4x4Comp);
  490.   free_mem5Dint(LevelScale8x8Comp);
  491.   free_mem5Dint(InvLevelScale4x4Comp);
  492.   free_mem5Dint(InvLevelScale8x8Comp);
  493. }
  494. /*!
  495.  ***********************************************************************
  496.  * brief
  497.  *    Initialise Q matrix values.
  498.  ***********************************************************************
  499.  */
  500. void Init_QMatrix (void)
  501. {
  502.   char *content;
  503.   allocate_QMatrix ();
  504.   if(params->ScalingMatrixPresentFlag)
  505.   {
  506.     printf ("Parsing QMatrix file %s ", params->QmatrixFile);
  507.     content = GetConfigFileContent(params->QmatrixFile, 0);
  508.     if(content!='')
  509.       ParseMatrix(content, strlen (content));
  510.     else
  511.       printf("nError: %snProceeding with default values for all matrices.", errortext);
  512.     PatchMatrix();
  513.     printf("n");
  514.     memset(UseDefaultScalingMatrix4x4Flag, 0, 6 * sizeof(short));
  515.     memset(UseDefaultScalingMatrix8x8Flag, 0, 6 * sizeof(short));
  516.     free(content);
  517.   }
  518. }
  519. /*!
  520.  ************************************************************************
  521.  * brief
  522.  *    For calculating the quantisation values at frame level
  523.  *
  524.  * par Input:
  525.  *    none
  526.  *
  527.  * par Output:
  528.  *    none
  529.  ************************************************************************
  530.  */
  531. void CalculateQuantParam(void)
  532. {
  533.   int i, j, k, temp;
  534.   int present[6];
  535.   int no_q_matrix=FALSE;
  536.   if(!active_sps->seq_scaling_matrix_present_flag && !active_pps->pic_scaling_matrix_present_flag) //set to no q-matrix
  537.     no_q_matrix=TRUE;
  538.   else
  539.   {
  540.     memset(present, 0, 6 * sizeof(int));
  541.     if(active_sps->seq_scaling_matrix_present_flag)
  542.       for(i=0; i<6; i++)
  543.         present[i] = active_sps->seq_scaling_list_present_flag[i];
  544.     if(active_pps->pic_scaling_matrix_present_flag)
  545.       for(i=0; i<6; i++)
  546.       {
  547.         if((i==0) || (i==3))
  548.           present[i] |= active_pps->pic_scaling_list_present_flag[i];
  549.         else
  550.           present[i] = active_pps->pic_scaling_list_present_flag[i];
  551.       }
  552.   }
  553.   if(no_q_matrix==TRUE)
  554.   {
  555.     for(k=0; k<6; k++)
  556.       for(j=0; j<4; j++)
  557.         for(i=0; i<4; i++)
  558.         {
  559.           LevelScale4x4Comp[0][1][k][j][i]    = quant_coef[k][j][i];
  560.           InvLevelScale4x4Comp[0][1][k][j][i] = dequant_coef[k][j][i]<<4;
  561.           LevelScale4x4Comp[1][1][k][j][i]    = quant_coef[k][j][i];
  562.           InvLevelScale4x4Comp[1][1][k][j][i] = dequant_coef[k][j][i]<<4;
  563.           LevelScale4x4Comp[2][1][k][j][i]    = quant_coef[k][j][i];
  564.           InvLevelScale4x4Comp[2][1][k][j][i] = dequant_coef[k][j][i]<<4;
  565.           // Inter
  566.           LevelScale4x4Comp[0][0][k][j][i]    = quant_coef[k][j][i];
  567.           InvLevelScale4x4Comp[0][0][k][j][i] = dequant_coef[k][j][i]<<4;
  568.           LevelScale4x4Comp[1][0][k][j][i]    = quant_coef[k][j][i];
  569.           InvLevelScale4x4Comp[1][0][k][j][i] = dequant_coef[k][j][i]<<4;
  570.           LevelScale4x4Comp[2][0][k][j][i]    = quant_coef[k][j][i];
  571.           InvLevelScale4x4Comp[2][0][k][j][i] = dequant_coef[k][j][i]<<4;
  572.         }
  573.   }
  574.   else
  575.   {
  576.     for(k=0; k<6; k++)
  577.     {
  578.       for(j=0; j<4; j++)
  579.       {
  580.         for(i=0; i<4; i++)
  581.         {
  582.           temp = (j<<2)+i;
  583.           if((!present[0]) || UseDefaultScalingMatrix4x4Flag[0])
  584.           {
  585.             LevelScale4x4Comp[0][1][k][j][i]         = (quant_coef[k][j][i]<<4)/Quant_intra_default[temp];
  586.             InvLevelScale4x4Comp[0][1][k][j][i]      = dequant_coef[k][j][i]*Quant_intra_default[temp];
  587.           }
  588.           else
  589.           {
  590.             LevelScale4x4Comp[0][1][k][j][i]         = (quant_coef[k][j][i]<<4)/ScalingList4x4[0][temp];
  591.             InvLevelScale4x4Comp[0][1][k][j][i]      = dequant_coef[k][j][i]*ScalingList4x4[0][temp];
  592.           }
  593.           if(!present[1])
  594.           {
  595.             LevelScale4x4Comp[1][1][k][j][i]    = LevelScale4x4Comp[0][1][k][j][i];
  596.             InvLevelScale4x4Comp[1][1][k][j][i] = InvLevelScale4x4Comp[0][1][k][j][i];
  597.           }
  598.           else
  599.           {
  600.             LevelScale4x4Comp[1][1][k][j][i]    = (quant_coef[k][j][i]<<4)/(UseDefaultScalingMatrix4x4Flag[1] ? Quant_intra_default[temp]:ScalingList4x4[1][temp]);
  601.             InvLevelScale4x4Comp[1][1][k][j][i] = dequant_coef[k][j][i]*(UseDefaultScalingMatrix4x4Flag[1] ? Quant_intra_default[temp]:ScalingList4x4[1][temp]);
  602.           }
  603.           if(!present[2])
  604.           {
  605.             LevelScale4x4Comp[2][1][k][j][i]    = LevelScale4x4Comp[1][1][k][j][i];
  606.             InvLevelScale4x4Comp[2][1][k][j][i] = InvLevelScale4x4Comp[1][1][k][j][i];
  607.           }
  608.           else
  609.           {
  610.             LevelScale4x4Comp[2][1][k][j][i]    = (quant_coef[k][j][i]<<4)/(UseDefaultScalingMatrix4x4Flag[2] ? Quant_intra_default[temp]:ScalingList4x4[2][temp]);
  611.             InvLevelScale4x4Comp[2][1][k][j][i] = dequant_coef[k][j][i]*(UseDefaultScalingMatrix4x4Flag[2] ? Quant_intra_default[temp]:ScalingList4x4[2][temp]);
  612.           }
  613.           if((!present[3]) || UseDefaultScalingMatrix4x4Flag[3])
  614.           {
  615.             LevelScale4x4Comp[0][0][k][j][i]         = (quant_coef[k][j][i]<<4)/Quant_inter_default[temp];
  616.             InvLevelScale4x4Comp[0][0][k][j][i]      = dequant_coef[k][j][i]*Quant_inter_default[temp];
  617.           }
  618.           else
  619.           {
  620.             LevelScale4x4Comp[0][0][k][j][i]         = (quant_coef[k][j][i]<<4)/ScalingList4x4[3][temp];
  621.             InvLevelScale4x4Comp[0][0][k][j][i]      = dequant_coef[k][j][i]*ScalingList4x4[3][temp];
  622.           }
  623.           if(!present[4])
  624.           {
  625.             LevelScale4x4Comp[1][0][k][j][i]    = LevelScale4x4Comp[0][0][k][j][i];
  626.             InvLevelScale4x4Comp[1][0][k][j][i] = InvLevelScale4x4Comp[0][0][k][j][i];
  627.           }
  628.           else
  629.           {
  630.             LevelScale4x4Comp[1][0][k][j][i]    = (quant_coef[k][j][i]<<4)/(UseDefaultScalingMatrix4x4Flag[4] ? Quant_inter_default[temp]:ScalingList4x4[4][temp]);
  631.             InvLevelScale4x4Comp[1][0][k][j][i] = dequant_coef[k][j][i]*(UseDefaultScalingMatrix4x4Flag[4] ? Quant_inter_default[temp]:ScalingList4x4[4][temp]);
  632.           }
  633.           if(!present[5])
  634.           {
  635.             LevelScale4x4Comp[2][0][k][j][i]    = LevelScale4x4Comp[1][0][k][j][i];
  636.             InvLevelScale4x4Comp[2][0][k][j][i] = InvLevelScale4x4Comp[1][0][k][j][i];
  637.           }
  638.           else
  639.           {
  640.             LevelScale4x4Comp[2][0][k][j][i]    = (quant_coef[k][j][i]<<4)/(UseDefaultScalingMatrix4x4Flag[5] ? Quant_inter_default[temp]:ScalingList4x4[5][temp]);
  641.             InvLevelScale4x4Comp[2][0][k][j][i] = dequant_coef[k][j][i]*(UseDefaultScalingMatrix4x4Flag[5] ? Quant_inter_default[temp]:ScalingList4x4[5][temp]);
  642.           }
  643.         }
  644.       }
  645.     }
  646.   }
  647. }
  648. /*!
  649.  ************************************************************************
  650.  * brief
  651.  *    Calculate the quantisation and inverse quantisation parameters
  652.  *
  653.  ************************************************************************
  654.  */
  655. void CalculateQuant8Param()
  656. {
  657.   int i, j, k, temp;
  658.   int n_ScalingList8x8;
  659.   int present[6];
  660.   int no_q_matrix=FALSE;
  661.   // maximum number of valid 8x8 scaling lists
  662.   n_ScalingList8x8 = ( active_sps->chroma_format_idc != 3 ) ? 2 : 6;
  663.   if(!active_sps->seq_scaling_matrix_present_flag && !active_pps->pic_scaling_matrix_present_flag) //set to default matrix
  664.     no_q_matrix=TRUE;
  665.   else
  666.   {
  667.     memset(present, 0, sizeof(int)*n_ScalingList8x8);
  668.     if(active_sps->seq_scaling_matrix_present_flag)
  669.       for(i=0; i<n_ScalingList8x8; i++)
  670.         present[i] = active_sps->seq_scaling_list_present_flag[i+6];
  671.       if(active_pps->pic_scaling_matrix_present_flag)
  672.         for(i=0; i<n_ScalingList8x8; i++)
  673.         {
  674.           if( i==0 || i==1 )
  675.             present[i] |= active_pps->pic_scaling_list_present_flag[i+6];
  676.           else
  677.             present[i] = active_pps->pic_scaling_list_present_flag[i+6];
  678.         }
  679.   }
  680.   if(no_q_matrix==TRUE)
  681.   {
  682.     for(k=0; k<6; k++)
  683.       for(j=0; j<8; j++)
  684.         for(i=0; i<8; i++)
  685.         {
  686.           // intra Y
  687.           LevelScale8x8Comp[0][1][k][j][i]      = quant_coef8[k][j][i];
  688.           InvLevelScale8x8Comp[0][1][k][j][i]   = dequant_coef8[k][j][i]<<4;
  689.           // inter Y
  690.           LevelScale8x8Comp[0][0][k][j][i]      = quant_coef8[k][j][i];
  691.           InvLevelScale8x8Comp[0][0][k][j][i]   = dequant_coef8[k][j][i]<<4;
  692.           if( n_ScalingList8x8 > 2 )  // 4:4:4 case only
  693.           {
  694.             // intra U
  695.             LevelScale8x8Comp[1][1][k][j][i]    = quant_coef8[k][j][i];
  696.             InvLevelScale8x8Comp[1][1][k][j][i] = dequant_coef8[k][j][i]<<4;
  697.             // intra V
  698.             LevelScale8x8Comp[2][1][k][j][i]    = quant_coef8[k][j][i];
  699.             InvLevelScale8x8Comp[2][1][k][j][i] = dequant_coef8[k][j][i]<<4;
  700.             // inter U
  701.             LevelScale8x8Comp[1][0][k][j][i]    = quant_coef8[k][j][i];
  702.             InvLevelScale8x8Comp[1][0][k][j][i] = dequant_coef8[k][j][i]<<4;
  703.             // inter V
  704.             LevelScale8x8Comp[2][0][k][j][i]    = quant_coef8[k][j][i];
  705.             InvLevelScale8x8Comp[2][0][k][j][i] = dequant_coef8[k][j][i]<<4;
  706.           }
  707.         }
  708.   }
  709.   else
  710.   {
  711.     for(k=0; k<6; k++)
  712.       for(j=0; j<8; j++)
  713.         for(i=0; i<8; i++)
  714.         {
  715.           temp = (j<<3)+i;
  716.           if((!present[0]) || UseDefaultScalingMatrix8x8Flag[0])
  717.           {
  718.             LevelScale8x8Comp[0][1][k][j][i]    = (quant_coef8[k][j][i]<<4)/Quant8_intra_default[temp];
  719.             InvLevelScale8x8Comp[0][1][k][j][i] = dequant_coef8[k][j][i]*Quant8_intra_default[temp];
  720.           }
  721.           else
  722.           {
  723.             LevelScale8x8Comp[0][1][k][j][i]    = (quant_coef8[k][j][i]<<4)/ScalingList8x8[0][temp];
  724.             InvLevelScale8x8Comp[0][1][k][j][i] = dequant_coef8[k][j][i]*ScalingList8x8[0][temp];
  725.           }
  726.           if((!present[1]) || UseDefaultScalingMatrix8x8Flag[1])
  727.           {
  728.             LevelScale8x8Comp[0][0][k][j][i]    = (quant_coef8[k][j][i]<<4)/Quant8_inter_default[temp];
  729.             InvLevelScale8x8Comp[0][0][k][j][i] = dequant_coef8[k][j][i]*Quant8_inter_default[temp];
  730.           }
  731.           else
  732.           {
  733.             LevelScale8x8Comp[0][0][k][j][i]    = (quant_coef8[k][j][i]<<4)/ScalingList8x8[1][temp];
  734.             InvLevelScale8x8Comp[0][0][k][j][i] = dequant_coef8[k][j][i]*ScalingList8x8[1][temp];
  735.           }
  736.           if( n_ScalingList8x8 > 2 )
  737.           {
  738.             // Intra U
  739.             if(!present[2])
  740.             {
  741.               LevelScale8x8Comp[1][1][k][j][i]    = LevelScale8x8Comp[0][1][k][j][i];
  742.               InvLevelScale8x8Comp[1][1][k][j][i] = InvLevelScale8x8Comp[0][1][k][j][i];
  743.             }
  744.             else
  745.             {
  746.               LevelScale8x8Comp[1][1][k][j][i]    = (quant_coef8[k][j][i]<<4)/(UseDefaultScalingMatrix8x8Flag[2] ? Quant8_intra_default[temp]:ScalingList8x8[2][temp]);
  747.               InvLevelScale8x8Comp[1][1][k][j][i] = dequant_coef8[k][j][i]*(UseDefaultScalingMatrix8x8Flag[2] ? Quant8_intra_default[temp]:ScalingList8x8[2][temp]);
  748.             }
  749.             // Inter U
  750.             if(!present[3])
  751.             {
  752.               LevelScale8x8Comp[1][0][k][j][i]    = LevelScale8x8Comp[0][0][k][j][i];
  753.               InvLevelScale8x8Comp[1][0][k][j][i] = InvLevelScale8x8Comp[0][0][k][j][i];
  754.             }
  755.             else
  756.             {
  757.               LevelScale8x8Comp[1][0][k][j][i]    = (quant_coef8[k][j][i]<<4)/(UseDefaultScalingMatrix8x8Flag[3] ? Quant8_inter_default[temp]:ScalingList8x8[3][temp]);
  758.               InvLevelScale8x8Comp[1][0][k][j][i] = dequant_coef8[k][j][i]*(UseDefaultScalingMatrix8x8Flag[3] ? Quant8_inter_default[temp]:ScalingList8x8[3][temp]);
  759.             }
  760.             // Intra V
  761.             if(!present[4])
  762.             {
  763.               LevelScale8x8Comp[2][1][k][j][i]    = LevelScale8x8Comp[1][1][k][j][i];
  764.               InvLevelScale8x8Comp[2][1][k][j][i] = InvLevelScale8x8Comp[1][1][k][j][i];
  765.             }
  766.             else
  767.             {
  768.               LevelScale8x8Comp[2][1][k][j][i]    = (quant_coef8[k][j][i]<<4)/(UseDefaultScalingMatrix8x8Flag[4] ? Quant8_intra_default[temp]:ScalingList8x8[4][temp]);
  769.               InvLevelScale8x8Comp[2][1][k][j][i] = dequant_coef8[k][j][i]*(UseDefaultScalingMatrix8x8Flag[4] ? Quant8_intra_default[temp]:ScalingList8x8[4][temp]);
  770.             }
  771.             // Inter V
  772.             if(!present[5])
  773.             {
  774.               LevelScale8x8Comp[2][0][k][j][i]    = LevelScale8x8Comp[1][0][k][j][i];
  775.               InvLevelScale8x8Comp[2][0][k][j][i] = InvLevelScale8x8Comp[1][0][k][j][i];
  776.             }
  777.             else
  778.             {
  779.               LevelScale8x8Comp[2][0][k][j][i]    = (quant_coef8[k][j][i]<<4)/(UseDefaultScalingMatrix8x8Flag[5] ? Quant8_inter_default[temp]:ScalingList8x8[5][temp]);
  780.               InvLevelScale8x8Comp[2][0][k][j][i] = dequant_coef8[k][j][i]*(UseDefaultScalingMatrix8x8Flag[5] ? Quant8_inter_default[temp]:ScalingList8x8[5][temp]);
  781.             }
  782.           }
  783.         }
  784.   }
  785. }