xref: /rockchip-linux_mpp/mpp/base/test/mpp_bit_read_test.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /*
2*437bfbebSnyanmisaka  * Copyright 2022 Rockchip Electronics Co. LTD
3*437bfbebSnyanmisaka  *
4*437bfbebSnyanmisaka  * Licensed under the Apache License, Version 2.0 (the "License");
5*437bfbebSnyanmisaka  * you may not use this file except in compliance with the License.
6*437bfbebSnyanmisaka  * You may obtain a copy of the License at
7*437bfbebSnyanmisaka  *
8*437bfbebSnyanmisaka  *      http://www.apache.org/licenses/LICENSE-2.0
9*437bfbebSnyanmisaka  *
10*437bfbebSnyanmisaka  * Unless required by applicable law or agreed to in writing, software
11*437bfbebSnyanmisaka  * distributed under the License is distributed on an "AS IS" BASIS,
12*437bfbebSnyanmisaka  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*437bfbebSnyanmisaka  * See the License for the specific language governing permissions and
14*437bfbebSnyanmisaka  * limitations under the License.
15*437bfbebSnyanmisaka  */
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MODULE_TAG "mpp_bit_read_test"
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #include <stdlib.h>
20*437bfbebSnyanmisaka #include <string.h>
21*437bfbebSnyanmisaka 
22*437bfbebSnyanmisaka #include "mpp_log.h"
23*437bfbebSnyanmisaka #include "mpp_common.h"
24*437bfbebSnyanmisaka #include "mpp_bitread.h"
25*437bfbebSnyanmisaka 
26*437bfbebSnyanmisaka #define BIT_READ_BUFFER_SIZE        (1024)
27*437bfbebSnyanmisaka 
28*437bfbebSnyanmisaka typedef enum BitOpsType_e {
29*437bfbebSnyanmisaka     BIT_GET,
30*437bfbebSnyanmisaka     BIT_GET_UE,
31*437bfbebSnyanmisaka     BIT_GET_SE,
32*437bfbebSnyanmisaka     BIT_SKIP,
33*437bfbebSnyanmisaka } BitOpsType;
34*437bfbebSnyanmisaka 
35*437bfbebSnyanmisaka static RK_U8 bitOpsStr[][10] = {
36*437bfbebSnyanmisaka     "read_bit",
37*437bfbebSnyanmisaka     "read_ue",
38*437bfbebSnyanmisaka     "read_se",
39*437bfbebSnyanmisaka     "skip_bit"
40*437bfbebSnyanmisaka };
41*437bfbebSnyanmisaka 
42*437bfbebSnyanmisaka typedef struct BitOps_t {
43*437bfbebSnyanmisaka     BitOpsType type;
44*437bfbebSnyanmisaka     RK_S32 len;
45*437bfbebSnyanmisaka     RK_S32 val;
46*437bfbebSnyanmisaka     char syntax[50];
47*437bfbebSnyanmisaka } BitOps;
48*437bfbebSnyanmisaka 
49*437bfbebSnyanmisaka // AVS2 I-frame data containing "00 00 02"
50*437bfbebSnyanmisaka static RK_U8 test_data_1[] = {
51*437bfbebSnyanmisaka     0x00, 0x00, 0x01, 0xB3, 0x00, 0x00, 0xFF, 0xFF,
52*437bfbebSnyanmisaka     0x80, 0x00, 0x00, 0x02, 0x04, 0x40, 0xCA, 0xB3,
53*437bfbebSnyanmisaka     0xD2, 0x2B, 0x33, 0x4C, 0x91, 0x88, 0xAC, 0xCD,
54*437bfbebSnyanmisaka     0x14, 0xD8, 0xA1, 0x86, 0x14, 0x30, 0x8A, 0x58,
55*437bfbebSnyanmisaka     0xE1, 0x46, 0x8C, 0x1D, 0x80, 0x00, 0x00, 0x01
56*437bfbebSnyanmisaka };
57*437bfbebSnyanmisaka 
58*437bfbebSnyanmisaka static BitOps bit_ops_1 [] = {
59*437bfbebSnyanmisaka     {BIT_SKIP, 32, 0, "Skip start code of I Pic"},
60*437bfbebSnyanmisaka     {BIT_GET, 32, 65535, "bbv_delay"},
61*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "time_code_flag"},
62*437bfbebSnyanmisaka     {BIT_GET, 24, 0, "time_code"},
63*437bfbebSnyanmisaka     {BIT_GET, 8, 0, "coding_order"},
64*437bfbebSnyanmisaka     {BIT_GET_UE, 0, 3, "picture_output_delay"},
65*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "use RCS in SPS"},
66*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "refered by others"},
67*437bfbebSnyanmisaka     {BIT_GET, 3, 0, "number of reference picture"},
68*437bfbebSnyanmisaka     {BIT_GET, 3, 0, "number of removed picture"},
69*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker bit"},
70*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "progressive_frame"},
71*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "top_field_first"},
72*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "repeat_first_field"},
73*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "fixed_picture_qp"},
74*437bfbebSnyanmisaka     {BIT_GET, 7, 43, "picture_qp"},
75*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "loop_filter_disable"},
76*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "loop_filter_parameter_flag"},
77*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "chroma_quant_param_disable"}
78*437bfbebSnyanmisaka };
79*437bfbebSnyanmisaka 
80*437bfbebSnyanmisaka // AVS2 Sequence header data without "00 00 02"
81*437bfbebSnyanmisaka static RK_U8 test_data_2[] = {
82*437bfbebSnyanmisaka     0x00, 0x00, 0x01, 0xB0, 0x20, 0x42, 0x81, 0xA0,
83*437bfbebSnyanmisaka     0x03, 0xC1, 0x23, 0x0F, 0x42, 0x44, 0x00, 0x10,
84*437bfbebSnyanmisaka     0x00, 0x01, 0x9F, 0xFE, 0x46, 0x10, 0x18, 0xE8,
85*437bfbebSnyanmisaka     0x0D, 0x02, 0x4B, 0x10, 0xA4, 0x74, 0x09, 0x44,
86*437bfbebSnyanmisaka     0x99, 0x02, 0x58, 0x90, 0x61, 0x0D, 0x0A, 0x20,
87*437bfbebSnyanmisaka     0x90, 0x22, 0x91, 0x24, 0x38, 0x42, 0x39, 0x00,
88*437bfbebSnyanmisaka     0x00, 0x01, 0xB5, 0x23, 0x0F, 0x01, 0x14, 0x99
89*437bfbebSnyanmisaka };
90*437bfbebSnyanmisaka 
91*437bfbebSnyanmisaka static BitOps bit_ops_2 [] = {
92*437bfbebSnyanmisaka     {BIT_SKIP, 32, 0, "Skip start code of Seq header"},
93*437bfbebSnyanmisaka     {BIT_GET, 8, 32, "profile_id"},
94*437bfbebSnyanmisaka     {BIT_GET, 8, 66, "level_id"},
95*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "progressive_sequence"},
96*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "field_coded_sequence"},
97*437bfbebSnyanmisaka     {BIT_GET, 14, 416, "horizontal_size"},
98*437bfbebSnyanmisaka     {BIT_GET, 14, 240, "vertical_size"},
99*437bfbebSnyanmisaka     {BIT_GET, 2, 1, "chroma_format"},
100*437bfbebSnyanmisaka     {BIT_GET, 3, 1, "sample_precision"},
101*437bfbebSnyanmisaka     {BIT_GET, 4, 1, "aspect_ratio"},
102*437bfbebSnyanmisaka     {BIT_GET, 4, 8, "frame_rate_code"},
103*437bfbebSnyanmisaka     {BIT_GET, 18, 125000, "bit_rate_lower_18"},
104*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
105*437bfbebSnyanmisaka     {BIT_GET, 12, 0, "bit_rate_upper_12"},
106*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "low_delay"},
107*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
108*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "enable_temporal_id"},
109*437bfbebSnyanmisaka     {BIT_GET, 18, 0, "bbv_uffer_size"},
110*437bfbebSnyanmisaka     {BIT_GET, 3, 6, "lcu_size"},
111*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "enable_weighted_quant"},
112*437bfbebSnyanmisaka     // weighted quant matrix
113*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "disable_background_picture"},
114*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_mhp_skip"},
115*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_dhp"},
116*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_wsm"},
117*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_amp"},
118*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_nsqt"},
119*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_nsip"},
120*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_2nd_transform"},
121*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_sao"},
122*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_alf"},
123*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_pmvr"},
124*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
125*437bfbebSnyanmisaka     {BIT_GET, 6, 8, "num_of_rps"},
126*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "refered_by_others[0]"},
127*437bfbebSnyanmisaka     {BIT_GET, 3, 4, "num_of_ref[0]"},
128*437bfbebSnyanmisaka     {BIT_GET, 6, 8, "ref_pic[0][0]"},
129*437bfbebSnyanmisaka     {BIT_GET, 6, 3, "ref_pic[0][1]"},
130*437bfbebSnyanmisaka     {BIT_GET, 6, 7, "ref_pic[0][2]"},
131*437bfbebSnyanmisaka     {BIT_GET, 6, 16, "ref_pic[0][3]"},
132*437bfbebSnyanmisaka     {BIT_GET, 3, 0, "num_to_remove[0]"},
133*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
134*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "refered_by_others[1]"},
135*437bfbebSnyanmisaka     {BIT_GET, 3, 2, "num_of_ref[1]"},
136*437bfbebSnyanmisaka     {BIT_GET, 6, 1, "ref_pic[1][0]"},
137*437bfbebSnyanmisaka     {BIT_GET, 6, 9, "ref_pic[1][1]"},
138*437bfbebSnyanmisaka     {BIT_GET, 3, 3, "num_to_remove[1]"},
139*437bfbebSnyanmisaka     {BIT_GET, 6, 4, "remove_pic[1][0]"},
140*437bfbebSnyanmisaka     {BIT_GET, 6, 10, "remove_pic[1][0]"},
141*437bfbebSnyanmisaka     {BIT_GET, 6, 17, "remove_pic[1][0]"},
142*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
143*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "refered_by_others[2]"},
144*437bfbebSnyanmisaka     {BIT_GET, 3, 2, "num_of_ref[2]"},
145*437bfbebSnyanmisaka     {BIT_GET, 6, 1, "ref_pic[2][0]"},
146*437bfbebSnyanmisaka     {BIT_GET, 6, 10, "ref_pic[2][1]"},
147*437bfbebSnyanmisaka     {BIT_GET, 3, 1, "num_to_remove[2]"},
148*437bfbebSnyanmisaka     {BIT_GET, 6, 9, "remove_pic[2][0]"},
149*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
150*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "refered_by_others[3]"},
151*437bfbebSnyanmisaka     {BIT_GET, 3, 2, "num_of_ref[3]"},
152*437bfbebSnyanmisaka     {BIT_GET, 6, 1, "ref_pic[3][0]"},
153*437bfbebSnyanmisaka     {BIT_GET, 6, 11, "ref_pic[3][1]"},
154*437bfbebSnyanmisaka     {BIT_GET, 3, 0, "num_to_remove[3]"},
155*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
156*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "refered_by_others[4]"},
157*437bfbebSnyanmisaka     {BIT_GET, 3, 2, "num_of_ref[4]"},
158*437bfbebSnyanmisaka     {BIT_GET, 6, 3, "ref_pic[4][0]"},
159*437bfbebSnyanmisaka     {BIT_GET, 6, 2, "ref_pic[4][1]"},
160*437bfbebSnyanmisaka     {BIT_GET, 3, 0, "num_to_remove[4]"},
161*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
162*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "refered_by_others[5]"},
163*437bfbebSnyanmisaka     {BIT_GET, 3, 2, "num_of_ref[5]"},
164*437bfbebSnyanmisaka     {BIT_GET, 6, 5, "ref_pic[5][0]"},
165*437bfbebSnyanmisaka     {BIT_GET, 6, 4, "ref_pic[5][1]"},
166*437bfbebSnyanmisaka     {BIT_GET, 3, 0, "num_to_remove[5]"},
167*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
168*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "refered_by_6thers[6]"},
169*437bfbebSnyanmisaka     {BIT_GET, 3, 2, "num_of_ref[6]"},
170*437bfbebSnyanmisaka     {BIT_GET, 6, 1, "ref_pic[6][0]"},
171*437bfbebSnyanmisaka     {BIT_GET, 6, 5, "ref_pic[6][1]"},
172*437bfbebSnyanmisaka     {BIT_GET, 3, 1, "num_to_remove[6]"},
173*437bfbebSnyanmisaka     {BIT_GET, 6, 4, "remove_pic[6][0]"},
174*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
175*437bfbebSnyanmisaka     {BIT_GET, 1, 0, "refered_by_others[7]"},
176*437bfbebSnyanmisaka     {BIT_GET, 3, 2, "num_of_ref[7]"},
177*437bfbebSnyanmisaka     {BIT_GET, 6, 7, "ref_pic[7][0]"},
178*437bfbebSnyanmisaka     {BIT_GET, 6, 2, "ref_pic[7][1]"},
179*437bfbebSnyanmisaka     {BIT_GET, 3, 0, "num_to_remove[7]"},
180*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "marker_bit"},
181*437bfbebSnyanmisaka     {BIT_GET, 5, 3, "picture_reorder_delay"},
182*437bfbebSnyanmisaka     {BIT_GET, 1, 1, "enable_clf"},
183*437bfbebSnyanmisaka     {BIT_GET, 2, 0, "reserved 2bits 00"}
184*437bfbebSnyanmisaka };
185*437bfbebSnyanmisaka 
186*437bfbebSnyanmisaka // H264 SPS data with "00 00 03 00"
187*437bfbebSnyanmisaka static RK_U8 test_data_3[] = {0x00, 0x00, 0x00, 0x01, 0x67, 0x64, 0x00, 0x28, 0xAD, 0x00,
188*437bfbebSnyanmisaka                               0x2C, 0xA4, 0x01, 0xE0, 0x11, 0x1F, 0x78, 0x0B, 0x50, 0x10,
189*437bfbebSnyanmisaka                               0x10, 0x14, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x03,
190*437bfbebSnyanmisaka                               0x00, 0xCB, 0x9B, 0x80, 0x03, 0xD0, 0x90, 0x03, 0xA9, 0xEF,
191*437bfbebSnyanmisaka                               0x7B, 0xE0, 0xA0
192*437bfbebSnyanmisaka                              };
193*437bfbebSnyanmisaka 
194*437bfbebSnyanmisaka // H264 PPS and SEI data without "00 00 03 00"
195*437bfbebSnyanmisaka static RK_U8 test_data_4[] = {0x00, 0x00, 0x00, 0x01, 0x68, 0xFE, 0x3C, 0xB0};
196*437bfbebSnyanmisaka 
197*437bfbebSnyanmisaka static BitOps bit_ops_3[] = {
198*437bfbebSnyanmisaka     {BIT_SKIP,      40, 0,      "start code of SPS"},
199*437bfbebSnyanmisaka     {BIT_GET,       8,  100,    "profile_idc"},
200*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "constraint_set0_flag"},
201*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "constraint_set1_flag"},
202*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "constraint_set2_flag"},
203*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "constraint_set3_flag"},
204*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "constraint_set4_flag"},
205*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "constraint_set5_flag"},
206*437bfbebSnyanmisaka     {BIT_GET,       2,  0,      "reserved_zero_2bits"},
207*437bfbebSnyanmisaka     {BIT_GET,       8,  40,     "level_idc"},
208*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "seq_parameter_set_id"},
209*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  1,      "chroma_format_idc"},
210*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "bit_depth_luma_minus8"},
211*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "bit_depth_chroma_minus8"},
212*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "qp_prime_y_zero_transform_bypass"},
213*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "seq_scaling_matrix_present_flag"},
214*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[0]"},
215*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[1]"},
216*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[2]"},
217*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[3]"},
218*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[4]"},
219*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[5]"},
220*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[6]"},
221*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "seq_sacling_list_present_flag[7]"},
222*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  4,      "log2_max_frame_num_minus4"},
223*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "pic_order_cnt_type"},
224*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  4,      "log2_max_pic_order_cnt_lsb_minus"},
225*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  3,      "max_num_ref_frames"},
226*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "gaps_in_frame_num_value_allowed_flag"},
227*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  119,     "pic_width_in_mbs_minus1"},
228*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  33,      "pic_height_in_map_units_minus1"},
229*437bfbebSnyanmisaka     {BIT_GET,       1,  0,       "frame_mbs_only_flag"},
230*437bfbebSnyanmisaka     {BIT_GET,       1,  0,       "mb_adaptive_frame_field_flag"},
231*437bfbebSnyanmisaka     {BIT_GET,       1,  1,       "direct_8x8_inference_flag"},
232*437bfbebSnyanmisaka     {BIT_GET,       1,  1,       "frame_cropping_flag"},
233*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "frame_crop_left_offset"},
234*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "frame_crop_right_offset"},
235*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "frame_crop_top_offset"},
236*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  2,      "frame_crop_bottom_offset"},
237*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "vui_parameters_present_flag"},
238*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "aspect_ratio_info_present_flag"},
239*437bfbebSnyanmisaka     {BIT_GET,       8,  1,      "aspect_ratio_idc"},
240*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "overscan_info_ipresent_flag"},
241*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "video_signal_type_present_flag"},
242*437bfbebSnyanmisaka     {BIT_GET,       3,  5,      "video_format"},
243*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "video_full_range_flag"},
244*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "colour_description_present_flag"},
245*437bfbebSnyanmisaka     {BIT_GET,       8,  1,      "colour_primaries"},
246*437bfbebSnyanmisaka     {BIT_GET,       8,  1,      "transfer_characteristics"},
247*437bfbebSnyanmisaka     {BIT_GET,       8,  1,      "matrix_coefficient"},
248*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "chroma_loc_info_present_flag"},
249*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "timing_info_presetn_flag"},
250*437bfbebSnyanmisaka     {BIT_GET,       32, 1,      "num_units_in_tick"},
251*437bfbebSnyanmisaka     {BIT_GET,       32, 50,     "time_scale"},
252*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "fixed_frame_rate_flag"},
253*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "nal_hrd_parameters_present_flag"},
254*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "cpb_cnt_minus1"},
255*437bfbebSnyanmisaka     {BIT_GET,       4,  3,      "bit_rate_scale"},
256*437bfbebSnyanmisaka     {BIT_GET,       4,  7,      "cpb_size_scale"},
257*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  15624,  "bit_rate_value_minus1[0]"},
258*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  1874,   "cpb_size_value_minus1[0]"},
259*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "cbr_flag[0]"},
260*437bfbebSnyanmisaka     {BIT_GET,       5,  23,     "initial_cpb_removal_delay_length_minus1"},
261*437bfbebSnyanmisaka     {BIT_GET,       5,  23,     "cpb_removal_delay_length_minus1"},
262*437bfbebSnyanmisaka     {BIT_GET,       5,  23,     "dpb_output_delay_length_minus1"},
263*437bfbebSnyanmisaka     {BIT_GET,       5,  24,     "time_offset_length"},
264*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "vcl_hrd_parameters_present_flag"},
265*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "low_delay_hrd_flag"},
266*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "picture_sturct_present_flag"},
267*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "bitstream_restriction_flag"},
268*437bfbebSnyanmisaka };
269*437bfbebSnyanmisaka 
270*437bfbebSnyanmisaka static BitOps bit_ops_4[] = {
271*437bfbebSnyanmisaka     {BIT_SKIP,      40, 0,      "Skip start code of PPS"},
272*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "pic_parameter_set_id"},
273*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "seq_parameter_set_id"},
274*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "entropy_coding_mode_flag"},
275*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "bottom_field_pic_order_in_frame_present_flag"},
276*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "num_slice_groups_minus1"},
277*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "num_ref_idx_l0_default_active_minus1"},
278*437bfbebSnyanmisaka     {BIT_GET_UE,    0,  0,      "num_ref_idx_l1_default_active_minus1"},
279*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "weighted_pred_flag"},
280*437bfbebSnyanmisaka     {BIT_GET,       2,  0,      "weighted_bipred_idc"},
281*437bfbebSnyanmisaka     {BIT_GET_SE,    0,  0,      "pic_init_qp_minus26"},
282*437bfbebSnyanmisaka     {BIT_GET_SE,    0,  0,      "pic_init_qs_minus26"},
283*437bfbebSnyanmisaka     {BIT_GET_SE,    0,  0,      "chroma_qp_index_offset"},
284*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "debloking_filter_control_present_flag"},
285*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "constrained_intra_pred_flag"},
286*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "redundant_pic_cnt_present_flag"},
287*437bfbebSnyanmisaka     {BIT_GET,       1,  1,      "transform_8x8_mode_flag"},
288*437bfbebSnyanmisaka     {BIT_GET,       1,  0,      "pic_scaling_matrix_present_flag"},
289*437bfbebSnyanmisaka     {BIT_GET_SE,    0,  0,      "second_chroma_qp_index_offset"}
290*437bfbebSnyanmisaka };
291*437bfbebSnyanmisaka 
proc_bit_ops(BitReadCtx_t * ctx,BitOps * ops,RK_S32 * ret_val)292*437bfbebSnyanmisaka MPP_RET proc_bit_ops(BitReadCtx_t *ctx, BitOps *ops, RK_S32 *ret_val)
293*437bfbebSnyanmisaka {
294*437bfbebSnyanmisaka     MPP_RET ret = MPP_OK;
295*437bfbebSnyanmisaka     switch (ops->type) {
296*437bfbebSnyanmisaka     case BIT_GET :
297*437bfbebSnyanmisaka         if (ops->len >= 32) {
298*437bfbebSnyanmisaka             READ_BITS_LONG(ctx, ops->len, ret_val);
299*437bfbebSnyanmisaka         } else {
300*437bfbebSnyanmisaka             READ_BITS(ctx, ops->len, ret_val);
301*437bfbebSnyanmisaka         }
302*437bfbebSnyanmisaka         break;
303*437bfbebSnyanmisaka     case BIT_GET_UE:
304*437bfbebSnyanmisaka         READ_UE(ctx, ret_val);
305*437bfbebSnyanmisaka         break;
306*437bfbebSnyanmisaka     case BIT_GET_SE:
307*437bfbebSnyanmisaka         READ_SE(ctx, ret_val);
308*437bfbebSnyanmisaka         break;
309*437bfbebSnyanmisaka     case BIT_SKIP:
310*437bfbebSnyanmisaka         if (ops->len >= 32) {
311*437bfbebSnyanmisaka             SKIP_BITS_LONG(ctx, ops->len);
312*437bfbebSnyanmisaka         } else {
313*437bfbebSnyanmisaka             SKIP_BITS(ctx, ops->len);
314*437bfbebSnyanmisaka         }
315*437bfbebSnyanmisaka         break;
316*437bfbebSnyanmisaka     }
317*437bfbebSnyanmisaka     goto __NORMAL;
318*437bfbebSnyanmisaka __BITREAD_ERR:
319*437bfbebSnyanmisaka     mpp_err("Read failed: syntax %s, %s, %d bits\n", ops->syntax, bitOpsStr[ops->type], ops->len);
320*437bfbebSnyanmisaka     return ret = MPP_ERR_VALUE;
321*437bfbebSnyanmisaka __NORMAL:
322*437bfbebSnyanmisaka     if (ops->val != *ret_val) {
323*437bfbebSnyanmisaka         mpp_err("Read error: syntax %s, expect %d but %d\n", ops->syntax, ops->val, *ret_val);
324*437bfbebSnyanmisaka         ret = MPP_ERR_VALUE;
325*437bfbebSnyanmisaka     } else {
326*437bfbebSnyanmisaka         mpp_log("Read OK, syntax %s, %d\n", ops->syntax, *ret_val);
327*437bfbebSnyanmisaka     }
328*437bfbebSnyanmisaka     return ret;
329*437bfbebSnyanmisaka }
330*437bfbebSnyanmisaka 
main()331*437bfbebSnyanmisaka int main()
332*437bfbebSnyanmisaka {
333*437bfbebSnyanmisaka     BitReadCtx_t reader;
334*437bfbebSnyanmisaka     RK_U32 i;
335*437bfbebSnyanmisaka     RK_S32 tmp = 0;
336*437bfbebSnyanmisaka 
337*437bfbebSnyanmisaka     mpp_log("mpp bit read test start\n");
338*437bfbebSnyanmisaka     mpp_log("Reading H264 data with 00 00 03 00...");
339*437bfbebSnyanmisaka     memset(&reader, 0, sizeof(BitReadCtx_t));
340*437bfbebSnyanmisaka     mpp_set_bitread_ctx(&reader, test_data_3, sizeof(test_data_3));
341*437bfbebSnyanmisaka     // mpp_set_pre_detection(&reader);
342*437bfbebSnyanmisaka     mpp_set_bitread_pseudo_code_type(&reader, PSEUDO_CODE_H264_H265);
343*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(bit_ops_3); i++) {
344*437bfbebSnyanmisaka 
345*437bfbebSnyanmisaka         if (proc_bit_ops(&reader, &bit_ops_3[i], &tmp))
346*437bfbebSnyanmisaka             goto __READ_FAILED;
347*437bfbebSnyanmisaka 
348*437bfbebSnyanmisaka         tmp = 0;
349*437bfbebSnyanmisaka     }
350*437bfbebSnyanmisaka 
351*437bfbebSnyanmisaka     mpp_log("Reading H264 data without 00 00 03 00...");
352*437bfbebSnyanmisaka     memset(&reader, 0, sizeof(BitReadCtx_t));
353*437bfbebSnyanmisaka     mpp_set_bitread_ctx(&reader, test_data_4, sizeof(test_data_4));
354*437bfbebSnyanmisaka 
355*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(bit_ops_4); i++) {
356*437bfbebSnyanmisaka         if (proc_bit_ops(&reader, &bit_ops_4[i], &tmp))
357*437bfbebSnyanmisaka             goto __READ_FAILED;
358*437bfbebSnyanmisaka 
359*437bfbebSnyanmisaka         tmp = 0;
360*437bfbebSnyanmisaka     }
361*437bfbebSnyanmisaka 
362*437bfbebSnyanmisaka     mpp_log("Reading AVS2 data without 00 00 02...");
363*437bfbebSnyanmisaka     memset(&reader, 0, sizeof(BitReadCtx_t));
364*437bfbebSnyanmisaka     mpp_set_bitread_ctx(&reader, test_data_2, sizeof(test_data_2));
365*437bfbebSnyanmisaka 
366*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(bit_ops_2); i++) {
367*437bfbebSnyanmisaka         if (proc_bit_ops(&reader, &bit_ops_2[i], &tmp))
368*437bfbebSnyanmisaka             goto __READ_FAILED;
369*437bfbebSnyanmisaka 
370*437bfbebSnyanmisaka         tmp = 0;
371*437bfbebSnyanmisaka     }
372*437bfbebSnyanmisaka 
373*437bfbebSnyanmisaka     mpp_log("Reading AVS2 data with 00 00 02...");
374*437bfbebSnyanmisaka     memset(&reader, 0, sizeof(BitReadCtx_t));
375*437bfbebSnyanmisaka     mpp_set_bitread_ctx(&reader, test_data_1, sizeof(test_data_1));
376*437bfbebSnyanmisaka     mpp_set_bitread_pseudo_code_type(&reader, PSEUDO_CODE_AVS2);
377*437bfbebSnyanmisaka 
378*437bfbebSnyanmisaka     for (i = 0; i < MPP_ARRAY_ELEMS(bit_ops_1); i++) {
379*437bfbebSnyanmisaka         if (proc_bit_ops(&reader, &bit_ops_1[i], &tmp))
380*437bfbebSnyanmisaka             goto __READ_FAILED;
381*437bfbebSnyanmisaka 
382*437bfbebSnyanmisaka         tmp = 0;
383*437bfbebSnyanmisaka     }
384*437bfbebSnyanmisaka     mpp_log("mpp bit read test end\n");
385*437bfbebSnyanmisaka     return 0;
386*437bfbebSnyanmisaka __READ_FAILED:
387*437bfbebSnyanmisaka     return -1;
388*437bfbebSnyanmisaka }