1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * H.26L/H.264/AVC/JVT/14496-10/... cavlc bitstream decoding
3cabdff1aSopenharmony_ci * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci/**
23cabdff1aSopenharmony_ci * @file
24cabdff1aSopenharmony_ci * H.264 / AVC / MPEG-4 part10 cavlc bitstream decoding.
25cabdff1aSopenharmony_ci * @author Michael Niedermayer <michaelni@gmx.at>
26cabdff1aSopenharmony_ci */
27cabdff1aSopenharmony_ci
28cabdff1aSopenharmony_ci#define CABAC(h) 0
29cabdff1aSopenharmony_ci#define UNCHECKED_BITSTREAM_READER 1
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci#include "h264dec.h"
32cabdff1aSopenharmony_ci#include "h264_mvpred.h"
33cabdff1aSopenharmony_ci#include "h264data.h"
34cabdff1aSopenharmony_ci#include "golomb.h"
35cabdff1aSopenharmony_ci#include "mpegutils.h"
36cabdff1aSopenharmony_ci#include "libavutil/avassert.h"
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_cistatic const uint8_t golomb_to_inter_cbp_gray[16]={
40cabdff1aSopenharmony_ci 0, 1, 2, 4, 8, 3, 5,10,12,15, 7,11,13,14, 6, 9,
41cabdff1aSopenharmony_ci};
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_cistatic const uint8_t golomb_to_intra4x4_cbp_gray[16]={
44cabdff1aSopenharmony_ci15, 0, 7,11,13,14, 3, 5,10,12, 1, 2, 4, 8, 6, 9,
45cabdff1aSopenharmony_ci};
46cabdff1aSopenharmony_ci
47cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_coeff_token_len[4*5]={
48cabdff1aSopenharmony_ci 2, 0, 0, 0,
49cabdff1aSopenharmony_ci 6, 1, 0, 0,
50cabdff1aSopenharmony_ci 6, 6, 3, 0,
51cabdff1aSopenharmony_ci 6, 7, 7, 6,
52cabdff1aSopenharmony_ci 6, 8, 8, 7,
53cabdff1aSopenharmony_ci};
54cabdff1aSopenharmony_ci
55cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_coeff_token_bits[4*5]={
56cabdff1aSopenharmony_ci 1, 0, 0, 0,
57cabdff1aSopenharmony_ci 7, 1, 0, 0,
58cabdff1aSopenharmony_ci 4, 6, 1, 0,
59cabdff1aSopenharmony_ci 3, 3, 2, 5,
60cabdff1aSopenharmony_ci 2, 3, 2, 0,
61cabdff1aSopenharmony_ci};
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_coeff_token_len[4*9]={
64cabdff1aSopenharmony_ci  1,  0,  0,  0,
65cabdff1aSopenharmony_ci  7,  2,  0,  0,
66cabdff1aSopenharmony_ci  7,  7,  3,  0,
67cabdff1aSopenharmony_ci  9,  7,  7,  5,
68cabdff1aSopenharmony_ci  9,  9,  7,  6,
69cabdff1aSopenharmony_ci 10, 10,  9,  7,
70cabdff1aSopenharmony_ci 11, 11, 10,  7,
71cabdff1aSopenharmony_ci 12, 12, 11, 10,
72cabdff1aSopenharmony_ci 13, 12, 12, 11,
73cabdff1aSopenharmony_ci};
74cabdff1aSopenharmony_ci
75cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_coeff_token_bits[4*9]={
76cabdff1aSopenharmony_ci  1,   0,  0, 0,
77cabdff1aSopenharmony_ci 15,   1,  0, 0,
78cabdff1aSopenharmony_ci 14,  13,  1, 0,
79cabdff1aSopenharmony_ci  7,  12, 11, 1,
80cabdff1aSopenharmony_ci  6,   5, 10, 1,
81cabdff1aSopenharmony_ci  7,   6,  4, 9,
82cabdff1aSopenharmony_ci  7,   6,  5, 8,
83cabdff1aSopenharmony_ci  7,   6,  5, 4,
84cabdff1aSopenharmony_ci  7,   5,  4, 4,
85cabdff1aSopenharmony_ci};
86cabdff1aSopenharmony_ci
87cabdff1aSopenharmony_cistatic const uint8_t coeff_token_len[4][4*17]={
88cabdff1aSopenharmony_ci{
89cabdff1aSopenharmony_ci     1, 0, 0, 0,
90cabdff1aSopenharmony_ci     6, 2, 0, 0,     8, 6, 3, 0,     9, 8, 7, 5,    10, 9, 8, 6,
91cabdff1aSopenharmony_ci    11,10, 9, 7,    13,11,10, 8,    13,13,11, 9,    13,13,13,10,
92cabdff1aSopenharmony_ci    14,14,13,11,    14,14,14,13,    15,15,14,14,    15,15,15,14,
93cabdff1aSopenharmony_ci    16,15,15,15,    16,16,16,15,    16,16,16,16,    16,16,16,16,
94cabdff1aSopenharmony_ci},
95cabdff1aSopenharmony_ci{
96cabdff1aSopenharmony_ci     2, 0, 0, 0,
97cabdff1aSopenharmony_ci     6, 2, 0, 0,     6, 5, 3, 0,     7, 6, 6, 4,     8, 6, 6, 4,
98cabdff1aSopenharmony_ci     8, 7, 7, 5,     9, 8, 8, 6,    11, 9, 9, 6,    11,11,11, 7,
99cabdff1aSopenharmony_ci    12,11,11, 9,    12,12,12,11,    12,12,12,11,    13,13,13,12,
100cabdff1aSopenharmony_ci    13,13,13,13,    13,14,13,13,    14,14,14,13,    14,14,14,14,
101cabdff1aSopenharmony_ci},
102cabdff1aSopenharmony_ci{
103cabdff1aSopenharmony_ci     4, 0, 0, 0,
104cabdff1aSopenharmony_ci     6, 4, 0, 0,     6, 5, 4, 0,     6, 5, 5, 4,     7, 5, 5, 4,
105cabdff1aSopenharmony_ci     7, 5, 5, 4,     7, 6, 6, 4,     7, 6, 6, 4,     8, 7, 7, 5,
106cabdff1aSopenharmony_ci     8, 8, 7, 6,     9, 8, 8, 7,     9, 9, 8, 8,     9, 9, 9, 8,
107cabdff1aSopenharmony_ci    10, 9, 9, 9,    10,10,10,10,    10,10,10,10,    10,10,10,10,
108cabdff1aSopenharmony_ci},
109cabdff1aSopenharmony_ci{
110cabdff1aSopenharmony_ci     6, 0, 0, 0,
111cabdff1aSopenharmony_ci     6, 6, 0, 0,     6, 6, 6, 0,     6, 6, 6, 6,     6, 6, 6, 6,
112cabdff1aSopenharmony_ci     6, 6, 6, 6,     6, 6, 6, 6,     6, 6, 6, 6,     6, 6, 6, 6,
113cabdff1aSopenharmony_ci     6, 6, 6, 6,     6, 6, 6, 6,     6, 6, 6, 6,     6, 6, 6, 6,
114cabdff1aSopenharmony_ci     6, 6, 6, 6,     6, 6, 6, 6,     6, 6, 6, 6,     6, 6, 6, 6,
115cabdff1aSopenharmony_ci}
116cabdff1aSopenharmony_ci};
117cabdff1aSopenharmony_ci
118cabdff1aSopenharmony_cistatic const uint8_t coeff_token_bits[4][4*17]={
119cabdff1aSopenharmony_ci{
120cabdff1aSopenharmony_ci     1, 0, 0, 0,
121cabdff1aSopenharmony_ci     5, 1, 0, 0,     7, 4, 1, 0,     7, 6, 5, 3,     7, 6, 5, 3,
122cabdff1aSopenharmony_ci     7, 6, 5, 4,    15, 6, 5, 4,    11,14, 5, 4,     8,10,13, 4,
123cabdff1aSopenharmony_ci    15,14, 9, 4,    11,10,13,12,    15,14, 9,12,    11,10,13, 8,
124cabdff1aSopenharmony_ci    15, 1, 9,12,    11,14,13, 8,     7,10, 9,12,     4, 6, 5, 8,
125cabdff1aSopenharmony_ci},
126cabdff1aSopenharmony_ci{
127cabdff1aSopenharmony_ci     3, 0, 0, 0,
128cabdff1aSopenharmony_ci    11, 2, 0, 0,     7, 7, 3, 0,     7,10, 9, 5,     7, 6, 5, 4,
129cabdff1aSopenharmony_ci     4, 6, 5, 6,     7, 6, 5, 8,    15, 6, 5, 4,    11,14,13, 4,
130cabdff1aSopenharmony_ci    15,10, 9, 4,    11,14,13,12,     8,10, 9, 8,    15,14,13,12,
131cabdff1aSopenharmony_ci    11,10, 9,12,     7,11, 6, 8,     9, 8,10, 1,     7, 6, 5, 4,
132cabdff1aSopenharmony_ci},
133cabdff1aSopenharmony_ci{
134cabdff1aSopenharmony_ci    15, 0, 0, 0,
135cabdff1aSopenharmony_ci    15,14, 0, 0,    11,15,13, 0,     8,12,14,12,    15,10,11,11,
136cabdff1aSopenharmony_ci    11, 8, 9,10,     9,14,13, 9,     8,10, 9, 8,    15,14,13,13,
137cabdff1aSopenharmony_ci    11,14,10,12,    15,10,13,12,    11,14, 9,12,     8,10,13, 8,
138cabdff1aSopenharmony_ci    13, 7, 9,12,     9,12,11,10,     5, 8, 7, 6,     1, 4, 3, 2,
139cabdff1aSopenharmony_ci},
140cabdff1aSopenharmony_ci{
141cabdff1aSopenharmony_ci     3, 0, 0, 0,
142cabdff1aSopenharmony_ci     0, 1, 0, 0,     4, 5, 6, 0,     8, 9,10,11,    12,13,14,15,
143cabdff1aSopenharmony_ci    16,17,18,19,    20,21,22,23,    24,25,26,27,    28,29,30,31,
144cabdff1aSopenharmony_ci    32,33,34,35,    36,37,38,39,    40,41,42,43,    44,45,46,47,
145cabdff1aSopenharmony_ci    48,49,50,51,    52,53,54,55,    56,57,58,59,    60,61,62,63,
146cabdff1aSopenharmony_ci}
147cabdff1aSopenharmony_ci};
148cabdff1aSopenharmony_ci
149cabdff1aSopenharmony_cistatic const uint8_t total_zeros_len[16][16]= {
150cabdff1aSopenharmony_ci    {1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
151cabdff1aSopenharmony_ci    {3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
152cabdff1aSopenharmony_ci    {4,3,3,3,4,4,3,3,4,5,5,6,5,6},
153cabdff1aSopenharmony_ci    {5,3,4,4,3,3,3,4,3,4,5,5,5},
154cabdff1aSopenharmony_ci    {4,4,4,3,3,3,3,3,4,5,4,5},
155cabdff1aSopenharmony_ci    {6,5,3,3,3,3,3,3,4,3,6},
156cabdff1aSopenharmony_ci    {6,5,3,3,3,2,3,4,3,6},
157cabdff1aSopenharmony_ci    {6,4,5,3,2,2,3,3,6},
158cabdff1aSopenharmony_ci    {6,6,4,2,2,3,2,5},
159cabdff1aSopenharmony_ci    {5,5,3,2,2,2,4},
160cabdff1aSopenharmony_ci    {4,4,3,3,1,3},
161cabdff1aSopenharmony_ci    {4,4,2,1,3},
162cabdff1aSopenharmony_ci    {3,3,1,2},
163cabdff1aSopenharmony_ci    {2,2,1},
164cabdff1aSopenharmony_ci    {1,1},
165cabdff1aSopenharmony_ci};
166cabdff1aSopenharmony_ci
167cabdff1aSopenharmony_cistatic const uint8_t total_zeros_bits[16][16]= {
168cabdff1aSopenharmony_ci    {1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
169cabdff1aSopenharmony_ci    {7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
170cabdff1aSopenharmony_ci    {5,7,6,5,4,3,4,3,2,3,2,1,1,0},
171cabdff1aSopenharmony_ci    {3,7,5,4,6,5,4,3,3,2,2,1,0},
172cabdff1aSopenharmony_ci    {5,4,3,7,6,5,4,3,2,1,1,0},
173cabdff1aSopenharmony_ci    {1,1,7,6,5,4,3,2,1,1,0},
174cabdff1aSopenharmony_ci    {1,1,5,4,3,3,2,1,1,0},
175cabdff1aSopenharmony_ci    {1,1,1,3,3,2,2,1,0},
176cabdff1aSopenharmony_ci    {1,0,1,3,2,1,1,1},
177cabdff1aSopenharmony_ci    {1,0,1,3,2,1,1},
178cabdff1aSopenharmony_ci    {0,1,1,2,1,3},
179cabdff1aSopenharmony_ci    {0,1,1,1,1},
180cabdff1aSopenharmony_ci    {0,1,1,1},
181cabdff1aSopenharmony_ci    {0,1,1},
182cabdff1aSopenharmony_ci    {0,1},
183cabdff1aSopenharmony_ci};
184cabdff1aSopenharmony_ci
185cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_total_zeros_len[3][4]= {
186cabdff1aSopenharmony_ci    { 1, 2, 3, 3,},
187cabdff1aSopenharmony_ci    { 1, 2, 2, 0,},
188cabdff1aSopenharmony_ci    { 1, 1, 0, 0,},
189cabdff1aSopenharmony_ci};
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_cistatic const uint8_t chroma_dc_total_zeros_bits[3][4]= {
192cabdff1aSopenharmony_ci    { 1, 1, 1, 0,},
193cabdff1aSopenharmony_ci    { 1, 1, 0, 0,},
194cabdff1aSopenharmony_ci    { 1, 0, 0, 0,},
195cabdff1aSopenharmony_ci};
196cabdff1aSopenharmony_ci
197cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_total_zeros_len[7][8]= {
198cabdff1aSopenharmony_ci    { 1, 3, 3, 4, 4, 4, 5, 5 },
199cabdff1aSopenharmony_ci    { 3, 2, 3, 3, 3, 3, 3 },
200cabdff1aSopenharmony_ci    { 3, 3, 2, 2, 3, 3 },
201cabdff1aSopenharmony_ci    { 3, 2, 2, 2, 3 },
202cabdff1aSopenharmony_ci    { 2, 2, 2, 2 },
203cabdff1aSopenharmony_ci    { 2, 2, 1 },
204cabdff1aSopenharmony_ci    { 1, 1 },
205cabdff1aSopenharmony_ci};
206cabdff1aSopenharmony_ci
207cabdff1aSopenharmony_cistatic const uint8_t chroma422_dc_total_zeros_bits[7][8]= {
208cabdff1aSopenharmony_ci    { 1, 2, 3, 2, 3, 1, 1, 0 },
209cabdff1aSopenharmony_ci    { 0, 1, 1, 4, 5, 6, 7 },
210cabdff1aSopenharmony_ci    { 0, 1, 1, 2, 6, 7 },
211cabdff1aSopenharmony_ci    { 6, 0, 1, 2, 7 },
212cabdff1aSopenharmony_ci    { 0, 1, 2, 3 },
213cabdff1aSopenharmony_ci    { 0, 1, 1 },
214cabdff1aSopenharmony_ci    { 0, 1 },
215cabdff1aSopenharmony_ci};
216cabdff1aSopenharmony_ci
217cabdff1aSopenharmony_cistatic const uint8_t run_len[7][16]={
218cabdff1aSopenharmony_ci    {1,1},
219cabdff1aSopenharmony_ci    {1,2,2},
220cabdff1aSopenharmony_ci    {2,2,2,2},
221cabdff1aSopenharmony_ci    {2,2,2,3,3},
222cabdff1aSopenharmony_ci    {2,2,3,3,3,3},
223cabdff1aSopenharmony_ci    {2,3,3,3,3,3,3},
224cabdff1aSopenharmony_ci    {3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
225cabdff1aSopenharmony_ci};
226cabdff1aSopenharmony_ci
227cabdff1aSopenharmony_cistatic const uint8_t run_bits[7][16]={
228cabdff1aSopenharmony_ci    {1,0},
229cabdff1aSopenharmony_ci    {1,1,0},
230cabdff1aSopenharmony_ci    {3,2,1,0},
231cabdff1aSopenharmony_ci    {3,2,1,1,0},
232cabdff1aSopenharmony_ci    {3,2,3,2,1,0},
233cabdff1aSopenharmony_ci    {3,0,1,3,2,5,4},
234cabdff1aSopenharmony_ci    {7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},
235cabdff1aSopenharmony_ci};
236cabdff1aSopenharmony_ci
237cabdff1aSopenharmony_cistatic VLC coeff_token_vlc[4];
238cabdff1aSopenharmony_cistatic VLCElem coeff_token_vlc_tables[520+332+280+256];
239cabdff1aSopenharmony_cistatic const int coeff_token_vlc_tables_size[4]={520,332,280,256};
240cabdff1aSopenharmony_ci
241cabdff1aSopenharmony_cistatic VLC chroma_dc_coeff_token_vlc;
242cabdff1aSopenharmony_cistatic VLCElem chroma_dc_coeff_token_vlc_table[256];
243cabdff1aSopenharmony_cistatic const int chroma_dc_coeff_token_vlc_table_size = 256;
244cabdff1aSopenharmony_ci
245cabdff1aSopenharmony_cistatic VLC chroma422_dc_coeff_token_vlc;
246cabdff1aSopenharmony_cistatic VLCElem chroma422_dc_coeff_token_vlc_table[8192];
247cabdff1aSopenharmony_cistatic const int chroma422_dc_coeff_token_vlc_table_size = 8192;
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_cistatic VLC total_zeros_vlc[15+1];
250cabdff1aSopenharmony_cistatic VLCElem total_zeros_vlc_tables[15][512];
251cabdff1aSopenharmony_cistatic const int total_zeros_vlc_tables_size = 512;
252cabdff1aSopenharmony_ci
253cabdff1aSopenharmony_cistatic VLC chroma_dc_total_zeros_vlc[3+1];
254cabdff1aSopenharmony_cistatic VLCElem chroma_dc_total_zeros_vlc_tables[3][8];
255cabdff1aSopenharmony_cistatic const int chroma_dc_total_zeros_vlc_tables_size = 8;
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_cistatic VLC chroma422_dc_total_zeros_vlc[7+1];
258cabdff1aSopenharmony_cistatic VLCElem chroma422_dc_total_zeros_vlc_tables[7][32];
259cabdff1aSopenharmony_cistatic const int chroma422_dc_total_zeros_vlc_tables_size = 32;
260cabdff1aSopenharmony_ci
261cabdff1aSopenharmony_cistatic VLC run_vlc[6+1];
262cabdff1aSopenharmony_cistatic VLCElem run_vlc_tables[6][8];
263cabdff1aSopenharmony_cistatic const int run_vlc_tables_size = 8;
264cabdff1aSopenharmony_ci
265cabdff1aSopenharmony_cistatic VLC run7_vlc;
266cabdff1aSopenharmony_cistatic VLCElem run7_vlc_table[96];
267cabdff1aSopenharmony_cistatic const int run7_vlc_table_size = 96;
268cabdff1aSopenharmony_ci
269cabdff1aSopenharmony_ci#define LEVEL_TAB_BITS 8
270cabdff1aSopenharmony_cistatic int8_t cavlc_level_tab[7][1<<LEVEL_TAB_BITS][2];
271cabdff1aSopenharmony_ci
272cabdff1aSopenharmony_ci#define CHROMA_DC_COEFF_TOKEN_VLC_BITS 8
273cabdff1aSopenharmony_ci#define CHROMA422_DC_COEFF_TOKEN_VLC_BITS 13
274cabdff1aSopenharmony_ci#define COEFF_TOKEN_VLC_BITS           8
275cabdff1aSopenharmony_ci#define TOTAL_ZEROS_VLC_BITS           9
276cabdff1aSopenharmony_ci#define CHROMA_DC_TOTAL_ZEROS_VLC_BITS 3
277cabdff1aSopenharmony_ci#define CHROMA422_DC_TOTAL_ZEROS_VLC_BITS 5
278cabdff1aSopenharmony_ci#define RUN_VLC_BITS                   3
279cabdff1aSopenharmony_ci#define RUN7_VLC_BITS                  6
280cabdff1aSopenharmony_ci
281cabdff1aSopenharmony_ci/**
282cabdff1aSopenharmony_ci * Get the predicted number of non-zero coefficients.
283cabdff1aSopenharmony_ci * @param n block index
284cabdff1aSopenharmony_ci */
285cabdff1aSopenharmony_cistatic inline int pred_non_zero_count(const H264Context *h, H264SliceContext *sl, int n)
286cabdff1aSopenharmony_ci{
287cabdff1aSopenharmony_ci    const int index8= scan8[n];
288cabdff1aSopenharmony_ci    const int left = sl->non_zero_count_cache[index8 - 1];
289cabdff1aSopenharmony_ci    const int top  = sl->non_zero_count_cache[index8 - 8];
290cabdff1aSopenharmony_ci    int i= left + top;
291cabdff1aSopenharmony_ci
292cabdff1aSopenharmony_ci    if(i<64) i= (i+1)>>1;
293cabdff1aSopenharmony_ci
294cabdff1aSopenharmony_ci    ff_tlog(h->avctx, "pred_nnz L%X T%X n%d s%d P%X\n", left, top, n, scan8[n], i&31);
295cabdff1aSopenharmony_ci
296cabdff1aSopenharmony_ci    return i&31;
297cabdff1aSopenharmony_ci}
298cabdff1aSopenharmony_ci
299cabdff1aSopenharmony_cistatic av_cold void init_cavlc_level_tab(void){
300cabdff1aSopenharmony_ci    int suffix_length;
301cabdff1aSopenharmony_ci    unsigned int i;
302cabdff1aSopenharmony_ci
303cabdff1aSopenharmony_ci    for(suffix_length=0; suffix_length<7; suffix_length++){
304cabdff1aSopenharmony_ci        for(i=0; i<(1<<LEVEL_TAB_BITS); i++){
305cabdff1aSopenharmony_ci            int prefix= LEVEL_TAB_BITS - av_log2(2*i);
306cabdff1aSopenharmony_ci
307cabdff1aSopenharmony_ci            if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){
308cabdff1aSopenharmony_ci                int level_code = (prefix << suffix_length) +
309cabdff1aSopenharmony_ci                    (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length);
310cabdff1aSopenharmony_ci                int mask = -(level_code&1);
311cabdff1aSopenharmony_ci                level_code = (((2 + level_code) >> 1) ^ mask) - mask;
312cabdff1aSopenharmony_ci                cavlc_level_tab[suffix_length][i][0]= level_code;
313cabdff1aSopenharmony_ci                cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length;
314cabdff1aSopenharmony_ci            }else if(prefix + 1 <= LEVEL_TAB_BITS){
315cabdff1aSopenharmony_ci                cavlc_level_tab[suffix_length][i][0]= prefix+100;
316cabdff1aSopenharmony_ci                cavlc_level_tab[suffix_length][i][1]= prefix + 1;
317cabdff1aSopenharmony_ci            }else{
318cabdff1aSopenharmony_ci                cavlc_level_tab[suffix_length][i][0]= LEVEL_TAB_BITS+100;
319cabdff1aSopenharmony_ci                cavlc_level_tab[suffix_length][i][1]= LEVEL_TAB_BITS;
320cabdff1aSopenharmony_ci            }
321cabdff1aSopenharmony_ci        }
322cabdff1aSopenharmony_ci    }
323cabdff1aSopenharmony_ci}
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ciav_cold void ff_h264_decode_init_vlc(void)
326cabdff1aSopenharmony_ci{
327cabdff1aSopenharmony_ci    int offset;
328cabdff1aSopenharmony_ci
329cabdff1aSopenharmony_ci    chroma_dc_coeff_token_vlc.table = chroma_dc_coeff_token_vlc_table;
330cabdff1aSopenharmony_ci    chroma_dc_coeff_token_vlc.table_allocated = chroma_dc_coeff_token_vlc_table_size;
331cabdff1aSopenharmony_ci    init_vlc(&chroma_dc_coeff_token_vlc, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 4*5,
332cabdff1aSopenharmony_ci             &chroma_dc_coeff_token_len [0], 1, 1,
333cabdff1aSopenharmony_ci             &chroma_dc_coeff_token_bits[0], 1, 1,
334cabdff1aSopenharmony_ci             INIT_VLC_USE_NEW_STATIC);
335cabdff1aSopenharmony_ci
336cabdff1aSopenharmony_ci    chroma422_dc_coeff_token_vlc.table = chroma422_dc_coeff_token_vlc_table;
337cabdff1aSopenharmony_ci    chroma422_dc_coeff_token_vlc.table_allocated = chroma422_dc_coeff_token_vlc_table_size;
338cabdff1aSopenharmony_ci    init_vlc(&chroma422_dc_coeff_token_vlc, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 4*9,
339cabdff1aSopenharmony_ci             &chroma422_dc_coeff_token_len [0], 1, 1,
340cabdff1aSopenharmony_ci             &chroma422_dc_coeff_token_bits[0], 1, 1,
341cabdff1aSopenharmony_ci             INIT_VLC_USE_NEW_STATIC);
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci    offset = 0;
344cabdff1aSopenharmony_ci    for (int i = 0; i < 4; i++) {
345cabdff1aSopenharmony_ci        coeff_token_vlc[i].table = coeff_token_vlc_tables + offset;
346cabdff1aSopenharmony_ci        coeff_token_vlc[i].table_allocated = coeff_token_vlc_tables_size[i];
347cabdff1aSopenharmony_ci        init_vlc(&coeff_token_vlc[i], COEFF_TOKEN_VLC_BITS, 4*17,
348cabdff1aSopenharmony_ci                 &coeff_token_len [i][0], 1, 1,
349cabdff1aSopenharmony_ci                 &coeff_token_bits[i][0], 1, 1,
350cabdff1aSopenharmony_ci                 INIT_VLC_USE_NEW_STATIC);
351cabdff1aSopenharmony_ci        offset += coeff_token_vlc_tables_size[i];
352cabdff1aSopenharmony_ci    }
353cabdff1aSopenharmony_ci    /*
354cabdff1aSopenharmony_ci     * This is a one time safety check to make sure that
355cabdff1aSopenharmony_ci     * the packed static coeff_token_vlc table sizes
356cabdff1aSopenharmony_ci     * were initialized correctly.
357cabdff1aSopenharmony_ci     */
358cabdff1aSopenharmony_ci    av_assert0(offset == FF_ARRAY_ELEMS(coeff_token_vlc_tables));
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_ci    for (int i = 0; i < 3; i++) {
361cabdff1aSopenharmony_ci        chroma_dc_total_zeros_vlc[i + 1].table = chroma_dc_total_zeros_vlc_tables[i];
362cabdff1aSopenharmony_ci        chroma_dc_total_zeros_vlc[i + 1].table_allocated = chroma_dc_total_zeros_vlc_tables_size;
363cabdff1aSopenharmony_ci        init_vlc(&chroma_dc_total_zeros_vlc[i + 1],
364cabdff1aSopenharmony_ci                 CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 4,
365cabdff1aSopenharmony_ci                 &chroma_dc_total_zeros_len [i][0], 1, 1,
366cabdff1aSopenharmony_ci                 &chroma_dc_total_zeros_bits[i][0], 1, 1,
367cabdff1aSopenharmony_ci                 INIT_VLC_USE_NEW_STATIC);
368cabdff1aSopenharmony_ci    }
369cabdff1aSopenharmony_ci
370cabdff1aSopenharmony_ci    for (int i = 0; i < 7; i++) {
371cabdff1aSopenharmony_ci        chroma422_dc_total_zeros_vlc[i + 1].table = chroma422_dc_total_zeros_vlc_tables[i];
372cabdff1aSopenharmony_ci        chroma422_dc_total_zeros_vlc[i + 1].table_allocated = chroma422_dc_total_zeros_vlc_tables_size;
373cabdff1aSopenharmony_ci        init_vlc(&chroma422_dc_total_zeros_vlc[i + 1],
374cabdff1aSopenharmony_ci                 CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 8,
375cabdff1aSopenharmony_ci                 &chroma422_dc_total_zeros_len [i][0], 1, 1,
376cabdff1aSopenharmony_ci                 &chroma422_dc_total_zeros_bits[i][0], 1, 1,
377cabdff1aSopenharmony_ci                 INIT_VLC_USE_NEW_STATIC);
378cabdff1aSopenharmony_ci    }
379cabdff1aSopenharmony_ci
380cabdff1aSopenharmony_ci    for (int i = 0; i < 15; i++) {
381cabdff1aSopenharmony_ci        total_zeros_vlc[i + 1].table = total_zeros_vlc_tables[i];
382cabdff1aSopenharmony_ci        total_zeros_vlc[i + 1].table_allocated = total_zeros_vlc_tables_size;
383cabdff1aSopenharmony_ci        init_vlc(&total_zeros_vlc[i + 1],
384cabdff1aSopenharmony_ci                 TOTAL_ZEROS_VLC_BITS, 16,
385cabdff1aSopenharmony_ci                 &total_zeros_len [i][0], 1, 1,
386cabdff1aSopenharmony_ci                 &total_zeros_bits[i][0], 1, 1,
387cabdff1aSopenharmony_ci                 INIT_VLC_USE_NEW_STATIC);
388cabdff1aSopenharmony_ci    }
389cabdff1aSopenharmony_ci
390cabdff1aSopenharmony_ci    for (int i = 0; i < 6; i++) {
391cabdff1aSopenharmony_ci        run_vlc[i + 1].table = run_vlc_tables[i];
392cabdff1aSopenharmony_ci        run_vlc[i + 1].table_allocated = run_vlc_tables_size;
393cabdff1aSopenharmony_ci        init_vlc(&run_vlc[i + 1],
394cabdff1aSopenharmony_ci                 RUN_VLC_BITS, 7,
395cabdff1aSopenharmony_ci                 &run_len [i][0], 1, 1,
396cabdff1aSopenharmony_ci                 &run_bits[i][0], 1, 1,
397cabdff1aSopenharmony_ci                 INIT_VLC_USE_NEW_STATIC);
398cabdff1aSopenharmony_ci    }
399cabdff1aSopenharmony_ci    run7_vlc.table = run7_vlc_table;
400cabdff1aSopenharmony_ci    run7_vlc.table_allocated = run7_vlc_table_size;
401cabdff1aSopenharmony_ci    init_vlc(&run7_vlc, RUN7_VLC_BITS, 16,
402cabdff1aSopenharmony_ci             &run_len [6][0], 1, 1,
403cabdff1aSopenharmony_ci             &run_bits[6][0], 1, 1,
404cabdff1aSopenharmony_ci             INIT_VLC_USE_NEW_STATIC);
405cabdff1aSopenharmony_ci
406cabdff1aSopenharmony_ci    init_cavlc_level_tab();
407cabdff1aSopenharmony_ci}
408cabdff1aSopenharmony_ci
409cabdff1aSopenharmony_cistatic inline int get_level_prefix(GetBitContext *gb){
410cabdff1aSopenharmony_ci    unsigned int buf;
411cabdff1aSopenharmony_ci    int log;
412cabdff1aSopenharmony_ci
413cabdff1aSopenharmony_ci    OPEN_READER(re, gb);
414cabdff1aSopenharmony_ci    UPDATE_CACHE(re, gb);
415cabdff1aSopenharmony_ci    buf=GET_CACHE(re, gb);
416cabdff1aSopenharmony_ci
417cabdff1aSopenharmony_ci    log= 32 - av_log2(buf);
418cabdff1aSopenharmony_ci
419cabdff1aSopenharmony_ci    LAST_SKIP_BITS(re, gb, log);
420cabdff1aSopenharmony_ci    CLOSE_READER(re, gb);
421cabdff1aSopenharmony_ci
422cabdff1aSopenharmony_ci    return log-1;
423cabdff1aSopenharmony_ci}
424cabdff1aSopenharmony_ci
425cabdff1aSopenharmony_ci/**
426cabdff1aSopenharmony_ci * Decode a residual block.
427cabdff1aSopenharmony_ci * @param n block index
428cabdff1aSopenharmony_ci * @param scantable scantable
429cabdff1aSopenharmony_ci * @param max_coeff number of coefficients in the block
430cabdff1aSopenharmony_ci * @return <0 if an error occurred
431cabdff1aSopenharmony_ci */
432cabdff1aSopenharmony_cistatic int decode_residual(const H264Context *h, H264SliceContext *sl,
433cabdff1aSopenharmony_ci                           GetBitContext *gb, int16_t *block, int n,
434cabdff1aSopenharmony_ci                           const uint8_t *scantable, const uint32_t *qmul,
435cabdff1aSopenharmony_ci                           int max_coeff)
436cabdff1aSopenharmony_ci{
437cabdff1aSopenharmony_ci    static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3};
438cabdff1aSopenharmony_ci    int level[16];
439cabdff1aSopenharmony_ci    int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before;
440cabdff1aSopenharmony_ci
441cabdff1aSopenharmony_ci    //FIXME put trailing_onex into the context
442cabdff1aSopenharmony_ci
443cabdff1aSopenharmony_ci    if(max_coeff <= 8){
444cabdff1aSopenharmony_ci        if (max_coeff == 4)
445cabdff1aSopenharmony_ci            coeff_token = get_vlc2(gb, chroma_dc_coeff_token_vlc.table, CHROMA_DC_COEFF_TOKEN_VLC_BITS, 1);
446cabdff1aSopenharmony_ci        else
447cabdff1aSopenharmony_ci            coeff_token = get_vlc2(gb, chroma422_dc_coeff_token_vlc.table, CHROMA422_DC_COEFF_TOKEN_VLC_BITS, 1);
448cabdff1aSopenharmony_ci        total_coeff= coeff_token>>2;
449cabdff1aSopenharmony_ci    }else{
450cabdff1aSopenharmony_ci        if(n >= LUMA_DC_BLOCK_INDEX){
451cabdff1aSopenharmony_ci            total_coeff= pred_non_zero_count(h, sl, (n - LUMA_DC_BLOCK_INDEX)*16);
452cabdff1aSopenharmony_ci            coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
453cabdff1aSopenharmony_ci            total_coeff= coeff_token>>2;
454cabdff1aSopenharmony_ci        }else{
455cabdff1aSopenharmony_ci            total_coeff= pred_non_zero_count(h, sl, n);
456cabdff1aSopenharmony_ci            coeff_token= get_vlc2(gb, coeff_token_vlc[ coeff_token_table_index[total_coeff] ].table, COEFF_TOKEN_VLC_BITS, 2);
457cabdff1aSopenharmony_ci            total_coeff= coeff_token>>2;
458cabdff1aSopenharmony_ci        }
459cabdff1aSopenharmony_ci    }
460cabdff1aSopenharmony_ci    sl->non_zero_count_cache[scan8[n]] = total_coeff;
461cabdff1aSopenharmony_ci
462cabdff1aSopenharmony_ci    //FIXME set last_non_zero?
463cabdff1aSopenharmony_ci
464cabdff1aSopenharmony_ci    if(total_coeff==0)
465cabdff1aSopenharmony_ci        return 0;
466cabdff1aSopenharmony_ci    if(total_coeff > (unsigned)max_coeff) {
467cabdff1aSopenharmony_ci        av_log(h->avctx, AV_LOG_ERROR, "corrupted macroblock %d %d (total_coeff=%d)\n", sl->mb_x, sl->mb_y, total_coeff);
468cabdff1aSopenharmony_ci        return -1;
469cabdff1aSopenharmony_ci    }
470cabdff1aSopenharmony_ci
471cabdff1aSopenharmony_ci    trailing_ones= coeff_token&3;
472cabdff1aSopenharmony_ci    ff_tlog(h->avctx, "trailing:%d, total:%d\n", trailing_ones, total_coeff);
473cabdff1aSopenharmony_ci    av_assert2(total_coeff<=16);
474cabdff1aSopenharmony_ci
475cabdff1aSopenharmony_ci    i = show_bits(gb, 3);
476cabdff1aSopenharmony_ci    skip_bits(gb, trailing_ones);
477cabdff1aSopenharmony_ci    level[0] = 1-((i&4)>>1);
478cabdff1aSopenharmony_ci    level[1] = 1-((i&2)   );
479cabdff1aSopenharmony_ci    level[2] = 1-((i&1)<<1);
480cabdff1aSopenharmony_ci
481cabdff1aSopenharmony_ci    if(trailing_ones<total_coeff) {
482cabdff1aSopenharmony_ci        int mask, prefix;
483cabdff1aSopenharmony_ci        int suffix_length = total_coeff > 10 & trailing_ones < 3;
484cabdff1aSopenharmony_ci        int bitsi= show_bits(gb, LEVEL_TAB_BITS);
485cabdff1aSopenharmony_ci        int level_code= cavlc_level_tab[suffix_length][bitsi][0];
486cabdff1aSopenharmony_ci
487cabdff1aSopenharmony_ci        skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
488cabdff1aSopenharmony_ci        if(level_code >= 100){
489cabdff1aSopenharmony_ci            prefix= level_code - 100;
490cabdff1aSopenharmony_ci            if(prefix == LEVEL_TAB_BITS)
491cabdff1aSopenharmony_ci                prefix += get_level_prefix(gb);
492cabdff1aSopenharmony_ci
493cabdff1aSopenharmony_ci            //first coefficient has suffix_length equal to 0 or 1
494cabdff1aSopenharmony_ci            if(prefix<14){ //FIXME try to build a large unified VLC table for all this
495cabdff1aSopenharmony_ci                if(suffix_length)
496cabdff1aSopenharmony_ci                    level_code= (prefix<<1) + get_bits1(gb); //part
497cabdff1aSopenharmony_ci                else
498cabdff1aSopenharmony_ci                    level_code= prefix; //part
499cabdff1aSopenharmony_ci            }else if(prefix==14){
500cabdff1aSopenharmony_ci                if(suffix_length)
501cabdff1aSopenharmony_ci                    level_code= (prefix<<1) + get_bits1(gb); //part
502cabdff1aSopenharmony_ci                else
503cabdff1aSopenharmony_ci                    level_code= prefix + get_bits(gb, 4); //part
504cabdff1aSopenharmony_ci            }else{
505cabdff1aSopenharmony_ci                level_code= 30;
506cabdff1aSopenharmony_ci                if(prefix>=16){
507cabdff1aSopenharmony_ci                    if(prefix > 25+3){
508cabdff1aSopenharmony_ci                        av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
509cabdff1aSopenharmony_ci                        return -1;
510cabdff1aSopenharmony_ci                    }
511cabdff1aSopenharmony_ci                    level_code += (1<<(prefix-3))-4096;
512cabdff1aSopenharmony_ci                }
513cabdff1aSopenharmony_ci                level_code += get_bits(gb, prefix-3); //part
514cabdff1aSopenharmony_ci            }
515cabdff1aSopenharmony_ci
516cabdff1aSopenharmony_ci            if(trailing_ones < 3) level_code += 2;
517cabdff1aSopenharmony_ci
518cabdff1aSopenharmony_ci            suffix_length = 2;
519cabdff1aSopenharmony_ci            mask= -(level_code&1);
520cabdff1aSopenharmony_ci            level[trailing_ones]= (((2+level_code)>>1) ^ mask) - mask;
521cabdff1aSopenharmony_ci        }else{
522cabdff1aSopenharmony_ci            level_code += ((level_code>>31)|1) & -(trailing_ones < 3);
523cabdff1aSopenharmony_ci
524cabdff1aSopenharmony_ci            suffix_length = 1 + (level_code + 3U > 6U);
525cabdff1aSopenharmony_ci            level[trailing_ones]= level_code;
526cabdff1aSopenharmony_ci        }
527cabdff1aSopenharmony_ci
528cabdff1aSopenharmony_ci        //remaining coefficients have suffix_length > 0
529cabdff1aSopenharmony_ci        for(i=trailing_ones+1;i<total_coeff;i++) {
530cabdff1aSopenharmony_ci            static const unsigned int suffix_limit[7] = {0,3,6,12,24,48,INT_MAX };
531cabdff1aSopenharmony_ci            int bitsi= show_bits(gb, LEVEL_TAB_BITS);
532cabdff1aSopenharmony_ci            level_code= cavlc_level_tab[suffix_length][bitsi][0];
533cabdff1aSopenharmony_ci
534cabdff1aSopenharmony_ci            skip_bits(gb, cavlc_level_tab[suffix_length][bitsi][1]);
535cabdff1aSopenharmony_ci            if(level_code >= 100){
536cabdff1aSopenharmony_ci                prefix= level_code - 100;
537cabdff1aSopenharmony_ci                if(prefix == LEVEL_TAB_BITS){
538cabdff1aSopenharmony_ci                    prefix += get_level_prefix(gb);
539cabdff1aSopenharmony_ci                }
540cabdff1aSopenharmony_ci                if(prefix<15){
541cabdff1aSopenharmony_ci                    level_code = (prefix<<suffix_length) + get_bits(gb, suffix_length);
542cabdff1aSopenharmony_ci                }else{
543cabdff1aSopenharmony_ci                    level_code = 15<<suffix_length;
544cabdff1aSopenharmony_ci                    if (prefix>=16) {
545cabdff1aSopenharmony_ci                        if(prefix > 25+3){
546cabdff1aSopenharmony_ci                            av_log(h->avctx, AV_LOG_ERROR, "Invalid level prefix\n");
547cabdff1aSopenharmony_ci                            return AVERROR_INVALIDDATA;
548cabdff1aSopenharmony_ci                        }
549cabdff1aSopenharmony_ci                        level_code += (1<<(prefix-3))-4096;
550cabdff1aSopenharmony_ci                    }
551cabdff1aSopenharmony_ci                    level_code += get_bits(gb, prefix-3);
552cabdff1aSopenharmony_ci                }
553cabdff1aSopenharmony_ci                mask= -(level_code&1);
554cabdff1aSopenharmony_ci                level_code= (((2+level_code)>>1) ^ mask) - mask;
555cabdff1aSopenharmony_ci            }
556cabdff1aSopenharmony_ci            level[i]= level_code;
557cabdff1aSopenharmony_ci            suffix_length+= suffix_limit[suffix_length] + level_code > 2U*suffix_limit[suffix_length];
558cabdff1aSopenharmony_ci        }
559cabdff1aSopenharmony_ci    }
560cabdff1aSopenharmony_ci
561cabdff1aSopenharmony_ci    if(total_coeff == max_coeff)
562cabdff1aSopenharmony_ci        zeros_left=0;
563cabdff1aSopenharmony_ci    else{
564cabdff1aSopenharmony_ci        if (max_coeff <= 8) {
565cabdff1aSopenharmony_ci            if (max_coeff == 4)
566cabdff1aSopenharmony_ci                zeros_left = get_vlc2(gb, chroma_dc_total_zeros_vlc[total_coeff].table,
567cabdff1aSopenharmony_ci                                      CHROMA_DC_TOTAL_ZEROS_VLC_BITS, 1);
568cabdff1aSopenharmony_ci            else
569cabdff1aSopenharmony_ci                zeros_left = get_vlc2(gb, chroma422_dc_total_zeros_vlc[total_coeff].table,
570cabdff1aSopenharmony_ci                                      CHROMA422_DC_TOTAL_ZEROS_VLC_BITS, 1);
571cabdff1aSopenharmony_ci        } else {
572cabdff1aSopenharmony_ci            zeros_left= get_vlc2(gb, total_zeros_vlc[ total_coeff ].table, TOTAL_ZEROS_VLC_BITS, 1);
573cabdff1aSopenharmony_ci        }
574cabdff1aSopenharmony_ci    }
575cabdff1aSopenharmony_ci
576cabdff1aSopenharmony_ci#define STORE_BLOCK(type) \
577cabdff1aSopenharmony_ci    scantable += zeros_left + total_coeff - 1; \
578cabdff1aSopenharmony_ci    if(n >= LUMA_DC_BLOCK_INDEX){ \
579cabdff1aSopenharmony_ci        ((type*)block)[*scantable] = level[0]; \
580cabdff1aSopenharmony_ci        for(i=1;i<total_coeff && zeros_left > 0;i++) { \
581cabdff1aSopenharmony_ci            if(zeros_left < 7) \
582cabdff1aSopenharmony_ci                run_before= get_vlc2(gb, run_vlc[zeros_left].table, RUN_VLC_BITS, 1); \
583cabdff1aSopenharmony_ci            else \
584cabdff1aSopenharmony_ci                run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \
585cabdff1aSopenharmony_ci            zeros_left -= run_before; \
586cabdff1aSopenharmony_ci            scantable -= 1 + run_before; \
587cabdff1aSopenharmony_ci            ((type*)block)[*scantable]= level[i]; \
588cabdff1aSopenharmony_ci        } \
589cabdff1aSopenharmony_ci        for(;i<total_coeff;i++) { \
590cabdff1aSopenharmony_ci            scantable--; \
591cabdff1aSopenharmony_ci            ((type*)block)[*scantable]= level[i]; \
592cabdff1aSopenharmony_ci        } \
593cabdff1aSopenharmony_ci    }else{ \
594cabdff1aSopenharmony_ci        ((type*)block)[*scantable] = ((int)(level[0] * qmul[*scantable] + 32))>>6; \
595cabdff1aSopenharmony_ci        for(i=1;i<total_coeff && zeros_left > 0;i++) { \
596cabdff1aSopenharmony_ci            if(zeros_left < 7) \
597cabdff1aSopenharmony_ci                run_before= get_vlc2(gb, run_vlc[zeros_left].table, RUN_VLC_BITS, 1); \
598cabdff1aSopenharmony_ci            else \
599cabdff1aSopenharmony_ci                run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); \
600cabdff1aSopenharmony_ci            zeros_left -= run_before; \
601cabdff1aSopenharmony_ci            scantable -= 1 + run_before; \
602cabdff1aSopenharmony_ci            ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
603cabdff1aSopenharmony_ci        } \
604cabdff1aSopenharmony_ci        for(;i<total_coeff;i++) { \
605cabdff1aSopenharmony_ci            scantable--; \
606cabdff1aSopenharmony_ci            ((type*)block)[*scantable]= ((int)(level[i] * qmul[*scantable] + 32))>>6; \
607cabdff1aSopenharmony_ci        } \
608cabdff1aSopenharmony_ci    }
609cabdff1aSopenharmony_ci
610cabdff1aSopenharmony_ci    if (h->pixel_shift) {
611cabdff1aSopenharmony_ci        STORE_BLOCK(int32_t)
612cabdff1aSopenharmony_ci    } else {
613cabdff1aSopenharmony_ci        STORE_BLOCK(int16_t)
614cabdff1aSopenharmony_ci    }
615cabdff1aSopenharmony_ci
616cabdff1aSopenharmony_ci    if(zeros_left<0){
617cabdff1aSopenharmony_ci        av_log(h->avctx, AV_LOG_ERROR, "negative number of zero coeffs at %d %d\n", sl->mb_x, sl->mb_y);
618cabdff1aSopenharmony_ci        return -1;
619cabdff1aSopenharmony_ci    }
620cabdff1aSopenharmony_ci
621cabdff1aSopenharmony_ci    return 0;
622cabdff1aSopenharmony_ci}
623cabdff1aSopenharmony_ci
624cabdff1aSopenharmony_cistatic av_always_inline
625cabdff1aSopenharmony_ciint decode_luma_residual(const H264Context *h, H264SliceContext *sl,
626cabdff1aSopenharmony_ci                         GetBitContext *gb, const uint8_t *scan,
627cabdff1aSopenharmony_ci                         const uint8_t *scan8x8, int pixel_shift,
628cabdff1aSopenharmony_ci                         int mb_type, int cbp, int p)
629cabdff1aSopenharmony_ci{
630cabdff1aSopenharmony_ci    int i4x4, i8x8;
631cabdff1aSopenharmony_ci    int qscale = p == 0 ? sl->qscale : sl->chroma_qp[p - 1];
632cabdff1aSopenharmony_ci    if(IS_INTRA16x16(mb_type)){
633cabdff1aSopenharmony_ci        AV_ZERO128(sl->mb_luma_dc[p]+0);
634cabdff1aSopenharmony_ci        AV_ZERO128(sl->mb_luma_dc[p]+8);
635cabdff1aSopenharmony_ci        AV_ZERO128(sl->mb_luma_dc[p]+16);
636cabdff1aSopenharmony_ci        AV_ZERO128(sl->mb_luma_dc[p]+24);
637cabdff1aSopenharmony_ci        if (decode_residual(h, sl, gb, sl->mb_luma_dc[p], LUMA_DC_BLOCK_INDEX + p, scan, NULL, 16) < 0) {
638cabdff1aSopenharmony_ci            return -1; //FIXME continue if partitioned and other return -1 too
639cabdff1aSopenharmony_ci        }
640cabdff1aSopenharmony_ci
641cabdff1aSopenharmony_ci        av_assert2((cbp&15) == 0 || (cbp&15) == 15);
642cabdff1aSopenharmony_ci
643cabdff1aSopenharmony_ci        if(cbp&15){
644cabdff1aSopenharmony_ci            for(i8x8=0; i8x8<4; i8x8++){
645cabdff1aSopenharmony_ci                for(i4x4=0; i4x4<4; i4x4++){
646cabdff1aSopenharmony_ci                    const int index= i4x4 + 4*i8x8 + p*16;
647cabdff1aSopenharmony_ci                    if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift),
648cabdff1aSopenharmony_ci                        index, scan + 1, h->ps.pps->dequant4_coeff[p][qscale], 15) < 0 ){
649cabdff1aSopenharmony_ci                        return -1;
650cabdff1aSopenharmony_ci                    }
651cabdff1aSopenharmony_ci                }
652cabdff1aSopenharmony_ci            }
653cabdff1aSopenharmony_ci            return 0xf;
654cabdff1aSopenharmony_ci        }else{
655cabdff1aSopenharmony_ci            fill_rectangle(&sl->non_zero_count_cache[scan8[p*16]], 4, 4, 8, 0, 1);
656cabdff1aSopenharmony_ci            return 0;
657cabdff1aSopenharmony_ci        }
658cabdff1aSopenharmony_ci    }else{
659cabdff1aSopenharmony_ci        int cqm = (IS_INTRA( mb_type ) ? 0:3)+p;
660cabdff1aSopenharmony_ci        /* For CAVLC 4:4:4, we need to keep track of the luma 8x8 CBP for deblocking nnz purposes. */
661cabdff1aSopenharmony_ci        int new_cbp = 0;
662cabdff1aSopenharmony_ci        for(i8x8=0; i8x8<4; i8x8++){
663cabdff1aSopenharmony_ci            if(cbp & (1<<i8x8)){
664cabdff1aSopenharmony_ci                if(IS_8x8DCT(mb_type)){
665cabdff1aSopenharmony_ci                    int16_t *buf = &sl->mb[64*i8x8+256*p << pixel_shift];
666cabdff1aSopenharmony_ci                    uint8_t *nnz;
667cabdff1aSopenharmony_ci                    for(i4x4=0; i4x4<4; i4x4++){
668cabdff1aSopenharmony_ci                        const int index= i4x4 + 4*i8x8 + p*16;
669cabdff1aSopenharmony_ci                        if( decode_residual(h, sl, gb, buf, index, scan8x8+16*i4x4,
670cabdff1aSopenharmony_ci                                            h->ps.pps->dequant8_coeff[cqm][qscale], 16) < 0 )
671cabdff1aSopenharmony_ci                            return -1;
672cabdff1aSopenharmony_ci                    }
673cabdff1aSopenharmony_ci                    nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
674cabdff1aSopenharmony_ci                    nnz[0] += nnz[1] + nnz[8] + nnz[9];
675cabdff1aSopenharmony_ci                    new_cbp |= !!nnz[0] << i8x8;
676cabdff1aSopenharmony_ci                }else{
677cabdff1aSopenharmony_ci                    for(i4x4=0; i4x4<4; i4x4++){
678cabdff1aSopenharmony_ci                        const int index= i4x4 + 4*i8x8 + p*16;
679cabdff1aSopenharmony_ci                        if( decode_residual(h, sl, gb, sl->mb + (16*index << pixel_shift), index,
680cabdff1aSopenharmony_ci                                            scan, h->ps.pps->dequant4_coeff[cqm][qscale], 16) < 0 ){
681cabdff1aSopenharmony_ci                            return -1;
682cabdff1aSopenharmony_ci                        }
683cabdff1aSopenharmony_ci                        new_cbp |= sl->non_zero_count_cache[scan8[index]] << i8x8;
684cabdff1aSopenharmony_ci                    }
685cabdff1aSopenharmony_ci                }
686cabdff1aSopenharmony_ci            }else{
687cabdff1aSopenharmony_ci                uint8_t * const nnz = &sl->non_zero_count_cache[scan8[4 * i8x8 + p * 16]];
688cabdff1aSopenharmony_ci                nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
689cabdff1aSopenharmony_ci            }
690cabdff1aSopenharmony_ci        }
691cabdff1aSopenharmony_ci        return new_cbp;
692cabdff1aSopenharmony_ci    }
693cabdff1aSopenharmony_ci}
694cabdff1aSopenharmony_ci
695cabdff1aSopenharmony_ciint ff_h264_decode_mb_cavlc(const H264Context *h, H264SliceContext *sl)
696cabdff1aSopenharmony_ci{
697cabdff1aSopenharmony_ci    int mb_xy;
698cabdff1aSopenharmony_ci    int partition_count;
699cabdff1aSopenharmony_ci    unsigned int mb_type, cbp;
700cabdff1aSopenharmony_ci    int dct8x8_allowed = h->ps.pps->transform_8x8_mode;
701cabdff1aSopenharmony_ci    const int decode_chroma = h->ps.sps->chroma_format_idc == 1 || h->ps.sps->chroma_format_idc == 2;
702cabdff1aSopenharmony_ci    const int pixel_shift = h->pixel_shift;
703cabdff1aSopenharmony_ci
704cabdff1aSopenharmony_ci    mb_xy = sl->mb_xy = sl->mb_x + sl->mb_y*h->mb_stride;
705cabdff1aSopenharmony_ci
706cabdff1aSopenharmony_ci    ff_tlog(h->avctx, "pic:%d mb:%d/%d\n", h->poc.frame_num, sl->mb_x, sl->mb_y);
707cabdff1aSopenharmony_ci    cbp = 0; /* avoid warning. FIXME: find a solution without slowing
708cabdff1aSopenharmony_ci                down the code */
709cabdff1aSopenharmony_ci    if (sl->slice_type_nos != AV_PICTURE_TYPE_I) {
710cabdff1aSopenharmony_ci        if (sl->mb_skip_run == -1) {
711cabdff1aSopenharmony_ci            unsigned mb_skip_run = get_ue_golomb_long(&sl->gb);
712cabdff1aSopenharmony_ci            if (mb_skip_run > h->mb_num) {
713cabdff1aSopenharmony_ci                av_log(h->avctx, AV_LOG_ERROR, "mb_skip_run %d is invalid\n", mb_skip_run);
714cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
715cabdff1aSopenharmony_ci            }
716cabdff1aSopenharmony_ci            sl->mb_skip_run = mb_skip_run;
717cabdff1aSopenharmony_ci        }
718cabdff1aSopenharmony_ci
719cabdff1aSopenharmony_ci        if (sl->mb_skip_run--) {
720cabdff1aSopenharmony_ci            if (FRAME_MBAFF(h) && (sl->mb_y & 1) == 0) {
721cabdff1aSopenharmony_ci                if (sl->mb_skip_run == 0)
722cabdff1aSopenharmony_ci                    sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb);
723cabdff1aSopenharmony_ci            }
724cabdff1aSopenharmony_ci            decode_mb_skip(h, sl);
725cabdff1aSopenharmony_ci            return 0;
726cabdff1aSopenharmony_ci        }
727cabdff1aSopenharmony_ci    }
728cabdff1aSopenharmony_ci    if (FRAME_MBAFF(h)) {
729cabdff1aSopenharmony_ci        if ((sl->mb_y & 1) == 0)
730cabdff1aSopenharmony_ci            sl->mb_mbaff = sl->mb_field_decoding_flag = get_bits1(&sl->gb);
731cabdff1aSopenharmony_ci    }
732cabdff1aSopenharmony_ci
733cabdff1aSopenharmony_ci    sl->prev_mb_skipped = 0;
734cabdff1aSopenharmony_ci
735cabdff1aSopenharmony_ci    mb_type= get_ue_golomb(&sl->gb);
736cabdff1aSopenharmony_ci    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
737cabdff1aSopenharmony_ci        if(mb_type < 23){
738cabdff1aSopenharmony_ci            partition_count = ff_h264_b_mb_type_info[mb_type].partition_count;
739cabdff1aSopenharmony_ci            mb_type         = ff_h264_b_mb_type_info[mb_type].type;
740cabdff1aSopenharmony_ci        }else{
741cabdff1aSopenharmony_ci            mb_type -= 23;
742cabdff1aSopenharmony_ci            goto decode_intra_mb;
743cabdff1aSopenharmony_ci        }
744cabdff1aSopenharmony_ci    } else if (sl->slice_type_nos == AV_PICTURE_TYPE_P) {
745cabdff1aSopenharmony_ci        if(mb_type < 5){
746cabdff1aSopenharmony_ci            partition_count = ff_h264_p_mb_type_info[mb_type].partition_count;
747cabdff1aSopenharmony_ci            mb_type         = ff_h264_p_mb_type_info[mb_type].type;
748cabdff1aSopenharmony_ci        }else{
749cabdff1aSopenharmony_ci            mb_type -= 5;
750cabdff1aSopenharmony_ci            goto decode_intra_mb;
751cabdff1aSopenharmony_ci        }
752cabdff1aSopenharmony_ci    }else{
753cabdff1aSopenharmony_ci       av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_I);
754cabdff1aSopenharmony_ci        if (sl->slice_type == AV_PICTURE_TYPE_SI && mb_type)
755cabdff1aSopenharmony_ci            mb_type--;
756cabdff1aSopenharmony_cidecode_intra_mb:
757cabdff1aSopenharmony_ci        if(mb_type > 25){
758cabdff1aSopenharmony_ci            av_log(h->avctx, AV_LOG_ERROR, "mb_type %d in %c slice too large at %d %d\n", mb_type, av_get_picture_type_char(sl->slice_type), sl->mb_x, sl->mb_y);
759cabdff1aSopenharmony_ci            return -1;
760cabdff1aSopenharmony_ci        }
761cabdff1aSopenharmony_ci        partition_count=0;
762cabdff1aSopenharmony_ci        cbp                      = ff_h264_i_mb_type_info[mb_type].cbp;
763cabdff1aSopenharmony_ci        sl->intra16x16_pred_mode = ff_h264_i_mb_type_info[mb_type].pred_mode;
764cabdff1aSopenharmony_ci        mb_type                  = ff_h264_i_mb_type_info[mb_type].type;
765cabdff1aSopenharmony_ci    }
766cabdff1aSopenharmony_ci
767cabdff1aSopenharmony_ci    if (MB_FIELD(sl))
768cabdff1aSopenharmony_ci        mb_type |= MB_TYPE_INTERLACED;
769cabdff1aSopenharmony_ci
770cabdff1aSopenharmony_ci    h->slice_table[mb_xy] = sl->slice_num;
771cabdff1aSopenharmony_ci
772cabdff1aSopenharmony_ci    if(IS_INTRA_PCM(mb_type)){
773cabdff1aSopenharmony_ci        const int mb_size = ff_h264_mb_sizes[h->ps.sps->chroma_format_idc] *
774cabdff1aSopenharmony_ci                            h->ps.sps->bit_depth_luma;
775cabdff1aSopenharmony_ci
776cabdff1aSopenharmony_ci        // We assume these blocks are very rare so we do not optimize it.
777cabdff1aSopenharmony_ci        sl->intra_pcm_ptr = align_get_bits(&sl->gb);
778cabdff1aSopenharmony_ci        if (get_bits_left(&sl->gb) < mb_size) {
779cabdff1aSopenharmony_ci            av_log(h->avctx, AV_LOG_ERROR, "Not enough data for an intra PCM block.\n");
780cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
781cabdff1aSopenharmony_ci        }
782cabdff1aSopenharmony_ci        skip_bits_long(&sl->gb, mb_size);
783cabdff1aSopenharmony_ci
784cabdff1aSopenharmony_ci        // In deblocking, the quantizer is 0
785cabdff1aSopenharmony_ci        h->cur_pic.qscale_table[mb_xy] = 0;
786cabdff1aSopenharmony_ci        // All coeffs are present
787cabdff1aSopenharmony_ci        memset(h->non_zero_count[mb_xy], 16, 48);
788cabdff1aSopenharmony_ci
789cabdff1aSopenharmony_ci        h->cur_pic.mb_type[mb_xy] = mb_type;
790cabdff1aSopenharmony_ci        return 0;
791cabdff1aSopenharmony_ci    }
792cabdff1aSopenharmony_ci
793cabdff1aSopenharmony_ci    fill_decode_neighbors(h, sl, mb_type);
794cabdff1aSopenharmony_ci    fill_decode_caches(h, sl, mb_type);
795cabdff1aSopenharmony_ci
796cabdff1aSopenharmony_ci    //mb_pred
797cabdff1aSopenharmony_ci    if(IS_INTRA(mb_type)){
798cabdff1aSopenharmony_ci        int pred_mode;
799cabdff1aSopenharmony_ci//            init_top_left_availability(h);
800cabdff1aSopenharmony_ci        if(IS_INTRA4x4(mb_type)){
801cabdff1aSopenharmony_ci            int i;
802cabdff1aSopenharmony_ci            int di = 1;
803cabdff1aSopenharmony_ci            if(dct8x8_allowed && get_bits1(&sl->gb)){
804cabdff1aSopenharmony_ci                mb_type |= MB_TYPE_8x8DCT;
805cabdff1aSopenharmony_ci                di = 4;
806cabdff1aSopenharmony_ci            }
807cabdff1aSopenharmony_ci
808cabdff1aSopenharmony_ci//                fill_intra4x4_pred_table(h);
809cabdff1aSopenharmony_ci            for(i=0; i<16; i+=di){
810cabdff1aSopenharmony_ci                int mode = pred_intra_mode(h, sl, i);
811cabdff1aSopenharmony_ci
812cabdff1aSopenharmony_ci                if(!get_bits1(&sl->gb)){
813cabdff1aSopenharmony_ci                    const int rem_mode= get_bits(&sl->gb, 3);
814cabdff1aSopenharmony_ci                    mode = rem_mode + (rem_mode >= mode);
815cabdff1aSopenharmony_ci                }
816cabdff1aSopenharmony_ci
817cabdff1aSopenharmony_ci                if(di==4)
818cabdff1aSopenharmony_ci                    fill_rectangle(&sl->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1);
819cabdff1aSopenharmony_ci                else
820cabdff1aSopenharmony_ci                    sl->intra4x4_pred_mode_cache[scan8[i]] = mode;
821cabdff1aSopenharmony_ci            }
822cabdff1aSopenharmony_ci            write_back_intra_pred_mode(h, sl);
823cabdff1aSopenharmony_ci            if (ff_h264_check_intra4x4_pred_mode(sl->intra4x4_pred_mode_cache, h->avctx,
824cabdff1aSopenharmony_ci                                                 sl->top_samples_available, sl->left_samples_available) < 0)
825cabdff1aSopenharmony_ci                return -1;
826cabdff1aSopenharmony_ci        }else{
827cabdff1aSopenharmony_ci            sl->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
828cabdff1aSopenharmony_ci                                                                     sl->left_samples_available, sl->intra16x16_pred_mode, 0);
829cabdff1aSopenharmony_ci            if (sl->intra16x16_pred_mode < 0)
830cabdff1aSopenharmony_ci                return -1;
831cabdff1aSopenharmony_ci        }
832cabdff1aSopenharmony_ci        if(decode_chroma){
833cabdff1aSopenharmony_ci            pred_mode= ff_h264_check_intra_pred_mode(h->avctx, sl->top_samples_available,
834cabdff1aSopenharmony_ci                                                     sl->left_samples_available, get_ue_golomb_31(&sl->gb), 1);
835cabdff1aSopenharmony_ci            if(pred_mode < 0)
836cabdff1aSopenharmony_ci                return -1;
837cabdff1aSopenharmony_ci            sl->chroma_pred_mode = pred_mode;
838cabdff1aSopenharmony_ci        } else {
839cabdff1aSopenharmony_ci            sl->chroma_pred_mode = DC_128_PRED8x8;
840cabdff1aSopenharmony_ci        }
841cabdff1aSopenharmony_ci    }else if(partition_count==4){
842cabdff1aSopenharmony_ci        int i, j, sub_partition_count[4], list, ref[2][4];
843cabdff1aSopenharmony_ci
844cabdff1aSopenharmony_ci        if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {
845cabdff1aSopenharmony_ci            for(i=0; i<4; i++){
846cabdff1aSopenharmony_ci                sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
847cabdff1aSopenharmony_ci                if(sl->sub_mb_type[i] >=13){
848cabdff1aSopenharmony_ci                    av_log(h->avctx, AV_LOG_ERROR, "B sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y);
849cabdff1aSopenharmony_ci                    return -1;
850cabdff1aSopenharmony_ci                }
851cabdff1aSopenharmony_ci                sub_partition_count[i] = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
852cabdff1aSopenharmony_ci                sl->sub_mb_type[i]     = ff_h264_b_sub_mb_type_info[sl->sub_mb_type[i]].type;
853cabdff1aSopenharmony_ci            }
854cabdff1aSopenharmony_ci            if( IS_DIRECT(sl->sub_mb_type[0]|sl->sub_mb_type[1]|sl->sub_mb_type[2]|sl->sub_mb_type[3])) {
855cabdff1aSopenharmony_ci                ff_h264_pred_direct_motion(h, sl, &mb_type);
856cabdff1aSopenharmony_ci                sl->ref_cache[0][scan8[4]] =
857cabdff1aSopenharmony_ci                sl->ref_cache[1][scan8[4]] =
858cabdff1aSopenharmony_ci                sl->ref_cache[0][scan8[12]] =
859cabdff1aSopenharmony_ci                sl->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
860cabdff1aSopenharmony_ci            }
861cabdff1aSopenharmony_ci        }else{
862cabdff1aSopenharmony_ci            av_assert2(sl->slice_type_nos == AV_PICTURE_TYPE_P); //FIXME SP correct ?
863cabdff1aSopenharmony_ci            for(i=0; i<4; i++){
864cabdff1aSopenharmony_ci                sl->sub_mb_type[i]= get_ue_golomb_31(&sl->gb);
865cabdff1aSopenharmony_ci                if(sl->sub_mb_type[i] >=4){
866cabdff1aSopenharmony_ci                    av_log(h->avctx, AV_LOG_ERROR, "P sub_mb_type %u out of range at %d %d\n", sl->sub_mb_type[i], sl->mb_x, sl->mb_y);
867cabdff1aSopenharmony_ci                    return -1;
868cabdff1aSopenharmony_ci                }
869cabdff1aSopenharmony_ci                sub_partition_count[i] = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].partition_count;
870cabdff1aSopenharmony_ci                sl->sub_mb_type[i]     = ff_h264_p_sub_mb_type_info[sl->sub_mb_type[i]].type;
871cabdff1aSopenharmony_ci            }
872cabdff1aSopenharmony_ci        }
873cabdff1aSopenharmony_ci
874cabdff1aSopenharmony_ci        for (list = 0; list < sl->list_count; list++) {
875cabdff1aSopenharmony_ci            int ref_count = IS_REF0(mb_type) ? 1 : sl->ref_count[list] << MB_MBAFF(sl);
876cabdff1aSopenharmony_ci            for(i=0; i<4; i++){
877cabdff1aSopenharmony_ci                if(IS_DIRECT(sl->sub_mb_type[i])) continue;
878cabdff1aSopenharmony_ci                if(IS_DIR(sl->sub_mb_type[i], 0, list)){
879cabdff1aSopenharmony_ci                    unsigned int tmp;
880cabdff1aSopenharmony_ci                    if(ref_count == 1){
881cabdff1aSopenharmony_ci                        tmp= 0;
882cabdff1aSopenharmony_ci                    }else if(ref_count == 2){
883cabdff1aSopenharmony_ci                        tmp= get_bits1(&sl->gb)^1;
884cabdff1aSopenharmony_ci                    }else{
885cabdff1aSopenharmony_ci                        tmp= get_ue_golomb_31(&sl->gb);
886cabdff1aSopenharmony_ci                        if(tmp>=ref_count){
887cabdff1aSopenharmony_ci                            av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp);
888cabdff1aSopenharmony_ci                            return -1;
889cabdff1aSopenharmony_ci                        }
890cabdff1aSopenharmony_ci                    }
891cabdff1aSopenharmony_ci                    ref[list][i]= tmp;
892cabdff1aSopenharmony_ci                }else{
893cabdff1aSopenharmony_ci                 //FIXME
894cabdff1aSopenharmony_ci                    ref[list][i] = -1;
895cabdff1aSopenharmony_ci                }
896cabdff1aSopenharmony_ci            }
897cabdff1aSopenharmony_ci        }
898cabdff1aSopenharmony_ci
899cabdff1aSopenharmony_ci        if(dct8x8_allowed)
900cabdff1aSopenharmony_ci            dct8x8_allowed = get_dct8x8_allowed(h, sl);
901cabdff1aSopenharmony_ci
902cabdff1aSopenharmony_ci        for (list = 0; list < sl->list_count; list++) {
903cabdff1aSopenharmony_ci            for(i=0; i<4; i++){
904cabdff1aSopenharmony_ci                if(IS_DIRECT(sl->sub_mb_type[i])) {
905cabdff1aSopenharmony_ci                    sl->ref_cache[list][ scan8[4*i] ] = sl->ref_cache[list][ scan8[4*i]+1 ];
906cabdff1aSopenharmony_ci                    continue;
907cabdff1aSopenharmony_ci                }
908cabdff1aSopenharmony_ci                sl->ref_cache[list][ scan8[4*i]   ]=sl->ref_cache[list][ scan8[4*i]+1 ]=
909cabdff1aSopenharmony_ci                sl->ref_cache[list][ scan8[4*i]+8 ]=sl->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
910cabdff1aSopenharmony_ci
911cabdff1aSopenharmony_ci                if(IS_DIR(sl->sub_mb_type[i], 0, list)){
912cabdff1aSopenharmony_ci                    const int sub_mb_type= sl->sub_mb_type[i];
913cabdff1aSopenharmony_ci                    const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
914cabdff1aSopenharmony_ci                    for(j=0; j<sub_partition_count[i]; j++){
915cabdff1aSopenharmony_ci                        int mx, my;
916cabdff1aSopenharmony_ci                        const int index= 4*i + block_width*j;
917cabdff1aSopenharmony_ci                        int16_t (* mv_cache)[2]= &sl->mv_cache[list][ scan8[index] ];
918cabdff1aSopenharmony_ci                        pred_motion(h, sl, index, block_width, list, sl->ref_cache[list][ scan8[index] ], &mx, &my);
919cabdff1aSopenharmony_ci                        mx += (unsigned)get_se_golomb(&sl->gb);
920cabdff1aSopenharmony_ci                        my += (unsigned)get_se_golomb(&sl->gb);
921cabdff1aSopenharmony_ci                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
922cabdff1aSopenharmony_ci
923cabdff1aSopenharmony_ci                        if(IS_SUB_8X8(sub_mb_type)){
924cabdff1aSopenharmony_ci                            mv_cache[ 1 ][0]=
925cabdff1aSopenharmony_ci                            mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
926cabdff1aSopenharmony_ci                            mv_cache[ 1 ][1]=
927cabdff1aSopenharmony_ci                            mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
928cabdff1aSopenharmony_ci                        }else if(IS_SUB_8X4(sub_mb_type)){
929cabdff1aSopenharmony_ci                            mv_cache[ 1 ][0]= mx;
930cabdff1aSopenharmony_ci                            mv_cache[ 1 ][1]= my;
931cabdff1aSopenharmony_ci                        }else if(IS_SUB_4X8(sub_mb_type)){
932cabdff1aSopenharmony_ci                            mv_cache[ 8 ][0]= mx;
933cabdff1aSopenharmony_ci                            mv_cache[ 8 ][1]= my;
934cabdff1aSopenharmony_ci                        }
935cabdff1aSopenharmony_ci                        mv_cache[ 0 ][0]= mx;
936cabdff1aSopenharmony_ci                        mv_cache[ 0 ][1]= my;
937cabdff1aSopenharmony_ci                    }
938cabdff1aSopenharmony_ci                }else{
939cabdff1aSopenharmony_ci                    uint32_t *p= (uint32_t *)&sl->mv_cache[list][ scan8[4*i] ][0];
940cabdff1aSopenharmony_ci                    p[0] = p[1]=
941cabdff1aSopenharmony_ci                    p[8] = p[9]= 0;
942cabdff1aSopenharmony_ci                }
943cabdff1aSopenharmony_ci            }
944cabdff1aSopenharmony_ci        }
945cabdff1aSopenharmony_ci    }else if(IS_DIRECT(mb_type)){
946cabdff1aSopenharmony_ci        ff_h264_pred_direct_motion(h, sl, &mb_type);
947cabdff1aSopenharmony_ci        dct8x8_allowed &= h->ps.sps->direct_8x8_inference_flag;
948cabdff1aSopenharmony_ci    }else{
949cabdff1aSopenharmony_ci        int list, mx, my, i;
950cabdff1aSopenharmony_ci         //FIXME we should set ref_idx_l? to 0 if we use that later ...
951cabdff1aSopenharmony_ci        if(IS_16X16(mb_type)){
952cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
953cabdff1aSopenharmony_ci                    unsigned int val;
954cabdff1aSopenharmony_ci                    if(IS_DIR(mb_type, 0, list)){
955cabdff1aSopenharmony_ci                        unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
956cabdff1aSopenharmony_ci                        if (rc == 1) {
957cabdff1aSopenharmony_ci                            val= 0;
958cabdff1aSopenharmony_ci                        } else if (rc == 2) {
959cabdff1aSopenharmony_ci                            val= get_bits1(&sl->gb)^1;
960cabdff1aSopenharmony_ci                        }else{
961cabdff1aSopenharmony_ci                            val= get_ue_golomb_31(&sl->gb);
962cabdff1aSopenharmony_ci                            if (val >= rc) {
963cabdff1aSopenharmony_ci                                av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
964cabdff1aSopenharmony_ci                                return -1;
965cabdff1aSopenharmony_ci                            }
966cabdff1aSopenharmony_ci                        }
967cabdff1aSopenharmony_ci                    fill_rectangle(&sl->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1);
968cabdff1aSopenharmony_ci                    }
969cabdff1aSopenharmony_ci            }
970cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
971cabdff1aSopenharmony_ci                if(IS_DIR(mb_type, 0, list)){
972cabdff1aSopenharmony_ci                    pred_motion(h, sl, 0, 4, list, sl->ref_cache[list][ scan8[0] ], &mx, &my);
973cabdff1aSopenharmony_ci                    mx += (unsigned)get_se_golomb(&sl->gb);
974cabdff1aSopenharmony_ci                    my += (unsigned)get_se_golomb(&sl->gb);
975cabdff1aSopenharmony_ci                    ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
976cabdff1aSopenharmony_ci
977cabdff1aSopenharmony_ci                    fill_rectangle(sl->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
978cabdff1aSopenharmony_ci                }
979cabdff1aSopenharmony_ci            }
980cabdff1aSopenharmony_ci        }
981cabdff1aSopenharmony_ci        else if(IS_16X8(mb_type)){
982cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
983cabdff1aSopenharmony_ci                    for(i=0; i<2; i++){
984cabdff1aSopenharmony_ci                        unsigned int val;
985cabdff1aSopenharmony_ci                        if(IS_DIR(mb_type, i, list)){
986cabdff1aSopenharmony_ci                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
987cabdff1aSopenharmony_ci                            if (rc == 1) {
988cabdff1aSopenharmony_ci                                val= 0;
989cabdff1aSopenharmony_ci                            } else if (rc == 2) {
990cabdff1aSopenharmony_ci                                val= get_bits1(&sl->gb)^1;
991cabdff1aSopenharmony_ci                            }else{
992cabdff1aSopenharmony_ci                                val= get_ue_golomb_31(&sl->gb);
993cabdff1aSopenharmony_ci                                if (val >= rc) {
994cabdff1aSopenharmony_ci                                    av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
995cabdff1aSopenharmony_ci                                    return -1;
996cabdff1aSopenharmony_ci                                }
997cabdff1aSopenharmony_ci                            }
998cabdff1aSopenharmony_ci                        }else
999cabdff1aSopenharmony_ci                            val= LIST_NOT_USED&0xFF;
1000cabdff1aSopenharmony_ci                        fill_rectangle(&sl->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1);
1001cabdff1aSopenharmony_ci                    }
1002cabdff1aSopenharmony_ci            }
1003cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
1004cabdff1aSopenharmony_ci                for(i=0; i<2; i++){
1005cabdff1aSopenharmony_ci                    unsigned int val;
1006cabdff1aSopenharmony_ci                    if(IS_DIR(mb_type, i, list)){
1007cabdff1aSopenharmony_ci                        pred_16x8_motion(h, sl, 8*i, list, sl->ref_cache[list][scan8[0] + 16*i], &mx, &my);
1008cabdff1aSopenharmony_ci                        mx += (unsigned)get_se_golomb(&sl->gb);
1009cabdff1aSopenharmony_ci                        my += (unsigned)get_se_golomb(&sl->gb);
1010cabdff1aSopenharmony_ci                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1011cabdff1aSopenharmony_ci
1012cabdff1aSopenharmony_ci                        val= pack16to32(mx,my);
1013cabdff1aSopenharmony_ci                    }else
1014cabdff1aSopenharmony_ci                        val=0;
1015cabdff1aSopenharmony_ci                    fill_rectangle(sl->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 4);
1016cabdff1aSopenharmony_ci                }
1017cabdff1aSopenharmony_ci            }
1018cabdff1aSopenharmony_ci        }else{
1019cabdff1aSopenharmony_ci            av_assert2(IS_8X16(mb_type));
1020cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
1021cabdff1aSopenharmony_ci                    for(i=0; i<2; i++){
1022cabdff1aSopenharmony_ci                        unsigned int val;
1023cabdff1aSopenharmony_ci                        if(IS_DIR(mb_type, i, list)){ //FIXME optimize
1024cabdff1aSopenharmony_ci                            unsigned rc = sl->ref_count[list] << MB_MBAFF(sl);
1025cabdff1aSopenharmony_ci                            if (rc == 1) {
1026cabdff1aSopenharmony_ci                                val= 0;
1027cabdff1aSopenharmony_ci                            } else if (rc == 2) {
1028cabdff1aSopenharmony_ci                                val= get_bits1(&sl->gb)^1;
1029cabdff1aSopenharmony_ci                            }else{
1030cabdff1aSopenharmony_ci                                val= get_ue_golomb_31(&sl->gb);
1031cabdff1aSopenharmony_ci                                if (val >= rc) {
1032cabdff1aSopenharmony_ci                                    av_log(h->avctx, AV_LOG_ERROR, "ref %u overflow\n", val);
1033cabdff1aSopenharmony_ci                                    return -1;
1034cabdff1aSopenharmony_ci                                }
1035cabdff1aSopenharmony_ci                            }
1036cabdff1aSopenharmony_ci                        }else
1037cabdff1aSopenharmony_ci                            val= LIST_NOT_USED&0xFF;
1038cabdff1aSopenharmony_ci                        fill_rectangle(&sl->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1);
1039cabdff1aSopenharmony_ci                    }
1040cabdff1aSopenharmony_ci            }
1041cabdff1aSopenharmony_ci            for (list = 0; list < sl->list_count; list++) {
1042cabdff1aSopenharmony_ci                for(i=0; i<2; i++){
1043cabdff1aSopenharmony_ci                    unsigned int val;
1044cabdff1aSopenharmony_ci                    if(IS_DIR(mb_type, i, list)){
1045cabdff1aSopenharmony_ci                        pred_8x16_motion(h, sl, i*4, list, sl->ref_cache[list][ scan8[0] + 2*i ], &mx, &my);
1046cabdff1aSopenharmony_ci                        mx += (unsigned)get_se_golomb(&sl->gb);
1047cabdff1aSopenharmony_ci                        my += (unsigned)get_se_golomb(&sl->gb);
1048cabdff1aSopenharmony_ci                        ff_tlog(h->avctx, "final mv:%d %d\n", mx, my);
1049cabdff1aSopenharmony_ci
1050cabdff1aSopenharmony_ci                        val= pack16to32(mx,my);
1051cabdff1aSopenharmony_ci                    }else
1052cabdff1aSopenharmony_ci                        val=0;
1053cabdff1aSopenharmony_ci                    fill_rectangle(sl->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 4);
1054cabdff1aSopenharmony_ci                }
1055cabdff1aSopenharmony_ci            }
1056cabdff1aSopenharmony_ci        }
1057cabdff1aSopenharmony_ci    }
1058cabdff1aSopenharmony_ci
1059cabdff1aSopenharmony_ci    if(IS_INTER(mb_type))
1060cabdff1aSopenharmony_ci        write_back_motion(h, sl, mb_type);
1061cabdff1aSopenharmony_ci
1062cabdff1aSopenharmony_ci    if(!IS_INTRA16x16(mb_type)){
1063cabdff1aSopenharmony_ci        cbp= get_ue_golomb(&sl->gb);
1064cabdff1aSopenharmony_ci
1065cabdff1aSopenharmony_ci        if(decode_chroma){
1066cabdff1aSopenharmony_ci            if(cbp > 47){
1067cabdff1aSopenharmony_ci                av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y);
1068cabdff1aSopenharmony_ci                return -1;
1069cabdff1aSopenharmony_ci            }
1070cabdff1aSopenharmony_ci            if (IS_INTRA4x4(mb_type))
1071cabdff1aSopenharmony_ci                cbp = ff_h264_golomb_to_intra4x4_cbp[cbp];
1072cabdff1aSopenharmony_ci            else
1073cabdff1aSopenharmony_ci                cbp = ff_h264_golomb_to_inter_cbp[cbp];
1074cabdff1aSopenharmony_ci        }else{
1075cabdff1aSopenharmony_ci            if(cbp > 15){
1076cabdff1aSopenharmony_ci                av_log(h->avctx, AV_LOG_ERROR, "cbp too large (%u) at %d %d\n", cbp, sl->mb_x, sl->mb_y);
1077cabdff1aSopenharmony_ci                return -1;
1078cabdff1aSopenharmony_ci            }
1079cabdff1aSopenharmony_ci            if(IS_INTRA4x4(mb_type)) cbp= golomb_to_intra4x4_cbp_gray[cbp];
1080cabdff1aSopenharmony_ci            else                     cbp= golomb_to_inter_cbp_gray[cbp];
1081cabdff1aSopenharmony_ci        }
1082cabdff1aSopenharmony_ci    } else {
1083cabdff1aSopenharmony_ci        if (!decode_chroma && cbp>15) {
1084cabdff1aSopenharmony_ci            av_log(h->avctx, AV_LOG_ERROR, "gray chroma\n");
1085cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1086cabdff1aSopenharmony_ci        }
1087cabdff1aSopenharmony_ci    }
1088cabdff1aSopenharmony_ci
1089cabdff1aSopenharmony_ci    if(dct8x8_allowed && (cbp&15) && !IS_INTRA(mb_type)){
1090cabdff1aSopenharmony_ci        mb_type |= MB_TYPE_8x8DCT*get_bits1(&sl->gb);
1091cabdff1aSopenharmony_ci    }
1092cabdff1aSopenharmony_ci    sl->cbp=
1093cabdff1aSopenharmony_ci    h->cbp_table[mb_xy]= cbp;
1094cabdff1aSopenharmony_ci    h->cur_pic.mb_type[mb_xy] = mb_type;
1095cabdff1aSopenharmony_ci
1096cabdff1aSopenharmony_ci    if(cbp || IS_INTRA16x16(mb_type)){
1097cabdff1aSopenharmony_ci        int i4x4, i8x8, chroma_idx;
1098cabdff1aSopenharmony_ci        int dquant;
1099cabdff1aSopenharmony_ci        int ret;
1100cabdff1aSopenharmony_ci        GetBitContext *gb = &sl->gb;
1101cabdff1aSopenharmony_ci        const uint8_t *scan, *scan8x8;
1102cabdff1aSopenharmony_ci        const int max_qp = 51 + 6 * (h->ps.sps->bit_depth_luma - 8);
1103cabdff1aSopenharmony_ci
1104cabdff1aSopenharmony_ci        dquant= get_se_golomb(&sl->gb);
1105cabdff1aSopenharmony_ci
1106cabdff1aSopenharmony_ci        sl->qscale += (unsigned)dquant;
1107cabdff1aSopenharmony_ci
1108cabdff1aSopenharmony_ci        if (((unsigned)sl->qscale) > max_qp){
1109cabdff1aSopenharmony_ci            if (sl->qscale < 0) sl->qscale += max_qp + 1;
1110cabdff1aSopenharmony_ci            else                sl->qscale -= max_qp+1;
1111cabdff1aSopenharmony_ci            if (((unsigned)sl->qscale) > max_qp){
1112cabdff1aSopenharmony_ci                av_log(h->avctx, AV_LOG_ERROR, "dquant out of range (%d) at %d %d\n", dquant, sl->mb_x, sl->mb_y);
1113cabdff1aSopenharmony_ci                sl->qscale = max_qp;
1114cabdff1aSopenharmony_ci                return -1;
1115cabdff1aSopenharmony_ci            }
1116cabdff1aSopenharmony_ci        }
1117cabdff1aSopenharmony_ci
1118cabdff1aSopenharmony_ci        sl->chroma_qp[0] = get_chroma_qp(h->ps.pps, 0, sl->qscale);
1119cabdff1aSopenharmony_ci        sl->chroma_qp[1] = get_chroma_qp(h->ps.pps, 1, sl->qscale);
1120cabdff1aSopenharmony_ci
1121cabdff1aSopenharmony_ci        if(IS_INTERLACED(mb_type)){
1122cabdff1aSopenharmony_ci            scan8x8 = sl->qscale ? h->field_scan8x8_cavlc : h->field_scan8x8_cavlc_q0;
1123cabdff1aSopenharmony_ci            scan    = sl->qscale ? h->field_scan : h->field_scan_q0;
1124cabdff1aSopenharmony_ci        }else{
1125cabdff1aSopenharmony_ci            scan8x8 = sl->qscale ? h->zigzag_scan8x8_cavlc : h->zigzag_scan8x8_cavlc_q0;
1126cabdff1aSopenharmony_ci            scan    = sl->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
1127cabdff1aSopenharmony_ci        }
1128cabdff1aSopenharmony_ci
1129cabdff1aSopenharmony_ci        if ((ret = decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 0)) < 0 ) {
1130cabdff1aSopenharmony_ci            return -1;
1131cabdff1aSopenharmony_ci        }
1132cabdff1aSopenharmony_ci        h->cbp_table[mb_xy] |= ret << 12;
1133cabdff1aSopenharmony_ci        if (CHROMA444(h)) {
1134cabdff1aSopenharmony_ci            if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 1) < 0 ) {
1135cabdff1aSopenharmony_ci                return -1;
1136cabdff1aSopenharmony_ci            }
1137cabdff1aSopenharmony_ci            if (decode_luma_residual(h, sl, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ) {
1138cabdff1aSopenharmony_ci                return -1;
1139cabdff1aSopenharmony_ci            }
1140cabdff1aSopenharmony_ci        } else {
1141cabdff1aSopenharmony_ci            const int num_c8x8 = h->ps.sps->chroma_format_idc;
1142cabdff1aSopenharmony_ci
1143cabdff1aSopenharmony_ci            if(cbp&0x30){
1144cabdff1aSopenharmony_ci                for(chroma_idx=0; chroma_idx<2; chroma_idx++)
1145cabdff1aSopenharmony_ci                    if (decode_residual(h, sl, gb, sl->mb + ((256 + 16*16*chroma_idx) << pixel_shift),
1146cabdff1aSopenharmony_ci                                        CHROMA_DC_BLOCK_INDEX + chroma_idx,
1147cabdff1aSopenharmony_ci                                        CHROMA422(h) ? ff_h264_chroma422_dc_scan : ff_h264_chroma_dc_scan,
1148cabdff1aSopenharmony_ci                                        NULL, 4 * num_c8x8) < 0) {
1149cabdff1aSopenharmony_ci                        return -1;
1150cabdff1aSopenharmony_ci                    }
1151cabdff1aSopenharmony_ci            }
1152cabdff1aSopenharmony_ci
1153cabdff1aSopenharmony_ci            if(cbp&0x20){
1154cabdff1aSopenharmony_ci                for(chroma_idx=0; chroma_idx<2; chroma_idx++){
1155cabdff1aSopenharmony_ci                    const uint32_t *qmul = h->ps.pps->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][sl->chroma_qp[chroma_idx]];
1156cabdff1aSopenharmony_ci                    int16_t *mb = sl->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
1157cabdff1aSopenharmony_ci                    for (i8x8 = 0; i8x8<num_c8x8; i8x8++) {
1158cabdff1aSopenharmony_ci                        for (i4x4 = 0; i4x4 < 4; i4x4++) {
1159cabdff1aSopenharmony_ci                            const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4;
1160cabdff1aSopenharmony_ci                            if (decode_residual(h, sl, gb, mb, index, scan + 1, qmul, 15) < 0)
1161cabdff1aSopenharmony_ci                                return -1;
1162cabdff1aSopenharmony_ci                            mb += 16 << pixel_shift;
1163cabdff1aSopenharmony_ci                        }
1164cabdff1aSopenharmony_ci                    }
1165cabdff1aSopenharmony_ci                }
1166cabdff1aSopenharmony_ci            }else{
1167cabdff1aSopenharmony_ci                fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1168cabdff1aSopenharmony_ci                fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1169cabdff1aSopenharmony_ci            }
1170cabdff1aSopenharmony_ci        }
1171cabdff1aSopenharmony_ci    }else{
1172cabdff1aSopenharmony_ci        fill_rectangle(&sl->non_zero_count_cache[scan8[ 0]], 4, 4, 8, 0, 1);
1173cabdff1aSopenharmony_ci        fill_rectangle(&sl->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
1174cabdff1aSopenharmony_ci        fill_rectangle(&sl->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
1175cabdff1aSopenharmony_ci    }
1176cabdff1aSopenharmony_ci    h->cur_pic.qscale_table[mb_xy] = sl->qscale;
1177cabdff1aSopenharmony_ci    write_back_non_zero_count(h, sl);
1178cabdff1aSopenharmony_ci
1179cabdff1aSopenharmony_ci    return 0;
1180cabdff1aSopenharmony_ci}
1181