• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <gtest/gtest.h>
2 
3 #include "memory_align.h"
4 #include "utils/DataGenerator.h"
5 
6 #include "encode_mb_aux.h"
7 using namespace WelsEnc;
8 
9 ALIGNED_DECLARE (const int16_t, g_kiQuantInterFFCompare[104][8], 16) = {
10   /* 0*/    {   0,     1,     0,     1,     1,     1,     1,     1 },
11   /* 1*/    {   0,     1,     0,     1,     1,     1,     1,     1 },
12   /* 2*/    {   1,     1,     1,     1,     1,     1,     1,     1 },
13   /* 3*/    {   1,     1,     1,     1,     1,     2,     1,     2 },
14   /* 4*/    {   1,     1,     1,     1,     1,     2,     1,     2 },
15   /* 5*/    {   1,     1,     1,     1,     1,     2,     1,     2 },
16   /* 6*/    {   1,     1,     1,     1,     1,     2,     1,     2 },
17   /* 7*/    {   1,     2,     1,     2,     2,     2,     2,     2 },
18   /* 8*/    {   1,     2,     1,     2,     2,     3,     2,     3 },
19   /* 9*/    {   1,     2,     1,     2,     2,     3,     2,     3 },
20   /*10*/    {   1,     2,     1,     2,     2,     3,     2,     3 },
21   /*11*/    {   2,     2,     2,     2,     2,     4,     2,     4 },
22   /*12*/    {   2,     3,     2,     3,     3,     4,     3,     4 },
23   /*13*/    {   2,     3,     2,     3,     3,     5,     3,     5 },
24   /*14*/    {   2,     3,     2,     3,     3,     5,     3,     5 },
25   /*15*/    {   2,     4,     2,     4,     4,     6,     4,     6 },
26   /*16*/    {   3,     4,     3,     4,     4,     7,     4,     7 },
27   /*17*/    {   3,     5,     3,     5,     5,     8,     5,     8 },
28   /*18*/    {   3,     6,     3,     6,     6,     9,     6,     9 },
29   /*19*/    {   4,     6,     4,     6,     6,    10,     6,    10 },
30   /*20*/    {   4,     7,     4,     7,     7,    11,     7,    11 },
31   /*21*/    {   5,     8,     5,     8,     8,    12,     8,    12 },
32   /*22*/    {   6,     9,     6,     9,     9,    13,     9,    13 },
33   /*23*/    {   6,    10,     6,    10,    10,    16,    10,    16 },
34   /*24*/    {   7,    11,     7,    11,    11,    17,    11,    17 },
35   /*25*/    {   8,    12,     8,    12,    12,    19,    12,    19 },
36   /*26*/    {   9,    14,     9,    14,    14,    21,    14,    21 },
37   /*27*/    {  10,    15,    10,    15,    15,    25,    15,    25 },
38   /*28*/    {  11,    17,    11,    17,    17,    27,    17,    27 },
39   /*29*/    {  12,    20,    12,    20,    20,    31,    20,    31 },
40   /*30*/    {  14,    22,    14,    22,    22,    34,    22,    34 },
41   /*31*/    {  15,    24,    15,    24,    24,    39,    24,    39 },
42   /*32*/    {  18,    27,    18,    27,    27,    43,    27,    43 },
43   /*33*/    {  19,    31,    19,    31,    31,    49,    31,    49 },
44   /*34*/    {  22,    34,    22,    34,    34,    54,    34,    54 },
45   /*35*/    {  25,    40,    25,    40,    40,    62,    40,    62 },
46   /*36*/    {  27,    45,    27,    45,    45,    69,    45,    69 },
47   /*37*/    {  30,    48,    30,    48,    48,    77,    48,    77 },
48   /*38*/    {  36,    55,    36,    55,    55,    86,    55,    86 },
49   /*39*/    {  38,    62,    38,    62,    62,    99,    62,    99 },
50   /*40*/    {  44,    69,    44,    69,    69,   107,    69,   107 },
51   /*41*/    {  49,    79,    49,    79,    79,   125,    79,   125 },
52   /*42*/    {  55,    89,    55,    89,    89,   137,    89,   137 },
53   /*43*/    {  61,    96,    61,    96,    96,   154,    96,   154 },
54   /*44*/    {  71,   110,    71,   110,   110,   171,   110,   171 },
55   /*45*/    {  77,   124,    77,   124,   124,   198,   124,   198 },
56   /*46*/    {  88,   137,    88,   137,   137,   217,   137,   217 },
57   /*47*/    {  99,   159,    99,   159,   159,   250,   159,   250 },
58   /*48*/    { 110,   179,   110,   179,   179,   275,   179,   275 },
59   /*49*/    { 121,   191,   121,   191,   191,   313,   191,   313 },
60   /*50*/    { 143,   221,   143,   221,   221,   341,   221,   341 },
61   /*51*/    { 154,   245,   154,   245,   245,   402,   245,   402 },
62 //from here below is intra
63   /* 0*/    {   1,     1,     1,     1,     1,     2,     1,     2 },
64   /* 1*/    {   1,     1,     1,     1,     1,     2,     1,     2 },
65   /* 2*/    {   1,     2,     1,     2,     2,     3,     2,     3 },
66   /* 3*/    {   1,     2,     1,     2,     2,     3,     2,     3 },
67   /* 4*/    {   1,     2,     1,     2,     2,     3,     2,     3 },
68   /* 5*/    {   1,     2,     1,     2,     2,     4,     2,     4 },
69   /* 6*/    {   2,     3,     2,     3,     3,     4,     3,     4 },
70   /* 7*/    {   2,     3,     2,     3,     3,     5,     3,     5 },
71   /* 8*/    {   2,     3,     2,     3,     3,     5,     3,     5 },
72   /* 9*/    {   2,     4,     2,     4,     4,     6,     4,     6 },
73   /*10*/    {   3,     4,     3,     4,     4,     6,     4,     6 },
74   /*11*/    {   3,     5,     3,     5,     5,     7,     5,     7 },
75   /*12*/    {   3,     5,     3,     5,     5,     8,     5,     8 },
76   /*13*/    {   4,     6,     4,     6,     6,     9,     6,     9 },
77   /*14*/    {   4,     7,     4,     7,     7,    10,     7,    10 },
78   /*15*/    {   5,     7,     5,     7,     7,    12,     7,    12 },
79   /*16*/    {   5,     8,     5,     8,     8,    13,     8,    13 },
80   /*17*/    {   6,     9,     6,     9,     9,    15,     9,    15 },
81   /*18*/    {   7,    11,     7,    11,    11,    16,    11,    16 },
82   /*19*/    {   7,    11,     7,    11,    11,    18,    11,    18 },
83   /*20*/    {   9,    13,     9,    13,    13,    20,    13,    20 },
84   /*21*/    {   9,    15,     9,    15,    15,    24,    15,    24 },
85   /*22*/    {  11,    16,    11,    16,    16,    26,    16,    26 },
86   /*23*/    {  12,    19,    12,    19,    19,    30,    19,    30 },
87   /*24*/    {  13,    21,    13,    21,    21,    33,    21,    33 },
88   /*25*/    {  14,    23,    14,    23,    23,    37,    23,    37 },
89   /*26*/    {  17,    26,    17,    26,    26,    41,    26,    41 },
90   /*27*/    {  18,    30,    18,    30,    30,    47,    30,    47 },
91   /*28*/    {  21,    33,    21,    33,    33,    51,    33,    51 },
92   /*29*/    {  24,    38,    24,    38,    38,    59,    38,    59 },
93   /*30*/    {  26,    43,    26,    43,    43,    66,    43,    66 },
94   /*31*/    {  29,    46,    29,    46,    46,    74,    46,    74 },
95   /*32*/    {  34,    52,    34,    52,    52,    82,    52,    82 },
96   /*33*/    {  37,    59,    37,    59,    59,    94,    59,    94 },
97   /*34*/    {  42,    66,    42,    66,    66,   102,    66,   102 },
98   /*35*/    {  47,    75,    47,    75,    75,   119,    75,   119 },
99   /*36*/    {  52,    85,    52,    85,    85,   131,    85,   131 },
100   /*37*/    {  58,    92,    58,    92,    92,   147,    92,   147 },
101   /*38*/    {  68,   105,    68,   105,   105,   164,   105,   164 },
102   /*39*/    {  73,   118,    73,   118,   118,   189,   118,   189 },
103   /*40*/    {  84,   131,    84,   131,   131,   205,   131,   205 },
104   /*41*/    {  94,   151,    94,   151,   151,   239,   151,   239 },
105   /*42*/    { 105,   171,   105,   171,   171,   262,   171,   262 },
106   /*43*/    { 116,   184,   116,   184,   184,   295,   184,   295 },
107   /*44*/    { 136,   211,   136,   211,   211,   326,   211,   326 },
108   /*45*/    { 147,   236,   147,   236,   236,   377,   236,   377 },
109   /*46*/    { 168,   262,   168,   262,   262,   414,   262,   414 },
110   /*47*/    { 189,   303,   189,   303,   303,   478,   303,   478 },
111   /*48*/    { 211,   341,   211,   341,   341,   524,   341,   524 },
112   /*49*/    { 231,   364,   231,   364,   364,   597,   364,   597 },
113   /*50*/    { 272,   422,   272,   422,   422,   652,   422,   652 },
114   /*51*/    { 295,   467,   295,   467,   467,   768,   467,   768 }
115 };
116 
117 #define ThValue 2
118 
TestQuant(uint32_t qp,uint8_t * pSrc,uint8_t * pPred,int16_t * pDct,int16_t * pDctCompare,int16_t iWidth,int16_t iHeight)119 void TestQuant (uint32_t qp, uint8_t* pSrc, uint8_t* pPred, int16_t* pDct,
120                 int16_t* pDctCompare, int16_t iWidth, int16_t iHeight) {
121   const int16_t* pMf = g_kiQuantMF[qp];
122   const int16_t* pFfCompareI = g_kiQuantInterFFCompare[52 + qp];
123   const int16_t* pFfCompareP = g_kiQuantInterFFCompare[qp];
124   const int16_t* pFfI = g_kiQuantInterFF[6 + qp];
125   const int16_t* pFfP = g_kiQuantInterFF[qp];
126   //quant4x4  Intra MB
127   RandomPixelDataGenerator (pSrc, iWidth, iHeight, iWidth);
128   RandomPixelDataGenerator (pPred, iWidth, iHeight, iWidth);
129 
130   for (int16_t i = 0; i < 16; i++) {
131     pDct[i] = pSrc[i] - pPred[i];
132     pDctCompare[i] = pSrc[i] - pPred[i];
133   }
134 
135   WelsQuant4x4_c (pDct, pFfI, pMf);
136   WelsQuant4x4_c (pDctCompare, pFfCompareI, pMf);
137 
138   for (int16_t i = 0; i < 16; i++) {
139     int16_t iDeta = WELS_ABS (pDct[i] - pDctCompare[i]);
140     iDeta = (iDeta < ThValue) ? 0 : iDeta;
141     EXPECT_EQ (iDeta, 0);
142   }
143 
144   //quant4x4 DC
145   RandomPixelDataGenerator (pSrc, iWidth, iHeight, iWidth);
146   RandomPixelDataGenerator (pPred, iWidth, iHeight, iWidth);
147 
148   for (int16_t i = 0; i < 16; i++) {
149     pDct[i] = pSrc[i] - pPred[i];
150     pDctCompare[i] = pSrc[i] - pPred[i];
151   }
152 
153   WelsQuant4x4Dc_c (pDct, pFfI[0] << 1, pMf[0]>>1);
154   WelsQuant4x4Dc_c (pDctCompare, pFfCompareI[0] << 1, pMf[0]>>1);
155 
156   for (int16_t i = 0; i < 16; i++) {
157     int16_t iDeta = WELS_ABS (pDct[i] - pDctCompare[i]);
158     iDeta = (iDeta < ThValue) ? 0 : iDeta;
159     EXPECT_EQ (iDeta, 0);
160   }
161 
162   //quant4x4 Inter MB
163   RandomPixelDataGenerator (pSrc, iWidth, iHeight, iWidth);
164   RandomPixelDataGenerator (pPred, iWidth, iHeight, iWidth);
165 
166   for (int16_t i = 0; i < 64; i++) {
167     pDct[i] =  pSrc[i] - pPred[i];
168     pDctCompare[i] = pSrc[i] - pPred[i];
169   }
170 
171   WelsQuantFour4x4_c (pDct, pFfP, pMf);
172   WelsQuantFour4x4_c (pDctCompare, pFfCompareP, pMf);
173 
174   for (int16_t i = 0; i < 64; i++) {
175     int16_t iDeta = WELS_ABS (pDct[i] - pDctCompare[i]);
176     iDeta = (iDeta < ThValue) ? 0 : iDeta;
177     EXPECT_EQ (iDeta, 0);
178   }
179 }
180 
TEST(EncoderMbTest,TestQuantTable)181 TEST (EncoderMbTest, TestQuantTable) {
182   CMemoryAlign cMemoryAlign (0);
183 
184   int16_t iWidth = 16;
185   int16_t iHeight = 16;
186 
187   uint8_t* pSrc = (uint8_t*)cMemoryAlign.WelsMalloc (iWidth * iHeight, "quant_src");
188   uint8_t* pPred = (uint8_t*)cMemoryAlign.WelsMalloc (iWidth * iHeight, "quant_pred");
189   int16_t* pDct = (int16_t*)cMemoryAlign.WelsMalloc (64 * sizeof (int16_t), "Dct Buffer");
190   int16_t* pDctCompare = (int16_t*)cMemoryAlign.WelsMalloc (64 * sizeof (int16_t), "DctCompare Buffer");
191 
192   for (int32_t iQP = 0; iQP < 51; iQP++) {
193     TestQuant (iQP, pSrc, pPred, pDct, pDctCompare, iWidth, iHeight);
194   }
195 
196   cMemoryAlign.WelsFree (pSrc, "quant_src");
197   cMemoryAlign.WelsFree (pPred, "quant_pred");
198   cMemoryAlign.WelsFree (pDct, "Dct Buffer");
199   cMemoryAlign.WelsFree (pDctCompare, "DctCompare Buffer");
200 }
201