1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * VC-1 and WMV3 decoder common code
3cabdff1aSopenharmony_ci * Copyright (c) 2011 Mashiat Sarker Shakkhar
4cabdff1aSopenharmony_ci * Copyright (c) 2006-2007 Konstantin Shishkov
5cabdff1aSopenharmony_ci * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * This file is part of FFmpeg.
8cabdff1aSopenharmony_ci *
9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
13cabdff1aSopenharmony_ci *
14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17cabdff1aSopenharmony_ci * Lesser General Public License for more details.
18cabdff1aSopenharmony_ci *
19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22cabdff1aSopenharmony_ci */
23cabdff1aSopenharmony_ci
24cabdff1aSopenharmony_ci/**
25cabdff1aSopenharmony_ci * @file
26cabdff1aSopenharmony_ci * VC-1 and WMV3 decoder common code
27cabdff1aSopenharmony_ci */
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include "libavutil/attributes.h"
30cabdff1aSopenharmony_ci#include "libavutil/thread.h"
31cabdff1aSopenharmony_ci#include "internal.h"
32cabdff1aSopenharmony_ci#include "avcodec.h"
33cabdff1aSopenharmony_ci#include "mpegvideo.h"
34cabdff1aSopenharmony_ci#include "vc1.h"
35cabdff1aSopenharmony_ci#include "vc1data.h"
36cabdff1aSopenharmony_ci#include "wmv2data.h"
37cabdff1aSopenharmony_ci#include "unary.h"
38cabdff1aSopenharmony_ci#include "simple_idct.h"
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci/***********************************************************************/
41cabdff1aSopenharmony_ci/**
42cabdff1aSopenharmony_ci * @name VC-1 Bitplane decoding
43cabdff1aSopenharmony_ci * @see 8.7, p56
44cabdff1aSopenharmony_ci * @{
45cabdff1aSopenharmony_ci */
46cabdff1aSopenharmony_ci
47cabdff1aSopenharmony_ci/** Decode rows by checking if they are skipped
48cabdff1aSopenharmony_ci * @param plane Buffer to store decoded bits
49cabdff1aSopenharmony_ci * @param[in] width Width of this buffer
50cabdff1aSopenharmony_ci * @param[in] height Height of this buffer
51cabdff1aSopenharmony_ci * @param[in] stride of this buffer
52cabdff1aSopenharmony_ci */
53cabdff1aSopenharmony_cistatic void decode_rowskip(uint8_t* plane, int width, int height, int stride,
54cabdff1aSopenharmony_ci                           GetBitContext *gb)
55cabdff1aSopenharmony_ci{
56cabdff1aSopenharmony_ci    int x, y;
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci    for (y = 0; y < height; y++) {
59cabdff1aSopenharmony_ci        if (!get_bits1(gb)) //rowskip
60cabdff1aSopenharmony_ci            memset(plane, 0, width);
61cabdff1aSopenharmony_ci        else
62cabdff1aSopenharmony_ci            for (x = 0; x < width; x++)
63cabdff1aSopenharmony_ci                plane[x] = get_bits1(gb);
64cabdff1aSopenharmony_ci        plane += stride;
65cabdff1aSopenharmony_ci    }
66cabdff1aSopenharmony_ci}
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_ci/** Decode columns by checking if they are skipped
69cabdff1aSopenharmony_ci * @param plane Buffer to store decoded bits
70cabdff1aSopenharmony_ci * @param[in] width Width of this buffer
71cabdff1aSopenharmony_ci * @param[in] height Height of this buffer
72cabdff1aSopenharmony_ci * @param[in] stride of this buffer
73cabdff1aSopenharmony_ci * @todo FIXME: Optimize
74cabdff1aSopenharmony_ci */
75cabdff1aSopenharmony_cistatic void decode_colskip(uint8_t* plane, int width, int height, int stride,
76cabdff1aSopenharmony_ci                           GetBitContext *gb)
77cabdff1aSopenharmony_ci{
78cabdff1aSopenharmony_ci    int x, y;
79cabdff1aSopenharmony_ci
80cabdff1aSopenharmony_ci    for (x = 0; x < width; x++) {
81cabdff1aSopenharmony_ci        if (!get_bits1(gb)) //colskip
82cabdff1aSopenharmony_ci            for (y = 0; y < height; y++)
83cabdff1aSopenharmony_ci                plane[y*stride] = 0;
84cabdff1aSopenharmony_ci        else
85cabdff1aSopenharmony_ci            for (y = 0; y < height; y++)
86cabdff1aSopenharmony_ci                plane[y*stride] = get_bits1(gb);
87cabdff1aSopenharmony_ci        plane ++;
88cabdff1aSopenharmony_ci    }
89cabdff1aSopenharmony_ci}
90cabdff1aSopenharmony_ci
91cabdff1aSopenharmony_ci/** Decode a bitplane's bits
92cabdff1aSopenharmony_ci * @param data bitplane where to store the decode bits
93cabdff1aSopenharmony_ci * @param[out] raw_flag pointer to the flag indicating that this bitplane is not coded explicitly
94cabdff1aSopenharmony_ci * @param v VC-1 context for bit reading and logging
95cabdff1aSopenharmony_ci * @return Status
96cabdff1aSopenharmony_ci * @todo FIXME: Optimize
97cabdff1aSopenharmony_ci */
98cabdff1aSopenharmony_cistatic int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
99cabdff1aSopenharmony_ci{
100cabdff1aSopenharmony_ci    GetBitContext *gb = &v->s.gb;
101cabdff1aSopenharmony_ci
102cabdff1aSopenharmony_ci    int imode, x, y, code, offset;
103cabdff1aSopenharmony_ci    uint8_t invert, *planep = data;
104cabdff1aSopenharmony_ci    int width, height, stride;
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci    width  = v->s.mb_width;
107cabdff1aSopenharmony_ci    height = v->s.mb_height >> v->field_mode;
108cabdff1aSopenharmony_ci    stride = v->s.mb_stride;
109cabdff1aSopenharmony_ci    invert = get_bits1(gb);
110cabdff1aSopenharmony_ci    imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
111cabdff1aSopenharmony_ci
112cabdff1aSopenharmony_ci    *raw_flag = 0;
113cabdff1aSopenharmony_ci    switch (imode) {
114cabdff1aSopenharmony_ci    case IMODE_RAW:
115cabdff1aSopenharmony_ci        //Data is actually read in the MB layer (same for all tests == "raw")
116cabdff1aSopenharmony_ci        *raw_flag = 1; //invert ignored
117cabdff1aSopenharmony_ci        return invert;
118cabdff1aSopenharmony_ci    case IMODE_DIFF2:
119cabdff1aSopenharmony_ci    case IMODE_NORM2:
120cabdff1aSopenharmony_ci        if ((height * width) & 1) {
121cabdff1aSopenharmony_ci            *planep++ = get_bits1(gb);
122cabdff1aSopenharmony_ci            y = offset = 1;
123cabdff1aSopenharmony_ci            if (offset == width) {
124cabdff1aSopenharmony_ci                offset = 0;
125cabdff1aSopenharmony_ci                planep += stride - width;
126cabdff1aSopenharmony_ci            }
127cabdff1aSopenharmony_ci        }
128cabdff1aSopenharmony_ci        else
129cabdff1aSopenharmony_ci            y = offset = 0;
130cabdff1aSopenharmony_ci        // decode bitplane as one long line
131cabdff1aSopenharmony_ci        for (; y < height * width; y += 2) {
132cabdff1aSopenharmony_ci            code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
133cabdff1aSopenharmony_ci            *planep++ = code & 1;
134cabdff1aSopenharmony_ci            offset++;
135cabdff1aSopenharmony_ci            if (offset == width) {
136cabdff1aSopenharmony_ci                offset  = 0;
137cabdff1aSopenharmony_ci                planep += stride - width;
138cabdff1aSopenharmony_ci            }
139cabdff1aSopenharmony_ci            *planep++ = code >> 1;
140cabdff1aSopenharmony_ci            offset++;
141cabdff1aSopenharmony_ci            if (offset == width) {
142cabdff1aSopenharmony_ci                offset  = 0;
143cabdff1aSopenharmony_ci                planep += stride - width;
144cabdff1aSopenharmony_ci            }
145cabdff1aSopenharmony_ci        }
146cabdff1aSopenharmony_ci        break;
147cabdff1aSopenharmony_ci    case IMODE_DIFF6:
148cabdff1aSopenharmony_ci    case IMODE_NORM6:
149cabdff1aSopenharmony_ci        if (!(height % 3) && (width % 3)) { // use 2x3 decoding
150cabdff1aSopenharmony_ci            for (y = 0; y < height; y += 3) {
151cabdff1aSopenharmony_ci                for (x = width & 1; x < width; x += 2) {
152cabdff1aSopenharmony_ci                    code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
153cabdff1aSopenharmony_ci                    if (code < 0) {
154cabdff1aSopenharmony_ci                        av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
155cabdff1aSopenharmony_ci                        return -1;
156cabdff1aSopenharmony_ci                    }
157cabdff1aSopenharmony_ci                    planep[x + 0]              = (code >> 0) & 1;
158cabdff1aSopenharmony_ci                    planep[x + 1]              = (code >> 1) & 1;
159cabdff1aSopenharmony_ci                    planep[x + 0 + stride]     = (code >> 2) & 1;
160cabdff1aSopenharmony_ci                    planep[x + 1 + stride]     = (code >> 3) & 1;
161cabdff1aSopenharmony_ci                    planep[x + 0 + stride * 2] = (code >> 4) & 1;
162cabdff1aSopenharmony_ci                    planep[x + 1 + stride * 2] = (code >> 5) & 1;
163cabdff1aSopenharmony_ci                }
164cabdff1aSopenharmony_ci                planep += stride * 3;
165cabdff1aSopenharmony_ci            }
166cabdff1aSopenharmony_ci            if (width & 1)
167cabdff1aSopenharmony_ci                decode_colskip(data, 1, height, stride, &v->s.gb);
168cabdff1aSopenharmony_ci        } else { // 3x2
169cabdff1aSopenharmony_ci            planep += (height & 1) * stride;
170cabdff1aSopenharmony_ci            for (y = height & 1; y < height; y += 2) {
171cabdff1aSopenharmony_ci                for (x = width % 3; x < width; x += 3) {
172cabdff1aSopenharmony_ci                    code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
173cabdff1aSopenharmony_ci                    if (code < 0) {
174cabdff1aSopenharmony_ci                        av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
175cabdff1aSopenharmony_ci                        return -1;
176cabdff1aSopenharmony_ci                    }
177cabdff1aSopenharmony_ci                    planep[x + 0]          = (code >> 0) & 1;
178cabdff1aSopenharmony_ci                    planep[x + 1]          = (code >> 1) & 1;
179cabdff1aSopenharmony_ci                    planep[x + 2]          = (code >> 2) & 1;
180cabdff1aSopenharmony_ci                    planep[x + 0 + stride] = (code >> 3) & 1;
181cabdff1aSopenharmony_ci                    planep[x + 1 + stride] = (code >> 4) & 1;
182cabdff1aSopenharmony_ci                    planep[x + 2 + stride] = (code >> 5) & 1;
183cabdff1aSopenharmony_ci                }
184cabdff1aSopenharmony_ci                planep += stride * 2;
185cabdff1aSopenharmony_ci            }
186cabdff1aSopenharmony_ci            x = width % 3;
187cabdff1aSopenharmony_ci            if (x)
188cabdff1aSopenharmony_ci                decode_colskip(data,             x, height, stride, &v->s.gb);
189cabdff1aSopenharmony_ci            if (height & 1)
190cabdff1aSopenharmony_ci                decode_rowskip(data + x, width - x,      1, stride, &v->s.gb);
191cabdff1aSopenharmony_ci        }
192cabdff1aSopenharmony_ci        break;
193cabdff1aSopenharmony_ci    case IMODE_ROWSKIP:
194cabdff1aSopenharmony_ci        decode_rowskip(data, width, height, stride, &v->s.gb);
195cabdff1aSopenharmony_ci        break;
196cabdff1aSopenharmony_ci    case IMODE_COLSKIP:
197cabdff1aSopenharmony_ci        decode_colskip(data, width, height, stride, &v->s.gb);
198cabdff1aSopenharmony_ci        break;
199cabdff1aSopenharmony_ci    default:
200cabdff1aSopenharmony_ci        break;
201cabdff1aSopenharmony_ci    }
202cabdff1aSopenharmony_ci
203cabdff1aSopenharmony_ci    /* Applying diff operator */
204cabdff1aSopenharmony_ci    if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6) {
205cabdff1aSopenharmony_ci        planep = data;
206cabdff1aSopenharmony_ci        planep[0] ^= invert;
207cabdff1aSopenharmony_ci        for (x = 1; x < width; x++)
208cabdff1aSopenharmony_ci            planep[x] ^= planep[x-1];
209cabdff1aSopenharmony_ci        for (y = 1; y < height; y++) {
210cabdff1aSopenharmony_ci            planep += stride;
211cabdff1aSopenharmony_ci            planep[0] ^= planep[-stride];
212cabdff1aSopenharmony_ci            for (x = 1; x < width; x++) {
213cabdff1aSopenharmony_ci                if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
214cabdff1aSopenharmony_ci                else                                 planep[x] ^= planep[x-1];
215cabdff1aSopenharmony_ci            }
216cabdff1aSopenharmony_ci        }
217cabdff1aSopenharmony_ci    } else if (invert) {
218cabdff1aSopenharmony_ci        planep = data;
219cabdff1aSopenharmony_ci        for (x = 0; x < stride * height; x++)
220cabdff1aSopenharmony_ci            planep[x] = !planep[x]; //FIXME stride
221cabdff1aSopenharmony_ci    }
222cabdff1aSopenharmony_ci    return (imode << 1) + invert;
223cabdff1aSopenharmony_ci}
224cabdff1aSopenharmony_ci
225cabdff1aSopenharmony_ci/** @} */ //Bitplane group
226cabdff1aSopenharmony_ci
227cabdff1aSopenharmony_ci/***********************************************************************/
228cabdff1aSopenharmony_ci/** VOP Dquant decoding
229cabdff1aSopenharmony_ci * @param v VC-1 Context
230cabdff1aSopenharmony_ci */
231cabdff1aSopenharmony_cistatic int vop_dquant_decoding(VC1Context *v)
232cabdff1aSopenharmony_ci{
233cabdff1aSopenharmony_ci    GetBitContext *gb = &v->s.gb;
234cabdff1aSopenharmony_ci    int pqdiff;
235cabdff1aSopenharmony_ci
236cabdff1aSopenharmony_ci    //variable size
237cabdff1aSopenharmony_ci    if (v->dquant != 2) {
238cabdff1aSopenharmony_ci        v->dquantfrm = get_bits1(gb);
239cabdff1aSopenharmony_ci        if (!v->dquantfrm)
240cabdff1aSopenharmony_ci            return 0;
241cabdff1aSopenharmony_ci
242cabdff1aSopenharmony_ci        v->dqprofile = get_bits(gb, 2);
243cabdff1aSopenharmony_ci        switch (v->dqprofile) {
244cabdff1aSopenharmony_ci        case DQPROFILE_SINGLE_EDGE:
245cabdff1aSopenharmony_ci        case DQPROFILE_DOUBLE_EDGES:
246cabdff1aSopenharmony_ci            v->dqsbedge = get_bits(gb, 2);
247cabdff1aSopenharmony_ci            break;
248cabdff1aSopenharmony_ci        case DQPROFILE_ALL_MBS:
249cabdff1aSopenharmony_ci            v->dqbilevel = get_bits1(gb);
250cabdff1aSopenharmony_ci            if (!v->dqbilevel) {
251cabdff1aSopenharmony_ci                v->halfpq = 0;
252cabdff1aSopenharmony_ci                return 0;
253cabdff1aSopenharmony_ci            }
254cabdff1aSopenharmony_ci        default:
255cabdff1aSopenharmony_ci            break; //Forbidden ?
256cabdff1aSopenharmony_ci        }
257cabdff1aSopenharmony_ci    }
258cabdff1aSopenharmony_ci
259cabdff1aSopenharmony_ci    pqdiff = get_bits(gb, 3);
260cabdff1aSopenharmony_ci    if (pqdiff == 7)
261cabdff1aSopenharmony_ci        v->altpq = get_bits(gb, 5);
262cabdff1aSopenharmony_ci    else
263cabdff1aSopenharmony_ci        v->altpq = v->pq + pqdiff + 1;
264cabdff1aSopenharmony_ci
265cabdff1aSopenharmony_ci    return 0;
266cabdff1aSopenharmony_ci}
267cabdff1aSopenharmony_ci
268cabdff1aSopenharmony_cistatic int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);
269cabdff1aSopenharmony_ci
270cabdff1aSopenharmony_ci/**
271cabdff1aSopenharmony_ci * Decode Simple/Main Profiles sequence header
272cabdff1aSopenharmony_ci * @see Figure 7-8, p16-17
273cabdff1aSopenharmony_ci * @param avctx Codec context
274cabdff1aSopenharmony_ci * @param gb GetBit context initialized from Codec context extra_data
275cabdff1aSopenharmony_ci * @return Status
276cabdff1aSopenharmony_ci */
277cabdff1aSopenharmony_ciint ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
278cabdff1aSopenharmony_ci{
279cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits_long(gb, 32));
280cabdff1aSopenharmony_ci    v->profile = get_bits(gb, 2);
281cabdff1aSopenharmony_ci    if (v->profile == PROFILE_COMPLEX) {
282cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_WARNING, "WMV3 Complex Profile is not fully supported\n");
283cabdff1aSopenharmony_ci    }
284cabdff1aSopenharmony_ci
285cabdff1aSopenharmony_ci    if (v->profile == PROFILE_ADVANCED) {
286cabdff1aSopenharmony_ci        v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz;
287cabdff1aSopenharmony_ci        v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz;
288cabdff1aSopenharmony_ci        return decode_sequence_header_adv(v, gb);
289cabdff1aSopenharmony_ci    } else {
290cabdff1aSopenharmony_ci        v->chromaformat = 1;
291cabdff1aSopenharmony_ci        v->zz_8x4 = ff_wmv2_scantableA;
292cabdff1aSopenharmony_ci        v->zz_4x8 = ff_wmv2_scantableB;
293cabdff1aSopenharmony_ci        v->res_y411   = get_bits1(gb);
294cabdff1aSopenharmony_ci        v->res_sprite = get_bits1(gb);
295cabdff1aSopenharmony_ci        if (v->res_y411) {
296cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
297cabdff1aSopenharmony_ci                   "Old interlaced mode is not supported\n");
298cabdff1aSopenharmony_ci            return -1;
299cabdff1aSopenharmony_ci        }
300cabdff1aSopenharmony_ci    }
301cabdff1aSopenharmony_ci
302cabdff1aSopenharmony_ci    // (fps-2)/4 (->30)
303cabdff1aSopenharmony_ci    v->frmrtq_postproc = get_bits(gb, 3); //common
304cabdff1aSopenharmony_ci    // (bitrate-32kbps)/64kbps
305cabdff1aSopenharmony_ci    v->bitrtq_postproc = get_bits(gb, 5); //common
306cabdff1aSopenharmony_ci    v->s.loop_filter   = get_bits1(gb); //common
307cabdff1aSopenharmony_ci    if (v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE) {
308cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
309cabdff1aSopenharmony_ci               "LOOPFILTER shall not be enabled in Simple Profile\n");
310cabdff1aSopenharmony_ci    }
311cabdff1aSopenharmony_ci    if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
312cabdff1aSopenharmony_ci        v->s.loop_filter = 0;
313cabdff1aSopenharmony_ci
314cabdff1aSopenharmony_ci    v->res_x8          = get_bits1(gb); //reserved
315cabdff1aSopenharmony_ci    v->multires        = get_bits1(gb);
316cabdff1aSopenharmony_ci    v->res_fasttx      = get_bits1(gb);
317cabdff1aSopenharmony_ci    if (!v->res_fasttx) {
318cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_8x8    = ff_simple_idct_int16_8bit;
319cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_8x4    = ff_simple_idct84_add;
320cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_4x8    = ff_simple_idct48_add;
321cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_4x4    = ff_simple_idct44_add;
322cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add_int16_8bit;
323cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
324cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
325cabdff1aSopenharmony_ci        v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
326cabdff1aSopenharmony_ci    }
327cabdff1aSopenharmony_ci
328cabdff1aSopenharmony_ci    v->fastuvmc        = get_bits1(gb); //common
329cabdff1aSopenharmony_ci    if (!v->profile && !v->fastuvmc) {
330cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
331cabdff1aSopenharmony_ci               "FASTUVMC unavailable in Simple Profile\n");
332cabdff1aSopenharmony_ci        return -1;
333cabdff1aSopenharmony_ci    }
334cabdff1aSopenharmony_ci    v->extended_mv     = get_bits1(gb); //common
335cabdff1aSopenharmony_ci    if (!v->profile && v->extended_mv) {
336cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
337cabdff1aSopenharmony_ci               "Extended MVs unavailable in Simple Profile\n");
338cabdff1aSopenharmony_ci        return -1;
339cabdff1aSopenharmony_ci    }
340cabdff1aSopenharmony_ci    v->dquant          = get_bits(gb, 2); //common
341cabdff1aSopenharmony_ci    v->vstransform     = get_bits1(gb); //common
342cabdff1aSopenharmony_ci
343cabdff1aSopenharmony_ci    v->res_transtab    = get_bits1(gb);
344cabdff1aSopenharmony_ci    if (v->res_transtab) {
345cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR,
346cabdff1aSopenharmony_ci               "1 for reserved RES_TRANSTAB is forbidden\n");
347cabdff1aSopenharmony_ci        return -1;
348cabdff1aSopenharmony_ci    }
349cabdff1aSopenharmony_ci
350cabdff1aSopenharmony_ci    v->overlap         = get_bits1(gb); //common
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_ci    v->resync_marker   = get_bits1(gb);
353cabdff1aSopenharmony_ci    v->rangered        = get_bits1(gb);
354cabdff1aSopenharmony_ci    if (v->rangered && v->profile == PROFILE_SIMPLE) {
355cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_INFO,
356cabdff1aSopenharmony_ci               "RANGERED should be set to 0 in Simple Profile\n");
357cabdff1aSopenharmony_ci    }
358cabdff1aSopenharmony_ci
359cabdff1aSopenharmony_ci    v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
360cabdff1aSopenharmony_ci    v->quantizer_mode = get_bits(gb, 2); //common
361cabdff1aSopenharmony_ci
362cabdff1aSopenharmony_ci    v->finterpflag = get_bits1(gb); //common
363cabdff1aSopenharmony_ci
364cabdff1aSopenharmony_ci    if (v->res_sprite) {
365cabdff1aSopenharmony_ci        int w = get_bits(gb, 11);
366cabdff1aSopenharmony_ci        int h = get_bits(gb, 11);
367cabdff1aSopenharmony_ci        int ret = ff_set_dimensions(v->s.avctx, w, h);
368cabdff1aSopenharmony_ci        if (ret < 0) {
369cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Failed to set dimensions %d %d\n", w, h);
370cabdff1aSopenharmony_ci            return ret;
371cabdff1aSopenharmony_ci        }
372cabdff1aSopenharmony_ci        skip_bits(gb, 5); //frame rate
373cabdff1aSopenharmony_ci        v->res_x8 = get_bits1(gb);
374cabdff1aSopenharmony_ci        if (get_bits1(gb)) { // something to do with DC VLC selection
375cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Unsupported sprite feature\n");
376cabdff1aSopenharmony_ci            return -1;
377cabdff1aSopenharmony_ci        }
378cabdff1aSopenharmony_ci        skip_bits(gb, 3); //slice code
379cabdff1aSopenharmony_ci        v->res_rtm_flag = 0;
380cabdff1aSopenharmony_ci    } else {
381cabdff1aSopenharmony_ci        v->res_rtm_flag = get_bits1(gb); //reserved
382cabdff1aSopenharmony_ci    }
383cabdff1aSopenharmony_ci    //TODO: figure out what they mean (always 0x402F)
384cabdff1aSopenharmony_ci    if (!v->res_fasttx)
385cabdff1aSopenharmony_ci        skip_bits(gb, 16);
386cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_DEBUG,
387cabdff1aSopenharmony_ci           "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
388cabdff1aSopenharmony_ci           "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
389cabdff1aSopenharmony_ci           "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
390cabdff1aSopenharmony_ci           "DQuant=%i, Quantizer mode=%i, Max B-frames=%i\n",
391cabdff1aSopenharmony_ci           v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
392cabdff1aSopenharmony_ci           v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
393cabdff1aSopenharmony_ci           v->rangered, v->vstransform, v->overlap, v->resync_marker,
394cabdff1aSopenharmony_ci           v->dquant, v->quantizer_mode, avctx->max_b_frames);
395cabdff1aSopenharmony_ci    return 0;
396cabdff1aSopenharmony_ci}
397cabdff1aSopenharmony_ci
398cabdff1aSopenharmony_cistatic int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
399cabdff1aSopenharmony_ci{
400cabdff1aSopenharmony_ci    v->res_rtm_flag = 1;
401cabdff1aSopenharmony_ci    v->level = get_bits(gb, 3);
402cabdff1aSopenharmony_ci    if (v->level >= 5) {
403cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
404cabdff1aSopenharmony_ci    }
405cabdff1aSopenharmony_ci    v->chromaformat = get_bits(gb, 2);
406cabdff1aSopenharmony_ci    if (v->chromaformat != 1) {
407cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_ERROR,
408cabdff1aSopenharmony_ci               "Only 4:2:0 chroma format supported\n");
409cabdff1aSopenharmony_ci        return -1;
410cabdff1aSopenharmony_ci    }
411cabdff1aSopenharmony_ci
412cabdff1aSopenharmony_ci    // (fps-2)/4 (->30)
413cabdff1aSopenharmony_ci    v->frmrtq_postproc       = get_bits(gb, 3); //common
414cabdff1aSopenharmony_ci    // (bitrate-32kbps)/64kbps
415cabdff1aSopenharmony_ci    v->bitrtq_postproc       = get_bits(gb, 5); //common
416cabdff1aSopenharmony_ci    v->postprocflag          = get_bits1(gb);   //common
417cabdff1aSopenharmony_ci
418cabdff1aSopenharmony_ci    v->max_coded_width       = (get_bits(gb, 12) + 1) << 1;
419cabdff1aSopenharmony_ci    v->max_coded_height      = (get_bits(gb, 12) + 1) << 1;
420cabdff1aSopenharmony_ci    v->broadcast             = get_bits1(gb);
421cabdff1aSopenharmony_ci    v->interlace             = get_bits1(gb);
422cabdff1aSopenharmony_ci    v->tfcntrflag            = get_bits1(gb);
423cabdff1aSopenharmony_ci    v->finterpflag           = get_bits1(gb);
424cabdff1aSopenharmony_ci    skip_bits1(gb); // reserved
425cabdff1aSopenharmony_ci
426cabdff1aSopenharmony_ci    av_log(v->s.avctx, AV_LOG_DEBUG,
427cabdff1aSopenharmony_ci           "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
428cabdff1aSopenharmony_ci           "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
429cabdff1aSopenharmony_ci           "TFCTRflag=%i, FINTERPflag=%i\n",
430cabdff1aSopenharmony_ci           v->level, v->frmrtq_postproc, v->bitrtq_postproc,
431cabdff1aSopenharmony_ci           v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
432cabdff1aSopenharmony_ci           v->tfcntrflag, v->finterpflag);
433cabdff1aSopenharmony_ci
434cabdff1aSopenharmony_ci    v->psf = get_bits1(gb);
435cabdff1aSopenharmony_ci    if (v->psf) { //PsF, 6.1.13
436cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
437cabdff1aSopenharmony_ci        return -1;
438cabdff1aSopenharmony_ci    }
439cabdff1aSopenharmony_ci    v->s.max_b_frames = v->s.avctx->max_b_frames = 7;
440cabdff1aSopenharmony_ci    if (get_bits1(gb)) { //Display Info - decoding is not affected by it
441cabdff1aSopenharmony_ci        int w, h, ar = 0;
442cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
443cabdff1aSopenharmony_ci        w = get_bits(gb, 14) + 1;
444cabdff1aSopenharmony_ci        h = get_bits(gb, 14) + 1;
445cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h);
446cabdff1aSopenharmony_ci        if (get_bits1(gb))
447cabdff1aSopenharmony_ci            ar = get_bits(gb, 4);
448cabdff1aSopenharmony_ci        if (ar && ar < 14) {
449cabdff1aSopenharmony_ci            v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar];
450cabdff1aSopenharmony_ci        } else if (ar == 15) {
451cabdff1aSopenharmony_ci            w = get_bits(gb, 8) + 1;
452cabdff1aSopenharmony_ci            h = get_bits(gb, 8) + 1;
453cabdff1aSopenharmony_ci            v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
454cabdff1aSopenharmony_ci        } else {
455cabdff1aSopenharmony_ci            if (v->s.avctx->width  > v->max_coded_width ||
456cabdff1aSopenharmony_ci                v->s.avctx->height > v->max_coded_height) {
457cabdff1aSopenharmony_ci                avpriv_request_sample(v->s.avctx, "Huge resolution");
458cabdff1aSopenharmony_ci            } else
459cabdff1aSopenharmony_ci                av_reduce(&v->s.avctx->sample_aspect_ratio.num,
460cabdff1aSopenharmony_ci                      &v->s.avctx->sample_aspect_ratio.den,
461cabdff1aSopenharmony_ci                      v->s.avctx->height * w,
462cabdff1aSopenharmony_ci                      v->s.avctx->width * h,
463cabdff1aSopenharmony_ci                      1 << 30);
464cabdff1aSopenharmony_ci        }
465cabdff1aSopenharmony_ci        ff_set_sar(v->s.avctx, v->s.avctx->sample_aspect_ratio);
466cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n",
467cabdff1aSopenharmony_ci               v->s.avctx->sample_aspect_ratio.num,
468cabdff1aSopenharmony_ci               v->s.avctx->sample_aspect_ratio.den);
469cabdff1aSopenharmony_ci
470cabdff1aSopenharmony_ci        if (get_bits1(gb)) { //framerate stuff
471cabdff1aSopenharmony_ci            if (get_bits1(gb)) {
472cabdff1aSopenharmony_ci                v->s.avctx->framerate.den = 32;
473cabdff1aSopenharmony_ci                v->s.avctx->framerate.num = get_bits(gb, 16) + 1;
474cabdff1aSopenharmony_ci            } else {
475cabdff1aSopenharmony_ci                int nr, dr;
476cabdff1aSopenharmony_ci                nr = get_bits(gb, 8);
477cabdff1aSopenharmony_ci                dr = get_bits(gb, 4);
478cabdff1aSopenharmony_ci                if (nr > 0 && nr < 8 && dr > 0 && dr < 3) {
479cabdff1aSopenharmony_ci                    v->s.avctx->framerate.den = ff_vc1_fps_dr[dr - 1];
480cabdff1aSopenharmony_ci                    v->s.avctx->framerate.num = ff_vc1_fps_nr[nr - 1] * 1000;
481cabdff1aSopenharmony_ci                }
482cabdff1aSopenharmony_ci            }
483cabdff1aSopenharmony_ci            if (v->broadcast) { // Pulldown may be present
484cabdff1aSopenharmony_ci                v->s.avctx->ticks_per_frame = 2;
485cabdff1aSopenharmony_ci            }
486cabdff1aSopenharmony_ci        }
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci        if (get_bits1(gb)) {
489cabdff1aSopenharmony_ci            v->color_prim    = get_bits(gb, 8);
490cabdff1aSopenharmony_ci            v->transfer_char = get_bits(gb, 8);
491cabdff1aSopenharmony_ci            v->matrix_coef   = get_bits(gb, 8);
492cabdff1aSopenharmony_ci        }
493cabdff1aSopenharmony_ci    }
494cabdff1aSopenharmony_ci
495cabdff1aSopenharmony_ci    v->hrd_param_flag = get_bits1(gb);
496cabdff1aSopenharmony_ci    if (v->hrd_param_flag) {
497cabdff1aSopenharmony_ci        int i;
498cabdff1aSopenharmony_ci        v->hrd_num_leaky_buckets = get_bits(gb, 5);
499cabdff1aSopenharmony_ci        skip_bits(gb, 4); //bitrate exponent
500cabdff1aSopenharmony_ci        skip_bits(gb, 4); //buffer size exponent
501cabdff1aSopenharmony_ci        for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
502cabdff1aSopenharmony_ci            skip_bits(gb, 16); //hrd_rate[n]
503cabdff1aSopenharmony_ci            skip_bits(gb, 16); //hrd_buffer[n]
504cabdff1aSopenharmony_ci        }
505cabdff1aSopenharmony_ci    }
506cabdff1aSopenharmony_ci    return 0;
507cabdff1aSopenharmony_ci}
508cabdff1aSopenharmony_ci
509cabdff1aSopenharmony_ciint ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
510cabdff1aSopenharmony_ci{
511cabdff1aSopenharmony_ci    int i;
512cabdff1aSopenharmony_ci    int w,h;
513cabdff1aSopenharmony_ci    int ret;
514cabdff1aSopenharmony_ci
515cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
516cabdff1aSopenharmony_ci    v->broken_link    = get_bits1(gb);
517cabdff1aSopenharmony_ci    v->closed_entry   = get_bits1(gb);
518cabdff1aSopenharmony_ci    v->panscanflag    = get_bits1(gb);
519cabdff1aSopenharmony_ci    v->refdist_flag   = get_bits1(gb);
520cabdff1aSopenharmony_ci    v->s.loop_filter  = get_bits1(gb);
521cabdff1aSopenharmony_ci    if (v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
522cabdff1aSopenharmony_ci        v->s.loop_filter = 0;
523cabdff1aSopenharmony_ci    v->fastuvmc       = get_bits1(gb);
524cabdff1aSopenharmony_ci    v->extended_mv    = get_bits1(gb);
525cabdff1aSopenharmony_ci    v->dquant         = get_bits(gb, 2);
526cabdff1aSopenharmony_ci    v->vstransform    = get_bits1(gb);
527cabdff1aSopenharmony_ci    v->overlap        = get_bits1(gb);
528cabdff1aSopenharmony_ci    v->quantizer_mode = get_bits(gb, 2);
529cabdff1aSopenharmony_ci
530cabdff1aSopenharmony_ci    if (v->hrd_param_flag) {
531cabdff1aSopenharmony_ci        for (i = 0; i < v->hrd_num_leaky_buckets; i++) {
532cabdff1aSopenharmony_ci            skip_bits(gb, 8); //hrd_full[n]
533cabdff1aSopenharmony_ci        }
534cabdff1aSopenharmony_ci    }
535cabdff1aSopenharmony_ci
536cabdff1aSopenharmony_ci    if(get_bits1(gb)){
537cabdff1aSopenharmony_ci        w = (get_bits(gb, 12)+1)<<1;
538cabdff1aSopenharmony_ci        h = (get_bits(gb, 12)+1)<<1;
539cabdff1aSopenharmony_ci    } else {
540cabdff1aSopenharmony_ci        w = v->max_coded_width;
541cabdff1aSopenharmony_ci        h = v->max_coded_height;
542cabdff1aSopenharmony_ci    }
543cabdff1aSopenharmony_ci    if ((ret = ff_set_dimensions(avctx, w, h)) < 0) {
544cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Failed to set dimensions %d %d\n", w, h);
545cabdff1aSopenharmony_ci        return ret;
546cabdff1aSopenharmony_ci    }
547cabdff1aSopenharmony_ci
548cabdff1aSopenharmony_ci    if (v->extended_mv)
549cabdff1aSopenharmony_ci        v->extended_dmv = get_bits1(gb);
550cabdff1aSopenharmony_ci    if ((v->range_mapy_flag = get_bits1(gb))) {
551cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
552cabdff1aSopenharmony_ci        v->range_mapy = get_bits(gb, 3);
553cabdff1aSopenharmony_ci    }
554cabdff1aSopenharmony_ci    if ((v->range_mapuv_flag = get_bits1(gb))) {
555cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
556cabdff1aSopenharmony_ci        v->range_mapuv = get_bits(gb, 3);
557cabdff1aSopenharmony_ci    }
558cabdff1aSopenharmony_ci
559cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
560cabdff1aSopenharmony_ci           "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
561cabdff1aSopenharmony_ci           "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
562cabdff1aSopenharmony_ci           "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
563cabdff1aSopenharmony_ci           v->broken_link, v->closed_entry, v->panscanflag, v->refdist_flag, v->s.loop_filter,
564cabdff1aSopenharmony_ci           v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);
565cabdff1aSopenharmony_ci
566cabdff1aSopenharmony_ci    return 0;
567cabdff1aSopenharmony_ci}
568cabdff1aSopenharmony_ci
569cabdff1aSopenharmony_ci/* fill lookup tables for intensity compensation */
570cabdff1aSopenharmony_ci#define INIT_LUT(lumscale, lumshift, luty, lutuv, chain) do {                 \
571cabdff1aSopenharmony_ci        int scale, shift, i;                                                  \
572cabdff1aSopenharmony_ci        if (!lumscale) {                                                      \
573cabdff1aSopenharmony_ci            scale = -64;                                                      \
574cabdff1aSopenharmony_ci            shift = (255 - lumshift * 2) * 64;                                \
575cabdff1aSopenharmony_ci            if (lumshift > 31)                                                \
576cabdff1aSopenharmony_ci                shift += 128 << 6;                                            \
577cabdff1aSopenharmony_ci        } else {                                                              \
578cabdff1aSopenharmony_ci            scale = lumscale + 32;                                            \
579cabdff1aSopenharmony_ci            if (lumshift > 31)                                                \
580cabdff1aSopenharmony_ci                shift = (lumshift - 64) * 64;                                 \
581cabdff1aSopenharmony_ci            else                                                              \
582cabdff1aSopenharmony_ci                shift = lumshift << 6;                                        \
583cabdff1aSopenharmony_ci        }                                                                     \
584cabdff1aSopenharmony_ci        for (i = 0; i < 256; i++) {                                           \
585cabdff1aSopenharmony_ci            int iy = chain ? luty[i]  : i;                                    \
586cabdff1aSopenharmony_ci            int iu = chain ? lutuv[i] : i;                                    \
587cabdff1aSopenharmony_ci            luty[i]  = av_clip_uint8((scale * iy + shift + 32) >> 6);         \
588cabdff1aSopenharmony_ci            lutuv[i] = av_clip_uint8((scale * (iu - 128) + 128*64 + 32) >> 6);\
589cabdff1aSopenharmony_ci        }                                                                     \
590cabdff1aSopenharmony_ci    } while(0)
591cabdff1aSopenharmony_ci
592cabdff1aSopenharmony_cistatic void rotate_luts(VC1Context *v)
593cabdff1aSopenharmony_ci{
594cabdff1aSopenharmony_ci#define ROTATE(DEF, L, N, C, A) do {                          \
595cabdff1aSopenharmony_ci        if (v->s.pict_type == AV_PICTURE_TYPE_BI || v->s.pict_type == AV_PICTURE_TYPE_B) { \
596cabdff1aSopenharmony_ci            C = A;                                            \
597cabdff1aSopenharmony_ci        } else {                                              \
598cabdff1aSopenharmony_ci            DEF;                                              \
599cabdff1aSopenharmony_ci            memcpy(&tmp, L   , sizeof(tmp));                  \
600cabdff1aSopenharmony_ci            memcpy(L   , N   , sizeof(tmp));                  \
601cabdff1aSopenharmony_ci            memcpy(N   , &tmp, sizeof(tmp));                  \
602cabdff1aSopenharmony_ci            C = N;                                            \
603cabdff1aSopenharmony_ci        }                                                     \
604cabdff1aSopenharmony_ci    } while(0)
605cabdff1aSopenharmony_ci
606cabdff1aSopenharmony_ci    ROTATE(int tmp,             &v->last_use_ic, &v->next_use_ic, v->curr_use_ic, &v->aux_use_ic);
607cabdff1aSopenharmony_ci    ROTATE(uint8_t tmp[2][256], v->last_luty,   v->next_luty,   v->curr_luty,   v->aux_luty);
608cabdff1aSopenharmony_ci    ROTATE(uint8_t tmp[2][256], v->last_lutuv,  v->next_lutuv,  v->curr_lutuv,  v->aux_lutuv);
609cabdff1aSopenharmony_ci
610cabdff1aSopenharmony_ci    INIT_LUT(32, 0, v->curr_luty[0], v->curr_lutuv[0], 0);
611cabdff1aSopenharmony_ci    INIT_LUT(32, 0, v->curr_luty[1], v->curr_lutuv[1], 0);
612cabdff1aSopenharmony_ci    *v->curr_use_ic = 0;
613cabdff1aSopenharmony_ci}
614cabdff1aSopenharmony_ci
615cabdff1aSopenharmony_cistatic int read_bfraction(VC1Context *v, GetBitContext* gb) {
616cabdff1aSopenharmony_ci    int bfraction_lut_index = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
617cabdff1aSopenharmony_ci
618cabdff1aSopenharmony_ci    if (bfraction_lut_index == 21 || bfraction_lut_index < 0) {
619cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_ERROR, "bfraction invalid\n");
620cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
621cabdff1aSopenharmony_ci    }
622cabdff1aSopenharmony_ci    v->bfraction_lut_index = bfraction_lut_index;
623cabdff1aSopenharmony_ci    v->bfraction           = ff_vc1_bfraction_lut[v->bfraction_lut_index];
624cabdff1aSopenharmony_ci    return 0;
625cabdff1aSopenharmony_ci}
626cabdff1aSopenharmony_ci
627cabdff1aSopenharmony_ciint ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
628cabdff1aSopenharmony_ci{
629cabdff1aSopenharmony_ci    int pqindex, lowquant, status;
630cabdff1aSopenharmony_ci
631cabdff1aSopenharmony_ci    v->field_mode = 0;
632cabdff1aSopenharmony_ci    v->fcm = PROGRESSIVE;
633cabdff1aSopenharmony_ci    if (v->finterpflag)
634cabdff1aSopenharmony_ci        v->interpfrm = get_bits1(gb);
635cabdff1aSopenharmony_ci    if (!v->s.avctx->codec)
636cabdff1aSopenharmony_ci        return -1;
637cabdff1aSopenharmony_ci    if (v->s.avctx->codec_id == AV_CODEC_ID_MSS2)
638cabdff1aSopenharmony_ci        v->respic   =
639cabdff1aSopenharmony_ci        v->rangered =
640cabdff1aSopenharmony_ci        v->multires = get_bits(gb, 2) == 1;
641cabdff1aSopenharmony_ci    else
642cabdff1aSopenharmony_ci        skip_bits(gb, 2); //framecnt unused
643cabdff1aSopenharmony_ci    v->rangeredfrm = 0;
644cabdff1aSopenharmony_ci    if (v->rangered)
645cabdff1aSopenharmony_ci        v->rangeredfrm = get_bits1(gb);
646cabdff1aSopenharmony_ci    if (get_bits1(gb)) {
647cabdff1aSopenharmony_ci        v->s.pict_type = AV_PICTURE_TYPE_P;
648cabdff1aSopenharmony_ci    } else {
649cabdff1aSopenharmony_ci        if (v->s.avctx->max_b_frames && !get_bits1(gb)) {
650cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_B;
651cabdff1aSopenharmony_ci        } else
652cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_I;
653cabdff1aSopenharmony_ci    }
654cabdff1aSopenharmony_ci
655cabdff1aSopenharmony_ci    v->bi_type = 0;
656cabdff1aSopenharmony_ci    if (v->s.pict_type == AV_PICTURE_TYPE_B) {
657cabdff1aSopenharmony_ci        if (read_bfraction(v, gb) < 0)
658cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
659cabdff1aSopenharmony_ci        if (v->bfraction == 0) {
660cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_BI;
661cabdff1aSopenharmony_ci        }
662cabdff1aSopenharmony_ci    }
663cabdff1aSopenharmony_ci    if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
664cabdff1aSopenharmony_ci        skip_bits(gb, 7); // skip buffer fullness
665cabdff1aSopenharmony_ci
666cabdff1aSopenharmony_ci    if (v->parse_only)
667cabdff1aSopenharmony_ci        return 0;
668cabdff1aSopenharmony_ci
669cabdff1aSopenharmony_ci    /* calculate RND */
670cabdff1aSopenharmony_ci    if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
671cabdff1aSopenharmony_ci        v->rnd = 1;
672cabdff1aSopenharmony_ci    if (v->s.pict_type == AV_PICTURE_TYPE_P)
673cabdff1aSopenharmony_ci        v->rnd ^= 1;
674cabdff1aSopenharmony_ci
675cabdff1aSopenharmony_ci    if (get_bits_left(gb) < 5)
676cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
677cabdff1aSopenharmony_ci    /* Quantizer stuff */
678cabdff1aSopenharmony_ci    pqindex = get_bits(gb, 5);
679cabdff1aSopenharmony_ci    if (!pqindex)
680cabdff1aSopenharmony_ci        return -1;
681cabdff1aSopenharmony_ci    if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
682cabdff1aSopenharmony_ci        v->pq = ff_vc1_pquant_table[0][pqindex];
683cabdff1aSopenharmony_ci    else
684cabdff1aSopenharmony_ci        v->pq = ff_vc1_pquant_table[1][pqindex];
685cabdff1aSopenharmony_ci    v->pqindex = pqindex;
686cabdff1aSopenharmony_ci    if (pqindex < 9)
687cabdff1aSopenharmony_ci        v->halfpq = get_bits1(gb);
688cabdff1aSopenharmony_ci    else
689cabdff1aSopenharmony_ci        v->halfpq = 0;
690cabdff1aSopenharmony_ci    switch (v->quantizer_mode) {
691cabdff1aSopenharmony_ci    case QUANT_FRAME_IMPLICIT:
692cabdff1aSopenharmony_ci        v->pquantizer = pqindex < 9;
693cabdff1aSopenharmony_ci        break;
694cabdff1aSopenharmony_ci    case QUANT_NON_UNIFORM:
695cabdff1aSopenharmony_ci        v->pquantizer = 0;
696cabdff1aSopenharmony_ci        break;
697cabdff1aSopenharmony_ci    case QUANT_FRAME_EXPLICIT:
698cabdff1aSopenharmony_ci        v->pquantizer = get_bits1(gb);
699cabdff1aSopenharmony_ci        break;
700cabdff1aSopenharmony_ci    default:
701cabdff1aSopenharmony_ci        v->pquantizer = 1;
702cabdff1aSopenharmony_ci        break;
703cabdff1aSopenharmony_ci    }
704cabdff1aSopenharmony_ci    v->dquantfrm = 0;
705cabdff1aSopenharmony_ci    if (v->extended_mv == 1)
706cabdff1aSopenharmony_ci        v->mvrange = get_unary(gb, 0, 3);
707cabdff1aSopenharmony_ci    v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
708cabdff1aSopenharmony_ci    v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
709cabdff1aSopenharmony_ci    v->range_x = 1 << (v->k_x - 1);
710cabdff1aSopenharmony_ci    v->range_y = 1 << (v->k_y - 1);
711cabdff1aSopenharmony_ci    if (v->multires && v->s.pict_type != AV_PICTURE_TYPE_B)
712cabdff1aSopenharmony_ci        v->respic = get_bits(gb, 2);
713cabdff1aSopenharmony_ci
714cabdff1aSopenharmony_ci    if (v->res_x8 && (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)) {
715cabdff1aSopenharmony_ci        v->x8_type = get_bits1(gb);
716cabdff1aSopenharmony_ci    } else
717cabdff1aSopenharmony_ci        v->x8_type = 0;
718cabdff1aSopenharmony_ci    ff_dlog(v->s.avctx, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
719cabdff1aSopenharmony_ci            (v->s.pict_type == AV_PICTURE_TYPE_P) ? 'P' : ((v->s.pict_type == AV_PICTURE_TYPE_I) ? 'I' : 'B'),
720cabdff1aSopenharmony_ci            pqindex, v->pq, v->halfpq, v->rangeredfrm);
721cabdff1aSopenharmony_ci
722cabdff1aSopenharmony_ci    if (v->first_pic_header_flag)
723cabdff1aSopenharmony_ci        rotate_luts(v);
724cabdff1aSopenharmony_ci
725cabdff1aSopenharmony_ci    switch (v->s.pict_type) {
726cabdff1aSopenharmony_ci    case AV_PICTURE_TYPE_P:
727cabdff1aSopenharmony_ci        v->tt_index = (v->pq > 4) + (v->pq > 12);
728cabdff1aSopenharmony_ci
729cabdff1aSopenharmony_ci        lowquant = (v->pq > 12) ? 0 : 1;
730cabdff1aSopenharmony_ci        v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
731cabdff1aSopenharmony_ci        if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
732cabdff1aSopenharmony_ci            v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
733cabdff1aSopenharmony_ci            v->lumscale = get_bits(gb, 6);
734cabdff1aSopenharmony_ci            v->lumshift = get_bits(gb, 6);
735cabdff1aSopenharmony_ci            v->last_use_ic = 1;
736cabdff1aSopenharmony_ci            /* fill lookup tables for intensity compensation */
737cabdff1aSopenharmony_ci            INIT_LUT(v->lumscale, v->lumshift, v->last_luty[0], v->last_lutuv[0], 1);
738cabdff1aSopenharmony_ci            INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], v->last_lutuv[1], 1);
739cabdff1aSopenharmony_ci        }
740cabdff1aSopenharmony_ci        v->qs_last = v->s.quarter_sample;
741cabdff1aSopenharmony_ci        if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
742cabdff1aSopenharmony_ci            v->s.quarter_sample = (v->mv_mode2 != MV_PMODE_1MV_HPEL &&
743cabdff1aSopenharmony_ci                                   v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
744cabdff1aSopenharmony_ci            v->s.mspel          = (v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
745cabdff1aSopenharmony_ci        } else {
746cabdff1aSopenharmony_ci            v->s.quarter_sample = (v->mv_mode != MV_PMODE_1MV_HPEL &&
747cabdff1aSopenharmony_ci                                   v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
748cabdff1aSopenharmony_ci            v->s.mspel          = (v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
749cabdff1aSopenharmony_ci        }
750cabdff1aSopenharmony_ci
751cabdff1aSopenharmony_ci        if ((v->mv_mode  == MV_PMODE_INTENSITY_COMP &&
752cabdff1aSopenharmony_ci             v->mv_mode2 == MV_PMODE_MIXED_MV)      ||
753cabdff1aSopenharmony_ci            v->mv_mode   == MV_PMODE_MIXED_MV) {
754cabdff1aSopenharmony_ci            status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
755cabdff1aSopenharmony_ci            if (status < 0)
756cabdff1aSopenharmony_ci                return -1;
757cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
758cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
759cabdff1aSopenharmony_ci        } else {
760cabdff1aSopenharmony_ci            v->mv_type_is_raw = 0;
761cabdff1aSopenharmony_ci            memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
762cabdff1aSopenharmony_ci        }
763cabdff1aSopenharmony_ci        status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
764cabdff1aSopenharmony_ci        if (status < 0)
765cabdff1aSopenharmony_ci            return -1;
766cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
767cabdff1aSopenharmony_ci               "Imode: %i, Invert: %i\n", status>>1, status&1);
768cabdff1aSopenharmony_ci
769cabdff1aSopenharmony_ci        if (get_bits_left(gb) < 4)
770cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
771cabdff1aSopenharmony_ci
772cabdff1aSopenharmony_ci        /* Hopefully this is correct for P-frames */
773cabdff1aSopenharmony_ci        v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
774cabdff1aSopenharmony_ci        v->cbptab = get_bits(gb, 2);
775cabdff1aSopenharmony_ci        v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[v->cbptab];
776cabdff1aSopenharmony_ci
777cabdff1aSopenharmony_ci        if (v->dquant) {
778cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
779cabdff1aSopenharmony_ci            vop_dquant_decoding(v);
780cabdff1aSopenharmony_ci        }
781cabdff1aSopenharmony_ci
782cabdff1aSopenharmony_ci        if (v->vstransform) {
783cabdff1aSopenharmony_ci            v->ttmbf = get_bits1(gb);
784cabdff1aSopenharmony_ci            if (v->ttmbf) {
785cabdff1aSopenharmony_ci                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
786cabdff1aSopenharmony_ci            } else
787cabdff1aSopenharmony_ci                v->ttfrm = 0; //FIXME Is that so ?
788cabdff1aSopenharmony_ci        } else {
789cabdff1aSopenharmony_ci            v->ttmbf = 1;
790cabdff1aSopenharmony_ci            v->ttfrm = TT_8X8;
791cabdff1aSopenharmony_ci        }
792cabdff1aSopenharmony_ci        break;
793cabdff1aSopenharmony_ci    case AV_PICTURE_TYPE_B:
794cabdff1aSopenharmony_ci        v->tt_index = (v->pq > 4) + (v->pq > 12);
795cabdff1aSopenharmony_ci
796cabdff1aSopenharmony_ci        v->mv_mode          = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
797cabdff1aSopenharmony_ci        v->qs_last          = v->s.quarter_sample;
798cabdff1aSopenharmony_ci        v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
799cabdff1aSopenharmony_ci        v->s.mspel          = v->s.quarter_sample;
800cabdff1aSopenharmony_ci
801cabdff1aSopenharmony_ci        status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
802cabdff1aSopenharmony_ci        if (status < 0)
803cabdff1aSopenharmony_ci            return -1;
804cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
805cabdff1aSopenharmony_ci               "Imode: %i, Invert: %i\n", status>>1, status&1);
806cabdff1aSopenharmony_ci        status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
807cabdff1aSopenharmony_ci        if (status < 0)
808cabdff1aSopenharmony_ci            return -1;
809cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
810cabdff1aSopenharmony_ci               "Imode: %i, Invert: %i\n", status>>1, status&1);
811cabdff1aSopenharmony_ci
812cabdff1aSopenharmony_ci        v->s.mv_table_index = get_bits(gb, 2);
813cabdff1aSopenharmony_ci        v->cbptab           = get_bits(gb, 2);
814cabdff1aSopenharmony_ci        v->cbpcy_vlc        = &ff_vc1_cbpcy_p_vlc[v->cbptab];
815cabdff1aSopenharmony_ci
816cabdff1aSopenharmony_ci        if (v->dquant) {
817cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
818cabdff1aSopenharmony_ci            vop_dquant_decoding(v);
819cabdff1aSopenharmony_ci        }
820cabdff1aSopenharmony_ci
821cabdff1aSopenharmony_ci        if (v->vstransform) {
822cabdff1aSopenharmony_ci            v->ttmbf = get_bits1(gb);
823cabdff1aSopenharmony_ci            if (v->ttmbf) {
824cabdff1aSopenharmony_ci                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
825cabdff1aSopenharmony_ci            } else
826cabdff1aSopenharmony_ci                v->ttfrm = 0;
827cabdff1aSopenharmony_ci        } else {
828cabdff1aSopenharmony_ci            v->ttmbf = 1;
829cabdff1aSopenharmony_ci            v->ttfrm = TT_8X8;
830cabdff1aSopenharmony_ci        }
831cabdff1aSopenharmony_ci        break;
832cabdff1aSopenharmony_ci    }
833cabdff1aSopenharmony_ci
834cabdff1aSopenharmony_ci    if (!v->x8_type) {
835cabdff1aSopenharmony_ci        /* AC Syntax */
836cabdff1aSopenharmony_ci        v->c_ac_table_index = decode012(gb);
837cabdff1aSopenharmony_ci        if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
838cabdff1aSopenharmony_ci            v->y_ac_table_index = decode012(gb);
839cabdff1aSopenharmony_ci        }
840cabdff1aSopenharmony_ci        /* DC Syntax */
841cabdff1aSopenharmony_ci        v->s.dc_table_index = get_bits1(gb);
842cabdff1aSopenharmony_ci    }
843cabdff1aSopenharmony_ci
844cabdff1aSopenharmony_ci    if (v->s.pict_type == AV_PICTURE_TYPE_BI) {
845cabdff1aSopenharmony_ci        v->s.pict_type = AV_PICTURE_TYPE_B;
846cabdff1aSopenharmony_ci        v->bi_type     = 1;
847cabdff1aSopenharmony_ci    }
848cabdff1aSopenharmony_ci    return 0;
849cabdff1aSopenharmony_ci}
850cabdff1aSopenharmony_ci
851cabdff1aSopenharmony_ciint ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
852cabdff1aSopenharmony_ci{
853cabdff1aSopenharmony_ci    int pqindex, lowquant;
854cabdff1aSopenharmony_ci    int status;
855cabdff1aSopenharmony_ci    int field_mode, fcm;
856cabdff1aSopenharmony_ci
857cabdff1aSopenharmony_ci    v->numref          = 0;
858cabdff1aSopenharmony_ci    v->p_frame_skipped = 0;
859cabdff1aSopenharmony_ci    if (v->second_field) {
860cabdff1aSopenharmony_ci        if (v->fcm != ILACE_FIELD || v->field_mode!=1)
861cabdff1aSopenharmony_ci            return -1;
862cabdff1aSopenharmony_ci        if (v->fptype & 4)
863cabdff1aSopenharmony_ci            v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
864cabdff1aSopenharmony_ci        else
865cabdff1aSopenharmony_ci            v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
866cabdff1aSopenharmony_ci        v->s.current_picture_ptr->f->pict_type = v->s.pict_type;
867cabdff1aSopenharmony_ci        if (!v->pic_header_flag)
868cabdff1aSopenharmony_ci            goto parse_common_info;
869cabdff1aSopenharmony_ci    }
870cabdff1aSopenharmony_ci
871cabdff1aSopenharmony_ci    field_mode = 0;
872cabdff1aSopenharmony_ci    if (v->interlace) {
873cabdff1aSopenharmony_ci        fcm = decode012(gb);
874cabdff1aSopenharmony_ci        if (fcm) {
875cabdff1aSopenharmony_ci            if (fcm == ILACE_FIELD)
876cabdff1aSopenharmony_ci                field_mode = 1;
877cabdff1aSopenharmony_ci        }
878cabdff1aSopenharmony_ci    } else {
879cabdff1aSopenharmony_ci        fcm = PROGRESSIVE;
880cabdff1aSopenharmony_ci    }
881cabdff1aSopenharmony_ci    if (!v->first_pic_header_flag && v->field_mode != field_mode)
882cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
883cabdff1aSopenharmony_ci    v->field_mode = field_mode;
884cabdff1aSopenharmony_ci    v->fcm = fcm;
885cabdff1aSopenharmony_ci
886cabdff1aSopenharmony_ci    av_assert0(    v->s.mb_height == v->s.height + 15 >> 4
887cabdff1aSopenharmony_ci                || v->s.mb_height == FFALIGN(v->s.height + 15 >> 4, 2));
888cabdff1aSopenharmony_ci    if (v->field_mode) {
889cabdff1aSopenharmony_ci        v->s.mb_height = FFALIGN(v->s.height + 15 >> 4, 2);
890cabdff1aSopenharmony_ci        v->fptype = get_bits(gb, 3);
891cabdff1aSopenharmony_ci        if (v->fptype & 4) // B-picture
892cabdff1aSopenharmony_ci            v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
893cabdff1aSopenharmony_ci        else
894cabdff1aSopenharmony_ci            v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
895cabdff1aSopenharmony_ci    } else {
896cabdff1aSopenharmony_ci        v->s.mb_height = v->s.height + 15 >> 4;
897cabdff1aSopenharmony_ci        switch (get_unary(gb, 0, 4)) {
898cabdff1aSopenharmony_ci        case 0:
899cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_P;
900cabdff1aSopenharmony_ci            break;
901cabdff1aSopenharmony_ci        case 1:
902cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_B;
903cabdff1aSopenharmony_ci            break;
904cabdff1aSopenharmony_ci        case 2:
905cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_I;
906cabdff1aSopenharmony_ci            break;
907cabdff1aSopenharmony_ci        case 3:
908cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_BI;
909cabdff1aSopenharmony_ci            break;
910cabdff1aSopenharmony_ci        case 4:
911cabdff1aSopenharmony_ci            v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
912cabdff1aSopenharmony_ci            v->p_frame_skipped = 1;
913cabdff1aSopenharmony_ci            break;
914cabdff1aSopenharmony_ci        }
915cabdff1aSopenharmony_ci    }
916cabdff1aSopenharmony_ci    if (v->tfcntrflag)
917cabdff1aSopenharmony_ci        skip_bits(gb, 8);
918cabdff1aSopenharmony_ci    if (v->broadcast) {
919cabdff1aSopenharmony_ci        if (!v->interlace || v->psf) {
920cabdff1aSopenharmony_ci            v->rptfrm = get_bits(gb, 2);
921cabdff1aSopenharmony_ci        } else {
922cabdff1aSopenharmony_ci            v->tff = get_bits1(gb);
923cabdff1aSopenharmony_ci            v->rff = get_bits1(gb);
924cabdff1aSopenharmony_ci        }
925cabdff1aSopenharmony_ci    } else {
926cabdff1aSopenharmony_ci        v->tff = 1;
927cabdff1aSopenharmony_ci    }
928cabdff1aSopenharmony_ci    if (v->panscanflag) {
929cabdff1aSopenharmony_ci        avpriv_report_missing_feature(v->s.avctx, "Pan-scan");
930cabdff1aSopenharmony_ci        //...
931cabdff1aSopenharmony_ci    }
932cabdff1aSopenharmony_ci    if (v->p_frame_skipped) {
933cabdff1aSopenharmony_ci        return 0;
934cabdff1aSopenharmony_ci    }
935cabdff1aSopenharmony_ci    v->rnd = get_bits1(gb);
936cabdff1aSopenharmony_ci    if (v->interlace)
937cabdff1aSopenharmony_ci        v->uvsamp = get_bits1(gb);
938cabdff1aSopenharmony_ci    if(!ff_vc1_bfraction_vlc.table)
939cabdff1aSopenharmony_ci        return 0; //parsing only, vlc tables havnt been allocated
940cabdff1aSopenharmony_ci    if (v->field_mode) {
941cabdff1aSopenharmony_ci        if (!v->refdist_flag)
942cabdff1aSopenharmony_ci            v->refdist = 0;
943cabdff1aSopenharmony_ci        else if ((v->s.pict_type != AV_PICTURE_TYPE_B) && (v->s.pict_type != AV_PICTURE_TYPE_BI)) {
944cabdff1aSopenharmony_ci            v->refdist = get_bits(gb, 2);
945cabdff1aSopenharmony_ci            if (v->refdist == 3)
946cabdff1aSopenharmony_ci                v->refdist += get_unary(gb, 0, 14);
947cabdff1aSopenharmony_ci            if (v->refdist > 16)
948cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
949cabdff1aSopenharmony_ci        }
950cabdff1aSopenharmony_ci        if ((v->s.pict_type == AV_PICTURE_TYPE_B) || (v->s.pict_type == AV_PICTURE_TYPE_BI)) {
951cabdff1aSopenharmony_ci            if (read_bfraction(v, gb) < 0)
952cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
953cabdff1aSopenharmony_ci            v->frfd = (v->bfraction * v->refdist) >> 8;
954cabdff1aSopenharmony_ci            v->brfd = v->refdist - v->frfd - 1;
955cabdff1aSopenharmony_ci            if (v->brfd < 0)
956cabdff1aSopenharmony_ci                v->brfd = 0;
957cabdff1aSopenharmony_ci        }
958cabdff1aSopenharmony_ci        goto parse_common_info;
959cabdff1aSopenharmony_ci    }
960cabdff1aSopenharmony_ci    if (v->fcm == PROGRESSIVE) {
961cabdff1aSopenharmony_ci        if (v->finterpflag)
962cabdff1aSopenharmony_ci            v->interpfrm = get_bits1(gb);
963cabdff1aSopenharmony_ci        if (v->s.pict_type == AV_PICTURE_TYPE_B) {
964cabdff1aSopenharmony_ci            if (read_bfraction(v, gb) < 0)
965cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
966cabdff1aSopenharmony_ci            if (v->bfraction == 0) {
967cabdff1aSopenharmony_ci                v->s.pict_type = AV_PICTURE_TYPE_BI; /* XXX: should not happen here */
968cabdff1aSopenharmony_ci            }
969cabdff1aSopenharmony_ci        }
970cabdff1aSopenharmony_ci    }
971cabdff1aSopenharmony_ci
972cabdff1aSopenharmony_ci    parse_common_info:
973cabdff1aSopenharmony_ci    if (v->field_mode)
974cabdff1aSopenharmony_ci        v->cur_field_type = !(v->tff ^ v->second_field);
975cabdff1aSopenharmony_ci    pqindex = get_bits(gb, 5);
976cabdff1aSopenharmony_ci    if (!pqindex)
977cabdff1aSopenharmony_ci        return -1;
978cabdff1aSopenharmony_ci    if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
979cabdff1aSopenharmony_ci        v->pq = ff_vc1_pquant_table[0][pqindex];
980cabdff1aSopenharmony_ci    else
981cabdff1aSopenharmony_ci        v->pq = ff_vc1_pquant_table[1][pqindex];
982cabdff1aSopenharmony_ci    v->pqindex = pqindex;
983cabdff1aSopenharmony_ci    if (pqindex < 9)
984cabdff1aSopenharmony_ci        v->halfpq = get_bits1(gb);
985cabdff1aSopenharmony_ci    else
986cabdff1aSopenharmony_ci        v->halfpq = 0;
987cabdff1aSopenharmony_ci    switch (v->quantizer_mode) {
988cabdff1aSopenharmony_ci    case QUANT_FRAME_IMPLICIT:
989cabdff1aSopenharmony_ci        v->pquantizer = pqindex < 9;
990cabdff1aSopenharmony_ci        break;
991cabdff1aSopenharmony_ci    case QUANT_NON_UNIFORM:
992cabdff1aSopenharmony_ci        v->pquantizer = 0;
993cabdff1aSopenharmony_ci        break;
994cabdff1aSopenharmony_ci    case QUANT_FRAME_EXPLICIT:
995cabdff1aSopenharmony_ci        v->pquantizer = get_bits1(gb);
996cabdff1aSopenharmony_ci        break;
997cabdff1aSopenharmony_ci    default:
998cabdff1aSopenharmony_ci        v->pquantizer = 1;
999cabdff1aSopenharmony_ci        break;
1000cabdff1aSopenharmony_ci    }
1001cabdff1aSopenharmony_ci    v->dquantfrm = 0;
1002cabdff1aSopenharmony_ci    if (v->postprocflag)
1003cabdff1aSopenharmony_ci        v->postproc = get_bits(gb, 2);
1004cabdff1aSopenharmony_ci
1005cabdff1aSopenharmony_ci    if (v->parse_only)
1006cabdff1aSopenharmony_ci        return 0;
1007cabdff1aSopenharmony_ci
1008cabdff1aSopenharmony_ci    if (v->first_pic_header_flag)
1009cabdff1aSopenharmony_ci        rotate_luts(v);
1010cabdff1aSopenharmony_ci
1011cabdff1aSopenharmony_ci    switch (v->s.pict_type) {
1012cabdff1aSopenharmony_ci    case AV_PICTURE_TYPE_I:
1013cabdff1aSopenharmony_ci    case AV_PICTURE_TYPE_BI:
1014cabdff1aSopenharmony_ci        if (v->fcm == ILACE_FRAME) { //interlace frame picture
1015cabdff1aSopenharmony_ci            status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
1016cabdff1aSopenharmony_ci            if (status < 0)
1017cabdff1aSopenharmony_ci                return -1;
1018cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "FIELDTX plane encoding: "
1019cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1020cabdff1aSopenharmony_ci        } else
1021cabdff1aSopenharmony_ci            v->fieldtx_is_raw = 0;
1022cabdff1aSopenharmony_ci        status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
1023cabdff1aSopenharmony_ci        if (status < 0)
1024cabdff1aSopenharmony_ci            return -1;
1025cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
1026cabdff1aSopenharmony_ci               "Imode: %i, Invert: %i\n", status>>1, status&1);
1027cabdff1aSopenharmony_ci        v->condover = CONDOVER_NONE;
1028cabdff1aSopenharmony_ci        if (v->overlap && v->pq <= 8) {
1029cabdff1aSopenharmony_ci            v->condover = decode012(gb);
1030cabdff1aSopenharmony_ci            if (v->condover == CONDOVER_SELECT) {
1031cabdff1aSopenharmony_ci                status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
1032cabdff1aSopenharmony_ci                if (status < 0)
1033cabdff1aSopenharmony_ci                    return -1;
1034cabdff1aSopenharmony_ci                av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
1035cabdff1aSopenharmony_ci                       "Imode: %i, Invert: %i\n", status>>1, status&1);
1036cabdff1aSopenharmony_ci            }
1037cabdff1aSopenharmony_ci        }
1038cabdff1aSopenharmony_ci        break;
1039cabdff1aSopenharmony_ci    case AV_PICTURE_TYPE_P:
1040cabdff1aSopenharmony_ci        if (v->field_mode) {
1041cabdff1aSopenharmony_ci            v->numref = get_bits1(gb);
1042cabdff1aSopenharmony_ci            if (!v->numref) {
1043cabdff1aSopenharmony_ci                v->reffield          = get_bits1(gb);
1044cabdff1aSopenharmony_ci                v->ref_field_type[0] = v->reffield ^ !v->cur_field_type;
1045cabdff1aSopenharmony_ci            }
1046cabdff1aSopenharmony_ci        }
1047cabdff1aSopenharmony_ci        if (v->extended_mv)
1048cabdff1aSopenharmony_ci            v->mvrange = get_unary(gb, 0, 3);
1049cabdff1aSopenharmony_ci        else
1050cabdff1aSopenharmony_ci            v->mvrange = 0;
1051cabdff1aSopenharmony_ci        if (v->interlace) {
1052cabdff1aSopenharmony_ci            if (v->extended_dmv)
1053cabdff1aSopenharmony_ci                v->dmvrange = get_unary(gb, 0, 3);
1054cabdff1aSopenharmony_ci            else
1055cabdff1aSopenharmony_ci                v->dmvrange = 0;
1056cabdff1aSopenharmony_ci            if (v->fcm == ILACE_FRAME) { // interlaced frame picture
1057cabdff1aSopenharmony_ci                v->fourmvswitch = get_bits1(gb);
1058cabdff1aSopenharmony_ci                v->intcomp      = get_bits1(gb);
1059cabdff1aSopenharmony_ci                if (v->intcomp) {
1060cabdff1aSopenharmony_ci                    v->lumscale = get_bits(gb, 6);
1061cabdff1aSopenharmony_ci                    v->lumshift = get_bits(gb, 6);
1062cabdff1aSopenharmony_ci                    INIT_LUT(v->lumscale, v->lumshift, v->last_luty[0], v->last_lutuv[0], 1);
1063cabdff1aSopenharmony_ci                    INIT_LUT(v->lumscale, v->lumshift, v->last_luty[1], v->last_lutuv[1], 1);
1064cabdff1aSopenharmony_ci                    v->last_use_ic = 1;
1065cabdff1aSopenharmony_ci                }
1066cabdff1aSopenharmony_ci                status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1067cabdff1aSopenharmony_ci                if (status < 0)
1068cabdff1aSopenharmony_ci                    return -1;
1069cabdff1aSopenharmony_ci                av_log(v->s.avctx, AV_LOG_DEBUG, "SKIPMB plane encoding: "
1070cabdff1aSopenharmony_ci                       "Imode: %i, Invert: %i\n", status>>1, status&1);
1071cabdff1aSopenharmony_ci                v->mbmodetab = get_bits(gb, 2);
1072cabdff1aSopenharmony_ci                if (v->fourmvswitch)
1073cabdff1aSopenharmony_ci                    v->mbmode_vlc = &ff_vc1_intfr_4mv_mbmode_vlc[v->mbmodetab];
1074cabdff1aSopenharmony_ci                else
1075cabdff1aSopenharmony_ci                    v->mbmode_vlc = &ff_vc1_intfr_non4mv_mbmode_vlc[v->mbmodetab];
1076cabdff1aSopenharmony_ci                v->imvtab      = get_bits(gb, 2);
1077cabdff1aSopenharmony_ci                v->imv_vlc     = &ff_vc1_1ref_mvdata_vlc[v->imvtab];
1078cabdff1aSopenharmony_ci                // interlaced p-picture cbpcy range is [1, 63]
1079cabdff1aSopenharmony_ci                v->icbptab     = get_bits(gb, 3);
1080cabdff1aSopenharmony_ci                v->cbpcy_vlc   = &ff_vc1_icbpcy_vlc[v->icbptab];
1081cabdff1aSopenharmony_ci                v->twomvbptab     = get_bits(gb, 2);
1082cabdff1aSopenharmony_ci                v->twomvbp_vlc = &ff_vc1_2mv_block_pattern_vlc[v->twomvbptab];
1083cabdff1aSopenharmony_ci                if (v->fourmvswitch) {
1084cabdff1aSopenharmony_ci                    v->fourmvbptab     = get_bits(gb, 2);
1085cabdff1aSopenharmony_ci                    v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab];
1086cabdff1aSopenharmony_ci                }
1087cabdff1aSopenharmony_ci            }
1088cabdff1aSopenharmony_ci        }
1089cabdff1aSopenharmony_ci        v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1090cabdff1aSopenharmony_ci        v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
1091cabdff1aSopenharmony_ci        v->range_x = 1 << (v->k_x - 1);
1092cabdff1aSopenharmony_ci        v->range_y = 1 << (v->k_y - 1);
1093cabdff1aSopenharmony_ci
1094cabdff1aSopenharmony_ci        v->tt_index = (v->pq > 4) + (v->pq > 12);
1095cabdff1aSopenharmony_ci        if (v->fcm != ILACE_FRAME) {
1096cabdff1aSopenharmony_ci            int mvmode;
1097cabdff1aSopenharmony_ci            mvmode     = get_unary(gb, 1, 4);
1098cabdff1aSopenharmony_ci            lowquant   = (v->pq > 12) ? 0 : 1;
1099cabdff1aSopenharmony_ci            v->mv_mode = ff_vc1_mv_pmode_table[lowquant][mvmode];
1100cabdff1aSopenharmony_ci            if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1101cabdff1aSopenharmony_ci                int mvmode2;
1102cabdff1aSopenharmony_ci                mvmode2 = get_unary(gb, 1, 3);
1103cabdff1aSopenharmony_ci                v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][mvmode2];
1104cabdff1aSopenharmony_ci                if (v->field_mode) {
1105cabdff1aSopenharmony_ci                    v->intcompfield = decode210(gb) ^ 3;
1106cabdff1aSopenharmony_ci                } else
1107cabdff1aSopenharmony_ci                    v->intcompfield = 3;
1108cabdff1aSopenharmony_ci
1109cabdff1aSopenharmony_ci                v->lumscale2 = v->lumscale = 32;
1110cabdff1aSopenharmony_ci                v->lumshift2 = v->lumshift =  0;
1111cabdff1aSopenharmony_ci                if (v->intcompfield & 1) {
1112cabdff1aSopenharmony_ci                    v->lumscale = get_bits(gb, 6);
1113cabdff1aSopenharmony_ci                    v->lumshift = get_bits(gb, 6);
1114cabdff1aSopenharmony_ci                }
1115cabdff1aSopenharmony_ci                if ((v->intcompfield & 2) && v->field_mode) {
1116cabdff1aSopenharmony_ci                    v->lumscale2 = get_bits(gb, 6);
1117cabdff1aSopenharmony_ci                    v->lumshift2 = get_bits(gb, 6);
1118cabdff1aSopenharmony_ci                } else if(!v->field_mode) {
1119cabdff1aSopenharmony_ci                    v->lumscale2 = v->lumscale;
1120cabdff1aSopenharmony_ci                    v->lumshift2 = v->lumshift;
1121cabdff1aSopenharmony_ci                }
1122cabdff1aSopenharmony_ci                if (v->field_mode && v->second_field) {
1123cabdff1aSopenharmony_ci                    if (v->cur_field_type) {
1124cabdff1aSopenharmony_ci                        INIT_LUT(v->lumscale , v->lumshift , v->curr_luty[v->cur_field_type^1], v->curr_lutuv[v->cur_field_type^1], 0);
1125cabdff1aSopenharmony_ci                        INIT_LUT(v->lumscale2, v->lumshift2, v->last_luty[v->cur_field_type  ], v->last_lutuv[v->cur_field_type  ], 1);
1126cabdff1aSopenharmony_ci                    } else {
1127cabdff1aSopenharmony_ci                        INIT_LUT(v->lumscale2, v->lumshift2, v->curr_luty[v->cur_field_type^1], v->curr_lutuv[v->cur_field_type^1], 0);
1128cabdff1aSopenharmony_ci                        INIT_LUT(v->lumscale , v->lumshift , v->last_luty[v->cur_field_type  ], v->last_lutuv[v->cur_field_type  ], 1);
1129cabdff1aSopenharmony_ci                    }
1130cabdff1aSopenharmony_ci                    v->next_use_ic = *v->curr_use_ic = 1;
1131cabdff1aSopenharmony_ci                } else {
1132cabdff1aSopenharmony_ci                    INIT_LUT(v->lumscale , v->lumshift , v->last_luty[0], v->last_lutuv[0], 1);
1133cabdff1aSopenharmony_ci                    INIT_LUT(v->lumscale2, v->lumshift2, v->last_luty[1], v->last_lutuv[1], 1);
1134cabdff1aSopenharmony_ci                }
1135cabdff1aSopenharmony_ci                v->last_use_ic = 1;
1136cabdff1aSopenharmony_ci            }
1137cabdff1aSopenharmony_ci            v->qs_last = v->s.quarter_sample;
1138cabdff1aSopenharmony_ci            if (v->mv_mode == MV_PMODE_INTENSITY_COMP) {
1139cabdff1aSopenharmony_ci                v->s.quarter_sample = (v->mv_mode2 != MV_PMODE_1MV_HPEL &&
1140cabdff1aSopenharmony_ci                                       v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
1141cabdff1aSopenharmony_ci                v->s.mspel          = (v->mv_mode2 != MV_PMODE_1MV_HPEL_BILIN);
1142cabdff1aSopenharmony_ci            } else {
1143cabdff1aSopenharmony_ci                v->s.quarter_sample = (v->mv_mode != MV_PMODE_1MV_HPEL &&
1144cabdff1aSopenharmony_ci                                       v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
1145cabdff1aSopenharmony_ci                v->s.mspel          = (v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
1146cabdff1aSopenharmony_ci            }
1147cabdff1aSopenharmony_ci        }
1148cabdff1aSopenharmony_ci        if (v->fcm == PROGRESSIVE) { // progressive
1149cabdff1aSopenharmony_ci            if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1150cabdff1aSopenharmony_ci                 v->mv_mode2 == MV_PMODE_MIXED_MV)
1151cabdff1aSopenharmony_ci                || v->mv_mode == MV_PMODE_MIXED_MV) {
1152cabdff1aSopenharmony_ci                status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1153cabdff1aSopenharmony_ci                if (status < 0)
1154cabdff1aSopenharmony_ci                    return -1;
1155cabdff1aSopenharmony_ci                av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
1156cabdff1aSopenharmony_ci                       "Imode: %i, Invert: %i\n", status>>1, status&1);
1157cabdff1aSopenharmony_ci            } else {
1158cabdff1aSopenharmony_ci                v->mv_type_is_raw = 0;
1159cabdff1aSopenharmony_ci                memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1160cabdff1aSopenharmony_ci            }
1161cabdff1aSopenharmony_ci            status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1162cabdff1aSopenharmony_ci            if (status < 0)
1163cabdff1aSopenharmony_ci                return -1;
1164cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1165cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1166cabdff1aSopenharmony_ci
1167cabdff1aSopenharmony_ci            /* Hopefully this is correct for P-frames */
1168cabdff1aSopenharmony_ci            v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
1169cabdff1aSopenharmony_ci            v->cbptab           = get_bits(gb, 2);
1170cabdff1aSopenharmony_ci            v->cbpcy_vlc        = &ff_vc1_cbpcy_p_vlc[v->cbptab];
1171cabdff1aSopenharmony_ci        } else if (v->fcm == ILACE_FRAME) { // frame interlaced
1172cabdff1aSopenharmony_ci            v->qs_last          = v->s.quarter_sample;
1173cabdff1aSopenharmony_ci            v->s.quarter_sample = 1;
1174cabdff1aSopenharmony_ci            v->s.mspel          = 1;
1175cabdff1aSopenharmony_ci        } else {    // field interlaced
1176cabdff1aSopenharmony_ci            v->mbmodetab = get_bits(gb, 3);
1177cabdff1aSopenharmony_ci            v->imvtab = get_bits(gb, 2 + v->numref);
1178cabdff1aSopenharmony_ci            if (!v->numref)
1179cabdff1aSopenharmony_ci                v->imv_vlc = &ff_vc1_1ref_mvdata_vlc[v->imvtab];
1180cabdff1aSopenharmony_ci            else
1181cabdff1aSopenharmony_ci                v->imv_vlc = &ff_vc1_2ref_mvdata_vlc[v->imvtab];
1182cabdff1aSopenharmony_ci            v->icbptab = get_bits(gb, 3);
1183cabdff1aSopenharmony_ci            v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[v->icbptab];
1184cabdff1aSopenharmony_ci            if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
1185cabdff1aSopenharmony_ci                v->mv_mode2 == MV_PMODE_MIXED_MV) || v->mv_mode == MV_PMODE_MIXED_MV) {
1186cabdff1aSopenharmony_ci                v->fourmvbptab     = get_bits(gb, 2);
1187cabdff1aSopenharmony_ci                v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab];
1188cabdff1aSopenharmony_ci                v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[v->mbmodetab];
1189cabdff1aSopenharmony_ci            } else {
1190cabdff1aSopenharmony_ci                v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[v->mbmodetab];
1191cabdff1aSopenharmony_ci            }
1192cabdff1aSopenharmony_ci        }
1193cabdff1aSopenharmony_ci        if (v->dquant) {
1194cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1195cabdff1aSopenharmony_ci            vop_dquant_decoding(v);
1196cabdff1aSopenharmony_ci        }
1197cabdff1aSopenharmony_ci
1198cabdff1aSopenharmony_ci        if (v->vstransform) {
1199cabdff1aSopenharmony_ci            v->ttmbf = get_bits1(gb);
1200cabdff1aSopenharmony_ci            if (v->ttmbf) {
1201cabdff1aSopenharmony_ci                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1202cabdff1aSopenharmony_ci            } else
1203cabdff1aSopenharmony_ci                v->ttfrm = 0; //FIXME Is that so ?
1204cabdff1aSopenharmony_ci        } else {
1205cabdff1aSopenharmony_ci            v->ttmbf = 1;
1206cabdff1aSopenharmony_ci            v->ttfrm = TT_8X8;
1207cabdff1aSopenharmony_ci        }
1208cabdff1aSopenharmony_ci        break;
1209cabdff1aSopenharmony_ci    case AV_PICTURE_TYPE_B:
1210cabdff1aSopenharmony_ci        if (v->fcm == ILACE_FRAME) {
1211cabdff1aSopenharmony_ci            if (read_bfraction(v, gb) < 0)
1212cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1213cabdff1aSopenharmony_ci            if (v->bfraction == 0) {
1214cabdff1aSopenharmony_ci                return -1;
1215cabdff1aSopenharmony_ci            }
1216cabdff1aSopenharmony_ci        }
1217cabdff1aSopenharmony_ci        if (v->extended_mv)
1218cabdff1aSopenharmony_ci            v->mvrange = get_unary(gb, 0, 3);
1219cabdff1aSopenharmony_ci        else
1220cabdff1aSopenharmony_ci            v->mvrange = 0;
1221cabdff1aSopenharmony_ci        v->k_x     = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
1222cabdff1aSopenharmony_ci        v->k_y     = v->mvrange + 8; //k_y can be 8 9 10 11
1223cabdff1aSopenharmony_ci        v->range_x = 1 << (v->k_x - 1);
1224cabdff1aSopenharmony_ci        v->range_y = 1 << (v->k_y - 1);
1225cabdff1aSopenharmony_ci
1226cabdff1aSopenharmony_ci        v->tt_index = (v->pq > 4) + (v->pq > 12);
1227cabdff1aSopenharmony_ci
1228cabdff1aSopenharmony_ci        if (v->field_mode) {
1229cabdff1aSopenharmony_ci            int mvmode;
1230cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "B Fields\n");
1231cabdff1aSopenharmony_ci            if (v->extended_dmv)
1232cabdff1aSopenharmony_ci                v->dmvrange = get_unary(gb, 0, 3);
1233cabdff1aSopenharmony_ci            mvmode = get_unary(gb, 1, 3);
1234cabdff1aSopenharmony_ci            lowquant = (v->pq > 12) ? 0 : 1;
1235cabdff1aSopenharmony_ci            v->mv_mode          = ff_vc1_mv_pmode_table2[lowquant][mvmode];
1236cabdff1aSopenharmony_ci            v->qs_last          = v->s.quarter_sample;
1237cabdff1aSopenharmony_ci            v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV || v->mv_mode == MV_PMODE_MIXED_MV);
1238cabdff1aSopenharmony_ci            v->s.mspel          = (v->mv_mode != MV_PMODE_1MV_HPEL_BILIN);
1239cabdff1aSopenharmony_ci            status = bitplane_decoding(v->forward_mb_plane, &v->fmb_is_raw, v);
1240cabdff1aSopenharmony_ci            if (status < 0)
1241cabdff1aSopenharmony_ci                return -1;
1242cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "MB Forward Type plane encoding: "
1243cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1244cabdff1aSopenharmony_ci            v->mbmodetab = get_bits(gb, 3);
1245cabdff1aSopenharmony_ci            if (v->mv_mode == MV_PMODE_MIXED_MV)
1246cabdff1aSopenharmony_ci                v->mbmode_vlc = &ff_vc1_if_mmv_mbmode_vlc[v->mbmodetab];
1247cabdff1aSopenharmony_ci            else
1248cabdff1aSopenharmony_ci                v->mbmode_vlc = &ff_vc1_if_1mv_mbmode_vlc[v->mbmodetab];
1249cabdff1aSopenharmony_ci            v->imvtab     = get_bits(gb, 3);
1250cabdff1aSopenharmony_ci            v->imv_vlc   = &ff_vc1_2ref_mvdata_vlc[v->imvtab];
1251cabdff1aSopenharmony_ci            v->icbptab   = get_bits(gb, 3);
1252cabdff1aSopenharmony_ci            v->cbpcy_vlc = &ff_vc1_icbpcy_vlc[v->icbptab];
1253cabdff1aSopenharmony_ci            if (v->mv_mode == MV_PMODE_MIXED_MV) {
1254cabdff1aSopenharmony_ci                v->fourmvbptab     = get_bits(gb, 2);
1255cabdff1aSopenharmony_ci                v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab];
1256cabdff1aSopenharmony_ci            }
1257cabdff1aSopenharmony_ci            v->numref = 1; // interlaced field B pictures are always 2-ref
1258cabdff1aSopenharmony_ci        } else if (v->fcm == ILACE_FRAME) {
1259cabdff1aSopenharmony_ci            if (v->extended_dmv)
1260cabdff1aSopenharmony_ci                v->dmvrange = get_unary(gb, 0, 3);
1261cabdff1aSopenharmony_ci            if (get_bits1(gb)) /* intcomp - present but shall always be 0 */
1262cabdff1aSopenharmony_ci                av_log(v->s.avctx, AV_LOG_WARNING, "Intensity compensation set for B picture\n");
1263cabdff1aSopenharmony_ci            v->intcomp          = 0;
1264cabdff1aSopenharmony_ci            v->mv_mode          = MV_PMODE_1MV;
1265cabdff1aSopenharmony_ci            v->fourmvswitch     = 0;
1266cabdff1aSopenharmony_ci            v->qs_last          = v->s.quarter_sample;
1267cabdff1aSopenharmony_ci            v->s.quarter_sample = 1;
1268cabdff1aSopenharmony_ci            v->s.mspel          = 1;
1269cabdff1aSopenharmony_ci            status              = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1270cabdff1aSopenharmony_ci            if (status < 0)
1271cabdff1aSopenharmony_ci                return -1;
1272cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1273cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1274cabdff1aSopenharmony_ci            status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1275cabdff1aSopenharmony_ci            if (status < 0)
1276cabdff1aSopenharmony_ci                return -1;
1277cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1278cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1279cabdff1aSopenharmony_ci            v->mbmodetab       = get_bits(gb, 2);
1280cabdff1aSopenharmony_ci            v->mbmode_vlc   = &ff_vc1_intfr_non4mv_mbmode_vlc[v->mbmodetab];
1281cabdff1aSopenharmony_ci            v->imvtab       = get_bits(gb, 2);
1282cabdff1aSopenharmony_ci            v->imv_vlc      = &ff_vc1_1ref_mvdata_vlc[v->imvtab];
1283cabdff1aSopenharmony_ci            // interlaced p/b-picture cbpcy range is [1, 63]
1284cabdff1aSopenharmony_ci            v->icbptab      = get_bits(gb, 3);
1285cabdff1aSopenharmony_ci            v->cbpcy_vlc    = &ff_vc1_icbpcy_vlc[v->icbptab];
1286cabdff1aSopenharmony_ci            v->twomvbptab      = get_bits(gb, 2);
1287cabdff1aSopenharmony_ci            v->twomvbp_vlc  = &ff_vc1_2mv_block_pattern_vlc[v->twomvbptab];
1288cabdff1aSopenharmony_ci            v->fourmvbptab     = get_bits(gb, 2);
1289cabdff1aSopenharmony_ci            v->fourmvbp_vlc = &ff_vc1_4mv_block_pattern_vlc[v->fourmvbptab];
1290cabdff1aSopenharmony_ci        } else {
1291cabdff1aSopenharmony_ci            v->mv_mode          = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
1292cabdff1aSopenharmony_ci            v->qs_last          = v->s.quarter_sample;
1293cabdff1aSopenharmony_ci            v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1294cabdff1aSopenharmony_ci            v->s.mspel          = v->s.quarter_sample;
1295cabdff1aSopenharmony_ci            status              = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
1296cabdff1aSopenharmony_ci            if (status < 0)
1297cabdff1aSopenharmony_ci                return -1;
1298cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
1299cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1300cabdff1aSopenharmony_ci            status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1301cabdff1aSopenharmony_ci            if (status < 0)
1302cabdff1aSopenharmony_ci                return -1;
1303cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
1304cabdff1aSopenharmony_ci                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1305cabdff1aSopenharmony_ci            v->s.mv_table_index = get_bits(gb, 2);
1306cabdff1aSopenharmony_ci            v->cbptab = get_bits(gb, 2);
1307cabdff1aSopenharmony_ci            v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[v->cbptab];
1308cabdff1aSopenharmony_ci        }
1309cabdff1aSopenharmony_ci
1310cabdff1aSopenharmony_ci        if (v->dquant) {
1311cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1312cabdff1aSopenharmony_ci            vop_dquant_decoding(v);
1313cabdff1aSopenharmony_ci        }
1314cabdff1aSopenharmony_ci
1315cabdff1aSopenharmony_ci        if (v->vstransform) {
1316cabdff1aSopenharmony_ci            v->ttmbf = get_bits1(gb);
1317cabdff1aSopenharmony_ci            if (v->ttmbf) {
1318cabdff1aSopenharmony_ci                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1319cabdff1aSopenharmony_ci            } else
1320cabdff1aSopenharmony_ci                v->ttfrm = 0;
1321cabdff1aSopenharmony_ci        } else {
1322cabdff1aSopenharmony_ci            v->ttmbf = 1;
1323cabdff1aSopenharmony_ci            v->ttfrm = TT_8X8;
1324cabdff1aSopenharmony_ci        }
1325cabdff1aSopenharmony_ci        break;
1326cabdff1aSopenharmony_ci    }
1327cabdff1aSopenharmony_ci
1328cabdff1aSopenharmony_ci
1329cabdff1aSopenharmony_ci    /* AC Syntax */
1330cabdff1aSopenharmony_ci    v->c_ac_table_index = decode012(gb);
1331cabdff1aSopenharmony_ci    if (v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI) {
1332cabdff1aSopenharmony_ci        v->y_ac_table_index = decode012(gb);
1333cabdff1aSopenharmony_ci    }
1334cabdff1aSopenharmony_ci    else if (v->fcm != PROGRESSIVE && !v->s.quarter_sample) {
1335cabdff1aSopenharmony_ci        v->range_x <<= 1;
1336cabdff1aSopenharmony_ci        v->range_y <<= 1;
1337cabdff1aSopenharmony_ci    }
1338cabdff1aSopenharmony_ci
1339cabdff1aSopenharmony_ci    /* DC Syntax */
1340cabdff1aSopenharmony_ci    v->s.dc_table_index = get_bits1(gb);
1341cabdff1aSopenharmony_ci    if ((v->s.pict_type == AV_PICTURE_TYPE_I || v->s.pict_type == AV_PICTURE_TYPE_BI)
1342cabdff1aSopenharmony_ci        && v->dquant) {
1343cabdff1aSopenharmony_ci        av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
1344cabdff1aSopenharmony_ci        vop_dquant_decoding(v);
1345cabdff1aSopenharmony_ci    }
1346cabdff1aSopenharmony_ci
1347cabdff1aSopenharmony_ci    v->bi_type = (v->s.pict_type == AV_PICTURE_TYPE_BI);
1348cabdff1aSopenharmony_ci    if (v->bi_type)
1349cabdff1aSopenharmony_ci        v->s.pict_type = AV_PICTURE_TYPE_B;
1350cabdff1aSopenharmony_ci
1351cabdff1aSopenharmony_ci    return 0;
1352cabdff1aSopenharmony_ci}
1353cabdff1aSopenharmony_ci
1354cabdff1aSopenharmony_cistatic const uint32_t vc1_ac_tables[AC_MODES][186][2] = {
1355cabdff1aSopenharmony_ci{
1356cabdff1aSopenharmony_ci{ 0x0001,  2}, { 0x0005,  3}, { 0x000D,  4}, { 0x0012,  5}, { 0x000E,  6}, { 0x0015,  7},
1357cabdff1aSopenharmony_ci{ 0x0013,  8}, { 0x003F,  8}, { 0x004B,  9}, { 0x011F,  9}, { 0x00B8, 10}, { 0x03E3, 10},
1358cabdff1aSopenharmony_ci{ 0x0172, 11}, { 0x024D, 12}, { 0x03DA, 12}, { 0x02DD, 13}, { 0x1F55, 13}, { 0x05B9, 14},
1359cabdff1aSopenharmony_ci{ 0x3EAE, 14}, { 0x0000,  4}, { 0x0010,  5}, { 0x0008,  7}, { 0x0020,  8}, { 0x0029,  9},
1360cabdff1aSopenharmony_ci{ 0x01F4,  9}, { 0x0233, 10}, { 0x01E0, 11}, { 0x012A, 12}, { 0x03DD, 12}, { 0x050A, 13},
1361cabdff1aSopenharmony_ci{ 0x1F29, 13}, { 0x0A42, 14}, { 0x1272, 15}, { 0x1737, 15}, { 0x0003,  5}, { 0x0011,  7},
1362cabdff1aSopenharmony_ci{ 0x00C4,  8}, { 0x004B, 10}, { 0x00B4, 11}, { 0x07D4, 11}, { 0x0345, 12}, { 0x02D7, 13},
1363cabdff1aSopenharmony_ci{ 0x07BF, 13}, { 0x0938, 14}, { 0x0BBB, 14}, { 0x095E, 15}, { 0x0013,  5}, { 0x0078,  7},
1364cabdff1aSopenharmony_ci{ 0x0069,  9}, { 0x0232, 10}, { 0x0461, 11}, { 0x03EC, 12}, { 0x0520, 13}, { 0x1F2A, 13},
1365cabdff1aSopenharmony_ci{ 0x3E50, 14}, { 0x3E51, 14}, { 0x1486, 15}, { 0x000C,  6}, { 0x0024,  9}, { 0x0094, 11},
1366cabdff1aSopenharmony_ci{ 0x08C0, 12}, { 0x0F09, 14}, { 0x1EF0, 15}, { 0x003D,  6}, { 0x0053,  9}, { 0x01A0, 11},
1367cabdff1aSopenharmony_ci{ 0x02D6, 13}, { 0x0F08, 14}, { 0x0013,  7}, { 0x007C,  9}, { 0x07C1, 11}, { 0x04AC, 14},
1368cabdff1aSopenharmony_ci{ 0x001B,  7}, { 0x00A0, 10}, { 0x0344, 12}, { 0x0F79, 14}, { 0x0079,  7}, { 0x03E1, 10},
1369cabdff1aSopenharmony_ci{ 0x02D4, 13}, { 0x2306, 14}, { 0x0021,  8}, { 0x023C, 10}, { 0x0FAE, 12}, { 0x23DE, 14},
1370cabdff1aSopenharmony_ci{ 0x0035,  8}, { 0x0175, 11}, { 0x07B3, 13}, { 0x00C5,  8}, { 0x0174, 11}, { 0x0785, 13},
1371cabdff1aSopenharmony_ci{ 0x0048,  9}, { 0x01A3, 11}, { 0x049E, 13}, { 0x002C,  9}, { 0x00FA, 10}, { 0x07D6, 11},
1372cabdff1aSopenharmony_ci{ 0x0092, 10}, { 0x05CC, 13}, { 0x1EF1, 15}, { 0x00A3, 10}, { 0x03ED, 12}, { 0x093E, 14},
1373cabdff1aSopenharmony_ci{ 0x01E2, 11}, { 0x1273, 15}, { 0x07C4, 11}, { 0x1487, 15}, { 0x0291, 12}, { 0x0293, 12},
1374cabdff1aSopenharmony_ci{ 0x0F8A, 12}, { 0x0509, 13}, { 0x0508, 13}, { 0x078D, 13}, { 0x07BE, 13}, { 0x078C, 13},
1375cabdff1aSopenharmony_ci{ 0x04AE, 14}, { 0x0BBA, 14}, { 0x2307, 14}, { 0x0B9A, 14}, { 0x1736, 15}, { 0x000E,  4},
1376cabdff1aSopenharmony_ci{ 0x0045,  7}, { 0x01F3,  9}, { 0x047A, 11}, { 0x05DC, 13}, { 0x23DF, 14}, { 0x0019,  5},
1377cabdff1aSopenharmony_ci{ 0x0028,  9}, { 0x0176, 11}, { 0x049D, 13}, { 0x23DD, 14}, { 0x0030,  6}, { 0x00A2, 10},
1378cabdff1aSopenharmony_ci{ 0x02EF, 12}, { 0x05B8, 14}, { 0x003F,  6}, { 0x00A5, 10}, { 0x03DB, 12}, { 0x093F, 14},
1379cabdff1aSopenharmony_ci{ 0x0044,  7}, { 0x07CB, 11}, { 0x095F, 15}, { 0x0063,  7}, { 0x03C3, 12}, { 0x0015,  8},
1380cabdff1aSopenharmony_ci{ 0x08F6, 12}, { 0x0017,  8}, { 0x0498, 13}, { 0x002C,  8}, { 0x07B2, 13}, { 0x002F,  8},
1381cabdff1aSopenharmony_ci{ 0x1F54, 13}, { 0x008D,  8}, { 0x07BD, 13}, { 0x008E,  8}, { 0x1182, 13}, { 0x00FB,  8},
1382cabdff1aSopenharmony_ci{ 0x050B, 13}, { 0x002D,  8}, { 0x07C0, 11}, { 0x0079,  9}, { 0x1F5F, 13}, { 0x007A,  9},
1383cabdff1aSopenharmony_ci{ 0x1F56, 13}, { 0x0231, 10}, { 0x03E4, 10}, { 0x01A1, 11}, { 0x0143, 11}, { 0x01F7, 11},
1384cabdff1aSopenharmony_ci{ 0x016F, 12}, { 0x0292, 12}, { 0x02E7, 12}, { 0x016C, 12}, { 0x016D, 12}, { 0x03DC, 12},
1385cabdff1aSopenharmony_ci{ 0x0F8B, 12}, { 0x0499, 13}, { 0x03D8, 12}, { 0x078E, 13}, { 0x02D5, 13}, { 0x1F5E, 13},
1386cabdff1aSopenharmony_ci{ 0x1F2B, 13}, { 0x078F, 13}, { 0x04AD, 14}, { 0x3EAF, 14}, { 0x23DC, 14}, { 0x004A,  9}
1387cabdff1aSopenharmony_ci},
1388cabdff1aSopenharmony_ci{
1389cabdff1aSopenharmony_ci{ 0x0000,  3}, { 0x0003,  4}, { 0x000B,  5}, { 0x0014,  6}, { 0x003F,  6}, { 0x005D,  7},
1390cabdff1aSopenharmony_ci{ 0x00A2,  8}, { 0x00AC,  9}, { 0x016E,  9}, { 0x020A, 10}, { 0x02E2, 10}, { 0x0432, 11},
1391cabdff1aSopenharmony_ci{ 0x05C9, 11}, { 0x0827, 12}, { 0x0B54, 12}, { 0x04E6, 13}, { 0x105F, 13}, { 0x172A, 13},
1392cabdff1aSopenharmony_ci{ 0x20B2, 14}, { 0x2D4E, 14}, { 0x39F0, 14}, { 0x4175, 15}, { 0x5A9E, 15}, { 0x0004,  4},
1393cabdff1aSopenharmony_ci{ 0x001E,  5}, { 0x0042,  7}, { 0x00B6,  8}, { 0x0173,  9}, { 0x0395, 10}, { 0x072E, 11},
1394cabdff1aSopenharmony_ci{ 0x0B94, 12}, { 0x16A4, 13}, { 0x20B3, 14}, { 0x2E45, 14}, { 0x0005,  5}, { 0x0040,  7},
1395cabdff1aSopenharmony_ci{ 0x0049,  9}, { 0x028F, 10}, { 0x05CB, 11}, { 0x048A, 13}, { 0x09DD, 14}, { 0x73E2, 15},
1396cabdff1aSopenharmony_ci{ 0x0018,  5}, { 0x0025,  8}, { 0x008A, 10}, { 0x051B, 11}, { 0x0E5F, 12}, { 0x09C9, 14},
1397cabdff1aSopenharmony_ci{ 0x139C, 15}, { 0x0029,  6}, { 0x004F,  9}, { 0x0412, 11}, { 0x048D, 13}, { 0x2E41, 14},
1398cabdff1aSopenharmony_ci{ 0x0038,  6}, { 0x010E,  9}, { 0x05A8, 11}, { 0x105C, 13}, { 0x39F2, 14}, { 0x0058,  7},
1399cabdff1aSopenharmony_ci{ 0x021F, 10}, { 0x0E7E, 12}, { 0x39FF, 14}, { 0x0023,  8}, { 0x02E3, 10}, { 0x04E5, 13},
1400cabdff1aSopenharmony_ci{ 0x2E40, 14}, { 0x00A1,  8}, { 0x05BE, 11}, { 0x09C8, 14}, { 0x0083,  8}, { 0x013A, 11},
1401cabdff1aSopenharmony_ci{ 0x1721, 13}, { 0x0044,  9}, { 0x0276, 12}, { 0x39F6, 14}, { 0x008B, 10}, { 0x04EF, 13},
1402cabdff1aSopenharmony_ci{ 0x5A9B, 15}, { 0x0208, 10}, { 0x1CFE, 13}, { 0x0399, 10}, { 0x1CB4, 13}, { 0x039E, 10},
1403cabdff1aSopenharmony_ci{ 0x39F3, 14}, { 0x05AB, 11}, { 0x73E3, 15}, { 0x0737, 11}, { 0x5A9F, 15}, { 0x082D, 12},
1404cabdff1aSopenharmony_ci{ 0x0E69, 12}, { 0x0E68, 12}, { 0x0433, 11}, { 0x0B7B, 12}, { 0x2DF8, 14}, { 0x2E56, 14},
1405cabdff1aSopenharmony_ci{ 0x2E57, 14}, { 0x39F7, 14}, { 0x51A5, 15}, { 0x0003,  3}, { 0x002A,  6}, { 0x00E4,  8},
1406cabdff1aSopenharmony_ci{ 0x028E, 10}, { 0x0735, 11}, { 0x1058, 13}, { 0x1CFA, 13}, { 0x2DF9, 14}, { 0x4174, 15},
1407cabdff1aSopenharmony_ci{ 0x0009,  4}, { 0x0054,  8}, { 0x0398, 10}, { 0x048B, 13}, { 0x139D, 15}, { 0x000D,  4},
1408cabdff1aSopenharmony_ci{ 0x00AD,  9}, { 0x0826, 12}, { 0x2D4C, 14}, { 0x0011,  5}, { 0x016B,  9}, { 0x0B7F, 12},
1409cabdff1aSopenharmony_ci{ 0x51A4, 15}, { 0x0019,  5}, { 0x021B, 10}, { 0x16FD, 13}, { 0x001D,  5}, { 0x0394, 10},
1410cabdff1aSopenharmony_ci{ 0x28D3, 14}, { 0x002B,  6}, { 0x05BC, 11}, { 0x5A9A, 15}, { 0x002F,  6}, { 0x0247, 12},
1411cabdff1aSopenharmony_ci{ 0x0010,  7}, { 0x0A35, 12}, { 0x003E,  6}, { 0x0B7A, 12}, { 0x0059,  7}, { 0x105E, 13},
1412cabdff1aSopenharmony_ci{ 0x0026,  8}, { 0x09CF, 14}, { 0x0055,  8}, { 0x1CB5, 13}, { 0x0057,  8}, { 0x0E5B, 12},
1413cabdff1aSopenharmony_ci{ 0x00A0,  8}, { 0x1468, 13}, { 0x0170,  9}, { 0x0090, 10}, { 0x01CE,  9}, { 0x021A, 10},
1414cabdff1aSopenharmony_ci{ 0x0218, 10}, { 0x0168,  9}, { 0x021E, 10}, { 0x0244, 12}, { 0x0736, 11}, { 0x0138, 11},
1415cabdff1aSopenharmony_ci{ 0x0519, 11}, { 0x0E5E, 12}, { 0x072C, 11}, { 0x0B55, 12}, { 0x09DC, 14}, { 0x20BB, 14},
1416cabdff1aSopenharmony_ci{ 0x048C, 13}, { 0x1723, 13}, { 0x2E44, 14}, { 0x16A5, 13}, { 0x0518, 11}, { 0x39FE, 14},
1417cabdff1aSopenharmony_ci{ 0x0169,  9}
1418cabdff1aSopenharmony_ci},
1419cabdff1aSopenharmony_ci{
1420cabdff1aSopenharmony_ci{ 0x0001,  2}, { 0x0006,  3}, { 0x000F,  4}, { 0x0016,  5}, { 0x0020,  6}, { 0x0018,  7},
1421cabdff1aSopenharmony_ci{ 0x0008,  8}, { 0x009A,  8}, { 0x0056,  9}, { 0x013E,  9}, { 0x00F0, 10}, { 0x03A5, 10},
1422cabdff1aSopenharmony_ci{ 0x0077, 11}, { 0x01EF, 11}, { 0x009A, 12}, { 0x005D, 13}, { 0x0001,  4}, { 0x0011,  5},
1423cabdff1aSopenharmony_ci{ 0x0002,  7}, { 0x000B,  8}, { 0x0012,  9}, { 0x01D6,  9}, { 0x027E, 10}, { 0x0191, 11},
1424cabdff1aSopenharmony_ci{ 0x00EA, 12}, { 0x03DC, 12}, { 0x013B, 13}, { 0x0004,  5}, { 0x0014,  7}, { 0x009E,  8},
1425cabdff1aSopenharmony_ci{ 0x0009, 10}, { 0x01AC, 11}, { 0x01E2, 11}, { 0x03CA, 12}, { 0x005F, 13}, { 0x0017,  5},
1426cabdff1aSopenharmony_ci{ 0x004E,  7}, { 0x005E,  9}, { 0x00F3, 10}, { 0x01AD, 11}, { 0x00EC, 12}, { 0x05F0, 13},
1427cabdff1aSopenharmony_ci{ 0x000E,  6}, { 0x00E1,  8}, { 0x03A4, 10}, { 0x009C, 12}, { 0x013D, 13}, { 0x003B,  6},
1428cabdff1aSopenharmony_ci{ 0x001C,  9}, { 0x0014, 11}, { 0x09BE, 12}, { 0x0006,  7}, { 0x007A,  9}, { 0x0190, 11},
1429cabdff1aSopenharmony_ci{ 0x0137, 13}, { 0x001B,  7}, { 0x0008, 10}, { 0x075C, 11}, { 0x0071,  7}, { 0x00D7, 10},
1430cabdff1aSopenharmony_ci{ 0x09BF, 12}, { 0x0007,  8}, { 0x00AF, 10}, { 0x04CC, 11}, { 0x0034,  8}, { 0x0265, 10},
1431cabdff1aSopenharmony_ci{ 0x009F, 12}, { 0x00E0,  8}, { 0x0016, 11}, { 0x0327, 12}, { 0x0015,  9}, { 0x017D, 11},
1432cabdff1aSopenharmony_ci{ 0x0EBB, 12}, { 0x0014,  9}, { 0x00F6, 10}, { 0x01E4, 11}, { 0x00CB, 10}, { 0x099D, 12},
1433cabdff1aSopenharmony_ci{ 0x00CA, 10}, { 0x02FC, 12}, { 0x017F, 11}, { 0x04CD, 11}, { 0x02FD, 12}, { 0x04FE, 11},
1434cabdff1aSopenharmony_ci{ 0x013A, 13}, { 0x000A,  4}, { 0x0042,  7}, { 0x01D3,  9}, { 0x04DD, 11}, { 0x0012,  5},
1435cabdff1aSopenharmony_ci{ 0x00E8,  8}, { 0x004C, 11}, { 0x0136, 13}, { 0x0039,  6}, { 0x0264, 10}, { 0x0EBA, 12},
1436cabdff1aSopenharmony_ci{ 0x0000,  7}, { 0x00AE, 10}, { 0x099C, 12}, { 0x001F,  7}, { 0x04DE, 11}, { 0x0043,  7},
1437cabdff1aSopenharmony_ci{ 0x04DC, 11}, { 0x0003,  8}, { 0x03CB, 12}, { 0x0006,  8}, { 0x099E, 12}, { 0x002A,  8},
1438cabdff1aSopenharmony_ci{ 0x05F1, 13}, { 0x000F,  8}, { 0x09FE, 12}, { 0x0033,  8}, { 0x09FF, 12}, { 0x0098,  8},
1439cabdff1aSopenharmony_ci{ 0x099F, 12}, { 0x00EA,  8}, { 0x013C, 13}, { 0x002E,  8}, { 0x0192, 11}, { 0x0136,  9},
1440cabdff1aSopenharmony_ci{ 0x006A,  9}, { 0x0015, 11}, { 0x03AF, 10}, { 0x01E3, 11}, { 0x0074, 11}, { 0x00EB, 12},
1441cabdff1aSopenharmony_ci{ 0x02F9, 12}, { 0x005C, 13}, { 0x00ED, 12}, { 0x03DD, 12}, { 0x0326, 12}, { 0x005E, 13},
1442cabdff1aSopenharmony_ci{ 0x0016,  7}
1443cabdff1aSopenharmony_ci},
1444cabdff1aSopenharmony_ci{
1445cabdff1aSopenharmony_ci{ 0x0004,  3}, { 0x0014,  5}, { 0x0017,  7}, { 0x007F,  8}, { 0x0154,  9}, { 0x01F2, 10},
1446cabdff1aSopenharmony_ci{ 0x00BF, 11}, { 0x0065, 12}, { 0x0AAA, 12}, { 0x0630, 13}, { 0x1597, 13}, { 0x03B7, 14},
1447cabdff1aSopenharmony_ci{ 0x2B22, 14}, { 0x0BE6, 15}, { 0x000B,  4}, { 0x0037,  7}, { 0x0062,  9}, { 0x0007, 11},
1448cabdff1aSopenharmony_ci{ 0x0166, 12}, { 0x00CE, 13}, { 0x1590, 13}, { 0x05F6, 14}, { 0x0BE7, 15}, { 0x0007,  5},
1449cabdff1aSopenharmony_ci{ 0x006D,  8}, { 0x0003, 11}, { 0x031F, 12}, { 0x05F2, 14}, { 0x0002,  6}, { 0x0061,  9},
1450cabdff1aSopenharmony_ci{ 0x0055, 12}, { 0x01DF, 14}, { 0x001A,  6}, { 0x001E, 10}, { 0x0AC9, 12}, { 0x2B23, 14},
1451cabdff1aSopenharmony_ci{ 0x001E,  6}, { 0x001F, 10}, { 0x0AC3, 12}, { 0x2B2B, 14}, { 0x0006,  7}, { 0x0004, 11},
1452cabdff1aSopenharmony_ci{ 0x02F8, 13}, { 0x0019,  7}, { 0x0006, 11}, { 0x063D, 13}, { 0x0057,  7}, { 0x0182, 11},
1453cabdff1aSopenharmony_ci{ 0x2AA2, 14}, { 0x0004,  8}, { 0x0180, 11}, { 0x059C, 14}, { 0x007D,  8}, { 0x0164, 12},
1454cabdff1aSopenharmony_ci{ 0x076D, 15}, { 0x0002,  9}, { 0x018D, 11}, { 0x1581, 13}, { 0x00AD,  8}, { 0x0060, 12},
1455cabdff1aSopenharmony_ci{ 0x0C67, 14}, { 0x001C,  9}, { 0x00EE, 13}, { 0x0003,  9}, { 0x02CF, 13}, { 0x00D9,  9},
1456cabdff1aSopenharmony_ci{ 0x1580, 13}, { 0x0002, 11}, { 0x0183, 11}, { 0x0057, 12}, { 0x0061, 12}, { 0x0031, 11},
1457cabdff1aSopenharmony_ci{ 0x0066, 12}, { 0x0631, 13}, { 0x0632, 13}, { 0x00AC, 13}, { 0x031D, 12}, { 0x0076, 12},
1458cabdff1aSopenharmony_ci{ 0x003A, 11}, { 0x0165, 12}, { 0x0C66, 14}, { 0x0003,  2}, { 0x0054,  7}, { 0x02AB, 10},
1459cabdff1aSopenharmony_ci{ 0x0016, 13}, { 0x05F7, 14}, { 0x0005,  4}, { 0x00F8,  9}, { 0x0AA9, 12}, { 0x005F, 15},
1460cabdff1aSopenharmony_ci{ 0x0004,  4}, { 0x001C, 10}, { 0x1550, 13}, { 0x0004,  5}, { 0x0077, 11}, { 0x076C, 15},
1461cabdff1aSopenharmony_ci{ 0x000E,  5}, { 0x000A, 12}, { 0x000C,  5}, { 0x0562, 11}, { 0x0004,  6}, { 0x031C, 12},
1462cabdff1aSopenharmony_ci{ 0x0006,  6}, { 0x00C8, 13}, { 0x000D,  6}, { 0x01DA, 13}, { 0x0007,  6}, { 0x00C9, 13},
1463cabdff1aSopenharmony_ci{ 0x0001,  7}, { 0x002E, 14}, { 0x0014,  7}, { 0x1596, 13}, { 0x000A,  7}, { 0x0AC2, 12},
1464cabdff1aSopenharmony_ci{ 0x0016,  7}, { 0x015B, 14}, { 0x0015,  7}, { 0x015A, 14}, { 0x000F,  8}, { 0x005E, 15},
1465cabdff1aSopenharmony_ci{ 0x007E,  8}, { 0x00AB,  8}, { 0x002D,  9}, { 0x00D8,  9}, { 0x000B,  9}, { 0x0014, 10},
1466cabdff1aSopenharmony_ci{ 0x02B3, 10}, { 0x01F3, 10}, { 0x003A, 10}, { 0x0000, 10}, { 0x0058, 10}, { 0x002E,  9},
1467cabdff1aSopenharmony_ci{ 0x005E, 10}, { 0x0563, 11}, { 0x00EC, 12}, { 0x0054, 12}, { 0x0AC1, 12}, { 0x1556, 13},
1468cabdff1aSopenharmony_ci{ 0x02FA, 13}, { 0x0181, 11}, { 0x1557, 13}, { 0x059D, 14}, { 0x2AA3, 14}, { 0x2B2A, 14},
1469cabdff1aSopenharmony_ci{ 0x01DE, 14}, { 0x063C, 13}, { 0x00CF, 13}, { 0x1594, 13}, { 0x000D,  9}
1470cabdff1aSopenharmony_ci},
1471cabdff1aSopenharmony_ci{
1472cabdff1aSopenharmony_ci{ 0x0002,  2}, { 0x0006,  3}, { 0x000F,  4}, { 0x000D,  5}, { 0x000C,  5}, { 0x0015,  6},
1473cabdff1aSopenharmony_ci{ 0x0013,  6}, { 0x0012,  6}, { 0x0017,  7}, { 0x001F,  8}, { 0x001E,  8}, { 0x001D,  8},
1474cabdff1aSopenharmony_ci{ 0x0025,  9}, { 0x0024,  9}, { 0x0023,  9}, { 0x0021,  9}, { 0x0021, 10}, { 0x0020, 10},
1475cabdff1aSopenharmony_ci{ 0x000F, 10}, { 0x000E, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11}, { 0x0021, 11},
1476cabdff1aSopenharmony_ci{ 0x0050, 12}, { 0x0051, 12}, { 0x0052, 12}, { 0x000E,  4}, { 0x0014,  6}, { 0x0016,  7},
1477cabdff1aSopenharmony_ci{ 0x001C,  8}, { 0x0020,  9}, { 0x001F,  9}, { 0x000D, 10}, { 0x0022, 11}, { 0x0053, 12},
1478cabdff1aSopenharmony_ci{ 0x0055, 12}, { 0x000B,  5}, { 0x0015,  7}, { 0x001E,  9}, { 0x000C, 10}, { 0x0056, 12},
1479cabdff1aSopenharmony_ci{ 0x0011,  6}, { 0x001B,  8}, { 0x001D,  9}, { 0x000B, 10}, { 0x0010,  6}, { 0x0022,  9},
1480cabdff1aSopenharmony_ci{ 0x000A, 10}, { 0x000D,  6}, { 0x001C,  9}, { 0x0008, 10}, { 0x0012,  7}, { 0x001B,  9},
1481cabdff1aSopenharmony_ci{ 0x0054, 12}, { 0x0014,  7}, { 0x001A,  9}, { 0x0057, 12}, { 0x0019,  8}, { 0x0009, 10},
1482cabdff1aSopenharmony_ci{ 0x0018,  8}, { 0x0023, 11}, { 0x0017,  8}, { 0x0019,  9}, { 0x0018,  9}, { 0x0007, 10},
1483cabdff1aSopenharmony_ci{ 0x0058, 12}, { 0x0007,  4}, { 0x000C,  6}, { 0x0016,  8}, { 0x0017,  9}, { 0x0006, 10},
1484cabdff1aSopenharmony_ci{ 0x0005, 11}, { 0x0004, 11}, { 0x0059, 12}, { 0x000F,  6}, { 0x0016,  9}, { 0x0005, 10},
1485cabdff1aSopenharmony_ci{ 0x000E,  6}, { 0x0004, 10}, { 0x0011,  7}, { 0x0024, 11}, { 0x0010,  7}, { 0x0025, 11},
1486cabdff1aSopenharmony_ci{ 0x0013,  7}, { 0x005A, 12}, { 0x0015,  8}, { 0x005B, 12}, { 0x0014,  8}, { 0x0013,  8},
1487cabdff1aSopenharmony_ci{ 0x001A,  8}, { 0x0015,  9}, { 0x0014,  9}, { 0x0013,  9}, { 0x0012,  9}, { 0x0011,  9},
1488cabdff1aSopenharmony_ci{ 0x0026, 11}, { 0x0027, 11}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
1489cabdff1aSopenharmony_ci{ 0x0003,  7}
1490cabdff1aSopenharmony_ci},
1491cabdff1aSopenharmony_ci{
1492cabdff1aSopenharmony_ci{ 0x0002,  2}, { 0x000F,  4}, { 0x0015,  6}, { 0x0017,  7}, { 0x001F,  8}, { 0x0025,  9},
1493cabdff1aSopenharmony_ci{ 0x0024,  9}, { 0x0021, 10}, { 0x0020, 10}, { 0x0007, 11}, { 0x0006, 11}, { 0x0020, 11},
1494cabdff1aSopenharmony_ci{ 0x0006,  3}, { 0x0014,  6}, { 0x001E,  8}, { 0x000F, 10}, { 0x0021, 11}, { 0x0050, 12},
1495cabdff1aSopenharmony_ci{ 0x000E,  4}, { 0x001D,  8}, { 0x000E, 10}, { 0x0051, 12}, { 0x000D,  5}, { 0x0023,  9},
1496cabdff1aSopenharmony_ci{ 0x000D, 10}, { 0x000C,  5}, { 0x0022,  9}, { 0x0052, 12}, { 0x000B,  5}, { 0x000C, 10},
1497cabdff1aSopenharmony_ci{ 0x0053, 12}, { 0x0013,  6}, { 0x000B, 10}, { 0x0054, 12}, { 0x0012,  6}, { 0x000A, 10},
1498cabdff1aSopenharmony_ci{ 0x0011,  6}, { 0x0009, 10}, { 0x0010,  6}, { 0x0008, 10}, { 0x0016,  7}, { 0x0055, 12},
1499cabdff1aSopenharmony_ci{ 0x0015,  7}, { 0x0014,  7}, { 0x001C,  8}, { 0x001B,  8}, { 0x0021,  9}, { 0x0020,  9},
1500cabdff1aSopenharmony_ci{ 0x001F,  9}, { 0x001E,  9}, { 0x001D,  9}, { 0x001C,  9}, { 0x001B,  9}, { 0x001A,  9},
1501cabdff1aSopenharmony_ci{ 0x0022, 11}, { 0x0023, 11}, { 0x0056, 12}, { 0x0057, 12}, { 0x0007,  4}, { 0x0019,  9},
1502cabdff1aSopenharmony_ci{ 0x0005, 11}, { 0x000F,  6}, { 0x0004, 11}, { 0x000E,  6}, { 0x000D,  6}, { 0x000C,  6},
1503cabdff1aSopenharmony_ci{ 0x0013,  7}, { 0x0012,  7}, { 0x0011,  7}, { 0x0010,  7}, { 0x001A,  8}, { 0x0019,  8},
1504cabdff1aSopenharmony_ci{ 0x0018,  8}, { 0x0017,  8}, { 0x0016,  8}, { 0x0015,  8}, { 0x0014,  8}, { 0x0013,  8},
1505cabdff1aSopenharmony_ci{ 0x0018,  9}, { 0x0017,  9}, { 0x0016,  9}, { 0x0015,  9}, { 0x0014,  9}, { 0x0013,  9},
1506cabdff1aSopenharmony_ci{ 0x0012,  9}, { 0x0011,  9}, { 0x0007, 10}, { 0x0006, 10}, { 0x0005, 10}, { 0x0004, 10},
1507cabdff1aSopenharmony_ci{ 0x0024, 11}, { 0x0025, 11}, { 0x0026, 11}, { 0x0027, 11}, { 0x0058, 12}, { 0x0059, 12},
1508cabdff1aSopenharmony_ci{ 0x005A, 12}, { 0x005B, 12}, { 0x005C, 12}, { 0x005D, 12}, { 0x005E, 12}, { 0x005F, 12},
1509cabdff1aSopenharmony_ci{ 0x0003,  7}
1510cabdff1aSopenharmony_ci},
1511cabdff1aSopenharmony_ci{
1512cabdff1aSopenharmony_ci{ 0x0000,  2}, { 0x0003,  3}, { 0x000D,  4}, { 0x0005,  4}, { 0x001C,  5}, { 0x0016,  5},
1513cabdff1aSopenharmony_ci{ 0x003F,  6}, { 0x003A,  6}, { 0x002E,  6}, { 0x0022,  6}, { 0x007B,  7}, { 0x0067,  7},
1514cabdff1aSopenharmony_ci{ 0x005F,  7}, { 0x0047,  7}, { 0x0026,  7}, { 0x00EF,  8}, { 0x00CD,  8}, { 0x00C1,  8},
1515cabdff1aSopenharmony_ci{ 0x00A9,  8}, { 0x004F,  8}, { 0x01F2,  9}, { 0x01DD,  9}, { 0x0199,  9}, { 0x0185,  9},
1516cabdff1aSopenharmony_ci{ 0x015D,  9}, { 0x011B,  9}, { 0x03EF, 10}, { 0x03E1, 10}, { 0x03C8, 10}, { 0x0331, 10},
1517cabdff1aSopenharmony_ci{ 0x0303, 10}, { 0x02F1, 10}, { 0x02A0, 10}, { 0x0233, 10}, { 0x0126, 10}, { 0x07C0, 11},
1518cabdff1aSopenharmony_ci{ 0x076F, 11}, { 0x076C, 11}, { 0x0661, 11}, { 0x0604, 11}, { 0x0572, 11}, { 0x0551, 11},
1519cabdff1aSopenharmony_ci{ 0x046A, 11}, { 0x0274, 11}, { 0x0F27, 12}, { 0x0F24, 12}, { 0x0EDB, 12}, { 0x0C8E, 12},
1520cabdff1aSopenharmony_ci{ 0x0C0B, 12}, { 0x0C0A, 12}, { 0x0AE3, 12}, { 0x08D6, 12}, { 0x0490, 12}, { 0x0495, 12},
1521cabdff1aSopenharmony_ci{ 0x1F19, 13}, { 0x1DB5, 13}, { 0x0009,  4}, { 0x0010,  5}, { 0x0029,  6}, { 0x0062,  7},
1522cabdff1aSopenharmony_ci{ 0x00F3,  8}, { 0x00AD,  8}, { 0x01E5,  9}, { 0x0179,  9}, { 0x009C,  9}, { 0x03B1, 10},
1523cabdff1aSopenharmony_ci{ 0x02AE, 10}, { 0x0127, 10}, { 0x076E, 11}, { 0x0570, 11}, { 0x0275, 11}, { 0x0F25, 12},
1524cabdff1aSopenharmony_ci{ 0x0EC0, 12}, { 0x0AA0, 12}, { 0x08D7, 12}, { 0x1E4C, 13}, { 0x0008,  5}, { 0x0063,  7},
1525cabdff1aSopenharmony_ci{ 0x00AF,  8}, { 0x017B,  9}, { 0x03B3, 10}, { 0x07DD, 11}, { 0x0640, 11}, { 0x0F8D, 12},
1526cabdff1aSopenharmony_ci{ 0x0BC1, 12}, { 0x0491, 12}, { 0x0028,  6}, { 0x00C3,  8}, { 0x0151,  9}, { 0x02A1, 10},
1527cabdff1aSopenharmony_ci{ 0x0573, 11}, { 0x0EC3, 12}, { 0x1F35, 13}, { 0x0065,  7}, { 0x01DA,  9}, { 0x02AF, 10},
1528cabdff1aSopenharmony_ci{ 0x0277, 11}, { 0x08C9, 12}, { 0x1781, 13}, { 0x0025,  7}, { 0x0118,  9}, { 0x0646, 11},
1529cabdff1aSopenharmony_ci{ 0x0AA6, 12}, { 0x1780, 13}, { 0x00C9,  8}, { 0x0321, 10}, { 0x0F9B, 12}, { 0x191E, 13},
1530cabdff1aSopenharmony_ci{ 0x0048,  8}, { 0x07CC, 11}, { 0x0AA1, 12}, { 0x0180,  9}, { 0x0465, 11}, { 0x1905, 13},
1531cabdff1aSopenharmony_ci{ 0x03E2, 10}, { 0x0EC1, 12}, { 0x3C9B, 14}, { 0x02F4, 10}, { 0x08C8, 12}, { 0x07C1, 11},
1532cabdff1aSopenharmony_ci{ 0x0928, 13}, { 0x05E1, 11}, { 0x320D, 14}, { 0x0EC2, 12}, { 0x6418, 15}, { 0x1F34, 13},
1533cabdff1aSopenharmony_ci{ 0x0078,  7}, { 0x0155,  9}, { 0x0552, 11}, { 0x191F, 13}, { 0x00FA,  8}, { 0x07DC, 11},
1534cabdff1aSopenharmony_ci{ 0x1907, 13}, { 0x00AC,  8}, { 0x0249, 11}, { 0x13B1, 14}, { 0x01F6,  9}, { 0x0AE2, 12},
1535cabdff1aSopenharmony_ci{ 0x01DC,  9}, { 0x04ED, 12}, { 0x0184,  9}, { 0x1904, 13}, { 0x0156,  9}, { 0x09D9, 13},
1536cabdff1aSopenharmony_ci{ 0x03E7, 10}, { 0x0929, 13}, { 0x03B2, 10}, { 0x3B68, 14}, { 0x02F5, 10}, { 0x13B0, 14},
1537cabdff1aSopenharmony_ci{ 0x0322, 10}, { 0x3B69, 14}, { 0x0234, 10}, { 0x7935, 15}, { 0x07C7, 11}, { 0xC833, 16},
1538cabdff1aSopenharmony_ci{ 0x0660, 11}, { 0x7934, 15}, { 0x024B, 11}, { 0xC832, 16}, { 0x0AA7, 12}, { 0x1F18, 13},
1539cabdff1aSopenharmony_ci{ 0x007A,  7}
1540cabdff1aSopenharmony_ci},
1541cabdff1aSopenharmony_ci{
1542cabdff1aSopenharmony_ci{ 0x0002,  2}, { 0x0000,  3}, { 0x001E,  5}, { 0x0004,  5}, { 0x0012,  6}, { 0x0070,  7},
1543cabdff1aSopenharmony_ci{ 0x001A,  7}, { 0x005F,  8}, { 0x0047,  8}, { 0x01D3,  9}, { 0x00B5,  9}, { 0x0057,  9},
1544cabdff1aSopenharmony_ci{ 0x03B5, 10}, { 0x016D, 10}, { 0x0162, 10}, { 0x07CE, 11}, { 0x0719, 11}, { 0x0691, 11},
1545cabdff1aSopenharmony_ci{ 0x02C6, 11}, { 0x0156, 11}, { 0x0F92, 12}, { 0x0D2E, 12}, { 0x0D20, 12}, { 0x059E, 12},
1546cabdff1aSopenharmony_ci{ 0x0468, 12}, { 0x02A6, 12}, { 0x1DA2, 13}, { 0x1C60, 13}, { 0x1A43, 13}, { 0x0B1D, 13},
1547cabdff1aSopenharmony_ci{ 0x08C0, 13}, { 0x055D, 13}, { 0x0003,  3}, { 0x000A,  5}, { 0x0077,  7}, { 0x00E5,  8},
1548cabdff1aSopenharmony_ci{ 0x01D9,  9}, { 0x03E5, 10}, { 0x0166, 10}, { 0x0694, 11}, { 0x0152, 11}, { 0x059F, 12},
1549cabdff1aSopenharmony_ci{ 0x1F3C, 13}, { 0x1A4B, 13}, { 0x055E, 13}, { 0x000C,  4}, { 0x007D,  7}, { 0x0044,  8},
1550cabdff1aSopenharmony_ci{ 0x03E0, 10}, { 0x0769, 11}, { 0x0E31, 12}, { 0x1F26, 13}, { 0x055C, 13}, { 0x001B,  5},
1551cabdff1aSopenharmony_ci{ 0x00E2,  8}, { 0x03A5, 10}, { 0x02C9, 11}, { 0x1F23, 13}, { 0x3B47, 14}, { 0x0007,  5},
1552cabdff1aSopenharmony_ci{ 0x01D8,  9}, { 0x02D8, 11}, { 0x1F27, 13}, { 0x3494, 14}, { 0x0035,  6}, { 0x03E1, 10},
1553cabdff1aSopenharmony_ci{ 0x059C, 12}, { 0x38C3, 14}, { 0x000C,  6}, { 0x0165, 10}, { 0x1D23, 13}, { 0x1638, 14},
1554cabdff1aSopenharmony_ci{ 0x0068,  7}, { 0x0693, 11}, { 0x3A45, 14}, { 0x0020,  7}, { 0x0F90, 12}, { 0x7CF6, 15},
1555cabdff1aSopenharmony_ci{ 0x00E8,  8}, { 0x058F, 12}, { 0x2CEF, 15}, { 0x0045,  8}, { 0x0B3A, 13}, { 0x01F1,  9},
1556cabdff1aSopenharmony_ci{ 0x3B46, 14}, { 0x01A7,  9}, { 0x1676, 14}, { 0x0056,  9}, { 0x692A, 15}, { 0x038D, 10},
1557cabdff1aSopenharmony_ci{ 0xE309, 16}, { 0x00AA, 10}, { 0x1C611, 17}, { 0x02DF, 11}, { 0xB3B9, 17}, { 0x02C8, 11},
1558cabdff1aSopenharmony_ci{ 0x38C20, 18}, { 0x01B0, 11}, { 0x16390, 18}, { 0x0F9F, 12}, { 0x16771, 18}, { 0x0ED0, 12},
1559cabdff1aSopenharmony_ci{ 0x71843, 19}, { 0x0D2A, 12}, { 0xF9E8C, 20}, { 0x0461, 12}, { 0xF9E8E, 20}, { 0x0B67, 13},
1560cabdff1aSopenharmony_ci{ 0x055F, 13}, { 0x003F,  6}, { 0x006D,  9}, { 0x0E90, 12}, { 0x054E, 13}, { 0x0013,  6},
1561cabdff1aSopenharmony_ci{ 0x0119, 10}, { 0x0B66, 13}, { 0x000B,  6}, { 0x0235, 11}, { 0x7CF5, 15}, { 0x0075,  7},
1562cabdff1aSopenharmony_ci{ 0x0D24, 12}, { 0xF9E9, 16}, { 0x002E,  7}, { 0x1F22, 13}, { 0x0021,  7}, { 0x054F, 13},
1563cabdff1aSopenharmony_ci{ 0x0014,  7}, { 0x3A44, 14}, { 0x00E4,  8}, { 0x7CF7, 15}, { 0x005E,  8}, { 0x7185, 15},
1564cabdff1aSopenharmony_ci{ 0x0037,  8}, { 0x2C73, 15}, { 0x01DB,  9}, { 0x59DD, 16}, { 0x01C7,  9}, { 0x692B, 15},
1565cabdff1aSopenharmony_ci{ 0x01A6,  9}, { 0x58E5, 16}, { 0x00B4,  9}, { 0x1F3D0, 17}, { 0x00B0,  9}, { 0xB1C9, 17},
1566cabdff1aSopenharmony_ci{ 0x03E6, 10}, { 0x16770, 18}, { 0x016E, 10}, { 0x3E7A2, 18}, { 0x011B, 10}, { 0xF9E8D, 20},
1567cabdff1aSopenharmony_ci{ 0x00D9, 10}, { 0xF9E8F, 20}, { 0x00A8, 10}, { 0x2C723, 19}, { 0x0749, 11}, { 0xE3084, 20},
1568cabdff1aSopenharmony_ci{ 0x0696, 11}, { 0x58E45, 20}, { 0x02DE, 11}, { 0xB1C88, 21}, { 0x0231, 11}, { 0x1C610A, 21},
1569cabdff1aSopenharmony_ci{ 0x01B1, 11}, { 0x71842D, 23}, { 0x0D2B, 12}, { 0x38C217, 22}, { 0x0D2F, 12}, { 0x163913, 22},
1570cabdff1aSopenharmony_ci{ 0x05B2, 12}, { 0x163912, 22}, { 0x0469, 12}, { 0x71842C, 23}, { 0x1A42, 13}, { 0x08C1, 13},
1571cabdff1aSopenharmony_ci{ 0x0073,  7}
1572cabdff1aSopenharmony_ci}
1573cabdff1aSopenharmony_ci};
1574cabdff1aSopenharmony_ci
1575cabdff1aSopenharmony_cistatic const uint16_t vlc_offs[] = {
1576cabdff1aSopenharmony_ci        0,   520,   552,   616,  1128,  1160,  1224,  1740,  1772,  1836,  1900,  2436,
1577cabdff1aSopenharmony_ci     2986,  3050,  3610,  4154,  4218,  4746,  5326,  5390,  5902,  6554,  7658,  8342,
1578cabdff1aSopenharmony_ci     9304,  9988, 10630, 11234, 12174, 13006, 13560, 14232, 14786, 15432, 16350, 17522,
1579cabdff1aSopenharmony_ci    20372, 21818, 22330, 22394, 23166, 23678, 23742, 24820, 25332, 25396, 26460, 26980,
1580cabdff1aSopenharmony_ci    27048, 27592, 27600, 27608, 27616, 27624, 28224, 28258, 28290, 28802, 28834, 28866,
1581cabdff1aSopenharmony_ci    29378, 29412, 29444, 29960, 29994, 30026, 30538, 30572, 30604, 31120, 31154, 31186,
1582cabdff1aSopenharmony_ci    31714, 31746, 31778, 32306, 32340, 32372
1583cabdff1aSopenharmony_ci};
1584cabdff1aSopenharmony_ci
1585cabdff1aSopenharmony_cistatic av_cold void vc1_init_static(void)
1586cabdff1aSopenharmony_ci{
1587cabdff1aSopenharmony_ci    static VLCElem vlc_table[32372];
1588cabdff1aSopenharmony_ci
1589cabdff1aSopenharmony_ci    INIT_VLC_STATIC(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
1590cabdff1aSopenharmony_ci                    ff_vc1_bfraction_bits,  1, 1,
1591cabdff1aSopenharmony_ci                    ff_vc1_bfraction_codes, 1, 1, 1 << VC1_BFRACTION_VLC_BITS);
1592cabdff1aSopenharmony_ci    INIT_VLC_STATIC(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
1593cabdff1aSopenharmony_ci                    ff_vc1_norm2_bits,  1, 1,
1594cabdff1aSopenharmony_ci                    ff_vc1_norm2_codes, 1, 1, 1 << VC1_NORM2_VLC_BITS);
1595cabdff1aSopenharmony_ci    INIT_VLC_STATIC(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
1596cabdff1aSopenharmony_ci                    ff_vc1_norm6_bits,  1, 1,
1597cabdff1aSopenharmony_ci                    ff_vc1_norm6_codes, 2, 2, 556);
1598cabdff1aSopenharmony_ci    INIT_VLC_STATIC(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
1599cabdff1aSopenharmony_ci                    ff_vc1_imode_bits,  1, 1,
1600cabdff1aSopenharmony_ci                    ff_vc1_imode_codes, 1, 1, 1 << VC1_IMODE_VLC_BITS);
1601cabdff1aSopenharmony_ci    for (int i = 0; i < 3; i++) {
1602cabdff1aSopenharmony_ci        ff_vc1_ttmb_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 0]];
1603cabdff1aSopenharmony_ci        ff_vc1_ttmb_vlc[i].table_allocated = vlc_offs[i * 3 + 1] - vlc_offs[i * 3 + 0];
1604cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
1605cabdff1aSopenharmony_ci                 ff_vc1_ttmb_bits[i],  1, 1,
1606cabdff1aSopenharmony_ci                 ff_vc1_ttmb_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1607cabdff1aSopenharmony_ci        ff_vc1_ttblk_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 1]];
1608cabdff1aSopenharmony_ci        ff_vc1_ttblk_vlc[i].table_allocated = vlc_offs[i * 3 + 2] - vlc_offs[i * 3 + 1];
1609cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
1610cabdff1aSopenharmony_ci                 ff_vc1_ttblk_bits[i],  1, 1,
1611cabdff1aSopenharmony_ci                 ff_vc1_ttblk_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1612cabdff1aSopenharmony_ci        ff_vc1_subblkpat_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 2]];
1613cabdff1aSopenharmony_ci        ff_vc1_subblkpat_vlc[i].table_allocated = vlc_offs[i * 3 + 3] - vlc_offs[i * 3 + 2];
1614cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
1615cabdff1aSopenharmony_ci                 ff_vc1_subblkpat_bits[i],  1, 1,
1616cabdff1aSopenharmony_ci                 ff_vc1_subblkpat_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1617cabdff1aSopenharmony_ci    }
1618cabdff1aSopenharmony_ci    for (int i = 0; i < 4; i++) {
1619cabdff1aSopenharmony_ci        ff_vc1_4mv_block_pattern_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 9]];
1620cabdff1aSopenharmony_ci        ff_vc1_4mv_block_pattern_vlc[i].table_allocated = vlc_offs[i * 3 + 10] - vlc_offs[i * 3 + 9];
1621cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
1622cabdff1aSopenharmony_ci                 ff_vc1_4mv_block_pattern_bits[i],  1, 1,
1623cabdff1aSopenharmony_ci                 ff_vc1_4mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1624cabdff1aSopenharmony_ci        ff_vc1_cbpcy_p_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 10]];
1625cabdff1aSopenharmony_ci        ff_vc1_cbpcy_p_vlc[i].table_allocated = vlc_offs[i * 3 + 11] - vlc_offs[i * 3 + 10];
1626cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
1627cabdff1aSopenharmony_ci                 ff_vc1_cbpcy_p_bits[i],  1, 1,
1628cabdff1aSopenharmony_ci                 ff_vc1_cbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1629cabdff1aSopenharmony_ci        ff_vc1_mv_diff_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 11]];
1630cabdff1aSopenharmony_ci        ff_vc1_mv_diff_vlc[i].table_allocated = vlc_offs[i * 3 + 12] - vlc_offs[i * 3 + 11];
1631cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
1632cabdff1aSopenharmony_ci                 ff_vc1_mv_diff_bits[i],  1, 1,
1633cabdff1aSopenharmony_ci                 ff_vc1_mv_diff_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1634cabdff1aSopenharmony_ci    }
1635cabdff1aSopenharmony_ci    for (int i = 0; i < 8; i++) {
1636cabdff1aSopenharmony_ci        ff_vc1_ac_coeff_table[i].table           = &vlc_table[vlc_offs[i * 2 + 21]];
1637cabdff1aSopenharmony_ci        ff_vc1_ac_coeff_table[i].table_allocated = vlc_offs[i * 2 + 22] - vlc_offs[i * 2 + 21];
1638cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, ff_vc1_ac_sizes[i],
1639cabdff1aSopenharmony_ci                 &vc1_ac_tables[i][0][1], 8, 4,
1640cabdff1aSopenharmony_ci                 &vc1_ac_tables[i][0][0], 8, 4, INIT_VLC_USE_NEW_STATIC);
1641cabdff1aSopenharmony_ci        /* initialize interlaced MVDATA tables (2-Ref) */
1642cabdff1aSopenharmony_ci        ff_vc1_2ref_mvdata_vlc[i].table           = &vlc_table[vlc_offs[i * 2 + 22]];
1643cabdff1aSopenharmony_ci        ff_vc1_2ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 2 + 23] - vlc_offs[i * 2 + 22];
1644cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_2ref_mvdata_vlc[i], VC1_2REF_MVDATA_VLC_BITS, 126,
1645cabdff1aSopenharmony_ci                 ff_vc1_2ref_mvdata_bits[i],  1, 1,
1646cabdff1aSopenharmony_ci                 ff_vc1_2ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
1647cabdff1aSopenharmony_ci    }
1648cabdff1aSopenharmony_ci    for (int i = 0; i < 4; i++) {
1649cabdff1aSopenharmony_ci        /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
1650cabdff1aSopenharmony_ci        ff_vc1_intfr_4mv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 37]];
1651cabdff1aSopenharmony_ci        ff_vc1_intfr_4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 38] - vlc_offs[i * 3 + 37];
1652cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_intfr_4mv_mbmode_vlc[i], VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
1653cabdff1aSopenharmony_ci                 ff_vc1_intfr_4mv_mbmode_bits[i],  1, 1,
1654cabdff1aSopenharmony_ci                 ff_vc1_intfr_4mv_mbmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1655cabdff1aSopenharmony_ci        /* initialize NON-4MV MBMODE VLC tables for the same */
1656cabdff1aSopenharmony_ci        ff_vc1_intfr_non4mv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 38]];
1657cabdff1aSopenharmony_ci        ff_vc1_intfr_non4mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 39] - vlc_offs[i * 3 + 38];
1658cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_intfr_non4mv_mbmode_vlc[i], VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
1659cabdff1aSopenharmony_ci                 ff_vc1_intfr_non4mv_mbmode_bits[i],  1, 1,
1660cabdff1aSopenharmony_ci                 ff_vc1_intfr_non4mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1661cabdff1aSopenharmony_ci        /* initialize interlaced MVDATA tables (1-Ref) */
1662cabdff1aSopenharmony_ci        ff_vc1_1ref_mvdata_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 39]];
1663cabdff1aSopenharmony_ci        ff_vc1_1ref_mvdata_vlc[i].table_allocated = vlc_offs[i * 3 + 40] - vlc_offs[i * 3 + 39];
1664cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_1ref_mvdata_vlc[i], VC1_1REF_MVDATA_VLC_BITS, 72,
1665cabdff1aSopenharmony_ci                 ff_vc1_1ref_mvdata_bits[i],  1, 1,
1666cabdff1aSopenharmony_ci                 ff_vc1_1ref_mvdata_codes[i], 4, 4, INIT_VLC_USE_NEW_STATIC);
1667cabdff1aSopenharmony_ci    }
1668cabdff1aSopenharmony_ci    for (int i = 0; i < 4; i++) {
1669cabdff1aSopenharmony_ci        /* Initialize 2MV Block pattern VLC tables */
1670cabdff1aSopenharmony_ci        ff_vc1_2mv_block_pattern_vlc[i].table           = &vlc_table[vlc_offs[i + 49]];
1671cabdff1aSopenharmony_ci        ff_vc1_2mv_block_pattern_vlc[i].table_allocated = vlc_offs[i + 50] - vlc_offs[i + 49];
1672cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_2mv_block_pattern_vlc[i], VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
1673cabdff1aSopenharmony_ci                 ff_vc1_2mv_block_pattern_bits[i],  1, 1,
1674cabdff1aSopenharmony_ci                 ff_vc1_2mv_block_pattern_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1675cabdff1aSopenharmony_ci    }
1676cabdff1aSopenharmony_ci    for (int i = 0; i < 8; i++) {
1677cabdff1aSopenharmony_ci        /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
1678cabdff1aSopenharmony_ci        ff_vc1_icbpcy_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 53]];
1679cabdff1aSopenharmony_ci        ff_vc1_icbpcy_vlc[i].table_allocated = vlc_offs[i * 3 + 54] - vlc_offs[i * 3 + 53];
1680cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_icbpcy_vlc[i], VC1_ICBPCY_VLC_BITS, 63,
1681cabdff1aSopenharmony_ci                 ff_vc1_icbpcy_p_bits[i],  1, 1,
1682cabdff1aSopenharmony_ci                 ff_vc1_icbpcy_p_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
1683cabdff1aSopenharmony_ci        /* Initialize interlaced field picture MBMODE VLC tables */
1684cabdff1aSopenharmony_ci        ff_vc1_if_mmv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 54]];
1685cabdff1aSopenharmony_ci        ff_vc1_if_mmv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 55] - vlc_offs[i * 3 + 54];
1686cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_if_mmv_mbmode_vlc[i], VC1_IF_MMV_MBMODE_VLC_BITS, 8,
1687cabdff1aSopenharmony_ci                 ff_vc1_if_mmv_mbmode_bits[i],  1, 1,
1688cabdff1aSopenharmony_ci                 ff_vc1_if_mmv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1689cabdff1aSopenharmony_ci        ff_vc1_if_1mv_mbmode_vlc[i].table           = &vlc_table[vlc_offs[i * 3 + 55]];
1690cabdff1aSopenharmony_ci        ff_vc1_if_1mv_mbmode_vlc[i].table_allocated = vlc_offs[i * 3 + 56] - vlc_offs[i * 3 + 55];
1691cabdff1aSopenharmony_ci        init_vlc(&ff_vc1_if_1mv_mbmode_vlc[i], VC1_IF_1MV_MBMODE_VLC_BITS, 6,
1692cabdff1aSopenharmony_ci                 ff_vc1_if_1mv_mbmode_bits[i],  1, 1,
1693cabdff1aSopenharmony_ci                 ff_vc1_if_1mv_mbmode_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
1694cabdff1aSopenharmony_ci    }
1695cabdff1aSopenharmony_ci}
1696cabdff1aSopenharmony_ci
1697cabdff1aSopenharmony_ci/**
1698cabdff1aSopenharmony_ci * Init VC-1 specific tables and VC1Context members
1699cabdff1aSopenharmony_ci * @param v The VC1Context to initialize
1700cabdff1aSopenharmony_ci * @return Status
1701cabdff1aSopenharmony_ci */
1702cabdff1aSopenharmony_ciav_cold void ff_vc1_init_common(VC1Context *v)
1703cabdff1aSopenharmony_ci{
1704cabdff1aSopenharmony_ci    static AVOnce init_static_once = AV_ONCE_INIT;
1705cabdff1aSopenharmony_ci
1706cabdff1aSopenharmony_ci    /* defaults */
1707cabdff1aSopenharmony_ci    v->pq      = -1;
1708cabdff1aSopenharmony_ci    v->mvrange = 0; /* 7.1.1.18, p80 */
1709cabdff1aSopenharmony_ci
1710cabdff1aSopenharmony_ci    ff_vc1dsp_init(&v->vc1dsp);
1711cabdff1aSopenharmony_ci
1712cabdff1aSopenharmony_ci    /* VLC tables */
1713cabdff1aSopenharmony_ci    ff_thread_once(&init_static_once, vc1_init_static);
1714cabdff1aSopenharmony_ci}
1715