xref: /aosp_15_r20/external/libgav1/src/utils/entropy_decoder_test.cc (revision 095378508e87ed692bf8dfeb34008b65b3735891)
1*09537850SAkhilesh Sanikop // Copyright 2021 The libgav1 Authors
2*09537850SAkhilesh Sanikop //
3*09537850SAkhilesh Sanikop // Licensed under the Apache License, Version 2.0 (the "License");
4*09537850SAkhilesh Sanikop // you may not use this file except in compliance with the License.
5*09537850SAkhilesh Sanikop // You may obtain a copy of the License at
6*09537850SAkhilesh Sanikop //
7*09537850SAkhilesh Sanikop //      http://www.apache.org/licenses/LICENSE-2.0
8*09537850SAkhilesh Sanikop //
9*09537850SAkhilesh Sanikop // Unless required by applicable law or agreed to in writing, software
10*09537850SAkhilesh Sanikop // distributed under the License is distributed on an "AS IS" BASIS,
11*09537850SAkhilesh Sanikop // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*09537850SAkhilesh Sanikop // See the License for the specific language governing permissions and
13*09537850SAkhilesh Sanikop // limitations under the License.
14*09537850SAkhilesh Sanikop 
15*09537850SAkhilesh Sanikop #include "src/utils/entropy_decoder.h"
16*09537850SAkhilesh Sanikop 
17*09537850SAkhilesh Sanikop #include <cstdint>
18*09537850SAkhilesh Sanikop #include <cstdio>
19*09537850SAkhilesh Sanikop 
20*09537850SAkhilesh Sanikop #include "absl/time/clock.h"
21*09537850SAkhilesh Sanikop #include "absl/time/time.h"
22*09537850SAkhilesh Sanikop #include "gtest/gtest.h"
23*09537850SAkhilesh Sanikop 
24*09537850SAkhilesh Sanikop namespace libgav1 {
25*09537850SAkhilesh Sanikop namespace {
26*09537850SAkhilesh Sanikop 
27*09537850SAkhilesh Sanikop #include "src/utils/entropy_decoder_test_data.inc"
28*09537850SAkhilesh Sanikop 
29*09537850SAkhilesh Sanikop class EntropyDecoderTest : public testing::Test {
30*09537850SAkhilesh Sanikop  protected:
31*09537850SAkhilesh Sanikop   // If compile_time is true, tests
32*09537850SAkhilesh Sanikop   //     bool EntropyDecoder::ReadSymbol(uint16_t* cdf).
33*09537850SAkhilesh Sanikop   // Otherwise, tests
34*09537850SAkhilesh Sanikop   //     int EntropyDecoder::ReadSymbol(uint16_t* cdf, int symbol_count)
35*09537850SAkhilesh Sanikop   // with symbol_count=2.
36*09537850SAkhilesh Sanikop   template <bool compile_time>
37*09537850SAkhilesh Sanikop   void TestReadSymbolBoolean(int num_runs);
38*09537850SAkhilesh Sanikop 
39*09537850SAkhilesh Sanikop   // For N = 3..16 (except 15):
40*09537850SAkhilesh Sanikop   //     template <bool compile_time>
41*09537850SAkhilesh Sanikop   //     void TestReadSymbolN(int num_runs);
42*09537850SAkhilesh Sanikop   //
43*09537850SAkhilesh Sanikop   // If compile_time is true, tests
44*09537850SAkhilesh Sanikop   //     int EntropyDecoder::ReadSymbol<N>(uint16_t* const cdf).
45*09537850SAkhilesh Sanikop   // Otherwise, tests
46*09537850SAkhilesh Sanikop   //     int EntropyDecoder::ReadSymbol(uint16_t* cdf, int symbol_count)
47*09537850SAkhilesh Sanikop   // with symbol_count=N.
48*09537850SAkhilesh Sanikop   //
49*09537850SAkhilesh Sanikop   // NOTE: symbol_count=15 is not tested because AV1 does not use it.
50*09537850SAkhilesh Sanikop   template <bool compile_time>
51*09537850SAkhilesh Sanikop   void TestReadSymbol3(int num_runs);
52*09537850SAkhilesh Sanikop 
53*09537850SAkhilesh Sanikop   template <bool compile_time>
54*09537850SAkhilesh Sanikop   void TestReadSymbol4(int num_runs);
55*09537850SAkhilesh Sanikop 
56*09537850SAkhilesh Sanikop   template <bool compile_time>
57*09537850SAkhilesh Sanikop   void TestReadSymbol5(int num_runs);
58*09537850SAkhilesh Sanikop 
59*09537850SAkhilesh Sanikop   template <bool compile_time>
60*09537850SAkhilesh Sanikop   void TestReadSymbol6(int num_runs);
61*09537850SAkhilesh Sanikop 
62*09537850SAkhilesh Sanikop   template <bool compile_time>
63*09537850SAkhilesh Sanikop   void TestReadSymbol7(int num_runs);
64*09537850SAkhilesh Sanikop 
65*09537850SAkhilesh Sanikop   template <bool compile_time>
66*09537850SAkhilesh Sanikop   void TestReadSymbol8(int num_runs);
67*09537850SAkhilesh Sanikop 
68*09537850SAkhilesh Sanikop   template <bool compile_time>
69*09537850SAkhilesh Sanikop   void TestReadSymbol9(int num_runs);
70*09537850SAkhilesh Sanikop 
71*09537850SAkhilesh Sanikop   template <bool compile_time>
72*09537850SAkhilesh Sanikop   void TestReadSymbol10(int num_runs);
73*09537850SAkhilesh Sanikop 
74*09537850SAkhilesh Sanikop   template <bool compile_time>
75*09537850SAkhilesh Sanikop   void TestReadSymbol11(int num_runs);
76*09537850SAkhilesh Sanikop 
77*09537850SAkhilesh Sanikop   template <bool compile_time>
78*09537850SAkhilesh Sanikop   void TestReadSymbol12(int num_runs);
79*09537850SAkhilesh Sanikop 
80*09537850SAkhilesh Sanikop   template <bool compile_time>
81*09537850SAkhilesh Sanikop   void TestReadSymbol13(int num_runs);
82*09537850SAkhilesh Sanikop 
83*09537850SAkhilesh Sanikop   template <bool compile_time>
84*09537850SAkhilesh Sanikop   void TestReadSymbol14(int num_runs);
85*09537850SAkhilesh Sanikop 
86*09537850SAkhilesh Sanikop   template <bool compile_time>
87*09537850SAkhilesh Sanikop   void TestReadSymbol16(int num_runs);
88*09537850SAkhilesh Sanikop };
89*09537850SAkhilesh Sanikop 
90*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbolBoolean(int num_runs)91*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbolBoolean(int num_runs) {
92*09537850SAkhilesh Sanikop   static constexpr int kSymbols[4][4] = {{0, 0, 1, 1},  //
93*09537850SAkhilesh Sanikop                                          {0, 1, 1, 0},  //
94*09537850SAkhilesh Sanikop                                          {1, 0, 1, 0},  //
95*09537850SAkhilesh Sanikop                                          {1, 0, 0, 1}};
96*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
97*09537850SAkhilesh Sanikop   bool symbols[1024 * 4 * 4];
98*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
99*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbolBoolean,
100*09537850SAkhilesh Sanikop                           kNumBytesTestReadSymbolBoolean,
101*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
102*09537850SAkhilesh Sanikop     uint16_t cdf[4][3] = {
103*09537850SAkhilesh Sanikop         {16384, 0, 0},
104*09537850SAkhilesh Sanikop         {32768 - 8386, 0, 0},
105*09537850SAkhilesh Sanikop         {32768 - 24312, 0, 0},
106*09537850SAkhilesh Sanikop         {16384, 0, 0},
107*09537850SAkhilesh Sanikop     };
108*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
109*09537850SAkhilesh Sanikop     int index = 0;
110*09537850SAkhilesh Sanikop     for (int i = 0; i < 1024; ++i) {
111*09537850SAkhilesh Sanikop       for (int j = 0; j < 4; ++j) {
112*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
113*09537850SAkhilesh Sanikop           if (compile_time) {
114*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k]);
115*09537850SAkhilesh Sanikop           } else {
116*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 2) != 0;
117*09537850SAkhilesh Sanikop           }
118*09537850SAkhilesh Sanikop         }
119*09537850SAkhilesh Sanikop       }
120*09537850SAkhilesh Sanikop     }
121*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
122*09537850SAkhilesh Sanikop   }
123*09537850SAkhilesh Sanikop   if (compile_time) {
124*09537850SAkhilesh Sanikop     printf("TestReadSymbolBooleanCompileTime(%d): %5d us\n", num_runs,
125*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
126*09537850SAkhilesh Sanikop   } else {
127*09537850SAkhilesh Sanikop     printf("TestReadSymbolBoolean(%d): %5d us\n", num_runs,
128*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
129*09537850SAkhilesh Sanikop   }
130*09537850SAkhilesh Sanikop 
131*09537850SAkhilesh Sanikop   int index = 0;
132*09537850SAkhilesh Sanikop   for (int i = 0; i < 1024; ++i) {
133*09537850SAkhilesh Sanikop     for (int j = 0; j < 4; ++j) {  // NOLINT(modernize-loop-convert)
134*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
135*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
136*09537850SAkhilesh Sanikop       }
137*09537850SAkhilesh Sanikop     }
138*09537850SAkhilesh Sanikop   }
139*09537850SAkhilesh Sanikop }
140*09537850SAkhilesh Sanikop 
141*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol3(int num_runs)142*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol3(int num_runs) {
143*09537850SAkhilesh Sanikop   static constexpr int kSymbols[6][4] = {{0, 2, 1, 2},  //
144*09537850SAkhilesh Sanikop                                          {1, 1, 2, 1},  //
145*09537850SAkhilesh Sanikop                                          {2, 0, 0, 0},  //
146*09537850SAkhilesh Sanikop                                          {0, 2, 0, 2},  //
147*09537850SAkhilesh Sanikop                                          {1, 2, 1, 0},  //
148*09537850SAkhilesh Sanikop                                          {2, 1, 1, 0}};
149*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
150*09537850SAkhilesh Sanikop   int symbols[1024 * 6 * 4];
151*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
152*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol3, kNumBytesTestReadSymbol3,
153*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
154*09537850SAkhilesh Sanikop     uint16_t cdf[4][4] = {
155*09537850SAkhilesh Sanikop         // pdf: 1/3, 1/3, 1/3
156*09537850SAkhilesh Sanikop         {32768 - 10923, 32768 - 21845, 0, 0},
157*09537850SAkhilesh Sanikop         // pdf: 1/6, 2/6, 3/6
158*09537850SAkhilesh Sanikop         {32768 - 5461, 32768 - 16384, 0, 0},
159*09537850SAkhilesh Sanikop         // pdf: 2/6, 3/6, 1/6
160*09537850SAkhilesh Sanikop         {32768 - 10923, 32768 - 27307, 0, 0},
161*09537850SAkhilesh Sanikop         // pdf: 3/6, 1/6, 2/6
162*09537850SAkhilesh Sanikop         {32768 - 16384, 32768 - 21845, 0, 0},
163*09537850SAkhilesh Sanikop     };
164*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
165*09537850SAkhilesh Sanikop     int index = 0;
166*09537850SAkhilesh Sanikop     for (int i = 0; i < 1024; ++i) {
167*09537850SAkhilesh Sanikop       for (int j = 0; j < 6; ++j) {
168*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
169*09537850SAkhilesh Sanikop           if (compile_time) {
170*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<3>(cdf[k]);
171*09537850SAkhilesh Sanikop           } else {
172*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 3);
173*09537850SAkhilesh Sanikop           }
174*09537850SAkhilesh Sanikop         }
175*09537850SAkhilesh Sanikop       }
176*09537850SAkhilesh Sanikop     }
177*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
178*09537850SAkhilesh Sanikop   }
179*09537850SAkhilesh Sanikop   if (compile_time) {
180*09537850SAkhilesh Sanikop     printf("TestReadSymbol3CompileTime(%d): %5d us\n", num_runs,
181*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
182*09537850SAkhilesh Sanikop   } else {
183*09537850SAkhilesh Sanikop     printf("TestReadSymbol3(%d): %5d us\n", num_runs,
184*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
185*09537850SAkhilesh Sanikop   }
186*09537850SAkhilesh Sanikop 
187*09537850SAkhilesh Sanikop   int index = 0;
188*09537850SAkhilesh Sanikop   for (int i = 0; i < 1024; ++i) {
189*09537850SAkhilesh Sanikop     for (int j = 0; j < 6; ++j) {  // NOLINT(modernize-loop-convert)
190*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
191*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
192*09537850SAkhilesh Sanikop       }
193*09537850SAkhilesh Sanikop     }
194*09537850SAkhilesh Sanikop   }
195*09537850SAkhilesh Sanikop }
196*09537850SAkhilesh Sanikop 
197*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol4(int num_runs)198*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol4(int num_runs) {
199*09537850SAkhilesh Sanikop   static constexpr int kSymbols[8][4] = {{0, 0, 3, 3},  //
200*09537850SAkhilesh Sanikop                                          {0, 0, 2, 2},  //
201*09537850SAkhilesh Sanikop                                          {1, 1, 0, 0},  //
202*09537850SAkhilesh Sanikop                                          {1, 2, 1, 1},  //
203*09537850SAkhilesh Sanikop                                          {2, 2, 3, 2},  //
204*09537850SAkhilesh Sanikop                                          {2, 3, 2, 1},  //
205*09537850SAkhilesh Sanikop                                          {3, 3, 0, 0},  //
206*09537850SAkhilesh Sanikop                                          {3, 3, 1, 1}};
207*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
208*09537850SAkhilesh Sanikop   int symbols[1024 * 8 * 4];
209*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
210*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol4, kNumBytesTestReadSymbol4,
211*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
212*09537850SAkhilesh Sanikop     uint16_t cdf[4][5] = {
213*09537850SAkhilesh Sanikop         // pdf: 1/4, 1/4, 1/4, 1/4
214*09537850SAkhilesh Sanikop         {32768 - 8192, 32768 - 16384, 32768 - 24576, 0, 0},
215*09537850SAkhilesh Sanikop         // pdf: 2/8, 1/8, 2/8, 3/8
216*09537850SAkhilesh Sanikop         {32768 - 8192, 32768 - 12288, 32768 - 20480, 0, 0},
217*09537850SAkhilesh Sanikop         // pdf: 1/4, 1/4, 1/4, 1/4
218*09537850SAkhilesh Sanikop         {32768 - 8192, 32768 - 16384, 32768 - 24576, 0, 0},
219*09537850SAkhilesh Sanikop         // pdf: 2/8, 3/8, 2/8, 1/8
220*09537850SAkhilesh Sanikop         {32768 - 8192, 32768 - 20480, 32768 - 28672, 0, 0},
221*09537850SAkhilesh Sanikop     };
222*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
223*09537850SAkhilesh Sanikop     int index = 0;
224*09537850SAkhilesh Sanikop     for (int i = 0; i < 1024; ++i) {
225*09537850SAkhilesh Sanikop       for (int j = 0; j < 8; ++j) {
226*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
227*09537850SAkhilesh Sanikop           if (compile_time) {
228*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<4>(cdf[k]);
229*09537850SAkhilesh Sanikop           } else {
230*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 4);
231*09537850SAkhilesh Sanikop           }
232*09537850SAkhilesh Sanikop         }
233*09537850SAkhilesh Sanikop       }
234*09537850SAkhilesh Sanikop     }
235*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
236*09537850SAkhilesh Sanikop   }
237*09537850SAkhilesh Sanikop   if (compile_time) {
238*09537850SAkhilesh Sanikop     printf("TestReadSymbol4CompileTime(%d): %5d us\n", num_runs,
239*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
240*09537850SAkhilesh Sanikop   } else {
241*09537850SAkhilesh Sanikop     printf("TestReadSymbol4(%d): %5d us\n", num_runs,
242*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
243*09537850SAkhilesh Sanikop   }
244*09537850SAkhilesh Sanikop 
245*09537850SAkhilesh Sanikop   int index = 0;
246*09537850SAkhilesh Sanikop   for (int i = 0; i < 1024; ++i) {
247*09537850SAkhilesh Sanikop     for (int j = 0; j < 8; ++j) {  // NOLINT(modernize-loop-convert)
248*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
249*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
250*09537850SAkhilesh Sanikop       }
251*09537850SAkhilesh Sanikop     }
252*09537850SAkhilesh Sanikop   }
253*09537850SAkhilesh Sanikop }
254*09537850SAkhilesh Sanikop 
255*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol5(int num_runs)256*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol5(int num_runs) {
257*09537850SAkhilesh Sanikop   static constexpr int kSymbols[10][4] = {{0, 0, 4, 4},  //
258*09537850SAkhilesh Sanikop                                           {0, 1, 3, 3},  //
259*09537850SAkhilesh Sanikop                                           {1, 2, 2, 2},  //
260*09537850SAkhilesh Sanikop                                           {1, 3, 1, 1},  //
261*09537850SAkhilesh Sanikop                                           {2, 4, 0, 0},  //
262*09537850SAkhilesh Sanikop                                           {2, 0, 4, 3},  //
263*09537850SAkhilesh Sanikop                                           {3, 1, 3, 2},  //
264*09537850SAkhilesh Sanikop                                           {3, 2, 2, 1},  //
265*09537850SAkhilesh Sanikop                                           {4, 3, 1, 2},  //
266*09537850SAkhilesh Sanikop                                           {4, 0, 4, 2}};
267*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
268*09537850SAkhilesh Sanikop   int symbols[320 * 10 * 4];
269*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
270*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol5, kNumBytesTestReadSymbol5,
271*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
272*09537850SAkhilesh Sanikop     uint16_t cdf[4][6] = {
273*09537850SAkhilesh Sanikop         // pdf: 1/5, 1/5, 1/5, 1/5, 1/5
274*09537850SAkhilesh Sanikop         {32768 - 6554, 32768 - 13107, 32768 - 19661, 32768 - 26214, 0, 0},
275*09537850SAkhilesh Sanikop         // pdf: 3/10, 2/10, 2/10, 2/10, 1/10
276*09537850SAkhilesh Sanikop         {32768 - 9830, 32768 - 16384, 32768 - 22938, 32768 - 29491, 0, 0},
277*09537850SAkhilesh Sanikop         // pdf: 1/10, 2/10, 2/10, 2/10, 3/10
278*09537850SAkhilesh Sanikop         {32768 - 3277, 32768 - 9830, 32768 - 16384, 32768 - 22938, 0, 0},
279*09537850SAkhilesh Sanikop         // pdf: 1/10, 2/10, 4/10, 2/10, 1/10
280*09537850SAkhilesh Sanikop         {32768 - 3277, 32768 - 9830, 32768 - 22938, 32768 - 29491, 0, 0},
281*09537850SAkhilesh Sanikop     };
282*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
283*09537850SAkhilesh Sanikop     int index = 0;
284*09537850SAkhilesh Sanikop     for (int i = 0; i < 320; ++i) {
285*09537850SAkhilesh Sanikop       for (int j = 0; j < 10; ++j) {
286*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
287*09537850SAkhilesh Sanikop           if (compile_time) {
288*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<5>(cdf[k]);
289*09537850SAkhilesh Sanikop           } else {
290*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 5);
291*09537850SAkhilesh Sanikop           }
292*09537850SAkhilesh Sanikop         }
293*09537850SAkhilesh Sanikop       }
294*09537850SAkhilesh Sanikop     }
295*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
296*09537850SAkhilesh Sanikop   }
297*09537850SAkhilesh Sanikop   if (compile_time) {
298*09537850SAkhilesh Sanikop     printf("TestReadSymbol5CompileTime(%d): %5d us\n", num_runs,
299*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
300*09537850SAkhilesh Sanikop   } else {
301*09537850SAkhilesh Sanikop     printf("TestReadSymbol5(%d): %5d us\n", num_runs,
302*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
303*09537850SAkhilesh Sanikop   }
304*09537850SAkhilesh Sanikop 
305*09537850SAkhilesh Sanikop   int index = 0;
306*09537850SAkhilesh Sanikop   for (int i = 0; i < 320; ++i) {
307*09537850SAkhilesh Sanikop     for (int j = 0; j < 10; ++j) {  // NOLINT(modernize-loop-convert)
308*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
309*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
310*09537850SAkhilesh Sanikop       }
311*09537850SAkhilesh Sanikop     }
312*09537850SAkhilesh Sanikop   }
313*09537850SAkhilesh Sanikop }
314*09537850SAkhilesh Sanikop 
315*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol6(int num_runs)316*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol6(int num_runs) {
317*09537850SAkhilesh Sanikop   static constexpr int kSymbols[12][4] = {{0, 0, 5, 5},  //
318*09537850SAkhilesh Sanikop                                           {0, 1, 4, 4},  //
319*09537850SAkhilesh Sanikop                                           {1, 2, 3, 3},  //
320*09537850SAkhilesh Sanikop                                           {1, 3, 2, 2},  //
321*09537850SAkhilesh Sanikop                                           {2, 4, 1, 1},  //
322*09537850SAkhilesh Sanikop                                           {2, 5, 0, 0},  //
323*09537850SAkhilesh Sanikop                                           {3, 0, 5, 4},  //
324*09537850SAkhilesh Sanikop                                           {3, 1, 4, 3},  //
325*09537850SAkhilesh Sanikop                                           {4, 2, 3, 2},  //
326*09537850SAkhilesh Sanikop                                           {4, 3, 2, 1},  //
327*09537850SAkhilesh Sanikop                                           {5, 4, 1, 3},  //
328*09537850SAkhilesh Sanikop                                           {5, 0, 5, 2}};
329*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
330*09537850SAkhilesh Sanikop   int symbols[256 * 12 * 4];
331*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
332*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol6, kNumBytesTestReadSymbol6,
333*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
334*09537850SAkhilesh Sanikop     uint16_t cdf[4][7] = {
335*09537850SAkhilesh Sanikop         // pmf: 1/6, 1/6, 1/6, 1/6, 1/6, 1/6
336*09537850SAkhilesh Sanikop         {32768 - 5461, 32768 - 10923, 32768 - 16384, 32768 - 21845,
337*09537850SAkhilesh Sanikop          32768 - 27307, 0, 0},
338*09537850SAkhilesh Sanikop         // pmf: 3/12, 2/12, 2/12, 2/12, 2/12, 1/12
339*09537850SAkhilesh Sanikop         {32768 - 8192, 32768 - 13653, 32768 - 19115, 32768 - 24576,
340*09537850SAkhilesh Sanikop          32768 - 30037, 0, 0},
341*09537850SAkhilesh Sanikop         // pmf: 1/12, 2/12, 2/12, 2/12, 2/12, 3/12
342*09537850SAkhilesh Sanikop         {32768 - 2731, 32768 - 8192, 32768 - 13653, 32768 - 19115,
343*09537850SAkhilesh Sanikop          32768 - 24576, 0, 0},
344*09537850SAkhilesh Sanikop         // pmf: 1/12, 2/12, 3/12, 3/12, 2/12, 1/12
345*09537850SAkhilesh Sanikop         {32768 - 2731, 32768 - 8192, 32768 - 16384, 32768 - 24576,
346*09537850SAkhilesh Sanikop          32768 - 30037, 0, 0},
347*09537850SAkhilesh Sanikop     };
348*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
349*09537850SAkhilesh Sanikop     int index = 0;
350*09537850SAkhilesh Sanikop     for (int i = 0; i < 256; ++i) {
351*09537850SAkhilesh Sanikop       for (int j = 0; j < 12; ++j) {
352*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
353*09537850SAkhilesh Sanikop           if (compile_time) {
354*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<6>(cdf[k]);
355*09537850SAkhilesh Sanikop           } else {
356*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 6);
357*09537850SAkhilesh Sanikop           }
358*09537850SAkhilesh Sanikop         }
359*09537850SAkhilesh Sanikop       }
360*09537850SAkhilesh Sanikop     }
361*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
362*09537850SAkhilesh Sanikop   }
363*09537850SAkhilesh Sanikop   if (compile_time) {
364*09537850SAkhilesh Sanikop     printf("TestReadSymbol6CompileTime(%d): %5d us\n", num_runs,
365*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
366*09537850SAkhilesh Sanikop   } else {
367*09537850SAkhilesh Sanikop     printf("TestReadSymbol6(%d): %5d us\n", num_runs,
368*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
369*09537850SAkhilesh Sanikop   }
370*09537850SAkhilesh Sanikop 
371*09537850SAkhilesh Sanikop   int index = 0;
372*09537850SAkhilesh Sanikop   for (int i = 0; i < 256; ++i) {
373*09537850SAkhilesh Sanikop     for (int j = 0; j < 12; ++j) {  // NOLINT(modernize-loop-convert)
374*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
375*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
376*09537850SAkhilesh Sanikop       }
377*09537850SAkhilesh Sanikop     }
378*09537850SAkhilesh Sanikop   }
379*09537850SAkhilesh Sanikop }
380*09537850SAkhilesh Sanikop 
381*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol7(int num_runs)382*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol7(int num_runs) {
383*09537850SAkhilesh Sanikop   static constexpr int kSymbols[14][4] = {{0, 4, 6, 3},  //
384*09537850SAkhilesh Sanikop                                           {1, 5, 5, 2},  //
385*09537850SAkhilesh Sanikop                                           {2, 6, 4, 1},  //
386*09537850SAkhilesh Sanikop                                           {3, 0, 3, 0},  //
387*09537850SAkhilesh Sanikop                                           {4, 1, 2, 6},  //
388*09537850SAkhilesh Sanikop                                           {5, 2, 1, 5},  //
389*09537850SAkhilesh Sanikop                                           {6, 3, 0, 4},  //
390*09537850SAkhilesh Sanikop                                           {0, 0, 6, 5},  //
391*09537850SAkhilesh Sanikop                                           {2, 1, 4, 3},  //
392*09537850SAkhilesh Sanikop                                           {4, 3, 6, 1},  //
393*09537850SAkhilesh Sanikop                                           {6, 5, 2, 4},  //
394*09537850SAkhilesh Sanikop                                           {1, 0, 5, 2},  //
395*09537850SAkhilesh Sanikop                                           {3, 2, 3, 2},  //
396*09537850SAkhilesh Sanikop                                           {5, 4, 5, 3}};
397*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
398*09537850SAkhilesh Sanikop   int symbols[1024 * 14 * 4];
399*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
400*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol7, kNumBytesTestReadSymbol7,
401*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
402*09537850SAkhilesh Sanikop     uint16_t cdf[4][8] = {
403*09537850SAkhilesh Sanikop         // pdf: 1/7, 1/7, 1/7, 1/7, 1/7, 1/7, 1/7
404*09537850SAkhilesh Sanikop         {32768 - 4681, 32768 - 9362, 32768 - 14043, 32768 - 18725,
405*09537850SAkhilesh Sanikop          32768 - 23406, 32768 - 28087, 0, 0},
406*09537850SAkhilesh Sanikop         // pdf: 3/14, 2/14, 2/14, 2/14, 2/14, 2/14, 1/14
407*09537850SAkhilesh Sanikop         {32768 - 7022, 32768 - 11703, 32768 - 16384, 32768 - 21065,
408*09537850SAkhilesh Sanikop          32768 - 25746, 32768 - 30427, 0, 0},
409*09537850SAkhilesh Sanikop         // pdf: 1/14, 1/14, 2/14, 2/14, 2/14, 3/14, 3/14
410*09537850SAkhilesh Sanikop         {32768 - 2341, 32768 - 4681, 32768 - 9362, 32768 - 14043, 32768 - 18725,
411*09537850SAkhilesh Sanikop          32768 - 25746, 0, 0},
412*09537850SAkhilesh Sanikop         // pdf: 1/14, 2/14, 3/14, 3/14, 2/14, 2/14, 1/14
413*09537850SAkhilesh Sanikop         {32768 - 2341, 32768 - 7022, 32768 - 14043, 32768 - 21065,
414*09537850SAkhilesh Sanikop          32768 - 25746, 32768 - 30427, 0, 0},
415*09537850SAkhilesh Sanikop     };
416*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
417*09537850SAkhilesh Sanikop     int index = 0;
418*09537850SAkhilesh Sanikop     for (int i = 0; i < 1024; ++i) {
419*09537850SAkhilesh Sanikop       for (int j = 0; j < 14; ++j) {
420*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
421*09537850SAkhilesh Sanikop           if (compile_time) {
422*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<7>(cdf[k]);
423*09537850SAkhilesh Sanikop           } else {
424*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 7);
425*09537850SAkhilesh Sanikop           }
426*09537850SAkhilesh Sanikop         }
427*09537850SAkhilesh Sanikop       }
428*09537850SAkhilesh Sanikop     }
429*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
430*09537850SAkhilesh Sanikop   }
431*09537850SAkhilesh Sanikop   if (compile_time) {
432*09537850SAkhilesh Sanikop     printf("TestReadSymbol7CompileTime(%d): %5d us\n", num_runs,
433*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
434*09537850SAkhilesh Sanikop   } else {
435*09537850SAkhilesh Sanikop     printf("TestReadSymbol7(%d): %5d us\n", num_runs,
436*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
437*09537850SAkhilesh Sanikop   }
438*09537850SAkhilesh Sanikop 
439*09537850SAkhilesh Sanikop   int index = 0;
440*09537850SAkhilesh Sanikop   for (int i = 0; i < 1024; ++i) {
441*09537850SAkhilesh Sanikop     for (int j = 0; j < 14; ++j) {  // NOLINT(modernize-loop-convert)
442*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
443*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
444*09537850SAkhilesh Sanikop       }
445*09537850SAkhilesh Sanikop     }
446*09537850SAkhilesh Sanikop   }
447*09537850SAkhilesh Sanikop }
448*09537850SAkhilesh Sanikop 
449*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol8(int num_runs)450*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol8(int num_runs) {
451*09537850SAkhilesh Sanikop   static constexpr int kSymbols[16][4] = {{0, 4, 7, 3},  //
452*09537850SAkhilesh Sanikop                                           {1, 5, 6, 2},  //
453*09537850SAkhilesh Sanikop                                           {2, 6, 5, 1},  //
454*09537850SAkhilesh Sanikop                                           {3, 7, 4, 0},  //
455*09537850SAkhilesh Sanikop                                           {4, 0, 3, 7},  //
456*09537850SAkhilesh Sanikop                                           {5, 1, 2, 6},  //
457*09537850SAkhilesh Sanikop                                           {6, 2, 1, 5},  //
458*09537850SAkhilesh Sanikop                                           {7, 3, 0, 4},  //
459*09537850SAkhilesh Sanikop                                           {0, 0, 6, 5},  //
460*09537850SAkhilesh Sanikop                                           {2, 1, 4, 3},  //
461*09537850SAkhilesh Sanikop                                           {4, 3, 6, 4},  //
462*09537850SAkhilesh Sanikop                                           {6, 5, 2, 2},  //
463*09537850SAkhilesh Sanikop                                           {1, 0, 7, 3},  //
464*09537850SAkhilesh Sanikop                                           {3, 2, 5, 5},  //
465*09537850SAkhilesh Sanikop                                           {5, 4, 7, 2},  //
466*09537850SAkhilesh Sanikop                                           {7, 6, 3, 4}};
467*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
468*09537850SAkhilesh Sanikop   int symbols[1024 * 16 * 4];
469*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
470*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol8, kNumBytesTestReadSymbol8,
471*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
472*09537850SAkhilesh Sanikop     uint16_t cdf[4][9] = {
473*09537850SAkhilesh Sanikop         // pdf: 1/8, 1/8, 1/8, 1/8, 1/8, 1/8, 1/8, 1/8
474*09537850SAkhilesh Sanikop         {32768 - 4096, 32768 - 8192, 32768 - 12288, 32768 - 16384,
475*09537850SAkhilesh Sanikop          32768 - 20480, 32768 - 24576, 32768 - 28672, 0, 0},
476*09537850SAkhilesh Sanikop         // pdf: 3/16, 2/16, 2/16, 2/16, 2/16, 2/16, 2/16, 1/16
477*09537850SAkhilesh Sanikop         {32768 - 6144, 32768 - 10240, 32768 - 14336, 32768 - 18432,
478*09537850SAkhilesh Sanikop          32768 - 22528, 32768 - 26624, 32768 - 30720, 0, 0},
479*09537850SAkhilesh Sanikop         // pdf: 1/16, 1/16, 2/16, 2/16, 2/16, 2/16, 3/16, 3/16
480*09537850SAkhilesh Sanikop         {32768 - 2048, 32768 - 4096, 32768 - 8192, 32768 - 12288, 32768 - 16384,
481*09537850SAkhilesh Sanikop          32768 - 20480, 32768 - 26624, 0, 0},
482*09537850SAkhilesh Sanikop         // pdf: 1/16, 1/16, 3/16, 3/16, 3/16, 3/16, 1/16, 1/16
483*09537850SAkhilesh Sanikop         {32768 - 2048, 32768 - 4096, 32768 - 10240, 32768 - 16384,
484*09537850SAkhilesh Sanikop          32768 - 22528, 32768 - 28672, 32768 - 30720, 0, 0},
485*09537850SAkhilesh Sanikop     };
486*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
487*09537850SAkhilesh Sanikop     int index = 0;
488*09537850SAkhilesh Sanikop     for (int i = 0; i < 1024; ++i) {
489*09537850SAkhilesh Sanikop       for (int j = 0; j < 16; ++j) {
490*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
491*09537850SAkhilesh Sanikop           if (compile_time) {
492*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<8>(cdf[k]);
493*09537850SAkhilesh Sanikop           } else {
494*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 8);
495*09537850SAkhilesh Sanikop           }
496*09537850SAkhilesh Sanikop         }
497*09537850SAkhilesh Sanikop       }
498*09537850SAkhilesh Sanikop     }
499*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
500*09537850SAkhilesh Sanikop   }
501*09537850SAkhilesh Sanikop   if (compile_time) {
502*09537850SAkhilesh Sanikop     printf("TestReadSymbol8CompileTime(%d): %5d us\n", num_runs,
503*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
504*09537850SAkhilesh Sanikop   } else {
505*09537850SAkhilesh Sanikop     printf("TestReadSymbol8(%d): %5d us\n", num_runs,
506*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
507*09537850SAkhilesh Sanikop   }
508*09537850SAkhilesh Sanikop 
509*09537850SAkhilesh Sanikop   int index = 0;
510*09537850SAkhilesh Sanikop   for (int i = 0; i < 1024; ++i) {
511*09537850SAkhilesh Sanikop     for (int j = 0; j < 16; ++j) {  // NOLINT(modernize-loop-convert)
512*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
513*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
514*09537850SAkhilesh Sanikop       }
515*09537850SAkhilesh Sanikop     }
516*09537850SAkhilesh Sanikop   }
517*09537850SAkhilesh Sanikop }
518*09537850SAkhilesh Sanikop 
519*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol9(int num_runs)520*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol9(int num_runs) {
521*09537850SAkhilesh Sanikop   static constexpr int kSymbols[18][4] = {{0, 4, 8, 3},  //
522*09537850SAkhilesh Sanikop                                           {1, 5, 7, 2},  //
523*09537850SAkhilesh Sanikop                                           {2, 6, 6, 1},  //
524*09537850SAkhilesh Sanikop                                           {3, 7, 5, 0},  //
525*09537850SAkhilesh Sanikop                                           {4, 8, 4, 8},  //
526*09537850SAkhilesh Sanikop                                           {5, 0, 3, 7},  //
527*09537850SAkhilesh Sanikop                                           {6, 1, 2, 6},  //
528*09537850SAkhilesh Sanikop                                           {7, 2, 1, 5},  //
529*09537850SAkhilesh Sanikop                                           {8, 3, 0, 4},  //
530*09537850SAkhilesh Sanikop                                           {0, 0, 8, 7},  //
531*09537850SAkhilesh Sanikop                                           {2, 1, 6, 5},  //
532*09537850SAkhilesh Sanikop                                           {4, 3, 4, 3},  //
533*09537850SAkhilesh Sanikop                                           {6, 5, 2, 1},  //
534*09537850SAkhilesh Sanikop                                           {8, 7, 7, 6},  //
535*09537850SAkhilesh Sanikop                                           {1, 0, 5, 4},  //
536*09537850SAkhilesh Sanikop                                           {3, 2, 3, 2},  //
537*09537850SAkhilesh Sanikop                                           {5, 4, 1, 4},  //
538*09537850SAkhilesh Sanikop                                           {7, 6, 8, 4}};
539*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
540*09537850SAkhilesh Sanikop   int symbols[128 * 18 * 4];
541*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
542*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol9, kNumBytesTestReadSymbol9,
543*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
544*09537850SAkhilesh Sanikop     uint16_t cdf[4][10] = {
545*09537850SAkhilesh Sanikop         // pmf: 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9, 1/9
546*09537850SAkhilesh Sanikop         {32768 - 3641, 32768 - 7282, 32768 - 10923, 32768 - 14564,
547*09537850SAkhilesh Sanikop          32768 - 18204, 32768 - 21845, 32768 - 25486, 32768 - 29127, 0, 0},
548*09537850SAkhilesh Sanikop         // pmf: 3/18, 2/18, 2/18, 2/18, 2/18, 2/18, 2/18, 2/18, 1/18
549*09537850SAkhilesh Sanikop         {32768 - 5461, 32768 - 9102, 32768 - 12743, 32768 - 16384,
550*09537850SAkhilesh Sanikop          32768 - 20025, 32768 - 23666, 32768 - 27307, 32768 - 30948, 0, 0},
551*09537850SAkhilesh Sanikop         // pmf: 1/18, 2/18, 2/18, 2/18, 2/18, 2/18, 2/18, 2/18, 3/18
552*09537850SAkhilesh Sanikop         {32768 - 1820, 32768 - 5461, 32768 - 9102, 32768 - 12743, 32768 - 16384,
553*09537850SAkhilesh Sanikop          32768 - 20025, 32768 - 23666, 32768 - 27307, 0, 0},
554*09537850SAkhilesh Sanikop         // pmf: 1/18, 2/18, 2/18, 2/18, 4/18, 2/18, 2/18, 2/18, 1/18
555*09537850SAkhilesh Sanikop         {32768 - 1820, 32768 - 5461, 32768 - 9102, 32768 - 12743, 32768 - 20025,
556*09537850SAkhilesh Sanikop          32768 - 23666, 32768 - 27307, 32768 - 30948, 0, 0},
557*09537850SAkhilesh Sanikop     };
558*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
559*09537850SAkhilesh Sanikop     int index = 0;
560*09537850SAkhilesh Sanikop     for (int i = 0; i < 128; ++i) {
561*09537850SAkhilesh Sanikop       for (int j = 0; j < 18; ++j) {
562*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
563*09537850SAkhilesh Sanikop           if (compile_time) {
564*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<9>(cdf[k]);
565*09537850SAkhilesh Sanikop           } else {
566*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 9);
567*09537850SAkhilesh Sanikop           }
568*09537850SAkhilesh Sanikop         }
569*09537850SAkhilesh Sanikop       }
570*09537850SAkhilesh Sanikop     }
571*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
572*09537850SAkhilesh Sanikop   }
573*09537850SAkhilesh Sanikop   if (compile_time) {
574*09537850SAkhilesh Sanikop     printf("TestReadSymbol9CompileTime(%d): %5d us\n", num_runs,
575*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
576*09537850SAkhilesh Sanikop   } else {
577*09537850SAkhilesh Sanikop     printf("TestReadSymbol9(%d): %5d us\n", num_runs,
578*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
579*09537850SAkhilesh Sanikop   }
580*09537850SAkhilesh Sanikop 
581*09537850SAkhilesh Sanikop   int index = 0;
582*09537850SAkhilesh Sanikop   for (int i = 0; i < 128; ++i) {
583*09537850SAkhilesh Sanikop     for (int j = 0; j < 18; ++j) {  // NOLINT(modernize-loop-convert)
584*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
585*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
586*09537850SAkhilesh Sanikop       }
587*09537850SAkhilesh Sanikop     }
588*09537850SAkhilesh Sanikop   }
589*09537850SAkhilesh Sanikop }
590*09537850SAkhilesh Sanikop 
591*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol10(int num_runs)592*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol10(int num_runs) {
593*09537850SAkhilesh Sanikop   static constexpr int kSymbols[20][4] = {{0, 5, 9, 4},  //
594*09537850SAkhilesh Sanikop                                           {1, 6, 8, 3},  //
595*09537850SAkhilesh Sanikop                                           {2, 7, 7, 2},  //
596*09537850SAkhilesh Sanikop                                           {3, 8, 6, 1},  //
597*09537850SAkhilesh Sanikop                                           {4, 9, 5, 0},  //
598*09537850SAkhilesh Sanikop                                           {5, 0, 4, 9},  //
599*09537850SAkhilesh Sanikop                                           {6, 1, 3, 8},  //
600*09537850SAkhilesh Sanikop                                           {7, 2, 2, 7},  //
601*09537850SAkhilesh Sanikop                                           {8, 3, 1, 6},  //
602*09537850SAkhilesh Sanikop                                           {9, 4, 0, 5},  //
603*09537850SAkhilesh Sanikop                                           {0, 0, 9, 7},  //
604*09537850SAkhilesh Sanikop                                           {2, 1, 8, 5},  //
605*09537850SAkhilesh Sanikop                                           {4, 3, 6, 3},  //
606*09537850SAkhilesh Sanikop                                           {6, 5, 4, 1},  //
607*09537850SAkhilesh Sanikop                                           {8, 7, 2, 8},  //
608*09537850SAkhilesh Sanikop                                           {1, 0, 9, 6},  //
609*09537850SAkhilesh Sanikop                                           {3, 2, 7, 4},  //
610*09537850SAkhilesh Sanikop                                           {5, 4, 5, 2},  //
611*09537850SAkhilesh Sanikop                                           {7, 6, 3, 5},  //
612*09537850SAkhilesh Sanikop                                           {9, 8, 1, 4}};
613*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
614*09537850SAkhilesh Sanikop   int symbols[96 * 20 * 4];
615*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
616*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol10, kNumBytesTestReadSymbol10,
617*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
618*09537850SAkhilesh Sanikop     uint16_t cdf[4][11] = {
619*09537850SAkhilesh Sanikop         // pmf: 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10, 1/10
620*09537850SAkhilesh Sanikop         {32768 - 3277, 32768 - 6554, 32768 - 9830, 32768 - 13107, 32768 - 16384,
621*09537850SAkhilesh Sanikop          32768 - 19661, 32768 - 22938, 32768 - 26214, 32768 - 29491, 0, 0},
622*09537850SAkhilesh Sanikop         // pmf: 3/20, 2/20, 2/20, 2/20, 2/20, 2/20, 2/20, 2/20, 2/20, 1/20
623*09537850SAkhilesh Sanikop         {32768 - 4915, 32768 - 8192, 32768 - 11469, 32768 - 14746,
624*09537850SAkhilesh Sanikop          32768 - 18022, 32768 - 21299, 32768 - 24576, 32768 - 27853,
625*09537850SAkhilesh Sanikop          32768 - 31130, 0, 0},
626*09537850SAkhilesh Sanikop         // pmf: 1/20, 2/20, 2/20, 2/20, 2/20, 2/20, 2/20, 2/20, 2/20, 3/20
627*09537850SAkhilesh Sanikop         {32768 - 1638, 32768 - 4915, 32768 - 8192, 32768 - 11469, 32768 - 14746,
628*09537850SAkhilesh Sanikop          32768 - 18022, 32768 - 21299, 32768 - 24576, 32768 - 27853, 0, 0},
629*09537850SAkhilesh Sanikop         // pmf: 1/20, 2/20, 2/20, 2/20, 3/20, 3/20, 2/20, 2/20, 2/20, 1/20
630*09537850SAkhilesh Sanikop         {32768 - 1638, 32768 - 4915, 32768 - 8192, 32768 - 11469, 32768 - 16384,
631*09537850SAkhilesh Sanikop          32768 - 21299, 32768 - 24576, 32768 - 27853, 32768 - 31130, 0, 0},
632*09537850SAkhilesh Sanikop     };
633*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
634*09537850SAkhilesh Sanikop     int index = 0;
635*09537850SAkhilesh Sanikop     for (int i = 0; i < 96; ++i) {
636*09537850SAkhilesh Sanikop       for (int j = 0; j < 20; ++j) {
637*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
638*09537850SAkhilesh Sanikop           if (compile_time) {
639*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<10>(cdf[k]);
640*09537850SAkhilesh Sanikop           } else {
641*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 10);
642*09537850SAkhilesh Sanikop           }
643*09537850SAkhilesh Sanikop         }
644*09537850SAkhilesh Sanikop       }
645*09537850SAkhilesh Sanikop     }
646*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
647*09537850SAkhilesh Sanikop   }
648*09537850SAkhilesh Sanikop   if (compile_time) {
649*09537850SAkhilesh Sanikop     printf("TestReadSymbol10CompileTime(%d): %5d us\n", num_runs,
650*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
651*09537850SAkhilesh Sanikop   } else {
652*09537850SAkhilesh Sanikop     printf("TestReadSymbol10(%d): %5d us\n", num_runs,
653*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
654*09537850SAkhilesh Sanikop   }
655*09537850SAkhilesh Sanikop 
656*09537850SAkhilesh Sanikop   int index = 0;
657*09537850SAkhilesh Sanikop   for (int i = 0; i < 96; ++i) {
658*09537850SAkhilesh Sanikop     for (int j = 0; j < 20; ++j) {  // NOLINT(modernize-loop-convert)
659*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
660*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
661*09537850SAkhilesh Sanikop       }
662*09537850SAkhilesh Sanikop     }
663*09537850SAkhilesh Sanikop   }
664*09537850SAkhilesh Sanikop }
665*09537850SAkhilesh Sanikop 
666*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol11(int num_runs)667*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol11(int num_runs) {
668*09537850SAkhilesh Sanikop   static constexpr int kSymbols[22][4] = {{0, 6, 10, 5},   //
669*09537850SAkhilesh Sanikop                                           {1, 7, 9, 4},    //
670*09537850SAkhilesh Sanikop                                           {2, 8, 8, 3},    //
671*09537850SAkhilesh Sanikop                                           {3, 9, 7, 2},    //
672*09537850SAkhilesh Sanikop                                           {4, 10, 6, 1},   //
673*09537850SAkhilesh Sanikop                                           {5, 0, 5, 0},    //
674*09537850SAkhilesh Sanikop                                           {6, 1, 4, 10},   //
675*09537850SAkhilesh Sanikop                                           {7, 2, 3, 9},    //
676*09537850SAkhilesh Sanikop                                           {8, 3, 2, 8},    //
677*09537850SAkhilesh Sanikop                                           {9, 4, 1, 7},    //
678*09537850SAkhilesh Sanikop                                           {10, 5, 0, 6},   //
679*09537850SAkhilesh Sanikop                                           {0, 0, 10, 9},   //
680*09537850SAkhilesh Sanikop                                           {2, 1, 8, 7},    //
681*09537850SAkhilesh Sanikop                                           {4, 3, 6, 5},    //
682*09537850SAkhilesh Sanikop                                           {6, 5, 4, 3},    //
683*09537850SAkhilesh Sanikop                                           {8, 7, 2, 1},    //
684*09537850SAkhilesh Sanikop                                           {10, 9, 10, 8},  //
685*09537850SAkhilesh Sanikop                                           {1, 0, 9, 6},    //
686*09537850SAkhilesh Sanikop                                           {3, 2, 7, 4},    //
687*09537850SAkhilesh Sanikop                                           {5, 4, 5, 2},    //
688*09537850SAkhilesh Sanikop                                           {7, 6, 3, 5},    //
689*09537850SAkhilesh Sanikop                                           {9, 8, 1, 5}};
690*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
691*09537850SAkhilesh Sanikop   int symbols[96 * 22 * 4];
692*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
693*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol11, kNumBytesTestReadSymbol11,
694*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
695*09537850SAkhilesh Sanikop     uint16_t cdf[4][12] = {
696*09537850SAkhilesh Sanikop         // pmf: 1/11, 1/11, 1/11, 1/11, 1/11, 1/11, 1/11, 1/11, 1/11, 1/11, 1/11
697*09537850SAkhilesh Sanikop         {32768 - 2979, 32768 - 5958, 32768 - 8937, 32768 - 11916, 32768 - 14895,
698*09537850SAkhilesh Sanikop          32768 - 17873, 32768 - 20852, 32768 - 23831, 32768 - 26810,
699*09537850SAkhilesh Sanikop          32768 - 29789, 0, 0},
700*09537850SAkhilesh Sanikop         // pmf: 3/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 1/22
701*09537850SAkhilesh Sanikop         {32768 - 4468, 32768 - 7447, 32768 - 10426, 32768 - 13405,
702*09537850SAkhilesh Sanikop          32768 - 16384, 32768 - 19363, 32768 - 22342, 32768 - 25321,
703*09537850SAkhilesh Sanikop          32768 - 28300, 32768 - 31279, 0, 0},
704*09537850SAkhilesh Sanikop         // pmf: 1/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 2/22, 3/22
705*09537850SAkhilesh Sanikop         {32768 - 1489, 32768 - 4468, 32768 - 7447, 32768 - 10426, 32768 - 13405,
706*09537850SAkhilesh Sanikop          32768 - 16384, 32768 - 19363, 32768 - 22342, 32768 - 25321,
707*09537850SAkhilesh Sanikop          32768 - 28300, 0, 0},
708*09537850SAkhilesh Sanikop         // pmf: 1/22, 2/22, 2/22, 2/22, 2/22, 4/22, 2/22, 2/22, 2/22, 2/22, 1/22
709*09537850SAkhilesh Sanikop         {32768 - 1489, 32768 - 4468, 32768 - 7447, 32768 - 10426, 32768 - 13405,
710*09537850SAkhilesh Sanikop          32768 - 19363, 32768 - 22342, 32768 - 25321, 32768 - 28300,
711*09537850SAkhilesh Sanikop          32768 - 31279, 0, 0},
712*09537850SAkhilesh Sanikop     };
713*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
714*09537850SAkhilesh Sanikop     int index = 0;
715*09537850SAkhilesh Sanikop     for (int i = 0; i < 96; ++i) {
716*09537850SAkhilesh Sanikop       for (int j = 0; j < 22; ++j) {
717*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
718*09537850SAkhilesh Sanikop           if (compile_time) {
719*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<11>(cdf[k]);
720*09537850SAkhilesh Sanikop           } else {
721*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 11);
722*09537850SAkhilesh Sanikop           }
723*09537850SAkhilesh Sanikop         }
724*09537850SAkhilesh Sanikop       }
725*09537850SAkhilesh Sanikop     }
726*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
727*09537850SAkhilesh Sanikop   }
728*09537850SAkhilesh Sanikop   if (compile_time) {
729*09537850SAkhilesh Sanikop     printf("TestReadSymbol11CompileTime(%d): %5d us\n", num_runs,
730*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
731*09537850SAkhilesh Sanikop   } else {
732*09537850SAkhilesh Sanikop     printf("TestReadSymbol11(%d): %5d us\n", num_runs,
733*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
734*09537850SAkhilesh Sanikop   }
735*09537850SAkhilesh Sanikop 
736*09537850SAkhilesh Sanikop   int index = 0;
737*09537850SAkhilesh Sanikop   for (int i = 0; i < 96; ++i) {
738*09537850SAkhilesh Sanikop     for (int j = 0; j < 22; ++j) {  // NOLINT(modernize-loop-convert)
739*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
740*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
741*09537850SAkhilesh Sanikop       }
742*09537850SAkhilesh Sanikop     }
743*09537850SAkhilesh Sanikop   }
744*09537850SAkhilesh Sanikop }
745*09537850SAkhilesh Sanikop 
746*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol12(int num_runs)747*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol12(int num_runs) {
748*09537850SAkhilesh Sanikop   static constexpr int kSymbols[24][4] = {{0, 6, 11, 5},   //
749*09537850SAkhilesh Sanikop                                           {1, 7, 10, 4},   //
750*09537850SAkhilesh Sanikop                                           {2, 8, 9, 3},    //
751*09537850SAkhilesh Sanikop                                           {3, 9, 8, 2},    //
752*09537850SAkhilesh Sanikop                                           {4, 10, 7, 1},   //
753*09537850SAkhilesh Sanikop                                           {5, 11, 6, 0},   //
754*09537850SAkhilesh Sanikop                                           {6, 0, 5, 11},   //
755*09537850SAkhilesh Sanikop                                           {7, 1, 4, 10},   //
756*09537850SAkhilesh Sanikop                                           {8, 2, 3, 9},    //
757*09537850SAkhilesh Sanikop                                           {9, 3, 2, 8},    //
758*09537850SAkhilesh Sanikop                                           {10, 4, 1, 7},   //
759*09537850SAkhilesh Sanikop                                           {11, 5, 0, 6},   //
760*09537850SAkhilesh Sanikop                                           {0, 0, 11, 9},   //
761*09537850SAkhilesh Sanikop                                           {2, 1, 10, 7},   //
762*09537850SAkhilesh Sanikop                                           {4, 3, 8, 5},    //
763*09537850SAkhilesh Sanikop                                           {6, 5, 6, 3},    //
764*09537850SAkhilesh Sanikop                                           {8, 7, 4, 1},    //
765*09537850SAkhilesh Sanikop                                           {10, 9, 2, 10},  //
766*09537850SAkhilesh Sanikop                                           {1, 0, 11, 8},   //
767*09537850SAkhilesh Sanikop                                           {3, 2, 9, 6},    //
768*09537850SAkhilesh Sanikop                                           {5, 4, 7, 4},    //
769*09537850SAkhilesh Sanikop                                           {7, 6, 5, 2},    //
770*09537850SAkhilesh Sanikop                                           {9, 8, 3, 6},    //
771*09537850SAkhilesh Sanikop                                           {11, 10, 1, 5}};
772*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
773*09537850SAkhilesh Sanikop   int symbols[80 * 24 * 4];
774*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
775*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol12, kNumBytesTestReadSymbol12,
776*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
777*09537850SAkhilesh Sanikop     uint16_t cdf[4][13] = {
778*09537850SAkhilesh Sanikop         // pmf: 1/12, 1/12, 1/12, 1/12, 1/12, 1/12, 1/12, 1/12, 1/12, 1/12,
779*09537850SAkhilesh Sanikop         // 1/12,
780*09537850SAkhilesh Sanikop         // 1/12
781*09537850SAkhilesh Sanikop         {32768 - 2731, 32768 - 5461, 32768 - 8192, 32768 - 10923, 32768 - 13653,
782*09537850SAkhilesh Sanikop          32768 - 16384, 32768 - 19115, 32768 - 21845, 32768 - 24576,
783*09537850SAkhilesh Sanikop          32768 - 27307, 32768 - 30037, 0, 0},
784*09537850SAkhilesh Sanikop         // pmf: 3/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24,
785*09537850SAkhilesh Sanikop         // 2/24,
786*09537850SAkhilesh Sanikop         // 1/24
787*09537850SAkhilesh Sanikop         {32768 - 4096, 32768 - 6827, 32768 - 9557, 32768 - 12288, 32768 - 15019,
788*09537850SAkhilesh Sanikop          32768 - 17749, 32768 - 20480, 32768 - 23211, 32768 - 25941,
789*09537850SAkhilesh Sanikop          32768 - 28672, 32768 - 31403, 0, 0},
790*09537850SAkhilesh Sanikop         // pmf: 1/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24, 2/24,
791*09537850SAkhilesh Sanikop         // 2/24,
792*09537850SAkhilesh Sanikop         // 3/24
793*09537850SAkhilesh Sanikop         {32768 - 1365, 32768 - 4096, 32768 - 6827, 32768 - 9557, 32768 - 12288,
794*09537850SAkhilesh Sanikop          32768 - 15019, 32768 - 17749, 32768 - 20480, 32768 - 23211,
795*09537850SAkhilesh Sanikop          32768 - 25941, 32768 - 28672, 0, 0},
796*09537850SAkhilesh Sanikop         // pmf: 1/24, 2/24, 2/24, 2/24, 2/24, 3/24, 3/24, 2/24, 2/24, 2/24,
797*09537850SAkhilesh Sanikop         // 2/24,
798*09537850SAkhilesh Sanikop         // 1/24
799*09537850SAkhilesh Sanikop         {32768 - 1365, 32768 - 4096, 32768 - 6827, 32768 - 9557, 32768 - 12288,
800*09537850SAkhilesh Sanikop          32768 - 16384, 32768 - 20480, 32768 - 23211, 32768 - 25941,
801*09537850SAkhilesh Sanikop          32768 - 28672, 32768 - 31403, 0, 0},
802*09537850SAkhilesh Sanikop     };
803*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
804*09537850SAkhilesh Sanikop     int index = 0;
805*09537850SAkhilesh Sanikop     for (int i = 0; i < 80; ++i) {
806*09537850SAkhilesh Sanikop       for (int j = 0; j < 24; ++j) {
807*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
808*09537850SAkhilesh Sanikop           if (compile_time) {
809*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<12>(cdf[k]);
810*09537850SAkhilesh Sanikop           } else {
811*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 12);
812*09537850SAkhilesh Sanikop           }
813*09537850SAkhilesh Sanikop         }
814*09537850SAkhilesh Sanikop       }
815*09537850SAkhilesh Sanikop     }
816*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
817*09537850SAkhilesh Sanikop   }
818*09537850SAkhilesh Sanikop   if (compile_time) {
819*09537850SAkhilesh Sanikop     printf("TestReadSymbol12CompileTime(%d): %5d us\n", num_runs,
820*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
821*09537850SAkhilesh Sanikop   } else {
822*09537850SAkhilesh Sanikop     printf("TestReadSymbol12(%d): %5d us\n", num_runs,
823*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
824*09537850SAkhilesh Sanikop   }
825*09537850SAkhilesh Sanikop 
826*09537850SAkhilesh Sanikop   int index = 0;
827*09537850SAkhilesh Sanikop   for (int i = 0; i < 80; ++i) {
828*09537850SAkhilesh Sanikop     for (int j = 0; j < 24; ++j) {  // NOLINT(modernize-loop-convert)
829*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
830*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
831*09537850SAkhilesh Sanikop       }
832*09537850SAkhilesh Sanikop     }
833*09537850SAkhilesh Sanikop   }
834*09537850SAkhilesh Sanikop }
835*09537850SAkhilesh Sanikop 
836*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol13(int num_runs)837*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol13(int num_runs) {
838*09537850SAkhilesh Sanikop   static constexpr int kSymbols[26][4] = {{0, 6, 12, 5},     //
839*09537850SAkhilesh Sanikop                                           {1, 7, 11, 4},     //
840*09537850SAkhilesh Sanikop                                           {2, 8, 10, 3},     //
841*09537850SAkhilesh Sanikop                                           {3, 9, 9, 2},      //
842*09537850SAkhilesh Sanikop                                           {4, 10, 8, 1},     //
843*09537850SAkhilesh Sanikop                                           {5, 11, 7, 0},     //
844*09537850SAkhilesh Sanikop                                           {6, 12, 6, 12},    //
845*09537850SAkhilesh Sanikop                                           {7, 0, 5, 11},     //
846*09537850SAkhilesh Sanikop                                           {8, 1, 4, 10},     //
847*09537850SAkhilesh Sanikop                                           {9, 2, 3, 9},      //
848*09537850SAkhilesh Sanikop                                           {10, 3, 2, 8},     //
849*09537850SAkhilesh Sanikop                                           {11, 4, 1, 7},     //
850*09537850SAkhilesh Sanikop                                           {12, 5, 0, 6},     //
851*09537850SAkhilesh Sanikop                                           {0, 0, 12, 11},    //
852*09537850SAkhilesh Sanikop                                           {2, 1, 10, 9},     //
853*09537850SAkhilesh Sanikop                                           {4, 3, 8, 7},      //
854*09537850SAkhilesh Sanikop                                           {6, 5, 6, 5},      //
855*09537850SAkhilesh Sanikop                                           {8, 7, 4, 3},      //
856*09537850SAkhilesh Sanikop                                           {10, 9, 2, 1},     //
857*09537850SAkhilesh Sanikop                                           {12, 11, 12, 10},  //
858*09537850SAkhilesh Sanikop                                           {1, 0, 11, 8},     //
859*09537850SAkhilesh Sanikop                                           {3, 2, 9, 6},      //
860*09537850SAkhilesh Sanikop                                           {5, 4, 7, 4},      //
861*09537850SAkhilesh Sanikop                                           {7, 6, 5, 2},      //
862*09537850SAkhilesh Sanikop                                           {9, 8, 3, 6},      //
863*09537850SAkhilesh Sanikop                                           {11, 10, 1, 6}};
864*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
865*09537850SAkhilesh Sanikop   int symbols[64 * 26 * 4];
866*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
867*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol13, kNumBytesTestReadSymbol13,
868*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
869*09537850SAkhilesh Sanikop     uint16_t cdf[4][14] = {
870*09537850SAkhilesh Sanikop         // pmf: 1/13, 1/13, 1/13, 1/13, 1/13, 1/13, 1/13, 1/13, 1/13, 1/13,
871*09537850SAkhilesh Sanikop         // 1/13, 1/13, 1/13
872*09537850SAkhilesh Sanikop         {32768 - 2521, 32768 - 5041, 32768 - 7562, 32768 - 10082, 32768 - 12603,
873*09537850SAkhilesh Sanikop          32768 - 15124, 32768 - 17644, 32768 - 20165, 32768 - 22686,
874*09537850SAkhilesh Sanikop          32768 - 25206, 32768 - 27727, 32768 - 30247, 0, 0},
875*09537850SAkhilesh Sanikop         // pmf: 3/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26,
876*09537850SAkhilesh Sanikop         // 2/26, 2/26, 1/26
877*09537850SAkhilesh Sanikop         {32768 - 3781, 32768 - 6302, 32768 - 8822, 32768 - 11343, 32768 - 13863,
878*09537850SAkhilesh Sanikop          32768 - 16384, 32768 - 18905, 32768 - 21425, 32768 - 23946,
879*09537850SAkhilesh Sanikop          32768 - 26466, 32768 - 28987, 32768 - 31508, 0, 0},
880*09537850SAkhilesh Sanikop         // pmf: 1/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26, 2/26,
881*09537850SAkhilesh Sanikop         // 2/26, 2/26, 3/26
882*09537850SAkhilesh Sanikop         {32768 - 1260, 32768 - 3781, 32768 - 6302, 32768 - 8822, 32768 - 11343,
883*09537850SAkhilesh Sanikop          32768 - 13863, 32768 - 16384, 32768 - 18905, 32768 - 21425,
884*09537850SAkhilesh Sanikop          32768 - 23946, 32768 - 26466, 32768 - 28987, 0, 0},
885*09537850SAkhilesh Sanikop         // pmf: 1/26, 2/26, 2/26, 2/26, 2/26, 2/26, 4/26, 2/26, 2/26, 2/26,
886*09537850SAkhilesh Sanikop         // 2/26, 2/26, 1/26
887*09537850SAkhilesh Sanikop         {32768 - 1260, 32768 - 3781, 32768 - 6302, 32768 - 8822, 32768 - 11343,
888*09537850SAkhilesh Sanikop          32768 - 13863, 32768 - 18905, 32768 - 21425, 32768 - 23946,
889*09537850SAkhilesh Sanikop          32768 - 26466, 32768 - 28987, 32768 - 31508, 0, 0},
890*09537850SAkhilesh Sanikop     };
891*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
892*09537850SAkhilesh Sanikop     int index = 0;
893*09537850SAkhilesh Sanikop     for (int i = 0; i < 64; ++i) {
894*09537850SAkhilesh Sanikop       for (int j = 0; j < 26; ++j) {
895*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
896*09537850SAkhilesh Sanikop           if (compile_time) {
897*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<13>(cdf[k]);
898*09537850SAkhilesh Sanikop           } else {
899*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 13);
900*09537850SAkhilesh Sanikop           }
901*09537850SAkhilesh Sanikop         }
902*09537850SAkhilesh Sanikop       }
903*09537850SAkhilesh Sanikop     }
904*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
905*09537850SAkhilesh Sanikop   }
906*09537850SAkhilesh Sanikop   if (compile_time) {
907*09537850SAkhilesh Sanikop     printf("TestReadSymbol13CompileTime(%d): %5d us\n", num_runs,
908*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
909*09537850SAkhilesh Sanikop   } else {
910*09537850SAkhilesh Sanikop     printf("TestReadSymbol13(%d): %5d us\n", num_runs,
911*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
912*09537850SAkhilesh Sanikop   }
913*09537850SAkhilesh Sanikop 
914*09537850SAkhilesh Sanikop   int index = 0;
915*09537850SAkhilesh Sanikop   for (int i = 0; i < 64; ++i) {
916*09537850SAkhilesh Sanikop     for (int j = 0; j < 26; ++j) {  // NOLINT(modernize-loop-convert)
917*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
918*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
919*09537850SAkhilesh Sanikop       }
920*09537850SAkhilesh Sanikop     }
921*09537850SAkhilesh Sanikop   }
922*09537850SAkhilesh Sanikop }
923*09537850SAkhilesh Sanikop 
924*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol14(int num_runs)925*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol14(int num_runs) {
926*09537850SAkhilesh Sanikop   static constexpr int kSymbols[28][4] = {{0, 7, 13, 6},    //
927*09537850SAkhilesh Sanikop                                           {1, 8, 12, 5},    //
928*09537850SAkhilesh Sanikop                                           {2, 9, 11, 4},    //
929*09537850SAkhilesh Sanikop                                           {3, 10, 10, 3},   //
930*09537850SAkhilesh Sanikop                                           {4, 11, 9, 2},    //
931*09537850SAkhilesh Sanikop                                           {5, 12, 8, 1},    //
932*09537850SAkhilesh Sanikop                                           {6, 13, 7, 0},    //
933*09537850SAkhilesh Sanikop                                           {7, 0, 6, 13},    //
934*09537850SAkhilesh Sanikop                                           {8, 1, 5, 12},    //
935*09537850SAkhilesh Sanikop                                           {9, 2, 4, 11},    //
936*09537850SAkhilesh Sanikop                                           {10, 3, 3, 10},   //
937*09537850SAkhilesh Sanikop                                           {11, 4, 2, 9},    //
938*09537850SAkhilesh Sanikop                                           {12, 5, 1, 8},    //
939*09537850SAkhilesh Sanikop                                           {13, 6, 0, 7},    //
940*09537850SAkhilesh Sanikop                                           {0, 0, 13, 11},   //
941*09537850SAkhilesh Sanikop                                           {2, 1, 12, 9},    //
942*09537850SAkhilesh Sanikop                                           {4, 3, 10, 7},    //
943*09537850SAkhilesh Sanikop                                           {6, 5, 8, 5},     //
944*09537850SAkhilesh Sanikop                                           {8, 7, 6, 3},     //
945*09537850SAkhilesh Sanikop                                           {10, 9, 4, 1},    //
946*09537850SAkhilesh Sanikop                                           {12, 11, 2, 12},  //
947*09537850SAkhilesh Sanikop                                           {1, 0, 13, 10},   //
948*09537850SAkhilesh Sanikop                                           {3, 2, 11, 8},    //
949*09537850SAkhilesh Sanikop                                           {5, 4, 9, 6},     //
950*09537850SAkhilesh Sanikop                                           {7, 6, 7, 4},     //
951*09537850SAkhilesh Sanikop                                           {9, 8, 5, 2},     //
952*09537850SAkhilesh Sanikop                                           {11, 10, 3, 7},   //
953*09537850SAkhilesh Sanikop                                           {13, 12, 1, 6}};
954*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
955*09537850SAkhilesh Sanikop   int symbols[64 * 28 * 4];
956*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
957*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol14, kNumBytesTestReadSymbol14,
958*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
959*09537850SAkhilesh Sanikop     uint16_t cdf[4][15] = {
960*09537850SAkhilesh Sanikop         // pmf: 1/14, 1/14, 1/14, 1/14, 1/14, 1/14, 1/14, 1/14, 1/14, 1/14,
961*09537850SAkhilesh Sanikop         // 1/14, 1/14, 1/14, 1/14
962*09537850SAkhilesh Sanikop         {32768 - 2341, 32768 - 4681, 32768 - 7022, 32768 - 9362, 32768 - 11703,
963*09537850SAkhilesh Sanikop          32768 - 14043, 32768 - 16384, 32768 - 18725, 32768 - 21065,
964*09537850SAkhilesh Sanikop          32768 - 23406, 32768 - 25746, 32768 - 28087, 32768 - 30427, 0, 0},
965*09537850SAkhilesh Sanikop         // pmf: 3/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28,
966*09537850SAkhilesh Sanikop         // 2/28, 2/28, 2/28, 1/28
967*09537850SAkhilesh Sanikop         {32768 - 3511, 32768 - 5851, 32768 - 8192, 32768 - 10533, 32768 - 12873,
968*09537850SAkhilesh Sanikop          32768 - 15214, 32768 - 17554, 32768 - 19895, 32768 - 22235,
969*09537850SAkhilesh Sanikop          32768 - 24576, 32768 - 26917, 32768 - 29257, 32768 - 31598, 0, 0},
970*09537850SAkhilesh Sanikop         // pmf: 1/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28, 2/28,
971*09537850SAkhilesh Sanikop         // 2/28, 2/28, 2/28, 3/28
972*09537850SAkhilesh Sanikop         {32768 - 1170, 32768 - 3511, 32768 - 5851, 32768 - 8192, 32768 - 10533,
973*09537850SAkhilesh Sanikop          32768 - 12873, 32768 - 15214, 32768 - 17554, 32768 - 19895,
974*09537850SAkhilesh Sanikop          32768 - 22235, 32768 - 24576, 32768 - 26917, 32768 - 29257, 0, 0},
975*09537850SAkhilesh Sanikop         // pmf: 1/28, 2/28, 2/28, 2/28, 2/28, 2/28, 3/28, 3/28, 2/28, 2/28,
976*09537850SAkhilesh Sanikop         // 2/28, 2/28, 2/28, 1/28
977*09537850SAkhilesh Sanikop         {32768 - 1170, 32768 - 3511, 32768 - 5851, 32768 - 8192, 32768 - 10533,
978*09537850SAkhilesh Sanikop          32768 - 12873, 32768 - 16384, 32768 - 19895, 32768 - 22235,
979*09537850SAkhilesh Sanikop          32768 - 24576, 32768 - 26917, 32768 - 29257, 32768 - 31598, 0, 0},
980*09537850SAkhilesh Sanikop     };
981*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
982*09537850SAkhilesh Sanikop     int index = 0;
983*09537850SAkhilesh Sanikop     for (int i = 0; i < 64; ++i) {
984*09537850SAkhilesh Sanikop       for (int j = 0; j < 28; ++j) {
985*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
986*09537850SAkhilesh Sanikop           if (compile_time) {
987*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<14>(cdf[k]);
988*09537850SAkhilesh Sanikop           } else {
989*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 14);
990*09537850SAkhilesh Sanikop           }
991*09537850SAkhilesh Sanikop         }
992*09537850SAkhilesh Sanikop       }
993*09537850SAkhilesh Sanikop     }
994*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
995*09537850SAkhilesh Sanikop   }
996*09537850SAkhilesh Sanikop   if (compile_time) {
997*09537850SAkhilesh Sanikop     printf("TestReadSymbol14CompileTime(%d): %5d us\n", num_runs,
998*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
999*09537850SAkhilesh Sanikop   } else {
1000*09537850SAkhilesh Sanikop     printf("TestReadSymbol14(%d): %5d us\n", num_runs,
1001*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1002*09537850SAkhilesh Sanikop   }
1003*09537850SAkhilesh Sanikop 
1004*09537850SAkhilesh Sanikop   int index = 0;
1005*09537850SAkhilesh Sanikop   for (int i = 0; i < 64; ++i) {
1006*09537850SAkhilesh Sanikop     for (int j = 0; j < 28; ++j) {  // NOLINT(modernize-loop-convert)
1007*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
1008*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
1009*09537850SAkhilesh Sanikop       }
1010*09537850SAkhilesh Sanikop     }
1011*09537850SAkhilesh Sanikop   }
1012*09537850SAkhilesh Sanikop }
1013*09537850SAkhilesh Sanikop 
1014*09537850SAkhilesh Sanikop template <bool compile_time>
TestReadSymbol16(int num_runs)1015*09537850SAkhilesh Sanikop void EntropyDecoderTest::TestReadSymbol16(int num_runs) {
1016*09537850SAkhilesh Sanikop   static constexpr int kSymbols[32][4] = {{0, 8, 15, 7},    //
1017*09537850SAkhilesh Sanikop                                           {1, 9, 14, 6},    //
1018*09537850SAkhilesh Sanikop                                           {2, 10, 13, 5},   //
1019*09537850SAkhilesh Sanikop                                           {3, 11, 12, 4},   //
1020*09537850SAkhilesh Sanikop                                           {4, 12, 11, 3},   //
1021*09537850SAkhilesh Sanikop                                           {5, 13, 10, 2},   //
1022*09537850SAkhilesh Sanikop                                           {6, 14, 9, 1},    //
1023*09537850SAkhilesh Sanikop                                           {7, 15, 8, 0},    //
1024*09537850SAkhilesh Sanikop                                           {8, 0, 7, 15},    //
1025*09537850SAkhilesh Sanikop                                           {9, 1, 6, 14},    //
1026*09537850SAkhilesh Sanikop                                           {10, 2, 5, 13},   //
1027*09537850SAkhilesh Sanikop                                           {11, 3, 4, 12},   //
1028*09537850SAkhilesh Sanikop                                           {12, 4, 3, 11},   //
1029*09537850SAkhilesh Sanikop                                           {13, 5, 2, 10},   //
1030*09537850SAkhilesh Sanikop                                           {14, 6, 1, 9},    //
1031*09537850SAkhilesh Sanikop                                           {15, 7, 0, 8},    //
1032*09537850SAkhilesh Sanikop                                           {0, 0, 15, 13},   //
1033*09537850SAkhilesh Sanikop                                           {2, 1, 14, 11},   //
1034*09537850SAkhilesh Sanikop                                           {4, 3, 12, 9},    //
1035*09537850SAkhilesh Sanikop                                           {6, 5, 10, 7},    //
1036*09537850SAkhilesh Sanikop                                           {8, 7, 8, 5},     //
1037*09537850SAkhilesh Sanikop                                           {10, 9, 6, 3},    //
1038*09537850SAkhilesh Sanikop                                           {12, 11, 4, 1},   //
1039*09537850SAkhilesh Sanikop                                           {14, 13, 2, 14},  //
1040*09537850SAkhilesh Sanikop                                           {1, 0, 15, 12},   //
1041*09537850SAkhilesh Sanikop                                           {3, 2, 13, 10},   //
1042*09537850SAkhilesh Sanikop                                           {5, 4, 11, 8},    //
1043*09537850SAkhilesh Sanikop                                           {7, 6, 9, 6},     //
1044*09537850SAkhilesh Sanikop                                           {9, 8, 7, 4},     //
1045*09537850SAkhilesh Sanikop                                           {11, 10, 5, 2},   //
1046*09537850SAkhilesh Sanikop                                           {13, 12, 3, 8},   //
1047*09537850SAkhilesh Sanikop                                           {15, 14, 1, 7}};
1048*09537850SAkhilesh Sanikop   absl::Duration elapsed_time;
1049*09537850SAkhilesh Sanikop   int symbols[48 * 32 * 4];
1050*09537850SAkhilesh Sanikop   for (int run = 0; run < num_runs; ++run) {
1051*09537850SAkhilesh Sanikop     EntropyDecoder reader(kBytesTestReadSymbol16, kNumBytesTestReadSymbol16,
1052*09537850SAkhilesh Sanikop                           /*allow_update_cdf=*/true);
1053*09537850SAkhilesh Sanikop     uint16_t cdf[4][17] = {
1054*09537850SAkhilesh Sanikop         // pmf: 1/16, 1/16, 1/16, 1/16, 1/16, 1/16, 1/16, 1/16, 1/16, 1/16,
1055*09537850SAkhilesh Sanikop         // 1/16, 1/16, 1/16, 1/16, 1/16, 1/16
1056*09537850SAkhilesh Sanikop         {32768 - 2048, 32768 - 4096, 32768 - 6144, 32768 - 8192, 32768 - 10240,
1057*09537850SAkhilesh Sanikop          32768 - 12288, 32768 - 14336, 32768 - 16384, 32768 - 18432,
1058*09537850SAkhilesh Sanikop          32768 - 20480, 32768 - 22528, 32768 - 24576, 32768 - 26624,
1059*09537850SAkhilesh Sanikop          32768 - 28672, 32768 - 30720, 0, 0},
1060*09537850SAkhilesh Sanikop         // pmf: 3/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32,
1061*09537850SAkhilesh Sanikop         // 2/32, 2/32, 2/32, 2/32, 2/32, 1/32
1062*09537850SAkhilesh Sanikop         {32768 - 3072, 32768 - 5120, 32768 - 7168, 32768 - 9216, 32768 - 11264,
1063*09537850SAkhilesh Sanikop          32768 - 13312, 32768 - 15360, 32768 - 17408, 32768 - 19456,
1064*09537850SAkhilesh Sanikop          32768 - 21504, 32768 - 23552, 32768 - 25600, 32768 - 27648,
1065*09537850SAkhilesh Sanikop          32768 - 29696, 32768 - 31744, 0, 0},
1066*09537850SAkhilesh Sanikop         // pmf: 1/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32,
1067*09537850SAkhilesh Sanikop         // 2/32, 2/32, 2/32, 2/32, 2/32, 3/32
1068*09537850SAkhilesh Sanikop         {32768 - 1024, 32768 - 3072, 32768 - 5120, 32768 - 7168, 32768 - 9216,
1069*09537850SAkhilesh Sanikop          32768 - 11264, 32768 - 13312, 32768 - 15360, 32768 - 17408,
1070*09537850SAkhilesh Sanikop          32768 - 19456, 32768 - 21504, 32768 - 23552, 32768 - 25600,
1071*09537850SAkhilesh Sanikop          32768 - 27648, 32768 - 29696, 0, 0},
1072*09537850SAkhilesh Sanikop         // pmf: 1/32, 2/32, 2/32, 2/32, 2/32, 2/32, 2/32, 3/32, 3/32, 2/32,
1073*09537850SAkhilesh Sanikop         // 2/32, 2/32, 2/32, 2/32, 2/32, 1/32
1074*09537850SAkhilesh Sanikop         {32768 - 1024, 32768 - 3072, 32768 - 5120, 32768 - 7168, 32768 - 9216,
1075*09537850SAkhilesh Sanikop          32768 - 11264, 32768 - 13312, 32768 - 16384, 32768 - 19456,
1076*09537850SAkhilesh Sanikop          32768 - 21504, 32768 - 23552, 32768 - 25600, 32768 - 27648,
1077*09537850SAkhilesh Sanikop          32768 - 29696, 32768 - 31744, 0, 0},
1078*09537850SAkhilesh Sanikop     };
1079*09537850SAkhilesh Sanikop     const absl::Time start = absl::Now();
1080*09537850SAkhilesh Sanikop     int index = 0;
1081*09537850SAkhilesh Sanikop     for (int i = 0; i < 48; ++i) {
1082*09537850SAkhilesh Sanikop       for (int j = 0; j < 32; ++j) {
1083*09537850SAkhilesh Sanikop         for (int k = 0; k < 4; ++k) {  // NOLINT(modernize-loop-convert)
1084*09537850SAkhilesh Sanikop           if (compile_time) {
1085*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol<16>(cdf[k]);
1086*09537850SAkhilesh Sanikop           } else {
1087*09537850SAkhilesh Sanikop             symbols[index++] = reader.ReadSymbol(cdf[k], 16);
1088*09537850SAkhilesh Sanikop           }
1089*09537850SAkhilesh Sanikop         }
1090*09537850SAkhilesh Sanikop       }
1091*09537850SAkhilesh Sanikop     }
1092*09537850SAkhilesh Sanikop     elapsed_time += absl::Now() - start;
1093*09537850SAkhilesh Sanikop   }
1094*09537850SAkhilesh Sanikop   if (compile_time) {
1095*09537850SAkhilesh Sanikop     printf("TestReadSymbol16CompileTime(%d): %5d us\n", num_runs,
1096*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1097*09537850SAkhilesh Sanikop   } else {
1098*09537850SAkhilesh Sanikop     printf("TestReadSymbol16(%d): %5d us\n", num_runs,
1099*09537850SAkhilesh Sanikop            static_cast<int>(absl::ToInt64Microseconds(elapsed_time)));
1100*09537850SAkhilesh Sanikop   }
1101*09537850SAkhilesh Sanikop 
1102*09537850SAkhilesh Sanikop   int index = 0;
1103*09537850SAkhilesh Sanikop   for (int i = 0; i < 48; ++i) {
1104*09537850SAkhilesh Sanikop     for (int j = 0; j < 32; ++j) {  // NOLINT(modernize-loop-convert)
1105*09537850SAkhilesh Sanikop       for (int k = 0; k < 4; ++k) {
1106*09537850SAkhilesh Sanikop         ASSERT_EQ(symbols[index++], kSymbols[j][k]);
1107*09537850SAkhilesh Sanikop       }
1108*09537850SAkhilesh Sanikop     }
1109*09537850SAkhilesh Sanikop   }
1110*09537850SAkhilesh Sanikop }
1111*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbolBoolean)1112*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbolBoolean) {
1113*09537850SAkhilesh Sanikop   TestReadSymbolBoolean</*compile_time=*/false>(1);
1114*09537850SAkhilesh Sanikop }
1115*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbolBooleanCompileTime)1116*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbolBooleanCompileTime) {
1117*09537850SAkhilesh Sanikop   TestReadSymbolBoolean</*compile_time=*/true>(1);
1118*09537850SAkhilesh Sanikop }
1119*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol3)1120*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol3) {
1121*09537850SAkhilesh Sanikop   TestReadSymbol3</*compile_time=*/false>(1);
1122*09537850SAkhilesh Sanikop }
1123*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol3CompileTime)1124*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol3CompileTime) {
1125*09537850SAkhilesh Sanikop   TestReadSymbol3</*compile_time=*/true>(1);
1126*09537850SAkhilesh Sanikop }
1127*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol4)1128*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol4) {
1129*09537850SAkhilesh Sanikop   TestReadSymbol4</*compile_time=*/false>(1);
1130*09537850SAkhilesh Sanikop }
1131*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol4CompileTime)1132*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol4CompileTime) {
1133*09537850SAkhilesh Sanikop   TestReadSymbol4</*compile_time=*/true>(1);
1134*09537850SAkhilesh Sanikop }
1135*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol5)1136*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol5) {
1137*09537850SAkhilesh Sanikop   TestReadSymbol5</*compile_time=*/false>(1);
1138*09537850SAkhilesh Sanikop }
1139*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol5CompileTime)1140*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol5CompileTime) {
1141*09537850SAkhilesh Sanikop   TestReadSymbol5</*compile_time=*/true>(1);
1142*09537850SAkhilesh Sanikop }
1143*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol6)1144*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol6) {
1145*09537850SAkhilesh Sanikop   TestReadSymbol6</*compile_time=*/false>(1);
1146*09537850SAkhilesh Sanikop }
1147*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol6CompileTime)1148*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol6CompileTime) {
1149*09537850SAkhilesh Sanikop   TestReadSymbol6</*compile_time=*/true>(1);
1150*09537850SAkhilesh Sanikop }
1151*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol7)1152*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol7) {
1153*09537850SAkhilesh Sanikop   TestReadSymbol7</*compile_time=*/false>(1);
1154*09537850SAkhilesh Sanikop }
1155*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol7CompileTime)1156*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol7CompileTime) {
1157*09537850SAkhilesh Sanikop   TestReadSymbol7</*compile_time=*/true>(1);
1158*09537850SAkhilesh Sanikop }
1159*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol8)1160*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol8) {
1161*09537850SAkhilesh Sanikop   TestReadSymbol8</*compile_time=*/false>(1);
1162*09537850SAkhilesh Sanikop }
1163*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol8CompileTime)1164*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol8CompileTime) {
1165*09537850SAkhilesh Sanikop   TestReadSymbol8</*compile_time=*/true>(1);
1166*09537850SAkhilesh Sanikop }
1167*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol9)1168*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol9) {
1169*09537850SAkhilesh Sanikop   TestReadSymbol9</*compile_time=*/false>(1);
1170*09537850SAkhilesh Sanikop }
1171*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol9CompileTime)1172*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol9CompileTime) {
1173*09537850SAkhilesh Sanikop   TestReadSymbol9</*compile_time=*/true>(1);
1174*09537850SAkhilesh Sanikop }
1175*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol10)1176*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol10) {
1177*09537850SAkhilesh Sanikop   TestReadSymbol10</*compile_time=*/false>(1);
1178*09537850SAkhilesh Sanikop }
1179*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol10CompileTime)1180*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol10CompileTime) {
1181*09537850SAkhilesh Sanikop   TestReadSymbol10</*compile_time=*/true>(1);
1182*09537850SAkhilesh Sanikop }
1183*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol11)1184*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol11) {
1185*09537850SAkhilesh Sanikop   TestReadSymbol11</*compile_time=*/false>(1);
1186*09537850SAkhilesh Sanikop }
1187*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol11CompileTime)1188*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol11CompileTime) {
1189*09537850SAkhilesh Sanikop   TestReadSymbol11</*compile_time=*/true>(1);
1190*09537850SAkhilesh Sanikop }
1191*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol12)1192*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol12) {
1193*09537850SAkhilesh Sanikop   TestReadSymbol12</*compile_time=*/false>(1);
1194*09537850SAkhilesh Sanikop }
1195*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol12CompileTime)1196*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol12CompileTime) {
1197*09537850SAkhilesh Sanikop   TestReadSymbol12</*compile_time=*/true>(1);
1198*09537850SAkhilesh Sanikop }
1199*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol13)1200*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol13) {
1201*09537850SAkhilesh Sanikop   TestReadSymbol13</*compile_time=*/false>(1);
1202*09537850SAkhilesh Sanikop }
1203*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol13CompileTime)1204*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol13CompileTime) {
1205*09537850SAkhilesh Sanikop   TestReadSymbol13</*compile_time=*/true>(1);
1206*09537850SAkhilesh Sanikop }
1207*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol14)1208*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol14) {
1209*09537850SAkhilesh Sanikop   TestReadSymbol14</*compile_time=*/false>(1);
1210*09537850SAkhilesh Sanikop }
1211*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol14CompileTime)1212*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol14CompileTime) {
1213*09537850SAkhilesh Sanikop   TestReadSymbol14</*compile_time=*/true>(1);
1214*09537850SAkhilesh Sanikop }
1215*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol16)1216*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol16) {
1217*09537850SAkhilesh Sanikop   TestReadSymbol16</*compile_time=*/false>(1);
1218*09537850SAkhilesh Sanikop }
1219*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,ReadSymbol16CompileTime)1220*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, ReadSymbol16CompileTime) {
1221*09537850SAkhilesh Sanikop   TestReadSymbol16</*compile_time=*/true>(1);
1222*09537850SAkhilesh Sanikop }
1223*09537850SAkhilesh Sanikop 
TEST_F(EntropyDecoderTest,DISABLED_Speed)1224*09537850SAkhilesh Sanikop TEST_F(EntropyDecoderTest, DISABLED_Speed) {
1225*09537850SAkhilesh Sanikop   // compile_time=true is only tested for those symbol_count values that have
1226*09537850SAkhilesh Sanikop   // an instantiation of the EntropyDecoder::ReadSymbol<symbol_count> template
1227*09537850SAkhilesh Sanikop   // method.
1228*09537850SAkhilesh Sanikop   TestReadSymbolBoolean</*compile_time=*/false>(10000);
1229*09537850SAkhilesh Sanikop   TestReadSymbolBoolean</*compile_time=*/true>(10000);
1230*09537850SAkhilesh Sanikop   TestReadSymbol3</*compile_time=*/false>(5000);
1231*09537850SAkhilesh Sanikop   TestReadSymbol3</*compile_time=*/true>(5000);
1232*09537850SAkhilesh Sanikop   TestReadSymbol4</*compile_time=*/false>(2000);
1233*09537850SAkhilesh Sanikop   TestReadSymbol4</*compile_time=*/true>(2000);
1234*09537850SAkhilesh Sanikop   TestReadSymbol5</*compile_time=*/false>(5000);
1235*09537850SAkhilesh Sanikop   TestReadSymbol5</*compile_time=*/true>(5000);
1236*09537850SAkhilesh Sanikop   TestReadSymbol6</*compile_time=*/false>(5000);
1237*09537850SAkhilesh Sanikop   TestReadSymbol6</*compile_time=*/true>(5000);
1238*09537850SAkhilesh Sanikop   TestReadSymbol7</*compile_time=*/false>(1000);
1239*09537850SAkhilesh Sanikop   TestReadSymbol7</*compile_time=*/true>(1000);
1240*09537850SAkhilesh Sanikop   TestReadSymbol8</*compile_time=*/false>(1000);
1241*09537850SAkhilesh Sanikop   TestReadSymbol8</*compile_time=*/true>(1000);
1242*09537850SAkhilesh Sanikop   TestReadSymbol9</*compile_time=*/false>(5000);
1243*09537850SAkhilesh Sanikop   TestReadSymbol9</*compile_time=*/true>(5000);
1244*09537850SAkhilesh Sanikop   TestReadSymbol10</*compile_time=*/false>(5000);
1245*09537850SAkhilesh Sanikop   TestReadSymbol10</*compile_time=*/true>(5000);
1246*09537850SAkhilesh Sanikop   TestReadSymbol11</*compile_time=*/false>(5000);
1247*09537850SAkhilesh Sanikop   TestReadSymbol11</*compile_time=*/true>(5000);
1248*09537850SAkhilesh Sanikop   TestReadSymbol12</*compile_time=*/false>(5000);
1249*09537850SAkhilesh Sanikop   TestReadSymbol12</*compile_time=*/true>(5000);
1250*09537850SAkhilesh Sanikop   TestReadSymbol13</*compile_time=*/false>(5000);
1251*09537850SAkhilesh Sanikop   TestReadSymbol13</*compile_time=*/true>(5000);
1252*09537850SAkhilesh Sanikop   TestReadSymbol14</*compile_time=*/false>(5000);
1253*09537850SAkhilesh Sanikop   TestReadSymbol14</*compile_time=*/true>(5000);
1254*09537850SAkhilesh Sanikop   TestReadSymbol16</*compile_time=*/false>(5000);
1255*09537850SAkhilesh Sanikop   TestReadSymbol16</*compile_time=*/true>(5000);
1256*09537850SAkhilesh Sanikop }
1257*09537850SAkhilesh Sanikop 
1258*09537850SAkhilesh Sanikop }  // namespace
1259*09537850SAkhilesh Sanikop }  // namespace libgav1
1260