1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * VC-1 and WMV3 decoder
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 block decoding routines
27cabdff1aSopenharmony_ci */
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include "avcodec.h"
30cabdff1aSopenharmony_ci#include "mpegutils.h"
31cabdff1aSopenharmony_ci#include "mpegvideo.h"
32cabdff1aSopenharmony_ci#include "mpegvideodec.h"
33cabdff1aSopenharmony_ci#include "msmpeg4data.h"
34cabdff1aSopenharmony_ci#include "unary.h"
35cabdff1aSopenharmony_ci#include "vc1.h"
36cabdff1aSopenharmony_ci#include "vc1_pred.h"
37cabdff1aSopenharmony_ci#include "vc1acdata.h"
38cabdff1aSopenharmony_ci#include "vc1data.h"
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_ci#define MB_INTRA_VLC_BITS 9
41cabdff1aSopenharmony_ci#define DC_VLC_BITS 9
42cabdff1aSopenharmony_ci
43cabdff1aSopenharmony_ci// offset tables for interlaced picture MVDATA decoding
44cabdff1aSopenharmony_cistatic const uint8_t offset_table[2][9] = {
45cabdff1aSopenharmony_ci    {  0,  1,  2,  4,  8, 16, 32,  64, 128 },
46cabdff1aSopenharmony_ci    {  0,  1,  3,  7, 15, 31, 63, 127, 255 },
47cabdff1aSopenharmony_ci};
48cabdff1aSopenharmony_ci
49cabdff1aSopenharmony_ci// mapping table for internal block representation
50cabdff1aSopenharmony_cistatic const int block_map[6] = {0, 2, 1, 3, 4, 5};
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_ci/***********************************************************************/
53cabdff1aSopenharmony_ci/**
54cabdff1aSopenharmony_ci * @name VC-1 Bitplane decoding
55cabdff1aSopenharmony_ci * @see 8.7, p56
56cabdff1aSopenharmony_ci * @{
57cabdff1aSopenharmony_ci */
58cabdff1aSopenharmony_ci
59cabdff1aSopenharmony_ci
60cabdff1aSopenharmony_cistatic inline void init_block_index(VC1Context *v)
61cabdff1aSopenharmony_ci{
62cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
63cabdff1aSopenharmony_ci    ff_init_block_index(s);
64cabdff1aSopenharmony_ci    if (v->field_mode && !(v->second_field ^ v->tff)) {
65cabdff1aSopenharmony_ci        s->dest[0] += s->current_picture_ptr->f->linesize[0];
66cabdff1aSopenharmony_ci        s->dest[1] += s->current_picture_ptr->f->linesize[1];
67cabdff1aSopenharmony_ci        s->dest[2] += s->current_picture_ptr->f->linesize[2];
68cabdff1aSopenharmony_ci    }
69cabdff1aSopenharmony_ci}
70cabdff1aSopenharmony_ci
71cabdff1aSopenharmony_ci/** @} */ //Bitplane group
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_cistatic void vc1_put_blocks_clamped(VC1Context *v, int put_signed)
74cabdff1aSopenharmony_ci{
75cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
76cabdff1aSopenharmony_ci    uint8_t *dest;
77cabdff1aSopenharmony_ci    int block_count = CONFIG_GRAY && (s->avctx->flags & AV_CODEC_FLAG_GRAY) ? 4 : 6;
78cabdff1aSopenharmony_ci    int fieldtx = 0;
79cabdff1aSopenharmony_ci    int i;
80cabdff1aSopenharmony_ci
81cabdff1aSopenharmony_ci    /* The put pixels loop is one MB row and one MB column behind the decoding
82cabdff1aSopenharmony_ci     * loop because we can only put pixels when overlap filtering is done. For
83cabdff1aSopenharmony_ci     * interlaced frame pictures, however, the put pixels loop is only one
84cabdff1aSopenharmony_ci     * column behind the decoding loop as interlaced frame pictures only need
85cabdff1aSopenharmony_ci     * horizontal overlap filtering. */
86cabdff1aSopenharmony_ci    if (!s->first_slice_line && v->fcm != ILACE_FRAME) {
87cabdff1aSopenharmony_ci        if (s->mb_x) {
88cabdff1aSopenharmony_ci            for (i = 0; i < block_count; i++) {
89cabdff1aSopenharmony_ci                if (i > 3 ? v->mb_type[0][s->block_index[i] - s->block_wrap[i] - 1] :
90cabdff1aSopenharmony_ci                            v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i] - 2]) {
91cabdff1aSopenharmony_ci                    dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + ((i & 1) - 2) * 8;
92cabdff1aSopenharmony_ci                    if (put_signed)
93cabdff1aSopenharmony_ci                        s->idsp.put_signed_pixels_clamped(v->block[v->topleft_blk_idx][block_map[i]],
94cabdff1aSopenharmony_ci                                                          i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest,
95cabdff1aSopenharmony_ci                                                          i > 3 ? s->uvlinesize : s->linesize);
96cabdff1aSopenharmony_ci                    else
97cabdff1aSopenharmony_ci                        s->idsp.put_pixels_clamped(v->block[v->topleft_blk_idx][block_map[i]],
98cabdff1aSopenharmony_ci                                                   i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize - 8 : dest,
99cabdff1aSopenharmony_ci                                                   i > 3 ? s->uvlinesize : s->linesize);
100cabdff1aSopenharmony_ci                }
101cabdff1aSopenharmony_ci            }
102cabdff1aSopenharmony_ci        }
103cabdff1aSopenharmony_ci        if (s->mb_x == v->end_mb_x - 1) {
104cabdff1aSopenharmony_ci            for (i = 0; i < block_count; i++) {
105cabdff1aSopenharmony_ci                if (i > 3 ? v->mb_type[0][s->block_index[i] - s->block_wrap[i]] :
106cabdff1aSopenharmony_ci                            v->mb_type[0][s->block_index[i] - 2 * s->block_wrap[i]]) {
107cabdff1aSopenharmony_ci                    dest = s->dest[0] + ((i & 2) - 4) * 4 * s->linesize + (i & 1) * 8;
108cabdff1aSopenharmony_ci                    if (put_signed)
109cabdff1aSopenharmony_ci                        s->idsp.put_signed_pixels_clamped(v->block[v->top_blk_idx][block_map[i]],
110cabdff1aSopenharmony_ci                                                          i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest,
111cabdff1aSopenharmony_ci                                                          i > 3 ? s->uvlinesize : s->linesize);
112cabdff1aSopenharmony_ci                    else
113cabdff1aSopenharmony_ci                        s->idsp.put_pixels_clamped(v->block[v->top_blk_idx][block_map[i]],
114cabdff1aSopenharmony_ci                                                   i > 3 ? s->dest[i - 3] - 8 * s->uvlinesize : dest,
115cabdff1aSopenharmony_ci                                                   i > 3 ? s->uvlinesize : s->linesize);
116cabdff1aSopenharmony_ci                }
117cabdff1aSopenharmony_ci            }
118cabdff1aSopenharmony_ci        }
119cabdff1aSopenharmony_ci    }
120cabdff1aSopenharmony_ci    if (s->mb_y == s->end_mb_y - 1 || v->fcm == ILACE_FRAME) {
121cabdff1aSopenharmony_ci        if (s->mb_x) {
122cabdff1aSopenharmony_ci            if (v->fcm == ILACE_FRAME)
123cabdff1aSopenharmony_ci                fieldtx = v->fieldtx_plane[s->mb_y * s->mb_stride + s->mb_x - 1];
124cabdff1aSopenharmony_ci            for (i = 0; i < block_count; i++) {
125cabdff1aSopenharmony_ci                if (i > 3 ? v->mb_type[0][s->block_index[i] - 1] :
126cabdff1aSopenharmony_ci                            v->mb_type[0][s->block_index[i] - 2]) {
127cabdff1aSopenharmony_ci                    if (fieldtx)
128cabdff1aSopenharmony_ci                        dest = s->dest[0] + ((i & 2) >> 1) * s->linesize + ((i & 1) - 2) * 8;
129cabdff1aSopenharmony_ci                    else
130cabdff1aSopenharmony_ci                        dest = s->dest[0] + (i & 2) * 4 * s->linesize + ((i & 1) - 2) * 8;
131cabdff1aSopenharmony_ci                    if (put_signed)
132cabdff1aSopenharmony_ci                        s->idsp.put_signed_pixels_clamped(v->block[v->left_blk_idx][block_map[i]],
133cabdff1aSopenharmony_ci                                                          i > 3 ? s->dest[i - 3] - 8 : dest,
134cabdff1aSopenharmony_ci                                                          i > 3 ? s->uvlinesize : s->linesize << fieldtx);
135cabdff1aSopenharmony_ci                    else
136cabdff1aSopenharmony_ci                        s->idsp.put_pixels_clamped(v->block[v->left_blk_idx][block_map[i]],
137cabdff1aSopenharmony_ci                                                   i > 3 ? s->dest[i - 3] - 8 : dest,
138cabdff1aSopenharmony_ci                                                   i > 3 ? s->uvlinesize : s->linesize << fieldtx);
139cabdff1aSopenharmony_ci                }
140cabdff1aSopenharmony_ci            }
141cabdff1aSopenharmony_ci        }
142cabdff1aSopenharmony_ci        if (s->mb_x == v->end_mb_x - 1) {
143cabdff1aSopenharmony_ci            if (v->fcm == ILACE_FRAME)
144cabdff1aSopenharmony_ci                fieldtx = v->fieldtx_plane[s->mb_y * s->mb_stride + s->mb_x];
145cabdff1aSopenharmony_ci            for (i = 0; i < block_count; i++) {
146cabdff1aSopenharmony_ci                if (v->mb_type[0][s->block_index[i]]) {
147cabdff1aSopenharmony_ci                    if (fieldtx)
148cabdff1aSopenharmony_ci                        dest = s->dest[0] + ((i & 2) >> 1) * s->linesize + (i & 1) * 8;
149cabdff1aSopenharmony_ci                    else
150cabdff1aSopenharmony_ci                        dest = s->dest[0] + (i & 2) * 4 * s->linesize + (i & 1) * 8;
151cabdff1aSopenharmony_ci                    if (put_signed)
152cabdff1aSopenharmony_ci                        s->idsp.put_signed_pixels_clamped(v->block[v->cur_blk_idx][block_map[i]],
153cabdff1aSopenharmony_ci                                                          i > 3 ? s->dest[i - 3] : dest,
154cabdff1aSopenharmony_ci                                                          i > 3 ? s->uvlinesize : s->linesize << fieldtx);
155cabdff1aSopenharmony_ci                    else
156cabdff1aSopenharmony_ci                        s->idsp.put_pixels_clamped(v->block[v->cur_blk_idx][block_map[i]],
157cabdff1aSopenharmony_ci                                                   i > 3 ? s->dest[i - 3] : dest,
158cabdff1aSopenharmony_ci                                                   i > 3 ? s->uvlinesize : s->linesize << fieldtx);
159cabdff1aSopenharmony_ci                }
160cabdff1aSopenharmony_ci            }
161cabdff1aSopenharmony_ci        }
162cabdff1aSopenharmony_ci    }
163cabdff1aSopenharmony_ci}
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_ci#define inc_blk_idx(idx) do { \
166cabdff1aSopenharmony_ci        idx++; \
167cabdff1aSopenharmony_ci        if (idx >= v->n_allocated_blks) \
168cabdff1aSopenharmony_ci            idx = 0; \
169cabdff1aSopenharmony_ci    } while (0)
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ci/***********************************************************************/
172cabdff1aSopenharmony_ci/**
173cabdff1aSopenharmony_ci * @name VC-1 Block-level functions
174cabdff1aSopenharmony_ci * @see 7.1.4, p91 and 8.1.1.7, p(1)04
175cabdff1aSopenharmony_ci * @{
176cabdff1aSopenharmony_ci */
177cabdff1aSopenharmony_ci
178cabdff1aSopenharmony_ci/**
179cabdff1aSopenharmony_ci * @def GET_MQUANT
180cabdff1aSopenharmony_ci * @brief Get macroblock-level quantizer scale
181cabdff1aSopenharmony_ci */
182cabdff1aSopenharmony_ci#define GET_MQUANT()                                           \
183cabdff1aSopenharmony_ci    if (v->dquantfrm) {                                        \
184cabdff1aSopenharmony_ci        int edges = 0;                                         \
185cabdff1aSopenharmony_ci        if (v->dqprofile == DQPROFILE_ALL_MBS) {               \
186cabdff1aSopenharmony_ci            if (v->dqbilevel) {                                \
187cabdff1aSopenharmony_ci                mquant = (get_bits1(gb)) ? -v->altpq : v->pq;  \
188cabdff1aSopenharmony_ci            } else {                                           \
189cabdff1aSopenharmony_ci                mqdiff = get_bits(gb, 3);                      \
190cabdff1aSopenharmony_ci                if (mqdiff != 7)                               \
191cabdff1aSopenharmony_ci                    mquant = -v->pq - mqdiff;                  \
192cabdff1aSopenharmony_ci                else                                           \
193cabdff1aSopenharmony_ci                    mquant = -get_bits(gb, 5);                 \
194cabdff1aSopenharmony_ci            }                                                  \
195cabdff1aSopenharmony_ci        }                                                      \
196cabdff1aSopenharmony_ci        if (v->dqprofile == DQPROFILE_SINGLE_EDGE)             \
197cabdff1aSopenharmony_ci            edges = 1 << v->dqsbedge;                          \
198cabdff1aSopenharmony_ci        else if (v->dqprofile == DQPROFILE_DOUBLE_EDGES)       \
199cabdff1aSopenharmony_ci            edges = (3 << v->dqsbedge) % 15;                   \
200cabdff1aSopenharmony_ci        else if (v->dqprofile == DQPROFILE_FOUR_EDGES)         \
201cabdff1aSopenharmony_ci            edges = 15;                                        \
202cabdff1aSopenharmony_ci        if ((edges&1) && !s->mb_x)                             \
203cabdff1aSopenharmony_ci            mquant = -v->altpq;                                \
204cabdff1aSopenharmony_ci        if ((edges&2) && !s->mb_y)                             \
205cabdff1aSopenharmony_ci            mquant = -v->altpq;                                \
206cabdff1aSopenharmony_ci        if ((edges&4) && s->mb_x == (s->mb_width - 1))         \
207cabdff1aSopenharmony_ci            mquant = -v->altpq;                                \
208cabdff1aSopenharmony_ci        if ((edges&8) &&                                       \
209cabdff1aSopenharmony_ci            s->mb_y == ((s->mb_height >> v->field_mode) - 1))  \
210cabdff1aSopenharmony_ci            mquant = -v->altpq;                                \
211cabdff1aSopenharmony_ci        if (!mquant || mquant > 31 || mquant < -31) {                          \
212cabdff1aSopenharmony_ci            av_log(v->s.avctx, AV_LOG_ERROR,                   \
213cabdff1aSopenharmony_ci                   "Overriding invalid mquant %d\n", mquant);  \
214cabdff1aSopenharmony_ci            mquant = 1;                                        \
215cabdff1aSopenharmony_ci        }                                                      \
216cabdff1aSopenharmony_ci    }
217cabdff1aSopenharmony_ci
218cabdff1aSopenharmony_ci/**
219cabdff1aSopenharmony_ci * @def GET_MVDATA(_dmv_x, _dmv_y)
220cabdff1aSopenharmony_ci * @brief Get MV differentials
221cabdff1aSopenharmony_ci * @see MVDATA decoding from 8.3.5.2, p(1)20
222cabdff1aSopenharmony_ci * @param _dmv_x Horizontal differential for decoded MV
223cabdff1aSopenharmony_ci * @param _dmv_y Vertical differential for decoded MV
224cabdff1aSopenharmony_ci */
225cabdff1aSopenharmony_ci#define GET_MVDATA(_dmv_x, _dmv_y)                                      \
226cabdff1aSopenharmony_ci    index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table, \
227cabdff1aSopenharmony_ci                         VC1_MV_DIFF_VLC_BITS, 2);                      \
228cabdff1aSopenharmony_ci    if (index > 36) {                                                   \
229cabdff1aSopenharmony_ci        mb_has_coeffs = 1;                                              \
230cabdff1aSopenharmony_ci        index -= 37;                                                    \
231cabdff1aSopenharmony_ci    } else                                                              \
232cabdff1aSopenharmony_ci        mb_has_coeffs = 0;                                              \
233cabdff1aSopenharmony_ci    s->mb_intra = 0;                                                    \
234cabdff1aSopenharmony_ci    if (!index) {                                                       \
235cabdff1aSopenharmony_ci        _dmv_x = _dmv_y = 0;                                            \
236cabdff1aSopenharmony_ci    } else if (index == 35) {                                           \
237cabdff1aSopenharmony_ci        _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample);          \
238cabdff1aSopenharmony_ci        _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample);          \
239cabdff1aSopenharmony_ci    } else if (index == 36) {                                           \
240cabdff1aSopenharmony_ci        _dmv_x = 0;                                                     \
241cabdff1aSopenharmony_ci        _dmv_y = 0;                                                     \
242cabdff1aSopenharmony_ci        s->mb_intra = 1;                                                \
243cabdff1aSopenharmony_ci    } else {                                                            \
244cabdff1aSopenharmony_ci        index1 = index % 6;                                             \
245cabdff1aSopenharmony_ci        _dmv_x = offset_table[1][index1];                               \
246cabdff1aSopenharmony_ci        val = size_table[index1] - (!s->quarter_sample && index1 == 5); \
247cabdff1aSopenharmony_ci        if (val > 0) {                                                  \
248cabdff1aSopenharmony_ci            val = get_bits(gb, val);                                    \
249cabdff1aSopenharmony_ci            sign = 0 - (val & 1);                                       \
250cabdff1aSopenharmony_ci            _dmv_x = (sign ^ ((val >> 1) + _dmv_x)) - sign;             \
251cabdff1aSopenharmony_ci        }                                                               \
252cabdff1aSopenharmony_ci                                                                        \
253cabdff1aSopenharmony_ci        index1 = index / 6;                                             \
254cabdff1aSopenharmony_ci        _dmv_y = offset_table[1][index1];                               \
255cabdff1aSopenharmony_ci        val = size_table[index1] - (!s->quarter_sample && index1 == 5); \
256cabdff1aSopenharmony_ci        if (val > 0) {                                                  \
257cabdff1aSopenharmony_ci            val = get_bits(gb, val);                                    \
258cabdff1aSopenharmony_ci            sign = 0 - (val & 1);                                       \
259cabdff1aSopenharmony_ci            _dmv_y = (sign ^ ((val >> 1) + _dmv_y)) - sign;             \
260cabdff1aSopenharmony_ci        }                                                               \
261cabdff1aSopenharmony_ci    }
262cabdff1aSopenharmony_ci
263cabdff1aSopenharmony_cistatic av_always_inline void get_mvdata_interlaced(VC1Context *v, int *dmv_x,
264cabdff1aSopenharmony_ci                                                   int *dmv_y, int *pred_flag)
265cabdff1aSopenharmony_ci{
266cabdff1aSopenharmony_ci    int index, index1;
267cabdff1aSopenharmony_ci    int extend_x, extend_y;
268cabdff1aSopenharmony_ci    GetBitContext *gb = &v->s.gb;
269cabdff1aSopenharmony_ci    int bits, esc;
270cabdff1aSopenharmony_ci    int val, sign;
271cabdff1aSopenharmony_ci
272cabdff1aSopenharmony_ci    if (v->numref) {
273cabdff1aSopenharmony_ci        bits = VC1_2REF_MVDATA_VLC_BITS;
274cabdff1aSopenharmony_ci        esc  = 125;
275cabdff1aSopenharmony_ci    } else {
276cabdff1aSopenharmony_ci        bits = VC1_1REF_MVDATA_VLC_BITS;
277cabdff1aSopenharmony_ci        esc  = 71;
278cabdff1aSopenharmony_ci    }
279cabdff1aSopenharmony_ci    extend_x = v->dmvrange & 1;
280cabdff1aSopenharmony_ci    extend_y = (v->dmvrange >> 1) & 1;
281cabdff1aSopenharmony_ci    index = get_vlc2(gb, v->imv_vlc->table, bits, 3);
282cabdff1aSopenharmony_ci    if (index == esc) {
283cabdff1aSopenharmony_ci        *dmv_x = get_bits(gb, v->k_x);
284cabdff1aSopenharmony_ci        *dmv_y = get_bits(gb, v->k_y);
285cabdff1aSopenharmony_ci        if (v->numref) {
286cabdff1aSopenharmony_ci            if (pred_flag)
287cabdff1aSopenharmony_ci                *pred_flag = *dmv_y & 1;
288cabdff1aSopenharmony_ci            *dmv_y = (*dmv_y + (*dmv_y & 1)) >> 1;
289cabdff1aSopenharmony_ci        }
290cabdff1aSopenharmony_ci    }
291cabdff1aSopenharmony_ci    else {
292cabdff1aSopenharmony_ci        av_assert0(index < esc);
293cabdff1aSopenharmony_ci        index1 = (index + 1) % 9;
294cabdff1aSopenharmony_ci        if (index1 != 0) {
295cabdff1aSopenharmony_ci            val    = get_bits(gb, index1 + extend_x);
296cabdff1aSopenharmony_ci            sign   = 0 - (val & 1);
297cabdff1aSopenharmony_ci            *dmv_x = (sign ^ ((val >> 1) + offset_table[extend_x][index1])) - sign;
298cabdff1aSopenharmony_ci        } else
299cabdff1aSopenharmony_ci            *dmv_x = 0;
300cabdff1aSopenharmony_ci        index1 = (index + 1) / 9;
301cabdff1aSopenharmony_ci        if (index1 > v->numref) {
302cabdff1aSopenharmony_ci            val    = get_bits(gb, (index1 >> v->numref) + extend_y);
303cabdff1aSopenharmony_ci            sign   = 0 - (val & 1);
304cabdff1aSopenharmony_ci            *dmv_y = (sign ^ ((val >> 1) + offset_table[extend_y][index1 >> v->numref])) - sign;
305cabdff1aSopenharmony_ci        } else
306cabdff1aSopenharmony_ci            *dmv_y = 0;
307cabdff1aSopenharmony_ci        if (v->numref && pred_flag)
308cabdff1aSopenharmony_ci            *pred_flag = index1 & 1;
309cabdff1aSopenharmony_ci    }
310cabdff1aSopenharmony_ci}
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci/** Reconstruct motion vector for B-frame and do motion compensation
313cabdff1aSopenharmony_ci */
314cabdff1aSopenharmony_cistatic inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2],
315cabdff1aSopenharmony_ci                            int direct, int mode)
316cabdff1aSopenharmony_ci{
317cabdff1aSopenharmony_ci    if (direct) {
318cabdff1aSopenharmony_ci        ff_vc1_mc_1mv(v, 0);
319cabdff1aSopenharmony_ci        ff_vc1_interp_mc(v);
320cabdff1aSopenharmony_ci        return;
321cabdff1aSopenharmony_ci    }
322cabdff1aSopenharmony_ci    if (mode == BMV_TYPE_INTERPOLATED) {
323cabdff1aSopenharmony_ci        ff_vc1_mc_1mv(v, 0);
324cabdff1aSopenharmony_ci        ff_vc1_interp_mc(v);
325cabdff1aSopenharmony_ci        return;
326cabdff1aSopenharmony_ci    }
327cabdff1aSopenharmony_ci
328cabdff1aSopenharmony_ci    ff_vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
329cabdff1aSopenharmony_ci}
330cabdff1aSopenharmony_ci
331cabdff1aSopenharmony_ci/** Get predicted DC value for I-frames only
332cabdff1aSopenharmony_ci * prediction dir: left=0, top=1
333cabdff1aSopenharmony_ci * @param s MpegEncContext
334cabdff1aSopenharmony_ci * @param overlap flag indicating that overlap filtering is used
335cabdff1aSopenharmony_ci * @param pq integer part of picture quantizer
336cabdff1aSopenharmony_ci * @param[in] n block index in the current MB
337cabdff1aSopenharmony_ci * @param dc_val_ptr Pointer to DC predictor
338cabdff1aSopenharmony_ci * @param dir_ptr Prediction direction for use in AC prediction
339cabdff1aSopenharmony_ci */
340cabdff1aSopenharmony_cistatic inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
341cabdff1aSopenharmony_ci                                int16_t **dc_val_ptr, int *dir_ptr)
342cabdff1aSopenharmony_ci{
343cabdff1aSopenharmony_ci    int a, b, c, wrap, pred, scale;
344cabdff1aSopenharmony_ci    int16_t *dc_val;
345cabdff1aSopenharmony_ci    static const uint16_t dcpred[32] = {
346cabdff1aSopenharmony_ci        -1, 1024,  512,  341,  256,  205,  171,  146,  128,
347cabdff1aSopenharmony_ci             114,  102,   93,   85,   79,   73,   68,   64,
348cabdff1aSopenharmony_ci              60,   57,   54,   51,   49,   47,   45,   43,
349cabdff1aSopenharmony_ci              41,   39,   38,   37,   35,   34,   33
350cabdff1aSopenharmony_ci    };
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_ci    /* find prediction - wmv3_dc_scale always used here in fact */
353cabdff1aSopenharmony_ci    if (n < 4) scale = s->y_dc_scale;
354cabdff1aSopenharmony_ci    else       scale = s->c_dc_scale;
355cabdff1aSopenharmony_ci
356cabdff1aSopenharmony_ci    wrap   = s->block_wrap[n];
357cabdff1aSopenharmony_ci    dc_val = s->dc_val[0] + s->block_index[n];
358cabdff1aSopenharmony_ci
359cabdff1aSopenharmony_ci    /* B A
360cabdff1aSopenharmony_ci     * C X
361cabdff1aSopenharmony_ci     */
362cabdff1aSopenharmony_ci    c = dc_val[ - 1];
363cabdff1aSopenharmony_ci    b = dc_val[ - 1 - wrap];
364cabdff1aSopenharmony_ci    a = dc_val[ - wrap];
365cabdff1aSopenharmony_ci
366cabdff1aSopenharmony_ci    if (pq < 9 || !overlap) {
367cabdff1aSopenharmony_ci        /* Set outer values */
368cabdff1aSopenharmony_ci        if (s->first_slice_line && (n != 2 && n != 3))
369cabdff1aSopenharmony_ci            b = a = dcpred[scale];
370cabdff1aSopenharmony_ci        if (s->mb_x == 0 && (n != 1 && n != 3))
371cabdff1aSopenharmony_ci            b = c = dcpred[scale];
372cabdff1aSopenharmony_ci    } else {
373cabdff1aSopenharmony_ci        /* Set outer values */
374cabdff1aSopenharmony_ci        if (s->first_slice_line && (n != 2 && n != 3))
375cabdff1aSopenharmony_ci            b = a = 0;
376cabdff1aSopenharmony_ci        if (s->mb_x == 0 && (n != 1 && n != 3))
377cabdff1aSopenharmony_ci            b = c = 0;
378cabdff1aSopenharmony_ci    }
379cabdff1aSopenharmony_ci
380cabdff1aSopenharmony_ci    if (abs(a - b) <= abs(b - c)) {
381cabdff1aSopenharmony_ci        pred     = c;
382cabdff1aSopenharmony_ci        *dir_ptr = 1; // left
383cabdff1aSopenharmony_ci    } else {
384cabdff1aSopenharmony_ci        pred     = a;
385cabdff1aSopenharmony_ci        *dir_ptr = 0; // top
386cabdff1aSopenharmony_ci    }
387cabdff1aSopenharmony_ci
388cabdff1aSopenharmony_ci    /* update predictor */
389cabdff1aSopenharmony_ci    *dc_val_ptr = &dc_val[0];
390cabdff1aSopenharmony_ci    return pred;
391cabdff1aSopenharmony_ci}
392cabdff1aSopenharmony_ci
393cabdff1aSopenharmony_ci
394cabdff1aSopenharmony_ci/** Get predicted DC value
395cabdff1aSopenharmony_ci * prediction dir: left=0, top=1
396cabdff1aSopenharmony_ci * @param s MpegEncContext
397cabdff1aSopenharmony_ci * @param overlap flag indicating that overlap filtering is used
398cabdff1aSopenharmony_ci * @param pq integer part of picture quantizer
399cabdff1aSopenharmony_ci * @param[in] n block index in the current MB
400cabdff1aSopenharmony_ci * @param a_avail flag indicating top block availability
401cabdff1aSopenharmony_ci * @param c_avail flag indicating left block availability
402cabdff1aSopenharmony_ci * @param dc_val_ptr Pointer to DC predictor
403cabdff1aSopenharmony_ci * @param dir_ptr Prediction direction for use in AC prediction
404cabdff1aSopenharmony_ci */
405cabdff1aSopenharmony_cistatic inline int ff_vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
406cabdff1aSopenharmony_ci                              int a_avail, int c_avail,
407cabdff1aSopenharmony_ci                              int16_t **dc_val_ptr, int *dir_ptr)
408cabdff1aSopenharmony_ci{
409cabdff1aSopenharmony_ci    int a, b, c, wrap, pred;
410cabdff1aSopenharmony_ci    int16_t *dc_val;
411cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
412cabdff1aSopenharmony_ci    int q1, q2 = 0;
413cabdff1aSopenharmony_ci    int dqscale_index;
414cabdff1aSopenharmony_ci
415cabdff1aSopenharmony_ci    /* scale predictors if needed */
416cabdff1aSopenharmony_ci    q1 = FFABS(s->current_picture.qscale_table[mb_pos]);
417cabdff1aSopenharmony_ci    dqscale_index = s->y_dc_scale_table[q1] - 1;
418cabdff1aSopenharmony_ci    if (dqscale_index < 0)
419cabdff1aSopenharmony_ci        return 0;
420cabdff1aSopenharmony_ci
421cabdff1aSopenharmony_ci    wrap = s->block_wrap[n];
422cabdff1aSopenharmony_ci    dc_val = s->dc_val[0] + s->block_index[n];
423cabdff1aSopenharmony_ci
424cabdff1aSopenharmony_ci    /* B A
425cabdff1aSopenharmony_ci     * C X
426cabdff1aSopenharmony_ci     */
427cabdff1aSopenharmony_ci    c = dc_val[ - 1];
428cabdff1aSopenharmony_ci    b = dc_val[ - 1 - wrap];
429cabdff1aSopenharmony_ci    a = dc_val[ - wrap];
430cabdff1aSopenharmony_ci
431cabdff1aSopenharmony_ci    if (c_avail && (n != 1 && n != 3)) {
432cabdff1aSopenharmony_ci        q2 = FFABS(s->current_picture.qscale_table[mb_pos - 1]);
433cabdff1aSopenharmony_ci        if (q2 && q2 != q1)
434cabdff1aSopenharmony_ci            c = (int)((unsigned)c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
435cabdff1aSopenharmony_ci    }
436cabdff1aSopenharmony_ci    if (a_avail && (n != 2 && n != 3)) {
437cabdff1aSopenharmony_ci        q2 = FFABS(s->current_picture.qscale_table[mb_pos - s->mb_stride]);
438cabdff1aSopenharmony_ci        if (q2 && q2 != q1)
439cabdff1aSopenharmony_ci            a = (int)((unsigned)a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
440cabdff1aSopenharmony_ci    }
441cabdff1aSopenharmony_ci    if (a_avail && c_avail && (n != 3)) {
442cabdff1aSopenharmony_ci        int off = mb_pos;
443cabdff1aSopenharmony_ci        if (n != 1)
444cabdff1aSopenharmony_ci            off--;
445cabdff1aSopenharmony_ci        if (n != 2)
446cabdff1aSopenharmony_ci            off -= s->mb_stride;
447cabdff1aSopenharmony_ci        q2 = FFABS(s->current_picture.qscale_table[off]);
448cabdff1aSopenharmony_ci        if (q2 && q2 != q1)
449cabdff1aSopenharmony_ci            b = (int)((unsigned)b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[dqscale_index] + 0x20000) >> 18;
450cabdff1aSopenharmony_ci    }
451cabdff1aSopenharmony_ci
452cabdff1aSopenharmony_ci    if (c_avail && (!a_avail || abs(a - b) <= abs(b - c))) {
453cabdff1aSopenharmony_ci        pred     = c;
454cabdff1aSopenharmony_ci        *dir_ptr = 1; // left
455cabdff1aSopenharmony_ci    } else if (a_avail) {
456cabdff1aSopenharmony_ci        pred     = a;
457cabdff1aSopenharmony_ci        *dir_ptr = 0; // top
458cabdff1aSopenharmony_ci    } else {
459cabdff1aSopenharmony_ci        pred     = 0;
460cabdff1aSopenharmony_ci        *dir_ptr = 1; // left
461cabdff1aSopenharmony_ci    }
462cabdff1aSopenharmony_ci
463cabdff1aSopenharmony_ci    /* update predictor */
464cabdff1aSopenharmony_ci    *dc_val_ptr = &dc_val[0];
465cabdff1aSopenharmony_ci    return pred;
466cabdff1aSopenharmony_ci}
467cabdff1aSopenharmony_ci
468cabdff1aSopenharmony_ci/** @} */ // Block group
469cabdff1aSopenharmony_ci
470cabdff1aSopenharmony_ci/**
471cabdff1aSopenharmony_ci * @name VC1 Macroblock-level functions in Simple/Main Profiles
472cabdff1aSopenharmony_ci * @see 7.1.4, p91 and 8.1.1.7, p(1)04
473cabdff1aSopenharmony_ci * @{
474cabdff1aSopenharmony_ci */
475cabdff1aSopenharmony_ci
476cabdff1aSopenharmony_cistatic inline int vc1_coded_block_pred(MpegEncContext * s, int n,
477cabdff1aSopenharmony_ci                                       uint8_t **coded_block_ptr)
478cabdff1aSopenharmony_ci{
479cabdff1aSopenharmony_ci    int xy, wrap, pred, a, b, c;
480cabdff1aSopenharmony_ci
481cabdff1aSopenharmony_ci    xy   = s->block_index[n];
482cabdff1aSopenharmony_ci    wrap = s->b8_stride;
483cabdff1aSopenharmony_ci
484cabdff1aSopenharmony_ci    /* B C
485cabdff1aSopenharmony_ci     * A X
486cabdff1aSopenharmony_ci     */
487cabdff1aSopenharmony_ci    a = s->coded_block[xy - 1       ];
488cabdff1aSopenharmony_ci    b = s->coded_block[xy - 1 - wrap];
489cabdff1aSopenharmony_ci    c = s->coded_block[xy     - wrap];
490cabdff1aSopenharmony_ci
491cabdff1aSopenharmony_ci    if (b == c) {
492cabdff1aSopenharmony_ci        pred = a;
493cabdff1aSopenharmony_ci    } else {
494cabdff1aSopenharmony_ci        pred = c;
495cabdff1aSopenharmony_ci    }
496cabdff1aSopenharmony_ci
497cabdff1aSopenharmony_ci    /* store value */
498cabdff1aSopenharmony_ci    *coded_block_ptr = &s->coded_block[xy];
499cabdff1aSopenharmony_ci
500cabdff1aSopenharmony_ci    return pred;
501cabdff1aSopenharmony_ci}
502cabdff1aSopenharmony_ci
503cabdff1aSopenharmony_ci/**
504cabdff1aSopenharmony_ci * Decode one AC coefficient
505cabdff1aSopenharmony_ci * @param v The VC1 context
506cabdff1aSopenharmony_ci * @param last Last coefficient
507cabdff1aSopenharmony_ci * @param skip How much zero coefficients to skip
508cabdff1aSopenharmony_ci * @param value Decoded AC coefficient value
509cabdff1aSopenharmony_ci * @param codingset set of VLC to decode data
510cabdff1aSopenharmony_ci * @see 8.1.3.4
511cabdff1aSopenharmony_ci */
512cabdff1aSopenharmony_cistatic int vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip,
513cabdff1aSopenharmony_ci                                int *value, int codingset)
514cabdff1aSopenharmony_ci{
515cabdff1aSopenharmony_ci    GetBitContext *gb = &v->s.gb;
516cabdff1aSopenharmony_ci    int index, run, level, lst, sign;
517cabdff1aSopenharmony_ci
518cabdff1aSopenharmony_ci    index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
519cabdff1aSopenharmony_ci    if (index < 0)
520cabdff1aSopenharmony_ci        return index;
521cabdff1aSopenharmony_ci    if (index != ff_vc1_ac_sizes[codingset] - 1) {
522cabdff1aSopenharmony_ci        run   = vc1_index_decode_table[codingset][index][0];
523cabdff1aSopenharmony_ci        level = vc1_index_decode_table[codingset][index][1];
524cabdff1aSopenharmony_ci        lst   = index >= vc1_last_decode_table[codingset] || get_bits_left(gb) < 0;
525cabdff1aSopenharmony_ci        sign  = get_bits1(gb);
526cabdff1aSopenharmony_ci    } else {
527cabdff1aSopenharmony_ci        int escape = decode210(gb);
528cabdff1aSopenharmony_ci        if (escape != 2) {
529cabdff1aSopenharmony_ci            index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
530cabdff1aSopenharmony_ci            if (index >= ff_vc1_ac_sizes[codingset] - 1U)
531cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
532cabdff1aSopenharmony_ci            run   = vc1_index_decode_table[codingset][index][0];
533cabdff1aSopenharmony_ci            level = vc1_index_decode_table[codingset][index][1];
534cabdff1aSopenharmony_ci            lst   = index >= vc1_last_decode_table[codingset];
535cabdff1aSopenharmony_ci            if (escape == 0) {
536cabdff1aSopenharmony_ci                if (lst)
537cabdff1aSopenharmony_ci                    level += vc1_last_delta_level_table[codingset][run];
538cabdff1aSopenharmony_ci                else
539cabdff1aSopenharmony_ci                    level += vc1_delta_level_table[codingset][run];
540cabdff1aSopenharmony_ci            } else {
541cabdff1aSopenharmony_ci                if (lst)
542cabdff1aSopenharmony_ci                    run += vc1_last_delta_run_table[codingset][level] + 1;
543cabdff1aSopenharmony_ci                else
544cabdff1aSopenharmony_ci                    run += vc1_delta_run_table[codingset][level] + 1;
545cabdff1aSopenharmony_ci            }
546cabdff1aSopenharmony_ci            sign = get_bits1(gb);
547cabdff1aSopenharmony_ci        } else {
548cabdff1aSopenharmony_ci            lst = get_bits1(gb);
549cabdff1aSopenharmony_ci            if (v->s.esc3_level_length == 0) {
550cabdff1aSopenharmony_ci                if (v->pq < 8 || v->dquantfrm) { // table 59
551cabdff1aSopenharmony_ci                    v->s.esc3_level_length = get_bits(gb, 3);
552cabdff1aSopenharmony_ci                    if (!v->s.esc3_level_length)
553cabdff1aSopenharmony_ci                        v->s.esc3_level_length = get_bits(gb, 2) + 8;
554cabdff1aSopenharmony_ci                } else { // table 60
555cabdff1aSopenharmony_ci                    v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
556cabdff1aSopenharmony_ci                }
557cabdff1aSopenharmony_ci                v->s.esc3_run_length = 3 + get_bits(gb, 2);
558cabdff1aSopenharmony_ci            }
559cabdff1aSopenharmony_ci            run   = get_bits(gb, v->s.esc3_run_length);
560cabdff1aSopenharmony_ci            sign  = get_bits1(gb);
561cabdff1aSopenharmony_ci            level = get_bits(gb, v->s.esc3_level_length);
562cabdff1aSopenharmony_ci        }
563cabdff1aSopenharmony_ci    }
564cabdff1aSopenharmony_ci
565cabdff1aSopenharmony_ci    *last  = lst;
566cabdff1aSopenharmony_ci    *skip  = run;
567cabdff1aSopenharmony_ci    *value = (level ^ -sign) + sign;
568cabdff1aSopenharmony_ci
569cabdff1aSopenharmony_ci    return 0;
570cabdff1aSopenharmony_ci}
571cabdff1aSopenharmony_ci
572cabdff1aSopenharmony_ci/** Decode intra block in intra frames - should be faster than decode_intra_block
573cabdff1aSopenharmony_ci * @param v VC1Context
574cabdff1aSopenharmony_ci * @param block block to decode
575cabdff1aSopenharmony_ci * @param[in] n subblock index
576cabdff1aSopenharmony_ci * @param coded are AC coeffs present or not
577cabdff1aSopenharmony_ci * @param codingset set of VLC to decode data
578cabdff1aSopenharmony_ci */
579cabdff1aSopenharmony_cistatic int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n,
580cabdff1aSopenharmony_ci                              int coded, int codingset)
581cabdff1aSopenharmony_ci{
582cabdff1aSopenharmony_ci    GetBitContext *gb = &v->s.gb;
583cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
584cabdff1aSopenharmony_ci    int dc_pred_dir = 0; /* Direction of the DC prediction used */
585cabdff1aSopenharmony_ci    int i;
586cabdff1aSopenharmony_ci    int16_t *dc_val;
587cabdff1aSopenharmony_ci    int16_t *ac_val, *ac_val2;
588cabdff1aSopenharmony_ci    int dcdiff, scale;
589cabdff1aSopenharmony_ci
590cabdff1aSopenharmony_ci    /* Get DC differential */
591cabdff1aSopenharmony_ci    if (n < 4) {
592cabdff1aSopenharmony_ci        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
593cabdff1aSopenharmony_ci    } else {
594cabdff1aSopenharmony_ci        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
595cabdff1aSopenharmony_ci    }
596cabdff1aSopenharmony_ci    if (dcdiff) {
597cabdff1aSopenharmony_ci        const int m = (v->pq == 1 || v->pq == 2) ? 3 - v->pq : 0;
598cabdff1aSopenharmony_ci        if (dcdiff == 119 /* ESC index value */) {
599cabdff1aSopenharmony_ci            dcdiff = get_bits(gb, 8 + m);
600cabdff1aSopenharmony_ci        } else {
601cabdff1aSopenharmony_ci            if (m)
602cabdff1aSopenharmony_ci                dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1);
603cabdff1aSopenharmony_ci        }
604cabdff1aSopenharmony_ci        if (get_bits1(gb))
605cabdff1aSopenharmony_ci            dcdiff = -dcdiff;
606cabdff1aSopenharmony_ci    }
607cabdff1aSopenharmony_ci
608cabdff1aSopenharmony_ci    /* Prediction */
609cabdff1aSopenharmony_ci    dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
610cabdff1aSopenharmony_ci    *dc_val = dcdiff;
611cabdff1aSopenharmony_ci
612cabdff1aSopenharmony_ci    /* Store the quantized DC coeff, used for prediction */
613cabdff1aSopenharmony_ci    if (n < 4)
614cabdff1aSopenharmony_ci        scale = s->y_dc_scale;
615cabdff1aSopenharmony_ci    else
616cabdff1aSopenharmony_ci        scale = s->c_dc_scale;
617cabdff1aSopenharmony_ci    block[0] = dcdiff * scale;
618cabdff1aSopenharmony_ci
619cabdff1aSopenharmony_ci    ac_val  = s->ac_val[0][s->block_index[n]];
620cabdff1aSopenharmony_ci    ac_val2 = ac_val;
621cabdff1aSopenharmony_ci    if (dc_pred_dir) // left
622cabdff1aSopenharmony_ci        ac_val -= 16;
623cabdff1aSopenharmony_ci    else // top
624cabdff1aSopenharmony_ci        ac_val -= 16 * s->block_wrap[n];
625cabdff1aSopenharmony_ci
626cabdff1aSopenharmony_ci    scale = v->pq * 2 + v->halfpq;
627cabdff1aSopenharmony_ci
628cabdff1aSopenharmony_ci    //AC Decoding
629cabdff1aSopenharmony_ci    i = !!coded;
630cabdff1aSopenharmony_ci
631cabdff1aSopenharmony_ci    if (coded) {
632cabdff1aSopenharmony_ci        int last = 0, skip, value;
633cabdff1aSopenharmony_ci        const uint8_t *zz_table;
634cabdff1aSopenharmony_ci        int k;
635cabdff1aSopenharmony_ci
636cabdff1aSopenharmony_ci        if (v->s.ac_pred) {
637cabdff1aSopenharmony_ci            if (!dc_pred_dir)
638cabdff1aSopenharmony_ci                zz_table = v->zz_8x8[2];
639cabdff1aSopenharmony_ci            else
640cabdff1aSopenharmony_ci                zz_table = v->zz_8x8[3];
641cabdff1aSopenharmony_ci        } else
642cabdff1aSopenharmony_ci            zz_table = v->zz_8x8[1];
643cabdff1aSopenharmony_ci
644cabdff1aSopenharmony_ci        while (!last) {
645cabdff1aSopenharmony_ci            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
646cabdff1aSopenharmony_ci            if (ret < 0)
647cabdff1aSopenharmony_ci                return ret;
648cabdff1aSopenharmony_ci            i += skip;
649cabdff1aSopenharmony_ci            if (i > 63)
650cabdff1aSopenharmony_ci                break;
651cabdff1aSopenharmony_ci            block[zz_table[i++]] = value;
652cabdff1aSopenharmony_ci        }
653cabdff1aSopenharmony_ci
654cabdff1aSopenharmony_ci        /* apply AC prediction if needed */
655cabdff1aSopenharmony_ci        if (s->ac_pred) {
656cabdff1aSopenharmony_ci            int sh;
657cabdff1aSopenharmony_ci            if (dc_pred_dir) { // left
658cabdff1aSopenharmony_ci                sh = v->left_blk_sh;
659cabdff1aSopenharmony_ci            } else { // top
660cabdff1aSopenharmony_ci                sh = v->top_blk_sh;
661cabdff1aSopenharmony_ci                ac_val += 8;
662cabdff1aSopenharmony_ci            }
663cabdff1aSopenharmony_ci            for (k = 1; k < 8; k++)
664cabdff1aSopenharmony_ci                block[k << sh] += ac_val[k];
665cabdff1aSopenharmony_ci        }
666cabdff1aSopenharmony_ci        /* save AC coeffs for further prediction */
667cabdff1aSopenharmony_ci        for (k = 1; k < 8; k++) {
668cabdff1aSopenharmony_ci            ac_val2[k]     = block[k << v->left_blk_sh];
669cabdff1aSopenharmony_ci            ac_val2[k + 8] = block[k << v->top_blk_sh];
670cabdff1aSopenharmony_ci        }
671cabdff1aSopenharmony_ci
672cabdff1aSopenharmony_ci        /* scale AC coeffs */
673cabdff1aSopenharmony_ci        for (k = 1; k < 64; k++)
674cabdff1aSopenharmony_ci            if (block[k]) {
675cabdff1aSopenharmony_ci                block[k] *= scale;
676cabdff1aSopenharmony_ci                if (!v->pquantizer)
677cabdff1aSopenharmony_ci                    block[k] += (block[k] < 0) ? -v->pq : v->pq;
678cabdff1aSopenharmony_ci            }
679cabdff1aSopenharmony_ci
680cabdff1aSopenharmony_ci    } else {
681cabdff1aSopenharmony_ci        int k;
682cabdff1aSopenharmony_ci
683cabdff1aSopenharmony_ci        memset(ac_val2, 0, 16 * 2);
684cabdff1aSopenharmony_ci
685cabdff1aSopenharmony_ci        /* apply AC prediction if needed */
686cabdff1aSopenharmony_ci        if (s->ac_pred) {
687cabdff1aSopenharmony_ci            int sh;
688cabdff1aSopenharmony_ci            if (dc_pred_dir) { //left
689cabdff1aSopenharmony_ci                sh = v->left_blk_sh;
690cabdff1aSopenharmony_ci            } else { // top
691cabdff1aSopenharmony_ci                sh = v->top_blk_sh;
692cabdff1aSopenharmony_ci                ac_val  += 8;
693cabdff1aSopenharmony_ci                ac_val2 += 8;
694cabdff1aSopenharmony_ci            }
695cabdff1aSopenharmony_ci            memcpy(ac_val2, ac_val, 8 * 2);
696cabdff1aSopenharmony_ci            for (k = 1; k < 8; k++) {
697cabdff1aSopenharmony_ci                block[k << sh] = ac_val[k] * scale;
698cabdff1aSopenharmony_ci                if (!v->pquantizer && block[k << sh])
699cabdff1aSopenharmony_ci                    block[k << sh] += (block[k << sh] < 0) ? -v->pq : v->pq;
700cabdff1aSopenharmony_ci            }
701cabdff1aSopenharmony_ci        }
702cabdff1aSopenharmony_ci    }
703cabdff1aSopenharmony_ci    if (s->ac_pred) i = 63;
704cabdff1aSopenharmony_ci    s->block_last_index[n] = i;
705cabdff1aSopenharmony_ci
706cabdff1aSopenharmony_ci    return 0;
707cabdff1aSopenharmony_ci}
708cabdff1aSopenharmony_ci
709cabdff1aSopenharmony_ci/** Decode intra block in intra frames - should be faster than decode_intra_block
710cabdff1aSopenharmony_ci * @param v VC1Context
711cabdff1aSopenharmony_ci * @param block block to decode
712cabdff1aSopenharmony_ci * @param[in] n subblock number
713cabdff1aSopenharmony_ci * @param coded are AC coeffs present or not
714cabdff1aSopenharmony_ci * @param codingset set of VLC to decode data
715cabdff1aSopenharmony_ci * @param mquant quantizer value for this macroblock
716cabdff1aSopenharmony_ci */
717cabdff1aSopenharmony_cistatic int vc1_decode_i_block_adv(VC1Context *v, int16_t block[64], int n,
718cabdff1aSopenharmony_ci                                  int coded, int codingset, int mquant)
719cabdff1aSopenharmony_ci{
720cabdff1aSopenharmony_ci    GetBitContext *gb = &v->s.gb;
721cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
722cabdff1aSopenharmony_ci    int dc_pred_dir = 0; /* Direction of the DC prediction used */
723cabdff1aSopenharmony_ci    int i;
724cabdff1aSopenharmony_ci    int16_t *dc_val = NULL;
725cabdff1aSopenharmony_ci    int16_t *ac_val, *ac_val2;
726cabdff1aSopenharmony_ci    int dcdiff;
727cabdff1aSopenharmony_ci    int a_avail = v->a_avail, c_avail = v->c_avail;
728cabdff1aSopenharmony_ci    int use_pred = s->ac_pred;
729cabdff1aSopenharmony_ci    int scale;
730cabdff1aSopenharmony_ci    int q1, q2 = 0;
731cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
732cabdff1aSopenharmony_ci    int quant = FFABS(mquant);
733cabdff1aSopenharmony_ci
734cabdff1aSopenharmony_ci    /* Get DC differential */
735cabdff1aSopenharmony_ci    if (n < 4) {
736cabdff1aSopenharmony_ci        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
737cabdff1aSopenharmony_ci    } else {
738cabdff1aSopenharmony_ci        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
739cabdff1aSopenharmony_ci    }
740cabdff1aSopenharmony_ci    if (dcdiff) {
741cabdff1aSopenharmony_ci        const int m = (quant == 1 || quant == 2) ? 3 - quant : 0;
742cabdff1aSopenharmony_ci        if (dcdiff == 119 /* ESC index value */) {
743cabdff1aSopenharmony_ci            dcdiff = get_bits(gb, 8 + m);
744cabdff1aSopenharmony_ci        } else {
745cabdff1aSopenharmony_ci            if (m)
746cabdff1aSopenharmony_ci                dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1);
747cabdff1aSopenharmony_ci        }
748cabdff1aSopenharmony_ci        if (get_bits1(gb))
749cabdff1aSopenharmony_ci            dcdiff = -dcdiff;
750cabdff1aSopenharmony_ci    }
751cabdff1aSopenharmony_ci
752cabdff1aSopenharmony_ci    /* Prediction */
753cabdff1aSopenharmony_ci    dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
754cabdff1aSopenharmony_ci    *dc_val = dcdiff;
755cabdff1aSopenharmony_ci
756cabdff1aSopenharmony_ci    /* Store the quantized DC coeff, used for prediction */
757cabdff1aSopenharmony_ci    if (n < 4)
758cabdff1aSopenharmony_ci        scale = s->y_dc_scale;
759cabdff1aSopenharmony_ci    else
760cabdff1aSopenharmony_ci        scale = s->c_dc_scale;
761cabdff1aSopenharmony_ci    block[0] = dcdiff * scale;
762cabdff1aSopenharmony_ci
763cabdff1aSopenharmony_ci    /* check if AC is needed at all */
764cabdff1aSopenharmony_ci    if (!a_avail && !c_avail)
765cabdff1aSopenharmony_ci        use_pred = 0;
766cabdff1aSopenharmony_ci
767cabdff1aSopenharmony_ci    scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq);
768cabdff1aSopenharmony_ci
769cabdff1aSopenharmony_ci    ac_val  = s->ac_val[0][s->block_index[n]];
770cabdff1aSopenharmony_ci    ac_val2 = ac_val;
771cabdff1aSopenharmony_ci    if (dc_pred_dir) // left
772cabdff1aSopenharmony_ci        ac_val -= 16;
773cabdff1aSopenharmony_ci    else // top
774cabdff1aSopenharmony_ci        ac_val -= 16 * s->block_wrap[n];
775cabdff1aSopenharmony_ci
776cabdff1aSopenharmony_ci    q1 = s->current_picture.qscale_table[mb_pos];
777cabdff1aSopenharmony_ci    if (n == 3)
778cabdff1aSopenharmony_ci        q2 = q1;
779cabdff1aSopenharmony_ci    else if (dc_pred_dir) {
780cabdff1aSopenharmony_ci        if (n == 1)
781cabdff1aSopenharmony_ci            q2 = q1;
782cabdff1aSopenharmony_ci        else if (c_avail && mb_pos)
783cabdff1aSopenharmony_ci            q2 = s->current_picture.qscale_table[mb_pos - 1];
784cabdff1aSopenharmony_ci    } else {
785cabdff1aSopenharmony_ci        if (n == 2)
786cabdff1aSopenharmony_ci            q2 = q1;
787cabdff1aSopenharmony_ci        else if (a_avail && mb_pos >= s->mb_stride)
788cabdff1aSopenharmony_ci            q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
789cabdff1aSopenharmony_ci    }
790cabdff1aSopenharmony_ci
791cabdff1aSopenharmony_ci    //AC Decoding
792cabdff1aSopenharmony_ci    i = 1;
793cabdff1aSopenharmony_ci
794cabdff1aSopenharmony_ci    if (coded) {
795cabdff1aSopenharmony_ci        int last = 0, skip, value;
796cabdff1aSopenharmony_ci        const uint8_t *zz_table;
797cabdff1aSopenharmony_ci        int k;
798cabdff1aSopenharmony_ci
799cabdff1aSopenharmony_ci        if (v->s.ac_pred) {
800cabdff1aSopenharmony_ci            if (!use_pred && v->fcm == ILACE_FRAME) {
801cabdff1aSopenharmony_ci                zz_table = v->zzi_8x8;
802cabdff1aSopenharmony_ci            } else {
803cabdff1aSopenharmony_ci                if (!dc_pred_dir) // top
804cabdff1aSopenharmony_ci                    zz_table = v->zz_8x8[2];
805cabdff1aSopenharmony_ci                else // left
806cabdff1aSopenharmony_ci                    zz_table = v->zz_8x8[3];
807cabdff1aSopenharmony_ci            }
808cabdff1aSopenharmony_ci        } else {
809cabdff1aSopenharmony_ci            if (v->fcm != ILACE_FRAME)
810cabdff1aSopenharmony_ci                zz_table = v->zz_8x8[1];
811cabdff1aSopenharmony_ci            else
812cabdff1aSopenharmony_ci                zz_table = v->zzi_8x8;
813cabdff1aSopenharmony_ci        }
814cabdff1aSopenharmony_ci
815cabdff1aSopenharmony_ci        while (!last) {
816cabdff1aSopenharmony_ci            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
817cabdff1aSopenharmony_ci            if (ret < 0)
818cabdff1aSopenharmony_ci                return ret;
819cabdff1aSopenharmony_ci            i += skip;
820cabdff1aSopenharmony_ci            if (i > 63)
821cabdff1aSopenharmony_ci                break;
822cabdff1aSopenharmony_ci            block[zz_table[i++]] = value;
823cabdff1aSopenharmony_ci        }
824cabdff1aSopenharmony_ci
825cabdff1aSopenharmony_ci        /* apply AC prediction if needed */
826cabdff1aSopenharmony_ci        if (use_pred) {
827cabdff1aSopenharmony_ci            int sh;
828cabdff1aSopenharmony_ci            if (dc_pred_dir) { // left
829cabdff1aSopenharmony_ci                sh = v->left_blk_sh;
830cabdff1aSopenharmony_ci            } else { // top
831cabdff1aSopenharmony_ci                sh = v->top_blk_sh;
832cabdff1aSopenharmony_ci                ac_val += 8;
833cabdff1aSopenharmony_ci            }
834cabdff1aSopenharmony_ci            /* scale predictors if needed*/
835cabdff1aSopenharmony_ci            q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1;
836cabdff1aSopenharmony_ci            if (q1 < 1)
837cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
838cabdff1aSopenharmony_ci            if (q2)
839cabdff1aSopenharmony_ci                q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1;
840cabdff1aSopenharmony_ci            if (q2 && q1 != q2) {
841cabdff1aSopenharmony_ci                for (k = 1; k < 8; k++)
842cabdff1aSopenharmony_ci                    block[k << sh] += (int)(ac_val[k] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
843cabdff1aSopenharmony_ci            } else {
844cabdff1aSopenharmony_ci                for (k = 1; k < 8; k++)
845cabdff1aSopenharmony_ci                    block[k << sh] += ac_val[k];
846cabdff1aSopenharmony_ci            }
847cabdff1aSopenharmony_ci        }
848cabdff1aSopenharmony_ci        /* save AC coeffs for further prediction */
849cabdff1aSopenharmony_ci        for (k = 1; k < 8; k++) {
850cabdff1aSopenharmony_ci            ac_val2[k    ] = block[k << v->left_blk_sh];
851cabdff1aSopenharmony_ci            ac_val2[k + 8] = block[k << v->top_blk_sh];
852cabdff1aSopenharmony_ci        }
853cabdff1aSopenharmony_ci
854cabdff1aSopenharmony_ci        /* scale AC coeffs */
855cabdff1aSopenharmony_ci        for (k = 1; k < 64; k++)
856cabdff1aSopenharmony_ci            if (block[k]) {
857cabdff1aSopenharmony_ci                block[k] *= scale;
858cabdff1aSopenharmony_ci                if (!v->pquantizer)
859cabdff1aSopenharmony_ci                    block[k] += (block[k] < 0) ? -quant : quant;
860cabdff1aSopenharmony_ci            }
861cabdff1aSopenharmony_ci
862cabdff1aSopenharmony_ci    } else { // no AC coeffs
863cabdff1aSopenharmony_ci        int k;
864cabdff1aSopenharmony_ci
865cabdff1aSopenharmony_ci        memset(ac_val2, 0, 16 * 2);
866cabdff1aSopenharmony_ci
867cabdff1aSopenharmony_ci        /* apply AC prediction if needed */
868cabdff1aSopenharmony_ci        if (use_pred) {
869cabdff1aSopenharmony_ci            int sh;
870cabdff1aSopenharmony_ci            if (dc_pred_dir) { // left
871cabdff1aSopenharmony_ci                sh = v->left_blk_sh;
872cabdff1aSopenharmony_ci            } else { // top
873cabdff1aSopenharmony_ci                sh = v->top_blk_sh;
874cabdff1aSopenharmony_ci                ac_val  += 8;
875cabdff1aSopenharmony_ci                ac_val2 += 8;
876cabdff1aSopenharmony_ci            }
877cabdff1aSopenharmony_ci            memcpy(ac_val2, ac_val, 8 * 2);
878cabdff1aSopenharmony_ci            q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1;
879cabdff1aSopenharmony_ci            if (q1 < 1)
880cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
881cabdff1aSopenharmony_ci            if (q2)
882cabdff1aSopenharmony_ci                q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1;
883cabdff1aSopenharmony_ci            if (q2 && q1 != q2) {
884cabdff1aSopenharmony_ci                for (k = 1; k < 8; k++)
885cabdff1aSopenharmony_ci                    ac_val2[k] = (int)(ac_val2[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
886cabdff1aSopenharmony_ci            }
887cabdff1aSopenharmony_ci            for (k = 1; k < 8; k++) {
888cabdff1aSopenharmony_ci                block[k << sh] = ac_val2[k] * scale;
889cabdff1aSopenharmony_ci                if (!v->pquantizer && block[k << sh])
890cabdff1aSopenharmony_ci                    block[k << sh] += (block[k << sh] < 0) ? -quant : quant;
891cabdff1aSopenharmony_ci            }
892cabdff1aSopenharmony_ci        }
893cabdff1aSopenharmony_ci    }
894cabdff1aSopenharmony_ci    if (use_pred) i = 63;
895cabdff1aSopenharmony_ci    s->block_last_index[n] = i;
896cabdff1aSopenharmony_ci
897cabdff1aSopenharmony_ci    return 0;
898cabdff1aSopenharmony_ci}
899cabdff1aSopenharmony_ci
900cabdff1aSopenharmony_ci/** Decode intra block in inter frames - more generic version than vc1_decode_i_block
901cabdff1aSopenharmony_ci * @param v VC1Context
902cabdff1aSopenharmony_ci * @param block block to decode
903cabdff1aSopenharmony_ci * @param[in] n subblock index
904cabdff1aSopenharmony_ci * @param coded are AC coeffs present or not
905cabdff1aSopenharmony_ci * @param mquant block quantizer
906cabdff1aSopenharmony_ci * @param codingset set of VLC to decode data
907cabdff1aSopenharmony_ci */
908cabdff1aSopenharmony_cistatic int vc1_decode_intra_block(VC1Context *v, int16_t block[64], int n,
909cabdff1aSopenharmony_ci                                  int coded, int mquant, int codingset)
910cabdff1aSopenharmony_ci{
911cabdff1aSopenharmony_ci    GetBitContext *gb = &v->s.gb;
912cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
913cabdff1aSopenharmony_ci    int dc_pred_dir = 0; /* Direction of the DC prediction used */
914cabdff1aSopenharmony_ci    int i;
915cabdff1aSopenharmony_ci    int16_t *dc_val = NULL;
916cabdff1aSopenharmony_ci    int16_t *ac_val, *ac_val2;
917cabdff1aSopenharmony_ci    int dcdiff;
918cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
919cabdff1aSopenharmony_ci    int a_avail = v->a_avail, c_avail = v->c_avail;
920cabdff1aSopenharmony_ci    int use_pred = s->ac_pred;
921cabdff1aSopenharmony_ci    int scale;
922cabdff1aSopenharmony_ci    int q1, q2 = 0;
923cabdff1aSopenharmony_ci    int quant = FFABS(mquant);
924cabdff1aSopenharmony_ci
925cabdff1aSopenharmony_ci    s->bdsp.clear_block(block);
926cabdff1aSopenharmony_ci
927cabdff1aSopenharmony_ci    /* XXX: Guard against dumb values of mquant */
928cabdff1aSopenharmony_ci    quant = av_clip_uintp2(quant, 5);
929cabdff1aSopenharmony_ci
930cabdff1aSopenharmony_ci    /* Set DC scale - y and c use the same */
931cabdff1aSopenharmony_ci    s->y_dc_scale = s->y_dc_scale_table[quant];
932cabdff1aSopenharmony_ci    s->c_dc_scale = s->c_dc_scale_table[quant];
933cabdff1aSopenharmony_ci
934cabdff1aSopenharmony_ci    /* Get DC differential */
935cabdff1aSopenharmony_ci    if (n < 4) {
936cabdff1aSopenharmony_ci        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
937cabdff1aSopenharmony_ci    } else {
938cabdff1aSopenharmony_ci        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
939cabdff1aSopenharmony_ci    }
940cabdff1aSopenharmony_ci    if (dcdiff) {
941cabdff1aSopenharmony_ci        const int m = (quant == 1 || quant == 2) ? 3 - quant : 0;
942cabdff1aSopenharmony_ci        if (dcdiff == 119 /* ESC index value */) {
943cabdff1aSopenharmony_ci            dcdiff = get_bits(gb, 8 + m);
944cabdff1aSopenharmony_ci        } else {
945cabdff1aSopenharmony_ci            if (m)
946cabdff1aSopenharmony_ci                dcdiff = (dcdiff << m) + get_bits(gb, m) - ((1 << m) - 1);
947cabdff1aSopenharmony_ci        }
948cabdff1aSopenharmony_ci        if (get_bits1(gb))
949cabdff1aSopenharmony_ci            dcdiff = -dcdiff;
950cabdff1aSopenharmony_ci    }
951cabdff1aSopenharmony_ci
952cabdff1aSopenharmony_ci    /* Prediction */
953cabdff1aSopenharmony_ci    dcdiff += ff_vc1_pred_dc(&v->s, v->overlap, quant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
954cabdff1aSopenharmony_ci    *dc_val = dcdiff;
955cabdff1aSopenharmony_ci
956cabdff1aSopenharmony_ci    /* Store the quantized DC coeff, used for prediction */
957cabdff1aSopenharmony_ci
958cabdff1aSopenharmony_ci    if (n < 4) {
959cabdff1aSopenharmony_ci        block[0] = dcdiff * s->y_dc_scale;
960cabdff1aSopenharmony_ci    } else {
961cabdff1aSopenharmony_ci        block[0] = dcdiff * s->c_dc_scale;
962cabdff1aSopenharmony_ci    }
963cabdff1aSopenharmony_ci
964cabdff1aSopenharmony_ci    //AC Decoding
965cabdff1aSopenharmony_ci    i = 1;
966cabdff1aSopenharmony_ci
967cabdff1aSopenharmony_ci    /* check if AC is needed at all and adjust direction if needed */
968cabdff1aSopenharmony_ci    if (!a_avail) dc_pred_dir = 1;
969cabdff1aSopenharmony_ci    if (!c_avail) dc_pred_dir = 0;
970cabdff1aSopenharmony_ci    if (!a_avail && !c_avail) use_pred = 0;
971cabdff1aSopenharmony_ci    ac_val = s->ac_val[0][s->block_index[n]];
972cabdff1aSopenharmony_ci    ac_val2 = ac_val;
973cabdff1aSopenharmony_ci
974cabdff1aSopenharmony_ci    scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq);
975cabdff1aSopenharmony_ci
976cabdff1aSopenharmony_ci    if (dc_pred_dir) //left
977cabdff1aSopenharmony_ci        ac_val -= 16;
978cabdff1aSopenharmony_ci    else //top
979cabdff1aSopenharmony_ci        ac_val -= 16 * s->block_wrap[n];
980cabdff1aSopenharmony_ci
981cabdff1aSopenharmony_ci    q1 = s->current_picture.qscale_table[mb_pos];
982cabdff1aSopenharmony_ci    if (dc_pred_dir && c_avail && mb_pos)
983cabdff1aSopenharmony_ci        q2 = s->current_picture.qscale_table[mb_pos - 1];
984cabdff1aSopenharmony_ci    if (!dc_pred_dir && a_avail && mb_pos >= s->mb_stride)
985cabdff1aSopenharmony_ci        q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
986cabdff1aSopenharmony_ci    if (dc_pred_dir && n == 1)
987cabdff1aSopenharmony_ci        q2 = q1;
988cabdff1aSopenharmony_ci    if (!dc_pred_dir && n == 2)
989cabdff1aSopenharmony_ci        q2 = q1;
990cabdff1aSopenharmony_ci    if (n == 3) q2 = q1;
991cabdff1aSopenharmony_ci
992cabdff1aSopenharmony_ci    if (coded) {
993cabdff1aSopenharmony_ci        int last = 0, skip, value;
994cabdff1aSopenharmony_ci        int k;
995cabdff1aSopenharmony_ci
996cabdff1aSopenharmony_ci        while (!last) {
997cabdff1aSopenharmony_ci            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
998cabdff1aSopenharmony_ci            if (ret < 0)
999cabdff1aSopenharmony_ci                return ret;
1000cabdff1aSopenharmony_ci            i += skip;
1001cabdff1aSopenharmony_ci            if (i > 63)
1002cabdff1aSopenharmony_ci                break;
1003cabdff1aSopenharmony_ci            if (v->fcm == PROGRESSIVE)
1004cabdff1aSopenharmony_ci                block[v->zz_8x8[0][i++]] = value;
1005cabdff1aSopenharmony_ci            else {
1006cabdff1aSopenharmony_ci                if (use_pred && (v->fcm == ILACE_FRAME)) {
1007cabdff1aSopenharmony_ci                    if (!dc_pred_dir) // top
1008cabdff1aSopenharmony_ci                        block[v->zz_8x8[2][i++]] = value;
1009cabdff1aSopenharmony_ci                    else // left
1010cabdff1aSopenharmony_ci                        block[v->zz_8x8[3][i++]] = value;
1011cabdff1aSopenharmony_ci                } else {
1012cabdff1aSopenharmony_ci                    block[v->zzi_8x8[i++]] = value;
1013cabdff1aSopenharmony_ci                }
1014cabdff1aSopenharmony_ci            }
1015cabdff1aSopenharmony_ci        }
1016cabdff1aSopenharmony_ci
1017cabdff1aSopenharmony_ci        /* apply AC prediction if needed */
1018cabdff1aSopenharmony_ci        if (use_pred) {
1019cabdff1aSopenharmony_ci            /* scale predictors if needed*/
1020cabdff1aSopenharmony_ci            q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1;
1021cabdff1aSopenharmony_ci            if (q1 < 1)
1022cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1023cabdff1aSopenharmony_ci            if (q2)
1024cabdff1aSopenharmony_ci                q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1;
1025cabdff1aSopenharmony_ci            if (q2 && q1 != q2) {
1026cabdff1aSopenharmony_ci                if (dc_pred_dir) { // left
1027cabdff1aSopenharmony_ci                    for (k = 1; k < 8; k++)
1028cabdff1aSopenharmony_ci                        block[k << v->left_blk_sh] += (int)(ac_val[k] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
1029cabdff1aSopenharmony_ci                } else { //top
1030cabdff1aSopenharmony_ci                    for (k = 1; k < 8; k++)
1031cabdff1aSopenharmony_ci                        block[k << v->top_blk_sh] += (int)(ac_val[k + 8] * q2 * (unsigned)ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
1032cabdff1aSopenharmony_ci                }
1033cabdff1aSopenharmony_ci            } else {
1034cabdff1aSopenharmony_ci                if (dc_pred_dir) { // left
1035cabdff1aSopenharmony_ci                    for (k = 1; k < 8; k++)
1036cabdff1aSopenharmony_ci                        block[k << v->left_blk_sh] += ac_val[k];
1037cabdff1aSopenharmony_ci                } else { // top
1038cabdff1aSopenharmony_ci                    for (k = 1; k < 8; k++)
1039cabdff1aSopenharmony_ci                        block[k << v->top_blk_sh] += ac_val[k + 8];
1040cabdff1aSopenharmony_ci                }
1041cabdff1aSopenharmony_ci            }
1042cabdff1aSopenharmony_ci        }
1043cabdff1aSopenharmony_ci        /* save AC coeffs for further prediction */
1044cabdff1aSopenharmony_ci        for (k = 1; k < 8; k++) {
1045cabdff1aSopenharmony_ci            ac_val2[k    ] = block[k << v->left_blk_sh];
1046cabdff1aSopenharmony_ci            ac_val2[k + 8] = block[k << v->top_blk_sh];
1047cabdff1aSopenharmony_ci        }
1048cabdff1aSopenharmony_ci
1049cabdff1aSopenharmony_ci        /* scale AC coeffs */
1050cabdff1aSopenharmony_ci        for (k = 1; k < 64; k++)
1051cabdff1aSopenharmony_ci            if (block[k]) {
1052cabdff1aSopenharmony_ci                block[k] *= scale;
1053cabdff1aSopenharmony_ci                if (!v->pquantizer)
1054cabdff1aSopenharmony_ci                    block[k] += (block[k] < 0) ? -quant : quant;
1055cabdff1aSopenharmony_ci            }
1056cabdff1aSopenharmony_ci
1057cabdff1aSopenharmony_ci        if (use_pred) i = 63;
1058cabdff1aSopenharmony_ci    } else { // no AC coeffs
1059cabdff1aSopenharmony_ci        int k;
1060cabdff1aSopenharmony_ci
1061cabdff1aSopenharmony_ci        memset(ac_val2, 0, 16 * 2);
1062cabdff1aSopenharmony_ci        if (dc_pred_dir) { // left
1063cabdff1aSopenharmony_ci            if (use_pred) {
1064cabdff1aSopenharmony_ci                memcpy(ac_val2, ac_val, 8 * 2);
1065cabdff1aSopenharmony_ci                q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1;
1066cabdff1aSopenharmony_ci                if (q1 < 1)
1067cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1068cabdff1aSopenharmony_ci                if (q2)
1069cabdff1aSopenharmony_ci                    q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1;
1070cabdff1aSopenharmony_ci                if (q2 && q1 != q2) {
1071cabdff1aSopenharmony_ci                    for (k = 1; k < 8; k++)
1072cabdff1aSopenharmony_ci                        ac_val2[k] = (int)(ac_val2[k] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
1073cabdff1aSopenharmony_ci                }
1074cabdff1aSopenharmony_ci            }
1075cabdff1aSopenharmony_ci        } else { // top
1076cabdff1aSopenharmony_ci            if (use_pred) {
1077cabdff1aSopenharmony_ci                memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
1078cabdff1aSopenharmony_ci                q1 = FFABS(q1) * 2 + ((q1 < 0) ? 0 : v->halfpq) - 1;
1079cabdff1aSopenharmony_ci                if (q1 < 1)
1080cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1081cabdff1aSopenharmony_ci                if (q2)
1082cabdff1aSopenharmony_ci                    q2 = FFABS(q2) * 2 + ((q2 < 0) ? 0 : v->halfpq) - 1;
1083cabdff1aSopenharmony_ci                if (q2 && q1 != q2) {
1084cabdff1aSopenharmony_ci                    for (k = 1; k < 8; k++)
1085cabdff1aSopenharmony_ci                        ac_val2[k + 8] = (int)(ac_val2[k + 8] * (unsigned)q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
1086cabdff1aSopenharmony_ci                }
1087cabdff1aSopenharmony_ci            }
1088cabdff1aSopenharmony_ci        }
1089cabdff1aSopenharmony_ci
1090cabdff1aSopenharmony_ci        /* apply AC prediction if needed */
1091cabdff1aSopenharmony_ci        if (use_pred) {
1092cabdff1aSopenharmony_ci            if (dc_pred_dir) { // left
1093cabdff1aSopenharmony_ci                for (k = 1; k < 8; k++) {
1094cabdff1aSopenharmony_ci                    block[k << v->left_blk_sh] = ac_val2[k] * scale;
1095cabdff1aSopenharmony_ci                    if (!v->pquantizer && block[k << v->left_blk_sh])
1096cabdff1aSopenharmony_ci                        block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -quant : quant;
1097cabdff1aSopenharmony_ci                }
1098cabdff1aSopenharmony_ci            } else { // top
1099cabdff1aSopenharmony_ci                for (k = 1; k < 8; k++) {
1100cabdff1aSopenharmony_ci                    block[k << v->top_blk_sh] = ac_val2[k + 8] * scale;
1101cabdff1aSopenharmony_ci                    if (!v->pquantizer && block[k << v->top_blk_sh])
1102cabdff1aSopenharmony_ci                        block[k << v->top_blk_sh] += (block[k << v->top_blk_sh] < 0) ? -quant : quant;
1103cabdff1aSopenharmony_ci                }
1104cabdff1aSopenharmony_ci            }
1105cabdff1aSopenharmony_ci            i = 63;
1106cabdff1aSopenharmony_ci        }
1107cabdff1aSopenharmony_ci    }
1108cabdff1aSopenharmony_ci    s->block_last_index[n] = i;
1109cabdff1aSopenharmony_ci
1110cabdff1aSopenharmony_ci    return 0;
1111cabdff1aSopenharmony_ci}
1112cabdff1aSopenharmony_ci
1113cabdff1aSopenharmony_ci/** Decode P block
1114cabdff1aSopenharmony_ci */
1115cabdff1aSopenharmony_cistatic int vc1_decode_p_block(VC1Context *v, int16_t block[64], int n,
1116cabdff1aSopenharmony_ci                              int mquant, int ttmb, int first_block,
1117cabdff1aSopenharmony_ci                              uint8_t *dst, int linesize, int skip_block,
1118cabdff1aSopenharmony_ci                              int *ttmb_out)
1119cabdff1aSopenharmony_ci{
1120cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
1121cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
1122cabdff1aSopenharmony_ci    int i, j;
1123cabdff1aSopenharmony_ci    int subblkpat = 0;
1124cabdff1aSopenharmony_ci    int scale, off, idx, last, skip, value;
1125cabdff1aSopenharmony_ci    int ttblk = ttmb & 7;
1126cabdff1aSopenharmony_ci    int pat = 0;
1127cabdff1aSopenharmony_ci    int quant = FFABS(mquant);
1128cabdff1aSopenharmony_ci
1129cabdff1aSopenharmony_ci    s->bdsp.clear_block(block);
1130cabdff1aSopenharmony_ci
1131cabdff1aSopenharmony_ci    if (ttmb == -1) {
1132cabdff1aSopenharmony_ci        ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
1133cabdff1aSopenharmony_ci    }
1134cabdff1aSopenharmony_ci    if (ttblk == TT_4X4) {
1135cabdff1aSopenharmony_ci        subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
1136cabdff1aSopenharmony_ci    }
1137cabdff1aSopenharmony_ci    if ((ttblk != TT_8X8 && ttblk != TT_4X4)
1138cabdff1aSopenharmony_ci        && ((v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))
1139cabdff1aSopenharmony_ci            || (!v->res_rtm_flag && !first_block))) {
1140cabdff1aSopenharmony_ci        subblkpat = decode012(gb);
1141cabdff1aSopenharmony_ci        if (subblkpat)
1142cabdff1aSopenharmony_ci            subblkpat ^= 3; // swap decoded pattern bits
1143cabdff1aSopenharmony_ci        if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM)
1144cabdff1aSopenharmony_ci            ttblk = TT_8X4;
1145cabdff1aSopenharmony_ci        if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT)
1146cabdff1aSopenharmony_ci            ttblk = TT_4X8;
1147cabdff1aSopenharmony_ci    }
1148cabdff1aSopenharmony_ci    scale = quant * 2 + ((mquant < 0) ? 0 : v->halfpq);
1149cabdff1aSopenharmony_ci
1150cabdff1aSopenharmony_ci    // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
1151cabdff1aSopenharmony_ci    if (ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
1152cabdff1aSopenharmony_ci        subblkpat = 2 - (ttblk == TT_8X4_TOP);
1153cabdff1aSopenharmony_ci        ttblk     = TT_8X4;
1154cabdff1aSopenharmony_ci    }
1155cabdff1aSopenharmony_ci    if (ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
1156cabdff1aSopenharmony_ci        subblkpat = 2 - (ttblk == TT_4X8_LEFT);
1157cabdff1aSopenharmony_ci        ttblk     = TT_4X8;
1158cabdff1aSopenharmony_ci    }
1159cabdff1aSopenharmony_ci    switch (ttblk) {
1160cabdff1aSopenharmony_ci    case TT_8X8:
1161cabdff1aSopenharmony_ci        pat  = 0xF;
1162cabdff1aSopenharmony_ci        i    = 0;
1163cabdff1aSopenharmony_ci        last = 0;
1164cabdff1aSopenharmony_ci        while (!last) {
1165cabdff1aSopenharmony_ci            int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
1166cabdff1aSopenharmony_ci            if (ret < 0)
1167cabdff1aSopenharmony_ci                return ret;
1168cabdff1aSopenharmony_ci            i += skip;
1169cabdff1aSopenharmony_ci            if (i > 63)
1170cabdff1aSopenharmony_ci                break;
1171cabdff1aSopenharmony_ci            if (!v->fcm)
1172cabdff1aSopenharmony_ci                idx = v->zz_8x8[0][i++];
1173cabdff1aSopenharmony_ci            else
1174cabdff1aSopenharmony_ci                idx = v->zzi_8x8[i++];
1175cabdff1aSopenharmony_ci            block[idx] = value * scale;
1176cabdff1aSopenharmony_ci            if (!v->pquantizer)
1177cabdff1aSopenharmony_ci                block[idx] += (block[idx] < 0) ? -quant : quant;
1178cabdff1aSopenharmony_ci        }
1179cabdff1aSopenharmony_ci        if (!skip_block) {
1180cabdff1aSopenharmony_ci            if (i == 1)
1181cabdff1aSopenharmony_ci                v->vc1dsp.vc1_inv_trans_8x8_dc(dst, linesize, block);
1182cabdff1aSopenharmony_ci            else {
1183cabdff1aSopenharmony_ci                v->vc1dsp.vc1_inv_trans_8x8(block);
1184cabdff1aSopenharmony_ci                s->idsp.add_pixels_clamped(block, dst, linesize);
1185cabdff1aSopenharmony_ci            }
1186cabdff1aSopenharmony_ci        }
1187cabdff1aSopenharmony_ci        break;
1188cabdff1aSopenharmony_ci    case TT_4X4:
1189cabdff1aSopenharmony_ci        pat = ~subblkpat & 0xF;
1190cabdff1aSopenharmony_ci        for (j = 0; j < 4; j++) {
1191cabdff1aSopenharmony_ci            last = subblkpat & (1 << (3 - j));
1192cabdff1aSopenharmony_ci            i    = 0;
1193cabdff1aSopenharmony_ci            off  = (j & 1) * 4 + (j & 2) * 16;
1194cabdff1aSopenharmony_ci            while (!last) {
1195cabdff1aSopenharmony_ci                int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
1196cabdff1aSopenharmony_ci                if (ret < 0)
1197cabdff1aSopenharmony_ci                    return ret;
1198cabdff1aSopenharmony_ci                i += skip;
1199cabdff1aSopenharmony_ci                if (i > 15)
1200cabdff1aSopenharmony_ci                    break;
1201cabdff1aSopenharmony_ci                if (!v->fcm)
1202cabdff1aSopenharmony_ci                    idx = ff_vc1_simple_progressive_4x4_zz[i++];
1203cabdff1aSopenharmony_ci                else
1204cabdff1aSopenharmony_ci                    idx = ff_vc1_adv_interlaced_4x4_zz[i++];
1205cabdff1aSopenharmony_ci                block[idx + off] = value * scale;
1206cabdff1aSopenharmony_ci                if (!v->pquantizer)
1207cabdff1aSopenharmony_ci                    block[idx + off] += (block[idx + off] < 0) ? -quant : quant;
1208cabdff1aSopenharmony_ci            }
1209cabdff1aSopenharmony_ci            if (!(subblkpat & (1 << (3 - j))) && !skip_block) {
1210cabdff1aSopenharmony_ci                if (i == 1)
1211cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_4x4_dc(dst + (j & 1) * 4 + (j & 2) * 2 * linesize, linesize, block + off);
1212cabdff1aSopenharmony_ci                else
1213cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_4x4(dst + (j & 1) * 4 + (j & 2) *  2 * linesize, linesize, block + off);
1214cabdff1aSopenharmony_ci            }
1215cabdff1aSopenharmony_ci        }
1216cabdff1aSopenharmony_ci        break;
1217cabdff1aSopenharmony_ci    case TT_8X4:
1218cabdff1aSopenharmony_ci        pat = ~((subblkpat & 2) * 6 + (subblkpat & 1) * 3) & 0xF;
1219cabdff1aSopenharmony_ci        for (j = 0; j < 2; j++) {
1220cabdff1aSopenharmony_ci            last = subblkpat & (1 << (1 - j));
1221cabdff1aSopenharmony_ci            i    = 0;
1222cabdff1aSopenharmony_ci            off  = j * 32;
1223cabdff1aSopenharmony_ci            while (!last) {
1224cabdff1aSopenharmony_ci                int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
1225cabdff1aSopenharmony_ci                if (ret < 0)
1226cabdff1aSopenharmony_ci                    return ret;
1227cabdff1aSopenharmony_ci                i += skip;
1228cabdff1aSopenharmony_ci                if (i > 31)
1229cabdff1aSopenharmony_ci                    break;
1230cabdff1aSopenharmony_ci                if (!v->fcm)
1231cabdff1aSopenharmony_ci                    idx = v->zz_8x4[i++] + off;
1232cabdff1aSopenharmony_ci                else
1233cabdff1aSopenharmony_ci                    idx = ff_vc1_adv_interlaced_8x4_zz[i++] + off;
1234cabdff1aSopenharmony_ci                block[idx] = value * scale;
1235cabdff1aSopenharmony_ci                if (!v->pquantizer)
1236cabdff1aSopenharmony_ci                    block[idx] += (block[idx] < 0) ? -quant : quant;
1237cabdff1aSopenharmony_ci            }
1238cabdff1aSopenharmony_ci            if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
1239cabdff1aSopenharmony_ci                if (i == 1)
1240cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_8x4_dc(dst + j * 4 * linesize, linesize, block + off);
1241cabdff1aSopenharmony_ci                else
1242cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_8x4(dst + j * 4 * linesize, linesize, block + off);
1243cabdff1aSopenharmony_ci            }
1244cabdff1aSopenharmony_ci        }
1245cabdff1aSopenharmony_ci        break;
1246cabdff1aSopenharmony_ci    case TT_4X8:
1247cabdff1aSopenharmony_ci        pat = ~(subblkpat * 5) & 0xF;
1248cabdff1aSopenharmony_ci        for (j = 0; j < 2; j++) {
1249cabdff1aSopenharmony_ci            last = subblkpat & (1 << (1 - j));
1250cabdff1aSopenharmony_ci            i    = 0;
1251cabdff1aSopenharmony_ci            off  = j * 4;
1252cabdff1aSopenharmony_ci            while (!last) {
1253cabdff1aSopenharmony_ci                int ret = vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
1254cabdff1aSopenharmony_ci                if (ret < 0)
1255cabdff1aSopenharmony_ci                    return ret;
1256cabdff1aSopenharmony_ci                i += skip;
1257cabdff1aSopenharmony_ci                if (i > 31)
1258cabdff1aSopenharmony_ci                    break;
1259cabdff1aSopenharmony_ci                if (!v->fcm)
1260cabdff1aSopenharmony_ci                    idx = v->zz_4x8[i++] + off;
1261cabdff1aSopenharmony_ci                else
1262cabdff1aSopenharmony_ci                    idx = ff_vc1_adv_interlaced_4x8_zz[i++] + off;
1263cabdff1aSopenharmony_ci                block[idx] = value * scale;
1264cabdff1aSopenharmony_ci                if (!v->pquantizer)
1265cabdff1aSopenharmony_ci                    block[idx] += (block[idx] < 0) ? -quant : quant;
1266cabdff1aSopenharmony_ci            }
1267cabdff1aSopenharmony_ci            if (!(subblkpat & (1 << (1 - j))) && !skip_block) {
1268cabdff1aSopenharmony_ci                if (i == 1)
1269cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_4x8_dc(dst + j * 4, linesize, block + off);
1270cabdff1aSopenharmony_ci                else
1271cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
1272cabdff1aSopenharmony_ci            }
1273cabdff1aSopenharmony_ci        }
1274cabdff1aSopenharmony_ci        break;
1275cabdff1aSopenharmony_ci    }
1276cabdff1aSopenharmony_ci    if (ttmb_out)
1277cabdff1aSopenharmony_ci        *ttmb_out |= ttblk << (n * 4);
1278cabdff1aSopenharmony_ci    return pat;
1279cabdff1aSopenharmony_ci}
1280cabdff1aSopenharmony_ci
1281cabdff1aSopenharmony_ci/** @} */ // Macroblock group
1282cabdff1aSopenharmony_ci
1283cabdff1aSopenharmony_cistatic const uint8_t size_table[6] = { 0, 2, 3, 4,  5,  8 };
1284cabdff1aSopenharmony_ci
1285cabdff1aSopenharmony_ci/** Decode one P-frame MB
1286cabdff1aSopenharmony_ci */
1287cabdff1aSopenharmony_cistatic int vc1_decode_p_mb(VC1Context *v)
1288cabdff1aSopenharmony_ci{
1289cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
1290cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
1291cabdff1aSopenharmony_ci    int i, j;
1292cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
1293cabdff1aSopenharmony_ci    int cbp; /* cbp decoding stuff */
1294cabdff1aSopenharmony_ci    int mqdiff, mquant; /* MB quantization */
1295cabdff1aSopenharmony_ci    int ttmb = v->ttfrm; /* MB Transform type */
1296cabdff1aSopenharmony_ci
1297cabdff1aSopenharmony_ci    int mb_has_coeffs = 1; /* last_flag */
1298cabdff1aSopenharmony_ci    int dmv_x, dmv_y; /* Differential MV components */
1299cabdff1aSopenharmony_ci    int index, index1; /* LUT indexes */
1300cabdff1aSopenharmony_ci    int val, sign; /* temp values */
1301cabdff1aSopenharmony_ci    int first_block = 1;
1302cabdff1aSopenharmony_ci    int dst_idx, off;
1303cabdff1aSopenharmony_ci    int skipped, fourmv;
1304cabdff1aSopenharmony_ci    int block_cbp = 0, pat, block_tt = 0, block_intra = 0;
1305cabdff1aSopenharmony_ci
1306cabdff1aSopenharmony_ci    mquant = v->pq; /* lossy initialization */
1307cabdff1aSopenharmony_ci
1308cabdff1aSopenharmony_ci    if (v->mv_type_is_raw)
1309cabdff1aSopenharmony_ci        fourmv = get_bits1(gb);
1310cabdff1aSopenharmony_ci    else
1311cabdff1aSopenharmony_ci        fourmv = v->mv_type_mb_plane[mb_pos];
1312cabdff1aSopenharmony_ci    if (v->skip_is_raw)
1313cabdff1aSopenharmony_ci        skipped = get_bits1(gb);
1314cabdff1aSopenharmony_ci    else
1315cabdff1aSopenharmony_ci        skipped = v->s.mbskip_table[mb_pos];
1316cabdff1aSopenharmony_ci
1317cabdff1aSopenharmony_ci    if (!fourmv) { /* 1MV mode */
1318cabdff1aSopenharmony_ci        if (!skipped) {
1319cabdff1aSopenharmony_ci            GET_MVDATA(dmv_x, dmv_y);
1320cabdff1aSopenharmony_ci
1321cabdff1aSopenharmony_ci            if (s->mb_intra) {
1322cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
1323cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
1324cabdff1aSopenharmony_ci            }
1325cabdff1aSopenharmony_ci            s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
1326cabdff1aSopenharmony_ci            ff_vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
1327cabdff1aSopenharmony_ci
1328cabdff1aSopenharmony_ci            /* FIXME Set DC val for inter block ? */
1329cabdff1aSopenharmony_ci            if (s->mb_intra && !mb_has_coeffs) {
1330cabdff1aSopenharmony_ci                GET_MQUANT();
1331cabdff1aSopenharmony_ci                s->ac_pred = get_bits1(gb);
1332cabdff1aSopenharmony_ci                cbp        = 0;
1333cabdff1aSopenharmony_ci            } else if (mb_has_coeffs) {
1334cabdff1aSopenharmony_ci                if (s->mb_intra)
1335cabdff1aSopenharmony_ci                    s->ac_pred = get_bits1(gb);
1336cabdff1aSopenharmony_ci                cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
1337cabdff1aSopenharmony_ci                GET_MQUANT();
1338cabdff1aSopenharmony_ci            } else {
1339cabdff1aSopenharmony_ci                mquant = v->pq;
1340cabdff1aSopenharmony_ci                cbp    = 0;
1341cabdff1aSopenharmony_ci            }
1342cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
1343cabdff1aSopenharmony_ci
1344cabdff1aSopenharmony_ci            if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
1345cabdff1aSopenharmony_ci                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
1346cabdff1aSopenharmony_ci                                VC1_TTMB_VLC_BITS, 2);
1347cabdff1aSopenharmony_ci            if (!s->mb_intra) ff_vc1_mc_1mv(v, 0);
1348cabdff1aSopenharmony_ci            dst_idx = 0;
1349cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
1350cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]] = 0;
1351cabdff1aSopenharmony_ci                dst_idx += i >> 2;
1352cabdff1aSopenharmony_ci                val = ((cbp >> (5 - i)) & 1);
1353cabdff1aSopenharmony_ci                off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
1354cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = s->mb_intra;
1355cabdff1aSopenharmony_ci                if (s->mb_intra) {
1356cabdff1aSopenharmony_ci                    /* check if prediction blocks A and C are available */
1357cabdff1aSopenharmony_ci                    v->a_avail = v->c_avail = 0;
1358cabdff1aSopenharmony_ci                    if (i == 2 || i == 3 || !s->first_slice_line)
1359cabdff1aSopenharmony_ci                        v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
1360cabdff1aSopenharmony_ci                    if (i == 1 || i == 3 || s->mb_x)
1361cabdff1aSopenharmony_ci                        v->c_avail = v->mb_type[0][s->block_index[i] - 1];
1362cabdff1aSopenharmony_ci
1363cabdff1aSopenharmony_ci                    vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant,
1364cabdff1aSopenharmony_ci                                           (i & 4) ? v->codingset2 : v->codingset);
1365cabdff1aSopenharmony_ci                    if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
1366cabdff1aSopenharmony_ci                        continue;
1367cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]);
1368cabdff1aSopenharmony_ci                    if (v->rangeredfrm)
1369cabdff1aSopenharmony_ci                        for (j = 0; j < 64; j++)
1370cabdff1aSopenharmony_ci                            v->block[v->cur_blk_idx][block_map[i]][j] *= 2;
1371cabdff1aSopenharmony_ci                    block_cbp   |= 0xF << (i << 2);
1372cabdff1aSopenharmony_ci                    block_intra |= 1 << i;
1373cabdff1aSopenharmony_ci                } else if (val) {
1374cabdff1aSopenharmony_ci                    pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb, first_block,
1375cabdff1aSopenharmony_ci                                             s->dest[dst_idx] + off, (i & 4) ? s->uvlinesize : s->linesize,
1376cabdff1aSopenharmony_ci                                             CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
1377cabdff1aSopenharmony_ci                    if (pat < 0)
1378cabdff1aSopenharmony_ci                        return pat;
1379cabdff1aSopenharmony_ci                    block_cbp |= pat << (i << 2);
1380cabdff1aSopenharmony_ci                    if (!v->ttmbf && ttmb < 8)
1381cabdff1aSopenharmony_ci                        ttmb = -1;
1382cabdff1aSopenharmony_ci                    first_block = 0;
1383cabdff1aSopenharmony_ci                }
1384cabdff1aSopenharmony_ci            }
1385cabdff1aSopenharmony_ci        } else { // skipped
1386cabdff1aSopenharmony_ci            s->mb_intra = 0;
1387cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
1388cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = 0;
1389cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]]  = 0;
1390cabdff1aSopenharmony_ci            }
1391cabdff1aSopenharmony_ci            s->current_picture.mb_type[mb_pos]      = MB_TYPE_SKIP;
1392cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = 0;
1393cabdff1aSopenharmony_ci            ff_vc1_pred_mv(v, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0], 0, 0);
1394cabdff1aSopenharmony_ci            ff_vc1_mc_1mv(v, 0);
1395cabdff1aSopenharmony_ci        }
1396cabdff1aSopenharmony_ci    } else { // 4MV mode
1397cabdff1aSopenharmony_ci        if (!skipped /* unskipped MB */) {
1398cabdff1aSopenharmony_ci            int intra_count = 0, coded_inter = 0;
1399cabdff1aSopenharmony_ci            int is_intra[6], is_coded[6];
1400cabdff1aSopenharmony_ci            /* Get CBPCY */
1401cabdff1aSopenharmony_ci            cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
1402cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
1403cabdff1aSopenharmony_ci                val = ((cbp >> (5 - i)) & 1);
1404cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]] = 0;
1405cabdff1aSopenharmony_ci                s->mb_intra                     = 0;
1406cabdff1aSopenharmony_ci                if (i < 4) {
1407cabdff1aSopenharmony_ci                    dmv_x = dmv_y = 0;
1408cabdff1aSopenharmony_ci                    s->mb_intra   = 0;
1409cabdff1aSopenharmony_ci                    mb_has_coeffs = 0;
1410cabdff1aSopenharmony_ci                    if (val) {
1411cabdff1aSopenharmony_ci                        GET_MVDATA(dmv_x, dmv_y);
1412cabdff1aSopenharmony_ci                    }
1413cabdff1aSopenharmony_ci                    ff_vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
1414cabdff1aSopenharmony_ci                    if (!s->mb_intra)
1415cabdff1aSopenharmony_ci                        ff_vc1_mc_4mv_luma(v, i, 0, 0);
1416cabdff1aSopenharmony_ci                    intra_count += s->mb_intra;
1417cabdff1aSopenharmony_ci                    is_intra[i]  = s->mb_intra;
1418cabdff1aSopenharmony_ci                    is_coded[i]  = mb_has_coeffs;
1419cabdff1aSopenharmony_ci                }
1420cabdff1aSopenharmony_ci                if (i & 4) {
1421cabdff1aSopenharmony_ci                    is_intra[i] = (intra_count >= 3);
1422cabdff1aSopenharmony_ci                    is_coded[i] = val;
1423cabdff1aSopenharmony_ci                }
1424cabdff1aSopenharmony_ci                if (i == 4)
1425cabdff1aSopenharmony_ci                    ff_vc1_mc_4mv_chroma(v, 0);
1426cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = is_intra[i];
1427cabdff1aSopenharmony_ci                if (!coded_inter)
1428cabdff1aSopenharmony_ci                    coded_inter = !is_intra[i] & is_coded[i];
1429cabdff1aSopenharmony_ci            }
1430cabdff1aSopenharmony_ci            // if there are no coded blocks then don't do anything more
1431cabdff1aSopenharmony_ci            dst_idx = 0;
1432cabdff1aSopenharmony_ci            if (!intra_count && !coded_inter)
1433cabdff1aSopenharmony_ci                goto end;
1434cabdff1aSopenharmony_ci            GET_MQUANT();
1435cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
1436cabdff1aSopenharmony_ci            /* test if block is intra and has pred */
1437cabdff1aSopenharmony_ci            {
1438cabdff1aSopenharmony_ci                int intrapred = 0;
1439cabdff1aSopenharmony_ci                for (i = 0; i < 6; i++)
1440cabdff1aSopenharmony_ci                    if (is_intra[i]) {
1441cabdff1aSopenharmony_ci                        if (((!s->first_slice_line || (i == 2 || i == 3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
1442cabdff1aSopenharmony_ci                            || ((s->mb_x || (i == 1 || i == 3)) && v->mb_type[0][s->block_index[i] - 1])) {
1443cabdff1aSopenharmony_ci                            intrapred = 1;
1444cabdff1aSopenharmony_ci                            break;
1445cabdff1aSopenharmony_ci                        }
1446cabdff1aSopenharmony_ci                    }
1447cabdff1aSopenharmony_ci                if (intrapred)
1448cabdff1aSopenharmony_ci                    s->ac_pred = get_bits1(gb);
1449cabdff1aSopenharmony_ci                else
1450cabdff1aSopenharmony_ci                    s->ac_pred = 0;
1451cabdff1aSopenharmony_ci            }
1452cabdff1aSopenharmony_ci            if (!v->ttmbf && coded_inter)
1453cabdff1aSopenharmony_ci                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
1454cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
1455cabdff1aSopenharmony_ci                dst_idx    += i >> 2;
1456cabdff1aSopenharmony_ci                off         = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
1457cabdff1aSopenharmony_ci                s->mb_intra = is_intra[i];
1458cabdff1aSopenharmony_ci                if (is_intra[i]) {
1459cabdff1aSopenharmony_ci                    /* check if prediction blocks A and C are available */
1460cabdff1aSopenharmony_ci                    v->a_avail = v->c_avail = 0;
1461cabdff1aSopenharmony_ci                    if (i == 2 || i == 3 || !s->first_slice_line)
1462cabdff1aSopenharmony_ci                        v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
1463cabdff1aSopenharmony_ci                    if (i == 1 || i == 3 || s->mb_x)
1464cabdff1aSopenharmony_ci                        v->c_avail = v->mb_type[0][s->block_index[i] - 1];
1465cabdff1aSopenharmony_ci
1466cabdff1aSopenharmony_ci                    vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, is_coded[i], mquant,
1467cabdff1aSopenharmony_ci                                           (i & 4) ? v->codingset2 : v->codingset);
1468cabdff1aSopenharmony_ci                    if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
1469cabdff1aSopenharmony_ci                        continue;
1470cabdff1aSopenharmony_ci                    v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]);
1471cabdff1aSopenharmony_ci                    if (v->rangeredfrm)
1472cabdff1aSopenharmony_ci                        for (j = 0; j < 64; j++)
1473cabdff1aSopenharmony_ci                            v->block[v->cur_blk_idx][block_map[i]][j] *= 2;
1474cabdff1aSopenharmony_ci                    block_cbp   |= 0xF << (i << 2);
1475cabdff1aSopenharmony_ci                    block_intra |= 1 << i;
1476cabdff1aSopenharmony_ci                } else if (is_coded[i]) {
1477cabdff1aSopenharmony_ci                    pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb,
1478cabdff1aSopenharmony_ci                                             first_block, s->dest[dst_idx] + off,
1479cabdff1aSopenharmony_ci                                             (i & 4) ? s->uvlinesize : s->linesize,
1480cabdff1aSopenharmony_ci                                             CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY),
1481cabdff1aSopenharmony_ci                                             &block_tt);
1482cabdff1aSopenharmony_ci                    if (pat < 0)
1483cabdff1aSopenharmony_ci                        return pat;
1484cabdff1aSopenharmony_ci                    block_cbp |= pat << (i << 2);
1485cabdff1aSopenharmony_ci                    if (!v->ttmbf && ttmb < 8)
1486cabdff1aSopenharmony_ci                        ttmb = -1;
1487cabdff1aSopenharmony_ci                    first_block = 0;
1488cabdff1aSopenharmony_ci                }
1489cabdff1aSopenharmony_ci            }
1490cabdff1aSopenharmony_ci        } else { // skipped MB
1491cabdff1aSopenharmony_ci            s->mb_intra                               = 0;
1492cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = 0;
1493cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
1494cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = 0;
1495cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]]  = 0;
1496cabdff1aSopenharmony_ci            }
1497cabdff1aSopenharmony_ci            for (i = 0; i < 4; i++) {
1498cabdff1aSopenharmony_ci                ff_vc1_pred_mv(v, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0], 0, 0);
1499cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, i, 0, 0);
1500cabdff1aSopenharmony_ci            }
1501cabdff1aSopenharmony_ci            ff_vc1_mc_4mv_chroma(v, 0);
1502cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = 0;
1503cabdff1aSopenharmony_ci        }
1504cabdff1aSopenharmony_ci    }
1505cabdff1aSopenharmony_ciend:
1506cabdff1aSopenharmony_ci    if (v->overlap && v->pq >= 9)
1507cabdff1aSopenharmony_ci        ff_vc1_p_overlap_filter(v);
1508cabdff1aSopenharmony_ci    vc1_put_blocks_clamped(v, 1);
1509cabdff1aSopenharmony_ci
1510cabdff1aSopenharmony_ci    v->cbp[s->mb_x]      = block_cbp;
1511cabdff1aSopenharmony_ci    v->ttblk[s->mb_x]    = block_tt;
1512cabdff1aSopenharmony_ci    v->is_intra[s->mb_x] = block_intra;
1513cabdff1aSopenharmony_ci
1514cabdff1aSopenharmony_ci    return 0;
1515cabdff1aSopenharmony_ci}
1516cabdff1aSopenharmony_ci
1517cabdff1aSopenharmony_ci/* Decode one macroblock in an interlaced frame p picture */
1518cabdff1aSopenharmony_ci
1519cabdff1aSopenharmony_cistatic int vc1_decode_p_mb_intfr(VC1Context *v)
1520cabdff1aSopenharmony_ci{
1521cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
1522cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
1523cabdff1aSopenharmony_ci    int i;
1524cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
1525cabdff1aSopenharmony_ci    int cbp = 0; /* cbp decoding stuff */
1526cabdff1aSopenharmony_ci    int mqdiff, mquant; /* MB quantization */
1527cabdff1aSopenharmony_ci    int ttmb = v->ttfrm; /* MB Transform type */
1528cabdff1aSopenharmony_ci
1529cabdff1aSopenharmony_ci    int mb_has_coeffs = 1; /* last_flag */
1530cabdff1aSopenharmony_ci    int dmv_x, dmv_y; /* Differential MV components */
1531cabdff1aSopenharmony_ci    int val; /* temp value */
1532cabdff1aSopenharmony_ci    int first_block = 1;
1533cabdff1aSopenharmony_ci    int dst_idx, off;
1534cabdff1aSopenharmony_ci    int skipped, fourmv = 0, twomv = 0;
1535cabdff1aSopenharmony_ci    int block_cbp = 0, pat, block_tt = 0;
1536cabdff1aSopenharmony_ci    int idx_mbmode = 0, mvbp;
1537cabdff1aSopenharmony_ci    int fieldtx;
1538cabdff1aSopenharmony_ci
1539cabdff1aSopenharmony_ci    mquant = v->pq; /* Lossy initialization */
1540cabdff1aSopenharmony_ci
1541cabdff1aSopenharmony_ci    if (v->skip_is_raw)
1542cabdff1aSopenharmony_ci        skipped = get_bits1(gb);
1543cabdff1aSopenharmony_ci    else
1544cabdff1aSopenharmony_ci        skipped = v->s.mbskip_table[mb_pos];
1545cabdff1aSopenharmony_ci    if (!skipped) {
1546cabdff1aSopenharmony_ci        if (v->fourmvswitch)
1547cabdff1aSopenharmony_ci            idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_4MV_MBMODE_VLC_BITS, 2); // try getting this done
1548cabdff1aSopenharmony_ci        else
1549cabdff1aSopenharmony_ci            idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2); // in a single line
1550cabdff1aSopenharmony_ci        switch (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0]) {
1551cabdff1aSopenharmony_ci        /* store the motion vector type in a flag (useful later) */
1552cabdff1aSopenharmony_ci        case MV_PMODE_INTFR_4MV:
1553cabdff1aSopenharmony_ci            fourmv = 1;
1554cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[0]] = 0;
1555cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[1]] = 0;
1556cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[2]] = 0;
1557cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[3]] = 0;
1558cabdff1aSopenharmony_ci            break;
1559cabdff1aSopenharmony_ci        case MV_PMODE_INTFR_4MV_FIELD:
1560cabdff1aSopenharmony_ci            fourmv = 1;
1561cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[0]] = 1;
1562cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[1]] = 1;
1563cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[2]] = 1;
1564cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[3]] = 1;
1565cabdff1aSopenharmony_ci            break;
1566cabdff1aSopenharmony_ci        case MV_PMODE_INTFR_2MV_FIELD:
1567cabdff1aSopenharmony_ci            twomv = 1;
1568cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[0]] = 1;
1569cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[1]] = 1;
1570cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[2]] = 1;
1571cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[3]] = 1;
1572cabdff1aSopenharmony_ci            break;
1573cabdff1aSopenharmony_ci        case MV_PMODE_INTFR_1MV:
1574cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[0]] = 0;
1575cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[1]] = 0;
1576cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[2]] = 0;
1577cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[3]] = 0;
1578cabdff1aSopenharmony_ci            break;
1579cabdff1aSopenharmony_ci        }
1580cabdff1aSopenharmony_ci        if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
1581cabdff1aSopenharmony_ci            for (i = 0; i < 4; i++) {
1582cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[i]][0] = 0;
1583cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[i]][1] = 0;
1584cabdff1aSopenharmony_ci            }
1585cabdff1aSopenharmony_ci            v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1.
1586cabdff1aSopenharmony_ci            s->mb_intra          = 1;
1587cabdff1aSopenharmony_ci            s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
1588cabdff1aSopenharmony_ci            fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
1589cabdff1aSopenharmony_ci            mb_has_coeffs = get_bits1(gb);
1590cabdff1aSopenharmony_ci            if (mb_has_coeffs)
1591cabdff1aSopenharmony_ci                cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
1592cabdff1aSopenharmony_ci            v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
1593cabdff1aSopenharmony_ci            GET_MQUANT();
1594cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
1595cabdff1aSopenharmony_ci            /* Set DC scale - y and c use the same (not sure if necessary here) */
1596cabdff1aSopenharmony_ci            s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)];
1597cabdff1aSopenharmony_ci            s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)];
1598cabdff1aSopenharmony_ci            dst_idx = 0;
1599cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
1600cabdff1aSopenharmony_ci                v->a_avail = v->c_avail          = 0;
1601cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = 1;
1602cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]]  = 0;
1603cabdff1aSopenharmony_ci                dst_idx += i >> 2;
1604cabdff1aSopenharmony_ci                val = ((cbp >> (5 - i)) & 1);
1605cabdff1aSopenharmony_ci                if (i == 2 || i == 3 || !s->first_slice_line)
1606cabdff1aSopenharmony_ci                    v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
1607cabdff1aSopenharmony_ci                if (i == 1 || i == 3 || s->mb_x)
1608cabdff1aSopenharmony_ci                    v->c_avail = v->mb_type[0][s->block_index[i] - 1];
1609cabdff1aSopenharmony_ci
1610cabdff1aSopenharmony_ci                vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant,
1611cabdff1aSopenharmony_ci                                       (i & 4) ? v->codingset2 : v->codingset);
1612cabdff1aSopenharmony_ci                if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
1613cabdff1aSopenharmony_ci                    continue;
1614cabdff1aSopenharmony_ci                v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]);
1615cabdff1aSopenharmony_ci                if (i < 4)
1616cabdff1aSopenharmony_ci                    off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
1617cabdff1aSopenharmony_ci                else
1618cabdff1aSopenharmony_ci                    off = 0;
1619cabdff1aSopenharmony_ci                block_cbp |= 0xf << (i << 2);
1620cabdff1aSopenharmony_ci            }
1621cabdff1aSopenharmony_ci
1622cabdff1aSopenharmony_ci        } else { // inter MB
1623cabdff1aSopenharmony_ci            mb_has_coeffs = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][3];
1624cabdff1aSopenharmony_ci            if (mb_has_coeffs)
1625cabdff1aSopenharmony_ci                cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
1626cabdff1aSopenharmony_ci            if (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
1627cabdff1aSopenharmony_ci                v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
1628cabdff1aSopenharmony_ci            } else {
1629cabdff1aSopenharmony_ci                if ((ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV)
1630cabdff1aSopenharmony_ci                    || (ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][0] == MV_PMODE_INTFR_4MV_FIELD)) {
1631cabdff1aSopenharmony_ci                    v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
1632cabdff1aSopenharmony_ci                }
1633cabdff1aSopenharmony_ci            }
1634cabdff1aSopenharmony_ci            s->mb_intra = v->is_intra[s->mb_x] = 0;
1635cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++)
1636cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = 0;
1637cabdff1aSopenharmony_ci            fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][1];
1638cabdff1aSopenharmony_ci            /* for all motion vector read MVDATA and motion compensate each block */
1639cabdff1aSopenharmony_ci            dst_idx = 0;
1640cabdff1aSopenharmony_ci            if (fourmv) {
1641cabdff1aSopenharmony_ci                mvbp = v->fourmvbp;
1642cabdff1aSopenharmony_ci                for (i = 0; i < 4; i++) {
1643cabdff1aSopenharmony_ci                    dmv_x = dmv_y = 0;
1644cabdff1aSopenharmony_ci                    if (mvbp & (8 >> i))
1645cabdff1aSopenharmony_ci                        get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
1646cabdff1aSopenharmony_ci                    ff_vc1_pred_mv_intfr(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, 0);
1647cabdff1aSopenharmony_ci                    ff_vc1_mc_4mv_luma(v, i, 0, 0);
1648cabdff1aSopenharmony_ci                }
1649cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_chroma4(v, 0, 0, 0);
1650cabdff1aSopenharmony_ci            } else if (twomv) {
1651cabdff1aSopenharmony_ci                mvbp  = v->twomvbp;
1652cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
1653cabdff1aSopenharmony_ci                if (mvbp & 2) {
1654cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
1655cabdff1aSopenharmony_ci                }
1656cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, 0);
1657cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 0, 0, 0);
1658cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 1, 0, 0);
1659cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
1660cabdff1aSopenharmony_ci                if (mvbp & 1) {
1661cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
1662cabdff1aSopenharmony_ci                }
1663cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, 0);
1664cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 2, 0, 0);
1665cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 3, 0, 0);
1666cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_chroma4(v, 0, 0, 0);
1667cabdff1aSopenharmony_ci            } else {
1668cabdff1aSopenharmony_ci                mvbp = ff_vc1_mbmode_intfrp[v->fourmvswitch][idx_mbmode][2];
1669cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
1670cabdff1aSopenharmony_ci                if (mvbp) {
1671cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
1672cabdff1aSopenharmony_ci                }
1673cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, 0);
1674cabdff1aSopenharmony_ci                ff_vc1_mc_1mv(v, 0);
1675cabdff1aSopenharmony_ci            }
1676cabdff1aSopenharmony_ci            if (cbp)
1677cabdff1aSopenharmony_ci                GET_MQUANT();  // p. 227
1678cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
1679cabdff1aSopenharmony_ci            if (!v->ttmbf && cbp)
1680cabdff1aSopenharmony_ci                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
1681cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
1682cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]] = 0;
1683cabdff1aSopenharmony_ci                dst_idx += i >> 2;
1684cabdff1aSopenharmony_ci                val = ((cbp >> (5 - i)) & 1);
1685cabdff1aSopenharmony_ci                if (!fieldtx)
1686cabdff1aSopenharmony_ci                    off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
1687cabdff1aSopenharmony_ci                else
1688cabdff1aSopenharmony_ci                    off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
1689cabdff1aSopenharmony_ci                if (val) {
1690cabdff1aSopenharmony_ci                    pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb,
1691cabdff1aSopenharmony_ci                                             first_block, s->dest[dst_idx] + off,
1692cabdff1aSopenharmony_ci                                             (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
1693cabdff1aSopenharmony_ci                                             CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
1694cabdff1aSopenharmony_ci                    if (pat < 0)
1695cabdff1aSopenharmony_ci                        return pat;
1696cabdff1aSopenharmony_ci                    block_cbp |= pat << (i << 2);
1697cabdff1aSopenharmony_ci                    if (!v->ttmbf && ttmb < 8)
1698cabdff1aSopenharmony_ci                        ttmb = -1;
1699cabdff1aSopenharmony_ci                    first_block = 0;
1700cabdff1aSopenharmony_ci                }
1701cabdff1aSopenharmony_ci            }
1702cabdff1aSopenharmony_ci        }
1703cabdff1aSopenharmony_ci    } else { // skipped
1704cabdff1aSopenharmony_ci        s->mb_intra = v->is_intra[s->mb_x] = 0;
1705cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++) {
1706cabdff1aSopenharmony_ci            v->mb_type[0][s->block_index[i]] = 0;
1707cabdff1aSopenharmony_ci            s->dc_val[0][s->block_index[i]] = 0;
1708cabdff1aSopenharmony_ci        }
1709cabdff1aSopenharmony_ci        s->current_picture.mb_type[mb_pos]      = MB_TYPE_SKIP;
1710cabdff1aSopenharmony_ci        s->current_picture.qscale_table[mb_pos] = 0;
1711cabdff1aSopenharmony_ci        v->blk_mv_type[s->block_index[0]] = 0;
1712cabdff1aSopenharmony_ci        v->blk_mv_type[s->block_index[1]] = 0;
1713cabdff1aSopenharmony_ci        v->blk_mv_type[s->block_index[2]] = 0;
1714cabdff1aSopenharmony_ci        v->blk_mv_type[s->block_index[3]] = 0;
1715cabdff1aSopenharmony_ci        ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, 0);
1716cabdff1aSopenharmony_ci        ff_vc1_mc_1mv(v, 0);
1717cabdff1aSopenharmony_ci        v->fieldtx_plane[mb_pos] = 0;
1718cabdff1aSopenharmony_ci    }
1719cabdff1aSopenharmony_ci    if (v->overlap && v->pq >= 9)
1720cabdff1aSopenharmony_ci        ff_vc1_p_overlap_filter(v);
1721cabdff1aSopenharmony_ci    vc1_put_blocks_clamped(v, 1);
1722cabdff1aSopenharmony_ci
1723cabdff1aSopenharmony_ci    v->cbp[s->mb_x]      = block_cbp;
1724cabdff1aSopenharmony_ci    v->ttblk[s->mb_x]    = block_tt;
1725cabdff1aSopenharmony_ci
1726cabdff1aSopenharmony_ci    return 0;
1727cabdff1aSopenharmony_ci}
1728cabdff1aSopenharmony_ci
1729cabdff1aSopenharmony_cistatic int vc1_decode_p_mb_intfi(VC1Context *v)
1730cabdff1aSopenharmony_ci{
1731cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
1732cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
1733cabdff1aSopenharmony_ci    int i;
1734cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
1735cabdff1aSopenharmony_ci    int cbp = 0; /* cbp decoding stuff */
1736cabdff1aSopenharmony_ci    int mqdiff, mquant; /* MB quantization */
1737cabdff1aSopenharmony_ci    int ttmb = v->ttfrm; /* MB Transform type */
1738cabdff1aSopenharmony_ci
1739cabdff1aSopenharmony_ci    int mb_has_coeffs = 1; /* last_flag */
1740cabdff1aSopenharmony_ci    int dmv_x, dmv_y; /* Differential MV components */
1741cabdff1aSopenharmony_ci    int val; /* temp values */
1742cabdff1aSopenharmony_ci    int first_block = 1;
1743cabdff1aSopenharmony_ci    int dst_idx, off;
1744cabdff1aSopenharmony_ci    int pred_flag = 0;
1745cabdff1aSopenharmony_ci    int block_cbp = 0, pat, block_tt = 0;
1746cabdff1aSopenharmony_ci    int idx_mbmode = 0;
1747cabdff1aSopenharmony_ci
1748cabdff1aSopenharmony_ci    mquant = v->pq; /* Lossy initialization */
1749cabdff1aSopenharmony_ci
1750cabdff1aSopenharmony_ci    idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
1751cabdff1aSopenharmony_ci    if (idx_mbmode <= 1) { // intra MB
1752cabdff1aSopenharmony_ci        v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1.
1753cabdff1aSopenharmony_ci        s->mb_intra          = 1;
1754cabdff1aSopenharmony_ci        s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][0] = 0;
1755cabdff1aSopenharmony_ci        s->current_picture.motion_val[1][s->block_index[0] + v->blocks_off][1] = 0;
1756cabdff1aSopenharmony_ci        s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_INTRA;
1757cabdff1aSopenharmony_ci        GET_MQUANT();
1758cabdff1aSopenharmony_ci        s->current_picture.qscale_table[mb_pos] = mquant;
1759cabdff1aSopenharmony_ci        /* Set DC scale - y and c use the same (not sure if necessary here) */
1760cabdff1aSopenharmony_ci        s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)];
1761cabdff1aSopenharmony_ci        s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)];
1762cabdff1aSopenharmony_ci        v->s.ac_pred  = v->acpred_plane[mb_pos] = get_bits1(gb);
1763cabdff1aSopenharmony_ci        mb_has_coeffs = idx_mbmode & 1;
1764cabdff1aSopenharmony_ci        if (mb_has_coeffs)
1765cabdff1aSopenharmony_ci            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
1766cabdff1aSopenharmony_ci        dst_idx = 0;
1767cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++) {
1768cabdff1aSopenharmony_ci            v->a_avail = v->c_avail          = 0;
1769cabdff1aSopenharmony_ci            v->mb_type[0][s->block_index[i]] = 1;
1770cabdff1aSopenharmony_ci            s->dc_val[0][s->block_index[i]]  = 0;
1771cabdff1aSopenharmony_ci            dst_idx += i >> 2;
1772cabdff1aSopenharmony_ci            val = ((cbp >> (5 - i)) & 1);
1773cabdff1aSopenharmony_ci            if (i == 2 || i == 3 || !s->first_slice_line)
1774cabdff1aSopenharmony_ci                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
1775cabdff1aSopenharmony_ci            if (i == 1 || i == 3 || s->mb_x)
1776cabdff1aSopenharmony_ci                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
1777cabdff1aSopenharmony_ci
1778cabdff1aSopenharmony_ci            vc1_decode_intra_block(v, v->block[v->cur_blk_idx][block_map[i]], i, val, mquant,
1779cabdff1aSopenharmony_ci                                   (i & 4) ? v->codingset2 : v->codingset);
1780cabdff1aSopenharmony_ci            if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
1781cabdff1aSopenharmony_ci                continue;
1782cabdff1aSopenharmony_ci            v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[i]]);
1783cabdff1aSopenharmony_ci            off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
1784cabdff1aSopenharmony_ci            block_cbp |= 0xf << (i << 2);
1785cabdff1aSopenharmony_ci        }
1786cabdff1aSopenharmony_ci    } else {
1787cabdff1aSopenharmony_ci        s->mb_intra = v->is_intra[s->mb_x] = 0;
1788cabdff1aSopenharmony_ci        s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
1789cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++)
1790cabdff1aSopenharmony_ci            v->mb_type[0][s->block_index[i]] = 0;
1791cabdff1aSopenharmony_ci        if (idx_mbmode <= 5) { // 1-MV
1792cabdff1aSopenharmony_ci            dmv_x = dmv_y = pred_flag = 0;
1793cabdff1aSopenharmony_ci            if (idx_mbmode & 1) {
1794cabdff1aSopenharmony_ci                get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
1795cabdff1aSopenharmony_ci            }
1796cabdff1aSopenharmony_ci            ff_vc1_pred_mv(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
1797cabdff1aSopenharmony_ci            ff_vc1_mc_1mv(v, 0);
1798cabdff1aSopenharmony_ci            mb_has_coeffs = !(idx_mbmode & 2);
1799cabdff1aSopenharmony_ci        } else { // 4-MV
1800cabdff1aSopenharmony_ci            v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
1801cabdff1aSopenharmony_ci            for (i = 0; i < 4; i++) {
1802cabdff1aSopenharmony_ci                dmv_x = dmv_y = pred_flag = 0;
1803cabdff1aSopenharmony_ci                if (v->fourmvbp & (8 >> i))
1804cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, &pred_flag);
1805cabdff1aSopenharmony_ci                ff_vc1_pred_mv(v, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0], pred_flag, 0);
1806cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, i, 0, 0);
1807cabdff1aSopenharmony_ci            }
1808cabdff1aSopenharmony_ci            ff_vc1_mc_4mv_chroma(v, 0);
1809cabdff1aSopenharmony_ci            mb_has_coeffs = idx_mbmode & 1;
1810cabdff1aSopenharmony_ci        }
1811cabdff1aSopenharmony_ci        if (mb_has_coeffs)
1812cabdff1aSopenharmony_ci            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
1813cabdff1aSopenharmony_ci        if (cbp) {
1814cabdff1aSopenharmony_ci            GET_MQUANT();
1815cabdff1aSopenharmony_ci        }
1816cabdff1aSopenharmony_ci        s->current_picture.qscale_table[mb_pos] = mquant;
1817cabdff1aSopenharmony_ci        if (!v->ttmbf && cbp) {
1818cabdff1aSopenharmony_ci            ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
1819cabdff1aSopenharmony_ci        }
1820cabdff1aSopenharmony_ci        dst_idx = 0;
1821cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++) {
1822cabdff1aSopenharmony_ci            s->dc_val[0][s->block_index[i]] = 0;
1823cabdff1aSopenharmony_ci            dst_idx += i >> 2;
1824cabdff1aSopenharmony_ci            val = ((cbp >> (5 - i)) & 1);
1825cabdff1aSopenharmony_ci            off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
1826cabdff1aSopenharmony_ci            if (val) {
1827cabdff1aSopenharmony_ci                pat = vc1_decode_p_block(v, v->block[v->cur_blk_idx][block_map[i]], i, mquant, ttmb,
1828cabdff1aSopenharmony_ci                                         first_block, s->dest[dst_idx] + off,
1829cabdff1aSopenharmony_ci                                         (i & 4) ? s->uvlinesize : s->linesize,
1830cabdff1aSopenharmony_ci                                         CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY),
1831cabdff1aSopenharmony_ci                                         &block_tt);
1832cabdff1aSopenharmony_ci                if (pat < 0)
1833cabdff1aSopenharmony_ci                    return pat;
1834cabdff1aSopenharmony_ci                block_cbp |= pat << (i << 2);
1835cabdff1aSopenharmony_ci                if (!v->ttmbf && ttmb < 8)
1836cabdff1aSopenharmony_ci                    ttmb = -1;
1837cabdff1aSopenharmony_ci                first_block = 0;
1838cabdff1aSopenharmony_ci            }
1839cabdff1aSopenharmony_ci        }
1840cabdff1aSopenharmony_ci    }
1841cabdff1aSopenharmony_ci    if (v->overlap && v->pq >= 9)
1842cabdff1aSopenharmony_ci        ff_vc1_p_overlap_filter(v);
1843cabdff1aSopenharmony_ci    vc1_put_blocks_clamped(v, 1);
1844cabdff1aSopenharmony_ci
1845cabdff1aSopenharmony_ci    v->cbp[s->mb_x]      = block_cbp;
1846cabdff1aSopenharmony_ci    v->ttblk[s->mb_x]    = block_tt;
1847cabdff1aSopenharmony_ci
1848cabdff1aSopenharmony_ci    return 0;
1849cabdff1aSopenharmony_ci}
1850cabdff1aSopenharmony_ci
1851cabdff1aSopenharmony_ci/** Decode one B-frame MB (in Main profile)
1852cabdff1aSopenharmony_ci */
1853cabdff1aSopenharmony_cistatic int vc1_decode_b_mb(VC1Context *v)
1854cabdff1aSopenharmony_ci{
1855cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
1856cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
1857cabdff1aSopenharmony_ci    int i, j;
1858cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
1859cabdff1aSopenharmony_ci    int cbp = 0; /* cbp decoding stuff */
1860cabdff1aSopenharmony_ci    int mqdiff, mquant; /* MB quantization */
1861cabdff1aSopenharmony_ci    int ttmb = v->ttfrm; /* MB Transform type */
1862cabdff1aSopenharmony_ci    int mb_has_coeffs = 0; /* last_flag */
1863cabdff1aSopenharmony_ci    int index, index1; /* LUT indexes */
1864cabdff1aSopenharmony_ci    int val, sign; /* temp values */
1865cabdff1aSopenharmony_ci    int first_block = 1;
1866cabdff1aSopenharmony_ci    int dst_idx, off;
1867cabdff1aSopenharmony_ci    int skipped, direct;
1868cabdff1aSopenharmony_ci    int dmv_x[2], dmv_y[2];
1869cabdff1aSopenharmony_ci    int bmvtype = BMV_TYPE_BACKWARD;
1870cabdff1aSopenharmony_ci
1871cabdff1aSopenharmony_ci    mquant      = v->pq; /* lossy initialization */
1872cabdff1aSopenharmony_ci    s->mb_intra = 0;
1873cabdff1aSopenharmony_ci
1874cabdff1aSopenharmony_ci    if (v->dmb_is_raw)
1875cabdff1aSopenharmony_ci        direct = get_bits1(gb);
1876cabdff1aSopenharmony_ci    else
1877cabdff1aSopenharmony_ci        direct = v->direct_mb_plane[mb_pos];
1878cabdff1aSopenharmony_ci    if (v->skip_is_raw)
1879cabdff1aSopenharmony_ci        skipped = get_bits1(gb);
1880cabdff1aSopenharmony_ci    else
1881cabdff1aSopenharmony_ci        skipped = v->s.mbskip_table[mb_pos];
1882cabdff1aSopenharmony_ci
1883cabdff1aSopenharmony_ci    dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
1884cabdff1aSopenharmony_ci    for (i = 0; i < 6; i++) {
1885cabdff1aSopenharmony_ci        v->mb_type[0][s->block_index[i]] = 0;
1886cabdff1aSopenharmony_ci        s->dc_val[0][s->block_index[i]]  = 0;
1887cabdff1aSopenharmony_ci    }
1888cabdff1aSopenharmony_ci    s->current_picture.qscale_table[mb_pos] = 0;
1889cabdff1aSopenharmony_ci
1890cabdff1aSopenharmony_ci    if (!direct) {
1891cabdff1aSopenharmony_ci        if (!skipped) {
1892cabdff1aSopenharmony_ci            GET_MVDATA(dmv_x[0], dmv_y[0]);
1893cabdff1aSopenharmony_ci            dmv_x[1] = dmv_x[0];
1894cabdff1aSopenharmony_ci            dmv_y[1] = dmv_y[0];
1895cabdff1aSopenharmony_ci        }
1896cabdff1aSopenharmony_ci        if (skipped || !s->mb_intra) {
1897cabdff1aSopenharmony_ci            bmvtype = decode012(gb);
1898cabdff1aSopenharmony_ci            switch (bmvtype) {
1899cabdff1aSopenharmony_ci            case 0:
1900cabdff1aSopenharmony_ci                bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
1901cabdff1aSopenharmony_ci                break;
1902cabdff1aSopenharmony_ci            case 1:
1903cabdff1aSopenharmony_ci                bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
1904cabdff1aSopenharmony_ci                break;
1905cabdff1aSopenharmony_ci            case 2:
1906cabdff1aSopenharmony_ci                bmvtype  = BMV_TYPE_INTERPOLATED;
1907cabdff1aSopenharmony_ci                dmv_x[0] = dmv_y[0] = 0;
1908cabdff1aSopenharmony_ci            }
1909cabdff1aSopenharmony_ci        }
1910cabdff1aSopenharmony_ci    }
1911cabdff1aSopenharmony_ci    for (i = 0; i < 6; i++)
1912cabdff1aSopenharmony_ci        v->mb_type[0][s->block_index[i]] = s->mb_intra;
1913cabdff1aSopenharmony_ci
1914cabdff1aSopenharmony_ci    if (skipped) {
1915cabdff1aSopenharmony_ci        if (direct)
1916cabdff1aSopenharmony_ci            bmvtype = BMV_TYPE_INTERPOLATED;
1917cabdff1aSopenharmony_ci        ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
1918cabdff1aSopenharmony_ci        vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
1919cabdff1aSopenharmony_ci        return 0;
1920cabdff1aSopenharmony_ci    }
1921cabdff1aSopenharmony_ci    if (direct) {
1922cabdff1aSopenharmony_ci        cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
1923cabdff1aSopenharmony_ci        GET_MQUANT();
1924cabdff1aSopenharmony_ci        s->mb_intra = 0;
1925cabdff1aSopenharmony_ci        s->current_picture.qscale_table[mb_pos] = mquant;
1926cabdff1aSopenharmony_ci        if (!v->ttmbf)
1927cabdff1aSopenharmony_ci            ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
1928cabdff1aSopenharmony_ci        dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
1929cabdff1aSopenharmony_ci        ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
1930cabdff1aSopenharmony_ci        vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
1931cabdff1aSopenharmony_ci    } else {
1932cabdff1aSopenharmony_ci        if (!mb_has_coeffs && !s->mb_intra) {
1933cabdff1aSopenharmony_ci            /* no coded blocks - effectively skipped */
1934cabdff1aSopenharmony_ci            ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
1935cabdff1aSopenharmony_ci            vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
1936cabdff1aSopenharmony_ci            return 0;
1937cabdff1aSopenharmony_ci        }
1938cabdff1aSopenharmony_ci        if (s->mb_intra && !mb_has_coeffs) {
1939cabdff1aSopenharmony_ci            GET_MQUANT();
1940cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
1941cabdff1aSopenharmony_ci            s->ac_pred = get_bits1(gb);
1942cabdff1aSopenharmony_ci            cbp = 0;
1943cabdff1aSopenharmony_ci            ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
1944cabdff1aSopenharmony_ci        } else {
1945cabdff1aSopenharmony_ci            if (bmvtype == BMV_TYPE_INTERPOLATED) {
1946cabdff1aSopenharmony_ci                GET_MVDATA(dmv_x[0], dmv_y[0]);
1947cabdff1aSopenharmony_ci                if (!mb_has_coeffs) {
1948cabdff1aSopenharmony_ci                    /* interpolated skipped block */
1949cabdff1aSopenharmony_ci                    ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
1950cabdff1aSopenharmony_ci                    vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
1951cabdff1aSopenharmony_ci                    return 0;
1952cabdff1aSopenharmony_ci                }
1953cabdff1aSopenharmony_ci            }
1954cabdff1aSopenharmony_ci            ff_vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
1955cabdff1aSopenharmony_ci            if (!s->mb_intra) {
1956cabdff1aSopenharmony_ci                vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
1957cabdff1aSopenharmony_ci            }
1958cabdff1aSopenharmony_ci            if (s->mb_intra)
1959cabdff1aSopenharmony_ci                s->ac_pred = get_bits1(gb);
1960cabdff1aSopenharmony_ci            cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
1961cabdff1aSopenharmony_ci            GET_MQUANT();
1962cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
1963cabdff1aSopenharmony_ci            if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
1964cabdff1aSopenharmony_ci                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
1965cabdff1aSopenharmony_ci        }
1966cabdff1aSopenharmony_ci    }
1967cabdff1aSopenharmony_ci    dst_idx = 0;
1968cabdff1aSopenharmony_ci    for (i = 0; i < 6; i++) {
1969cabdff1aSopenharmony_ci        s->dc_val[0][s->block_index[i]] = 0;
1970cabdff1aSopenharmony_ci        dst_idx += i >> 2;
1971cabdff1aSopenharmony_ci        val = ((cbp >> (5 - i)) & 1);
1972cabdff1aSopenharmony_ci        off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
1973cabdff1aSopenharmony_ci        v->mb_type[0][s->block_index[i]] = s->mb_intra;
1974cabdff1aSopenharmony_ci        if (s->mb_intra) {
1975cabdff1aSopenharmony_ci            /* check if prediction blocks A and C are available */
1976cabdff1aSopenharmony_ci            v->a_avail = v->c_avail = 0;
1977cabdff1aSopenharmony_ci            if (i == 2 || i == 3 || !s->first_slice_line)
1978cabdff1aSopenharmony_ci                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
1979cabdff1aSopenharmony_ci            if (i == 1 || i == 3 || s->mb_x)
1980cabdff1aSopenharmony_ci                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
1981cabdff1aSopenharmony_ci
1982cabdff1aSopenharmony_ci            vc1_decode_intra_block(v, s->block[i], i, val, mquant,
1983cabdff1aSopenharmony_ci                                   (i & 4) ? v->codingset2 : v->codingset);
1984cabdff1aSopenharmony_ci            if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
1985cabdff1aSopenharmony_ci                continue;
1986cabdff1aSopenharmony_ci            v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
1987cabdff1aSopenharmony_ci            if (v->rangeredfrm)
1988cabdff1aSopenharmony_ci                for (j = 0; j < 64; j++)
1989cabdff1aSopenharmony_ci                    s->block[i][j] *= 2;
1990cabdff1aSopenharmony_ci            s->idsp.put_signed_pixels_clamped(s->block[i],
1991cabdff1aSopenharmony_ci                                              s->dest[dst_idx] + off,
1992cabdff1aSopenharmony_ci                                              i & 4 ? s->uvlinesize
1993cabdff1aSopenharmony_ci                                                    : s->linesize);
1994cabdff1aSopenharmony_ci        } else if (val) {
1995cabdff1aSopenharmony_ci            int pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
1996cabdff1aSopenharmony_ci                                         first_block, s->dest[dst_idx] + off,
1997cabdff1aSopenharmony_ci                                         (i & 4) ? s->uvlinesize : s->linesize,
1998cabdff1aSopenharmony_ci                                         CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), NULL);
1999cabdff1aSopenharmony_ci            if (pat < 0)
2000cabdff1aSopenharmony_ci                return pat;
2001cabdff1aSopenharmony_ci            if (!v->ttmbf && ttmb < 8)
2002cabdff1aSopenharmony_ci                ttmb = -1;
2003cabdff1aSopenharmony_ci            first_block = 0;
2004cabdff1aSopenharmony_ci        }
2005cabdff1aSopenharmony_ci    }
2006cabdff1aSopenharmony_ci    return 0;
2007cabdff1aSopenharmony_ci}
2008cabdff1aSopenharmony_ci
2009cabdff1aSopenharmony_ci/** Decode one B-frame MB (in interlaced field B picture)
2010cabdff1aSopenharmony_ci */
2011cabdff1aSopenharmony_cistatic int vc1_decode_b_mb_intfi(VC1Context *v)
2012cabdff1aSopenharmony_ci{
2013cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
2014cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
2015cabdff1aSopenharmony_ci    int i, j;
2016cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2017cabdff1aSopenharmony_ci    int cbp = 0; /* cbp decoding stuff */
2018cabdff1aSopenharmony_ci    int mqdiff, mquant; /* MB quantization */
2019cabdff1aSopenharmony_ci    int ttmb = v->ttfrm; /* MB Transform type */
2020cabdff1aSopenharmony_ci    int mb_has_coeffs = 0; /* last_flag */
2021cabdff1aSopenharmony_ci    int val; /* temp value */
2022cabdff1aSopenharmony_ci    int first_block = 1;
2023cabdff1aSopenharmony_ci    int dst_idx, off;
2024cabdff1aSopenharmony_ci    int fwd;
2025cabdff1aSopenharmony_ci    int dmv_x[2], dmv_y[2], pred_flag[2];
2026cabdff1aSopenharmony_ci    int bmvtype = BMV_TYPE_BACKWARD;
2027cabdff1aSopenharmony_ci    int block_cbp = 0, pat, block_tt = 0;
2028cabdff1aSopenharmony_ci    int idx_mbmode;
2029cabdff1aSopenharmony_ci
2030cabdff1aSopenharmony_ci    mquant      = v->pq; /* Lossy initialization */
2031cabdff1aSopenharmony_ci    s->mb_intra = 0;
2032cabdff1aSopenharmony_ci
2033cabdff1aSopenharmony_ci    idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_IF_MBMODE_VLC_BITS, 2);
2034cabdff1aSopenharmony_ci    if (idx_mbmode <= 1) { // intra MB
2035cabdff1aSopenharmony_ci        v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1.
2036cabdff1aSopenharmony_ci        s->mb_intra          = 1;
2037cabdff1aSopenharmony_ci        s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
2038cabdff1aSopenharmony_ci        s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
2039cabdff1aSopenharmony_ci        s->current_picture.mb_type[mb_pos + v->mb_off]         = MB_TYPE_INTRA;
2040cabdff1aSopenharmony_ci        GET_MQUANT();
2041cabdff1aSopenharmony_ci        s->current_picture.qscale_table[mb_pos] = mquant;
2042cabdff1aSopenharmony_ci        /* Set DC scale - y and c use the same (not sure if necessary here) */
2043cabdff1aSopenharmony_ci        s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)];
2044cabdff1aSopenharmony_ci        s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)];
2045cabdff1aSopenharmony_ci        v->s.ac_pred  = v->acpred_plane[mb_pos] = get_bits1(gb);
2046cabdff1aSopenharmony_ci        mb_has_coeffs = idx_mbmode & 1;
2047cabdff1aSopenharmony_ci        if (mb_has_coeffs)
2048cabdff1aSopenharmony_ci            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_ICBPCY_VLC_BITS, 2);
2049cabdff1aSopenharmony_ci        dst_idx = 0;
2050cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++) {
2051cabdff1aSopenharmony_ci            v->a_avail = v->c_avail          = 0;
2052cabdff1aSopenharmony_ci            v->mb_type[0][s->block_index[i]] = 1;
2053cabdff1aSopenharmony_ci            s->dc_val[0][s->block_index[i]]  = 0;
2054cabdff1aSopenharmony_ci            dst_idx += i >> 2;
2055cabdff1aSopenharmony_ci            val = ((cbp >> (5 - i)) & 1);
2056cabdff1aSopenharmony_ci            if (i == 2 || i == 3 || !s->first_slice_line)
2057cabdff1aSopenharmony_ci                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
2058cabdff1aSopenharmony_ci            if (i == 1 || i == 3 || s->mb_x)
2059cabdff1aSopenharmony_ci                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
2060cabdff1aSopenharmony_ci
2061cabdff1aSopenharmony_ci            vc1_decode_intra_block(v, s->block[i], i, val, mquant,
2062cabdff1aSopenharmony_ci                                   (i & 4) ? v->codingset2 : v->codingset);
2063cabdff1aSopenharmony_ci            if (CONFIG_GRAY && (i > 3) && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
2064cabdff1aSopenharmony_ci                continue;
2065cabdff1aSopenharmony_ci            v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
2066cabdff1aSopenharmony_ci            if (v->rangeredfrm)
2067cabdff1aSopenharmony_ci                for (j = 0; j < 64; j++)
2068cabdff1aSopenharmony_ci                    s->block[i][j] <<= 1;
2069cabdff1aSopenharmony_ci            off  = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
2070cabdff1aSopenharmony_ci            s->idsp.put_signed_pixels_clamped(s->block[i],
2071cabdff1aSopenharmony_ci                                              s->dest[dst_idx] + off,
2072cabdff1aSopenharmony_ci                                              (i & 4) ? s->uvlinesize
2073cabdff1aSopenharmony_ci                                                      : s->linesize);
2074cabdff1aSopenharmony_ci        }
2075cabdff1aSopenharmony_ci    } else {
2076cabdff1aSopenharmony_ci        s->mb_intra = v->is_intra[s->mb_x] = 0;
2077cabdff1aSopenharmony_ci        s->current_picture.mb_type[mb_pos + v->mb_off] = MB_TYPE_16x16;
2078cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++)
2079cabdff1aSopenharmony_ci            v->mb_type[0][s->block_index[i]] = 0;
2080cabdff1aSopenharmony_ci        if (v->fmb_is_raw)
2081cabdff1aSopenharmony_ci            fwd = v->forward_mb_plane[mb_pos] = get_bits1(gb);
2082cabdff1aSopenharmony_ci        else
2083cabdff1aSopenharmony_ci            fwd = v->forward_mb_plane[mb_pos];
2084cabdff1aSopenharmony_ci        if (idx_mbmode <= 5) { // 1-MV
2085cabdff1aSopenharmony_ci            int interpmvp = 0;
2086cabdff1aSopenharmony_ci            dmv_x[0]     = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
2087cabdff1aSopenharmony_ci            pred_flag[0] = pred_flag[1] = 0;
2088cabdff1aSopenharmony_ci            if (fwd)
2089cabdff1aSopenharmony_ci                bmvtype = BMV_TYPE_FORWARD;
2090cabdff1aSopenharmony_ci            else {
2091cabdff1aSopenharmony_ci                bmvtype = decode012(gb);
2092cabdff1aSopenharmony_ci                switch (bmvtype) {
2093cabdff1aSopenharmony_ci                case 0:
2094cabdff1aSopenharmony_ci                    bmvtype = BMV_TYPE_BACKWARD;
2095cabdff1aSopenharmony_ci                    break;
2096cabdff1aSopenharmony_ci                case 1:
2097cabdff1aSopenharmony_ci                    bmvtype = BMV_TYPE_DIRECT;
2098cabdff1aSopenharmony_ci                    break;
2099cabdff1aSopenharmony_ci                case 2:
2100cabdff1aSopenharmony_ci                    bmvtype   = BMV_TYPE_INTERPOLATED;
2101cabdff1aSopenharmony_ci                    interpmvp = get_bits1(gb);
2102cabdff1aSopenharmony_ci                }
2103cabdff1aSopenharmony_ci            }
2104cabdff1aSopenharmony_ci            v->bmvtype = bmvtype;
2105cabdff1aSopenharmony_ci            if (bmvtype != BMV_TYPE_DIRECT && idx_mbmode & 1) {
2106cabdff1aSopenharmony_ci                get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD], &dmv_y[bmvtype == BMV_TYPE_BACKWARD], &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
2107cabdff1aSopenharmony_ci            }
2108cabdff1aSopenharmony_ci            if (interpmvp) {
2109cabdff1aSopenharmony_ci                get_mvdata_interlaced(v, &dmv_x[1], &dmv_y[1], &pred_flag[1]);
2110cabdff1aSopenharmony_ci            }
2111cabdff1aSopenharmony_ci            if (bmvtype == BMV_TYPE_DIRECT) {
2112cabdff1aSopenharmony_ci                dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
2113cabdff1aSopenharmony_ci                dmv_x[1] = dmv_y[1] = pred_flag[0] = 0;
2114cabdff1aSopenharmony_ci                if (!s->next_picture_ptr->field_picture) {
2115cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR, "Mixed field/frame direct mode not supported\n");
2116cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
2117cabdff1aSopenharmony_ci                }
2118cabdff1aSopenharmony_ci            }
2119cabdff1aSopenharmony_ci            ff_vc1_pred_b_mv_intfi(v, 0, dmv_x, dmv_y, 1, pred_flag);
2120cabdff1aSopenharmony_ci            vc1_b_mc(v, dmv_x, dmv_y, (bmvtype == BMV_TYPE_DIRECT), bmvtype);
2121cabdff1aSopenharmony_ci            mb_has_coeffs = !(idx_mbmode & 2);
2122cabdff1aSopenharmony_ci        } else { // 4-MV
2123cabdff1aSopenharmony_ci            if (fwd)
2124cabdff1aSopenharmony_ci                bmvtype = BMV_TYPE_FORWARD;
2125cabdff1aSopenharmony_ci            v->bmvtype  = bmvtype;
2126cabdff1aSopenharmony_ci            v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
2127cabdff1aSopenharmony_ci            for (i = 0; i < 4; i++) {
2128cabdff1aSopenharmony_ci                dmv_x[0] = dmv_y[0] = pred_flag[0] = 0;
2129cabdff1aSopenharmony_ci                dmv_x[1] = dmv_y[1] = pred_flag[1] = 0;
2130cabdff1aSopenharmony_ci                if (v->fourmvbp & (8 >> i)) {
2131cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x[bmvtype == BMV_TYPE_BACKWARD],
2132cabdff1aSopenharmony_ci                                             &dmv_y[bmvtype == BMV_TYPE_BACKWARD],
2133cabdff1aSopenharmony_ci                                         &pred_flag[bmvtype == BMV_TYPE_BACKWARD]);
2134cabdff1aSopenharmony_ci                }
2135cabdff1aSopenharmony_ci                ff_vc1_pred_b_mv_intfi(v, i, dmv_x, dmv_y, 0, pred_flag);
2136cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, i, bmvtype == BMV_TYPE_BACKWARD, 0);
2137cabdff1aSopenharmony_ci            }
2138cabdff1aSopenharmony_ci            ff_vc1_mc_4mv_chroma(v, bmvtype == BMV_TYPE_BACKWARD);
2139cabdff1aSopenharmony_ci            mb_has_coeffs = idx_mbmode & 1;
2140cabdff1aSopenharmony_ci        }
2141cabdff1aSopenharmony_ci        if (mb_has_coeffs)
2142cabdff1aSopenharmony_ci            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
2143cabdff1aSopenharmony_ci        if (cbp) {
2144cabdff1aSopenharmony_ci            GET_MQUANT();
2145cabdff1aSopenharmony_ci        }
2146cabdff1aSopenharmony_ci        s->current_picture.qscale_table[mb_pos] = mquant;
2147cabdff1aSopenharmony_ci        if (!v->ttmbf && cbp) {
2148cabdff1aSopenharmony_ci            ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
2149cabdff1aSopenharmony_ci        }
2150cabdff1aSopenharmony_ci        dst_idx = 0;
2151cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++) {
2152cabdff1aSopenharmony_ci            s->dc_val[0][s->block_index[i]] = 0;
2153cabdff1aSopenharmony_ci            dst_idx += i >> 2;
2154cabdff1aSopenharmony_ci            val = ((cbp >> (5 - i)) & 1);
2155cabdff1aSopenharmony_ci            off = (i & 4) ? 0 : (i & 1) * 8 + (i & 2) * 4 * s->linesize;
2156cabdff1aSopenharmony_ci            if (val) {
2157cabdff1aSopenharmony_ci                pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
2158cabdff1aSopenharmony_ci                                         first_block, s->dest[dst_idx] + off,
2159cabdff1aSopenharmony_ci                                         (i & 4) ? s->uvlinesize : s->linesize,
2160cabdff1aSopenharmony_ci                                         CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
2161cabdff1aSopenharmony_ci                if (pat < 0)
2162cabdff1aSopenharmony_ci                    return pat;
2163cabdff1aSopenharmony_ci                block_cbp |= pat << (i << 2);
2164cabdff1aSopenharmony_ci                if (!v->ttmbf && ttmb < 8)
2165cabdff1aSopenharmony_ci                    ttmb = -1;
2166cabdff1aSopenharmony_ci                first_block = 0;
2167cabdff1aSopenharmony_ci            }
2168cabdff1aSopenharmony_ci        }
2169cabdff1aSopenharmony_ci    }
2170cabdff1aSopenharmony_ci    v->cbp[s->mb_x]      = block_cbp;
2171cabdff1aSopenharmony_ci    v->ttblk[s->mb_x]    = block_tt;
2172cabdff1aSopenharmony_ci
2173cabdff1aSopenharmony_ci    return 0;
2174cabdff1aSopenharmony_ci}
2175cabdff1aSopenharmony_ci
2176cabdff1aSopenharmony_ci/** Decode one B-frame MB (in interlaced frame B picture)
2177cabdff1aSopenharmony_ci */
2178cabdff1aSopenharmony_cistatic int vc1_decode_b_mb_intfr(VC1Context *v)
2179cabdff1aSopenharmony_ci{
2180cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
2181cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
2182cabdff1aSopenharmony_ci    int i, j;
2183cabdff1aSopenharmony_ci    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2184cabdff1aSopenharmony_ci    int cbp = 0; /* cbp decoding stuff */
2185cabdff1aSopenharmony_ci    int mqdiff, mquant; /* MB quantization */
2186cabdff1aSopenharmony_ci    int ttmb = v->ttfrm; /* MB Transform type */
2187cabdff1aSopenharmony_ci    int mvsw = 0; /* motion vector switch */
2188cabdff1aSopenharmony_ci    int mb_has_coeffs = 1; /* last_flag */
2189cabdff1aSopenharmony_ci    int dmv_x, dmv_y; /* Differential MV components */
2190cabdff1aSopenharmony_ci    int val; /* temp value */
2191cabdff1aSopenharmony_ci    int first_block = 1;
2192cabdff1aSopenharmony_ci    int dst_idx, off;
2193cabdff1aSopenharmony_ci    int skipped, direct, twomv = 0;
2194cabdff1aSopenharmony_ci    int block_cbp = 0, pat, block_tt = 0;
2195cabdff1aSopenharmony_ci    int idx_mbmode = 0, mvbp;
2196cabdff1aSopenharmony_ci    int stride_y, fieldtx;
2197cabdff1aSopenharmony_ci    int bmvtype = BMV_TYPE_BACKWARD;
2198cabdff1aSopenharmony_ci    int dir, dir2;
2199cabdff1aSopenharmony_ci
2200cabdff1aSopenharmony_ci    mquant = v->pq; /* Lossy initialization */
2201cabdff1aSopenharmony_ci    s->mb_intra = 0;
2202cabdff1aSopenharmony_ci    if (v->skip_is_raw)
2203cabdff1aSopenharmony_ci        skipped = get_bits1(gb);
2204cabdff1aSopenharmony_ci    else
2205cabdff1aSopenharmony_ci        skipped = v->s.mbskip_table[mb_pos];
2206cabdff1aSopenharmony_ci
2207cabdff1aSopenharmony_ci    if (!skipped) {
2208cabdff1aSopenharmony_ci        idx_mbmode = get_vlc2(gb, v->mbmode_vlc->table, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 2);
2209cabdff1aSopenharmony_ci        if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_2MV_FIELD) {
2210cabdff1aSopenharmony_ci            twomv = 1;
2211cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[0]] = 1;
2212cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[1]] = 1;
2213cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[2]] = 1;
2214cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[3]] = 1;
2215cabdff1aSopenharmony_ci        } else {
2216cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[0]] = 0;
2217cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[1]] = 0;
2218cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[2]] = 0;
2219cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[3]] = 0;
2220cabdff1aSopenharmony_ci        }
2221cabdff1aSopenharmony_ci    }
2222cabdff1aSopenharmony_ci
2223cabdff1aSopenharmony_ci    if (ff_vc1_mbmode_intfrp[0][idx_mbmode][0] == MV_PMODE_INTFR_INTRA) { // intra MB
2224cabdff1aSopenharmony_ci        for (i = 0; i < 4; i++) {
2225cabdff1aSopenharmony_ci            s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = 0;
2226cabdff1aSopenharmony_ci            s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = 0;
2227cabdff1aSopenharmony_ci            s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = 0;
2228cabdff1aSopenharmony_ci            s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = 0;
2229cabdff1aSopenharmony_ci        }
2230cabdff1aSopenharmony_ci        v->is_intra[s->mb_x] = 0x3f; // Set the bitfield to all 1.
2231cabdff1aSopenharmony_ci        s->mb_intra          = 1;
2232cabdff1aSopenharmony_ci        s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
2233cabdff1aSopenharmony_ci        fieldtx = v->fieldtx_plane[mb_pos] = get_bits1(gb);
2234cabdff1aSopenharmony_ci        mb_has_coeffs = get_bits1(gb);
2235cabdff1aSopenharmony_ci        if (mb_has_coeffs)
2236cabdff1aSopenharmony_ci            cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
2237cabdff1aSopenharmony_ci        v->s.ac_pred = v->acpred_plane[mb_pos] = get_bits1(gb);
2238cabdff1aSopenharmony_ci        GET_MQUANT();
2239cabdff1aSopenharmony_ci        s->current_picture.qscale_table[mb_pos] = mquant;
2240cabdff1aSopenharmony_ci        /* Set DC scale - y and c use the same (not sure if necessary here) */
2241cabdff1aSopenharmony_ci        s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)];
2242cabdff1aSopenharmony_ci        s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)];
2243cabdff1aSopenharmony_ci        dst_idx = 0;
2244cabdff1aSopenharmony_ci        for (i = 0; i < 6; i++) {
2245cabdff1aSopenharmony_ci            v->a_avail = v->c_avail          = 0;
2246cabdff1aSopenharmony_ci            v->mb_type[0][s->block_index[i]] = 1;
2247cabdff1aSopenharmony_ci            s->dc_val[0][s->block_index[i]]  = 0;
2248cabdff1aSopenharmony_ci            dst_idx += i >> 2;
2249cabdff1aSopenharmony_ci            val = ((cbp >> (5 - i)) & 1);
2250cabdff1aSopenharmony_ci            if (i == 2 || i == 3 || !s->first_slice_line)
2251cabdff1aSopenharmony_ci                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
2252cabdff1aSopenharmony_ci            if (i == 1 || i == 3 || s->mb_x)
2253cabdff1aSopenharmony_ci                v->c_avail = v->mb_type[0][s->block_index[i] - 1];
2254cabdff1aSopenharmony_ci
2255cabdff1aSopenharmony_ci            vc1_decode_intra_block(v, s->block[i], i, val, mquant,
2256cabdff1aSopenharmony_ci                                   (i & 4) ? v->codingset2 : v->codingset);
2257cabdff1aSopenharmony_ci            if (CONFIG_GRAY && i > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
2258cabdff1aSopenharmony_ci                continue;
2259cabdff1aSopenharmony_ci            v->vc1dsp.vc1_inv_trans_8x8(s->block[i]);
2260cabdff1aSopenharmony_ci            if (i < 4) {
2261cabdff1aSopenharmony_ci                stride_y = s->linesize << fieldtx;
2262cabdff1aSopenharmony_ci                off = (fieldtx) ? ((i & 1) * 8) + ((i & 2) >> 1) * s->linesize : (i & 1) * 8 + 4 * (i & 2) * s->linesize;
2263cabdff1aSopenharmony_ci            } else {
2264cabdff1aSopenharmony_ci                stride_y = s->uvlinesize;
2265cabdff1aSopenharmony_ci                off = 0;
2266cabdff1aSopenharmony_ci            }
2267cabdff1aSopenharmony_ci            s->idsp.put_signed_pixels_clamped(s->block[i],
2268cabdff1aSopenharmony_ci                                              s->dest[dst_idx] + off,
2269cabdff1aSopenharmony_ci                                              stride_y);
2270cabdff1aSopenharmony_ci        }
2271cabdff1aSopenharmony_ci    } else {
2272cabdff1aSopenharmony_ci        s->mb_intra = v->is_intra[s->mb_x] = 0;
2273cabdff1aSopenharmony_ci
2274cabdff1aSopenharmony_ci        if (v->dmb_is_raw)
2275cabdff1aSopenharmony_ci            direct = get_bits1(gb);
2276cabdff1aSopenharmony_ci        else
2277cabdff1aSopenharmony_ci            direct = v->direct_mb_plane[mb_pos];
2278cabdff1aSopenharmony_ci
2279cabdff1aSopenharmony_ci        if (direct) {
2280cabdff1aSopenharmony_ci            if (s->next_picture_ptr->field_picture)
2281cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_WARNING, "Mixed frame/field direct mode not supported\n");
2282cabdff1aSopenharmony_ci            s->mv[0][0][0] = s->current_picture.motion_val[0][s->block_index[0]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][0], v->bfraction, 0, s->quarter_sample);
2283cabdff1aSopenharmony_ci            s->mv[0][0][1] = s->current_picture.motion_val[0][s->block_index[0]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][1], v->bfraction, 0, s->quarter_sample);
2284cabdff1aSopenharmony_ci            s->mv[1][0][0] = s->current_picture.motion_val[1][s->block_index[0]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][0], v->bfraction, 1, s->quarter_sample);
2285cabdff1aSopenharmony_ci            s->mv[1][0][1] = s->current_picture.motion_val[1][s->block_index[0]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[0]][1], v->bfraction, 1, s->quarter_sample);
2286cabdff1aSopenharmony_ci
2287cabdff1aSopenharmony_ci            if (twomv) {
2288cabdff1aSopenharmony_ci                s->mv[0][2][0] = s->current_picture.motion_val[0][s->block_index[2]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][0], v->bfraction, 0, s->quarter_sample);
2289cabdff1aSopenharmony_ci                s->mv[0][2][1] = s->current_picture.motion_val[0][s->block_index[2]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][1], v->bfraction, 0, s->quarter_sample);
2290cabdff1aSopenharmony_ci                s->mv[1][2][0] = s->current_picture.motion_val[1][s->block_index[2]][0] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][0], v->bfraction, 1, s->quarter_sample);
2291cabdff1aSopenharmony_ci                s->mv[1][2][1] = s->current_picture.motion_val[1][s->block_index[2]][1] = scale_mv(s->next_picture.motion_val[1][s->block_index[2]][1], v->bfraction, 1, s->quarter_sample);
2292cabdff1aSopenharmony_ci
2293cabdff1aSopenharmony_ci                for (i = 1; i < 4; i += 2) {
2294cabdff1aSopenharmony_ci                    s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = s->mv[0][i-1][0];
2295cabdff1aSopenharmony_ci                    s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = s->mv[0][i-1][1];
2296cabdff1aSopenharmony_ci                    s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = s->mv[1][i-1][0];
2297cabdff1aSopenharmony_ci                    s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = s->mv[1][i-1][1];
2298cabdff1aSopenharmony_ci                }
2299cabdff1aSopenharmony_ci            } else {
2300cabdff1aSopenharmony_ci                for (i = 1; i < 4; i++) {
2301cabdff1aSopenharmony_ci                    s->mv[0][i][0] = s->current_picture.motion_val[0][s->block_index[i]][0] = s->mv[0][0][0];
2302cabdff1aSopenharmony_ci                    s->mv[0][i][1] = s->current_picture.motion_val[0][s->block_index[i]][1] = s->mv[0][0][1];
2303cabdff1aSopenharmony_ci                    s->mv[1][i][0] = s->current_picture.motion_val[1][s->block_index[i]][0] = s->mv[1][0][0];
2304cabdff1aSopenharmony_ci                    s->mv[1][i][1] = s->current_picture.motion_val[1][s->block_index[i]][1] = s->mv[1][0][1];
2305cabdff1aSopenharmony_ci                }
2306cabdff1aSopenharmony_ci            }
2307cabdff1aSopenharmony_ci        }
2308cabdff1aSopenharmony_ci
2309cabdff1aSopenharmony_ci        if (!direct) {
2310cabdff1aSopenharmony_ci            if (skipped || !s->mb_intra) {
2311cabdff1aSopenharmony_ci                bmvtype = decode012(gb);
2312cabdff1aSopenharmony_ci                switch (bmvtype) {
2313cabdff1aSopenharmony_ci                case 0:
2314cabdff1aSopenharmony_ci                    bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
2315cabdff1aSopenharmony_ci                    break;
2316cabdff1aSopenharmony_ci                case 1:
2317cabdff1aSopenharmony_ci                    bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
2318cabdff1aSopenharmony_ci                    break;
2319cabdff1aSopenharmony_ci                case 2:
2320cabdff1aSopenharmony_ci                    bmvtype  = BMV_TYPE_INTERPOLATED;
2321cabdff1aSopenharmony_ci                }
2322cabdff1aSopenharmony_ci            }
2323cabdff1aSopenharmony_ci
2324cabdff1aSopenharmony_ci            if (twomv && bmvtype != BMV_TYPE_INTERPOLATED)
2325cabdff1aSopenharmony_ci                mvsw = get_bits1(gb);
2326cabdff1aSopenharmony_ci        }
2327cabdff1aSopenharmony_ci
2328cabdff1aSopenharmony_ci        if (!skipped) { // inter MB
2329cabdff1aSopenharmony_ci            mb_has_coeffs = ff_vc1_mbmode_intfrp[0][idx_mbmode][3];
2330cabdff1aSopenharmony_ci            if (mb_has_coeffs)
2331cabdff1aSopenharmony_ci                cbp = 1 + get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
2332cabdff1aSopenharmony_ci            if (!direct) {
2333cabdff1aSopenharmony_ci                if (bmvtype == BMV_TYPE_INTERPOLATED && twomv) {
2334cabdff1aSopenharmony_ci                    v->fourmvbp = get_vlc2(gb, v->fourmvbp_vlc->table, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 1);
2335cabdff1aSopenharmony_ci                } else if (bmvtype == BMV_TYPE_INTERPOLATED || twomv) {
2336cabdff1aSopenharmony_ci                    v->twomvbp = get_vlc2(gb, v->twomvbp_vlc->table, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 1);
2337cabdff1aSopenharmony_ci                }
2338cabdff1aSopenharmony_ci            }
2339cabdff1aSopenharmony_ci
2340cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++)
2341cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = 0;
2342cabdff1aSopenharmony_ci            fieldtx = v->fieldtx_plane[mb_pos] = ff_vc1_mbmode_intfrp[0][idx_mbmode][1];
2343cabdff1aSopenharmony_ci            /* for all motion vector read MVDATA and motion compensate each block */
2344cabdff1aSopenharmony_ci            dst_idx = 0;
2345cabdff1aSopenharmony_ci            if (direct) {
2346cabdff1aSopenharmony_ci                if (twomv) {
2347cabdff1aSopenharmony_ci                    for (i = 0; i < 4; i++) {
2348cabdff1aSopenharmony_ci                        ff_vc1_mc_4mv_luma(v, i, 0, 0);
2349cabdff1aSopenharmony_ci                        ff_vc1_mc_4mv_luma(v, i, 1, 1);
2350cabdff1aSopenharmony_ci                    }
2351cabdff1aSopenharmony_ci                    ff_vc1_mc_4mv_chroma4(v, 0, 0, 0);
2352cabdff1aSopenharmony_ci                    ff_vc1_mc_4mv_chroma4(v, 1, 1, 1);
2353cabdff1aSopenharmony_ci                } else {
2354cabdff1aSopenharmony_ci                    ff_vc1_mc_1mv(v, 0);
2355cabdff1aSopenharmony_ci                    ff_vc1_interp_mc(v);
2356cabdff1aSopenharmony_ci                }
2357cabdff1aSopenharmony_ci            } else if (twomv && bmvtype == BMV_TYPE_INTERPOLATED) {
2358cabdff1aSopenharmony_ci                mvbp = v->fourmvbp;
2359cabdff1aSopenharmony_ci                for (i = 0; i < 4; i++) {
2360cabdff1aSopenharmony_ci                    dir = i==1 || i==3;
2361cabdff1aSopenharmony_ci                    dmv_x = dmv_y = 0;
2362cabdff1aSopenharmony_ci                    val = ((mvbp >> (3 - i)) & 1);
2363cabdff1aSopenharmony_ci                    if (val)
2364cabdff1aSopenharmony_ci                        get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
2365cabdff1aSopenharmony_ci                    j = i > 1 ? 2 : 0;
2366cabdff1aSopenharmony_ci                    ff_vc1_pred_mv_intfr(v, j, dmv_x, dmv_y, 2, v->range_x, v->range_y, dir);
2367cabdff1aSopenharmony_ci                    ff_vc1_mc_4mv_luma(v, j, dir, dir);
2368cabdff1aSopenharmony_ci                    ff_vc1_mc_4mv_luma(v, j+1, dir, dir);
2369cabdff1aSopenharmony_ci                }
2370cabdff1aSopenharmony_ci
2371cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_chroma4(v, 0, 0, 0);
2372cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_chroma4(v, 1, 1, 1);
2373cabdff1aSopenharmony_ci            } else if (bmvtype == BMV_TYPE_INTERPOLATED) {
2374cabdff1aSopenharmony_ci                mvbp = v->twomvbp;
2375cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
2376cabdff1aSopenharmony_ci                if (mvbp & 2)
2377cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
2378cabdff1aSopenharmony_ci
2379cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, 0);
2380cabdff1aSopenharmony_ci                ff_vc1_mc_1mv(v, 0);
2381cabdff1aSopenharmony_ci
2382cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
2383cabdff1aSopenharmony_ci                if (mvbp & 1)
2384cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
2385cabdff1aSopenharmony_ci
2386cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, 1);
2387cabdff1aSopenharmony_ci                ff_vc1_interp_mc(v);
2388cabdff1aSopenharmony_ci            } else if (twomv) {
2389cabdff1aSopenharmony_ci                dir = bmvtype == BMV_TYPE_BACKWARD;
2390cabdff1aSopenharmony_ci                dir2 = dir;
2391cabdff1aSopenharmony_ci                if (mvsw)
2392cabdff1aSopenharmony_ci                    dir2 = !dir;
2393cabdff1aSopenharmony_ci                mvbp = v->twomvbp;
2394cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
2395cabdff1aSopenharmony_ci                if (mvbp & 2)
2396cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
2397cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 2, v->range_x, v->range_y, dir);
2398cabdff1aSopenharmony_ci
2399cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
2400cabdff1aSopenharmony_ci                if (mvbp & 1)
2401cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
2402cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 2, dmv_x, dmv_y, 2, v->range_x, v->range_y, dir2);
2403cabdff1aSopenharmony_ci
2404cabdff1aSopenharmony_ci                if (mvsw) {
2405cabdff1aSopenharmony_ci                    for (i = 0; i < 2; i++) {
2406cabdff1aSopenharmony_ci                        s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->current_picture.motion_val[dir][s->block_index[i+2]][0] = s->current_picture.motion_val[dir][s->block_index[i]][0];
2407cabdff1aSopenharmony_ci                        s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->current_picture.motion_val[dir][s->block_index[i+2]][1] = s->current_picture.motion_val[dir][s->block_index[i]][1];
2408cabdff1aSopenharmony_ci                        s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->current_picture.motion_val[dir2][s->block_index[i]][0] = s->current_picture.motion_val[dir2][s->block_index[i+2]][0];
2409cabdff1aSopenharmony_ci                        s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->current_picture.motion_val[dir2][s->block_index[i]][1] = s->current_picture.motion_val[dir2][s->block_index[i+2]][1];
2410cabdff1aSopenharmony_ci                    }
2411cabdff1aSopenharmony_ci                } else {
2412cabdff1aSopenharmony_ci                    ff_vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, !dir);
2413cabdff1aSopenharmony_ci                    ff_vc1_pred_mv_intfr(v, 2, 0, 0, 2, v->range_x, v->range_y, !dir);
2414cabdff1aSopenharmony_ci                }
2415cabdff1aSopenharmony_ci
2416cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 0, dir, 0);
2417cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 1, dir, 0);
2418cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 2, dir2, 0);
2419cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_luma(v, 3, dir2, 0);
2420cabdff1aSopenharmony_ci                ff_vc1_mc_4mv_chroma4(v, dir, dir2, 0);
2421cabdff1aSopenharmony_ci            } else {
2422cabdff1aSopenharmony_ci                dir = bmvtype == BMV_TYPE_BACKWARD;
2423cabdff1aSopenharmony_ci
2424cabdff1aSopenharmony_ci                mvbp = ff_vc1_mbmode_intfrp[0][idx_mbmode][2];
2425cabdff1aSopenharmony_ci                dmv_x = dmv_y = 0;
2426cabdff1aSopenharmony_ci                if (mvbp)
2427cabdff1aSopenharmony_ci                    get_mvdata_interlaced(v, &dmv_x, &dmv_y, 0);
2428cabdff1aSopenharmony_ci
2429cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, dir);
2430cabdff1aSopenharmony_ci                v->blk_mv_type[s->block_index[0]] = 1;
2431cabdff1aSopenharmony_ci                v->blk_mv_type[s->block_index[1]] = 1;
2432cabdff1aSopenharmony_ci                v->blk_mv_type[s->block_index[2]] = 1;
2433cabdff1aSopenharmony_ci                v->blk_mv_type[s->block_index[3]] = 1;
2434cabdff1aSopenharmony_ci                ff_vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, !dir);
2435cabdff1aSopenharmony_ci                for (i = 0; i < 2; i++) {
2436cabdff1aSopenharmony_ci                    s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->current_picture.motion_val[!dir][s->block_index[i+2]][0] = s->current_picture.motion_val[!dir][s->block_index[i]][0];
2437cabdff1aSopenharmony_ci                    s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->current_picture.motion_val[!dir][s->block_index[i+2]][1] = s->current_picture.motion_val[!dir][s->block_index[i]][1];
2438cabdff1aSopenharmony_ci                }
2439cabdff1aSopenharmony_ci                ff_vc1_mc_1mv(v, dir);
2440cabdff1aSopenharmony_ci            }
2441cabdff1aSopenharmony_ci
2442cabdff1aSopenharmony_ci            if (cbp)
2443cabdff1aSopenharmony_ci                GET_MQUANT();  // p. 227
2444cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
2445cabdff1aSopenharmony_ci            if (!v->ttmbf && cbp)
2446cabdff1aSopenharmony_ci                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
2447cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
2448cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]] = 0;
2449cabdff1aSopenharmony_ci                dst_idx += i >> 2;
2450cabdff1aSopenharmony_ci                val = ((cbp >> (5 - i)) & 1);
2451cabdff1aSopenharmony_ci                if (!fieldtx)
2452cabdff1aSopenharmony_ci                    off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
2453cabdff1aSopenharmony_ci                else
2454cabdff1aSopenharmony_ci                    off = (i & 4) ? 0 : ((i & 1) * 8 + ((i > 1) * s->linesize));
2455cabdff1aSopenharmony_ci                if (val) {
2456cabdff1aSopenharmony_ci                    pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb,
2457cabdff1aSopenharmony_ci                                             first_block, s->dest[dst_idx] + off,
2458cabdff1aSopenharmony_ci                                             (i & 4) ? s->uvlinesize : (s->linesize << fieldtx),
2459cabdff1aSopenharmony_ci                                             CONFIG_GRAY && (i & 4) && (s->avctx->flags & AV_CODEC_FLAG_GRAY), &block_tt);
2460cabdff1aSopenharmony_ci                    if (pat < 0)
2461cabdff1aSopenharmony_ci                        return pat;
2462cabdff1aSopenharmony_ci                    block_cbp |= pat << (i << 2);
2463cabdff1aSopenharmony_ci                    if (!v->ttmbf && ttmb < 8)
2464cabdff1aSopenharmony_ci                        ttmb = -1;
2465cabdff1aSopenharmony_ci                    first_block = 0;
2466cabdff1aSopenharmony_ci                }
2467cabdff1aSopenharmony_ci            }
2468cabdff1aSopenharmony_ci
2469cabdff1aSopenharmony_ci        } else { // skipped
2470cabdff1aSopenharmony_ci            dir = 0;
2471cabdff1aSopenharmony_ci            for (i = 0; i < 6; i++) {
2472cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[i]] = 0;
2473cabdff1aSopenharmony_ci                s->dc_val[0][s->block_index[i]] = 0;
2474cabdff1aSopenharmony_ci            }
2475cabdff1aSopenharmony_ci            s->current_picture.mb_type[mb_pos]      = MB_TYPE_SKIP;
2476cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = 0;
2477cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[0]] = 0;
2478cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[1]] = 0;
2479cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[2]] = 0;
2480cabdff1aSopenharmony_ci            v->blk_mv_type[s->block_index[3]] = 0;
2481cabdff1aSopenharmony_ci
2482cabdff1aSopenharmony_ci            if (!direct) {
2483cabdff1aSopenharmony_ci                if (bmvtype == BMV_TYPE_INTERPOLATED) {
2484cabdff1aSopenharmony_ci                    ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, 0);
2485cabdff1aSopenharmony_ci                    ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, 1);
2486cabdff1aSopenharmony_ci                } else {
2487cabdff1aSopenharmony_ci                    dir = bmvtype == BMV_TYPE_BACKWARD;
2488cabdff1aSopenharmony_ci                    ff_vc1_pred_mv_intfr(v, 0, 0, 0, 1, v->range_x, v->range_y, dir);
2489cabdff1aSopenharmony_ci                    if (mvsw) {
2490cabdff1aSopenharmony_ci                        int dir2 = dir;
2491cabdff1aSopenharmony_ci                        if (mvsw)
2492cabdff1aSopenharmony_ci                            dir2 = !dir;
2493cabdff1aSopenharmony_ci                        for (i = 0; i < 2; i++) {
2494cabdff1aSopenharmony_ci                            s->mv[dir][i+2][0] = s->mv[dir][i][0] = s->current_picture.motion_val[dir][s->block_index[i+2]][0] = s->current_picture.motion_val[dir][s->block_index[i]][0];
2495cabdff1aSopenharmony_ci                            s->mv[dir][i+2][1] = s->mv[dir][i][1] = s->current_picture.motion_val[dir][s->block_index[i+2]][1] = s->current_picture.motion_val[dir][s->block_index[i]][1];
2496cabdff1aSopenharmony_ci                            s->mv[dir2][i+2][0] = s->mv[dir2][i][0] = s->current_picture.motion_val[dir2][s->block_index[i]][0] = s->current_picture.motion_val[dir2][s->block_index[i+2]][0];
2497cabdff1aSopenharmony_ci                            s->mv[dir2][i+2][1] = s->mv[dir2][i][1] = s->current_picture.motion_val[dir2][s->block_index[i]][1] = s->current_picture.motion_val[dir2][s->block_index[i+2]][1];
2498cabdff1aSopenharmony_ci                        }
2499cabdff1aSopenharmony_ci                    } else {
2500cabdff1aSopenharmony_ci                        v->blk_mv_type[s->block_index[0]] = 1;
2501cabdff1aSopenharmony_ci                        v->blk_mv_type[s->block_index[1]] = 1;
2502cabdff1aSopenharmony_ci                        v->blk_mv_type[s->block_index[2]] = 1;
2503cabdff1aSopenharmony_ci                        v->blk_mv_type[s->block_index[3]] = 1;
2504cabdff1aSopenharmony_ci                        ff_vc1_pred_mv_intfr(v, 0, 0, 0, 2, v->range_x, v->range_y, !dir);
2505cabdff1aSopenharmony_ci                        for (i = 0; i < 2; i++) {
2506cabdff1aSopenharmony_ci                            s->mv[!dir][i+2][0] = s->mv[!dir][i][0] = s->current_picture.motion_val[!dir][s->block_index[i+2]][0] = s->current_picture.motion_val[!dir][s->block_index[i]][0];
2507cabdff1aSopenharmony_ci                            s->mv[!dir][i+2][1] = s->mv[!dir][i][1] = s->current_picture.motion_val[!dir][s->block_index[i+2]][1] = s->current_picture.motion_val[!dir][s->block_index[i]][1];
2508cabdff1aSopenharmony_ci                        }
2509cabdff1aSopenharmony_ci                    }
2510cabdff1aSopenharmony_ci                }
2511cabdff1aSopenharmony_ci            }
2512cabdff1aSopenharmony_ci
2513cabdff1aSopenharmony_ci            ff_vc1_mc_1mv(v, dir);
2514cabdff1aSopenharmony_ci            if (direct || bmvtype == BMV_TYPE_INTERPOLATED) {
2515cabdff1aSopenharmony_ci                ff_vc1_interp_mc(v);
2516cabdff1aSopenharmony_ci            }
2517cabdff1aSopenharmony_ci            v->fieldtx_plane[mb_pos] = 0;
2518cabdff1aSopenharmony_ci        }
2519cabdff1aSopenharmony_ci    }
2520cabdff1aSopenharmony_ci    v->cbp[s->mb_x]      = block_cbp;
2521cabdff1aSopenharmony_ci    v->ttblk[s->mb_x]    = block_tt;
2522cabdff1aSopenharmony_ci
2523cabdff1aSopenharmony_ci    return 0;
2524cabdff1aSopenharmony_ci}
2525cabdff1aSopenharmony_ci
2526cabdff1aSopenharmony_ci/** Decode blocks of I-frame
2527cabdff1aSopenharmony_ci */
2528cabdff1aSopenharmony_cistatic void vc1_decode_i_blocks(VC1Context *v)
2529cabdff1aSopenharmony_ci{
2530cabdff1aSopenharmony_ci    int k, j;
2531cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
2532cabdff1aSopenharmony_ci    int cbp, val;
2533cabdff1aSopenharmony_ci    uint8_t *coded_val;
2534cabdff1aSopenharmony_ci    int mb_pos;
2535cabdff1aSopenharmony_ci
2536cabdff1aSopenharmony_ci    /* select coding mode used for VLC tables selection */
2537cabdff1aSopenharmony_ci    switch (v->y_ac_table_index) {
2538cabdff1aSopenharmony_ci    case 0:
2539cabdff1aSopenharmony_ci        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2540cabdff1aSopenharmony_ci        break;
2541cabdff1aSopenharmony_ci    case 1:
2542cabdff1aSopenharmony_ci        v->codingset = CS_HIGH_MOT_INTRA;
2543cabdff1aSopenharmony_ci        break;
2544cabdff1aSopenharmony_ci    case 2:
2545cabdff1aSopenharmony_ci        v->codingset = CS_MID_RATE_INTRA;
2546cabdff1aSopenharmony_ci        break;
2547cabdff1aSopenharmony_ci    }
2548cabdff1aSopenharmony_ci
2549cabdff1aSopenharmony_ci    switch (v->c_ac_table_index) {
2550cabdff1aSopenharmony_ci    case 0:
2551cabdff1aSopenharmony_ci        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2552cabdff1aSopenharmony_ci        break;
2553cabdff1aSopenharmony_ci    case 1:
2554cabdff1aSopenharmony_ci        v->codingset2 = CS_HIGH_MOT_INTER;
2555cabdff1aSopenharmony_ci        break;
2556cabdff1aSopenharmony_ci    case 2:
2557cabdff1aSopenharmony_ci        v->codingset2 = CS_MID_RATE_INTER;
2558cabdff1aSopenharmony_ci        break;
2559cabdff1aSopenharmony_ci    }
2560cabdff1aSopenharmony_ci
2561cabdff1aSopenharmony_ci    /* Set DC scale - y and c use the same */
2562cabdff1aSopenharmony_ci    s->y_dc_scale = s->y_dc_scale_table[v->pq];
2563cabdff1aSopenharmony_ci    s->c_dc_scale = s->c_dc_scale_table[v->pq];
2564cabdff1aSopenharmony_ci
2565cabdff1aSopenharmony_ci    //do frame decode
2566cabdff1aSopenharmony_ci    s->mb_x = s->mb_y = 0;
2567cabdff1aSopenharmony_ci    s->mb_intra         = 1;
2568cabdff1aSopenharmony_ci    s->first_slice_line = 1;
2569cabdff1aSopenharmony_ci    for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2570cabdff1aSopenharmony_ci        s->mb_x = 0;
2571cabdff1aSopenharmony_ci        init_block_index(v);
2572cabdff1aSopenharmony_ci        for (; s->mb_x < v->end_mb_x; s->mb_x++) {
2573cabdff1aSopenharmony_ci            ff_update_block_index(s);
2574cabdff1aSopenharmony_ci            s->bdsp.clear_blocks(v->block[v->cur_blk_idx][0]);
2575cabdff1aSopenharmony_ci            mb_pos = s->mb_x + s->mb_y * s->mb_width;
2576cabdff1aSopenharmony_ci            s->current_picture.mb_type[mb_pos]                     = MB_TYPE_INTRA;
2577cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos]                = v->pq;
2578cabdff1aSopenharmony_ci            for (int i = 0; i < 4; i++) {
2579cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[i]][0] = 0;
2580cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[i]][1] = 0;
2581cabdff1aSopenharmony_ci            }
2582cabdff1aSopenharmony_ci
2583cabdff1aSopenharmony_ci            // do actual MB decoding and displaying
2584cabdff1aSopenharmony_ci            cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
2585cabdff1aSopenharmony_ci            v->s.ac_pred = get_bits1(&v->s.gb);
2586cabdff1aSopenharmony_ci
2587cabdff1aSopenharmony_ci            for (k = 0; k < 6; k++) {
2588cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[k]] = 1;
2589cabdff1aSopenharmony_ci
2590cabdff1aSopenharmony_ci                val = ((cbp >> (5 - k)) & 1);
2591cabdff1aSopenharmony_ci
2592cabdff1aSopenharmony_ci                if (k < 4) {
2593cabdff1aSopenharmony_ci                    int pred   = vc1_coded_block_pred(&v->s, k, &coded_val);
2594cabdff1aSopenharmony_ci                    val        = val ^ pred;
2595cabdff1aSopenharmony_ci                    *coded_val = val;
2596cabdff1aSopenharmony_ci                }
2597cabdff1aSopenharmony_ci                cbp |= val << (5 - k);
2598cabdff1aSopenharmony_ci
2599cabdff1aSopenharmony_ci                vc1_decode_i_block(v, v->block[v->cur_blk_idx][block_map[k]], k, val, (k < 4) ? v->codingset : v->codingset2);
2600cabdff1aSopenharmony_ci
2601cabdff1aSopenharmony_ci                if (CONFIG_GRAY && k > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
2602cabdff1aSopenharmony_ci                    continue;
2603cabdff1aSopenharmony_ci                v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[k]]);
2604cabdff1aSopenharmony_ci            }
2605cabdff1aSopenharmony_ci
2606cabdff1aSopenharmony_ci            if (v->overlap && v->pq >= 9) {
2607cabdff1aSopenharmony_ci                ff_vc1_i_overlap_filter(v);
2608cabdff1aSopenharmony_ci                if (v->rangeredfrm)
2609cabdff1aSopenharmony_ci                    for (k = 0; k < 6; k++)
2610cabdff1aSopenharmony_ci                        for (j = 0; j < 64; j++)
2611cabdff1aSopenharmony_ci                            v->block[v->cur_blk_idx][block_map[k]][j] *= 2;
2612cabdff1aSopenharmony_ci                vc1_put_blocks_clamped(v, 1);
2613cabdff1aSopenharmony_ci            } else {
2614cabdff1aSopenharmony_ci                if (v->rangeredfrm)
2615cabdff1aSopenharmony_ci                    for (k = 0; k < 6; k++)
2616cabdff1aSopenharmony_ci                        for (j = 0; j < 64; j++)
2617cabdff1aSopenharmony_ci                            v->block[v->cur_blk_idx][block_map[k]][j] = (v->block[v->cur_blk_idx][block_map[k]][j] - 64) * 2;
2618cabdff1aSopenharmony_ci                vc1_put_blocks_clamped(v, 0);
2619cabdff1aSopenharmony_ci            }
2620cabdff1aSopenharmony_ci
2621cabdff1aSopenharmony_ci            if (v->s.loop_filter)
2622cabdff1aSopenharmony_ci                ff_vc1_i_loop_filter(v);
2623cabdff1aSopenharmony_ci
2624cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0) {
2625cabdff1aSopenharmony_ci                ff_er_add_slice(&s->er, 0, 0, s->mb_x, s->mb_y, ER_MB_ERROR);
2626cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
2627cabdff1aSopenharmony_ci                       get_bits_count(&s->gb), s->gb.size_in_bits);
2628cabdff1aSopenharmony_ci                return;
2629cabdff1aSopenharmony_ci            }
2630cabdff1aSopenharmony_ci
2631cabdff1aSopenharmony_ci            v->topleft_blk_idx = (v->topleft_blk_idx + 1) % (v->end_mb_x + 2);
2632cabdff1aSopenharmony_ci            v->top_blk_idx = (v->top_blk_idx + 1) % (v->end_mb_x + 2);
2633cabdff1aSopenharmony_ci            v->left_blk_idx = (v->left_blk_idx + 1) % (v->end_mb_x + 2);
2634cabdff1aSopenharmony_ci            v->cur_blk_idx = (v->cur_blk_idx + 1) % (v->end_mb_x + 2);
2635cabdff1aSopenharmony_ci        }
2636cabdff1aSopenharmony_ci        if (!v->s.loop_filter)
2637cabdff1aSopenharmony_ci            ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
2638cabdff1aSopenharmony_ci        else if (s->mb_y)
2639cabdff1aSopenharmony_ci            ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
2640cabdff1aSopenharmony_ci
2641cabdff1aSopenharmony_ci        s->first_slice_line = 0;
2642cabdff1aSopenharmony_ci    }
2643cabdff1aSopenharmony_ci    if (v->s.loop_filter)
2644cabdff1aSopenharmony_ci        ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
2645cabdff1aSopenharmony_ci
2646cabdff1aSopenharmony_ci    /* This is intentionally mb_height and not end_mb_y - unlike in advanced
2647cabdff1aSopenharmony_ci     * profile, these only differ are when decoding MSS2 rectangles. */
2648cabdff1aSopenharmony_ci    ff_er_add_slice(&s->er, 0, 0, s->mb_width - 1, s->mb_height - 1, ER_MB_END);
2649cabdff1aSopenharmony_ci}
2650cabdff1aSopenharmony_ci
2651cabdff1aSopenharmony_ci/** Decode blocks of I-frame for advanced profile
2652cabdff1aSopenharmony_ci */
2653cabdff1aSopenharmony_cistatic int vc1_decode_i_blocks_adv(VC1Context *v)
2654cabdff1aSopenharmony_ci{
2655cabdff1aSopenharmony_ci    int k;
2656cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
2657cabdff1aSopenharmony_ci    int cbp, val;
2658cabdff1aSopenharmony_ci    uint8_t *coded_val;
2659cabdff1aSopenharmony_ci    int mb_pos;
2660cabdff1aSopenharmony_ci    int mquant;
2661cabdff1aSopenharmony_ci    int mqdiff;
2662cabdff1aSopenharmony_ci    GetBitContext *gb = &s->gb;
2663cabdff1aSopenharmony_ci
2664cabdff1aSopenharmony_ci    if (get_bits_left(gb) <= 1)
2665cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
2666cabdff1aSopenharmony_ci
2667cabdff1aSopenharmony_ci    /* select coding mode used for VLC tables selection */
2668cabdff1aSopenharmony_ci    switch (v->y_ac_table_index) {
2669cabdff1aSopenharmony_ci    case 0:
2670cabdff1aSopenharmony_ci        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2671cabdff1aSopenharmony_ci        break;
2672cabdff1aSopenharmony_ci    case 1:
2673cabdff1aSopenharmony_ci        v->codingset = CS_HIGH_MOT_INTRA;
2674cabdff1aSopenharmony_ci        break;
2675cabdff1aSopenharmony_ci    case 2:
2676cabdff1aSopenharmony_ci        v->codingset = CS_MID_RATE_INTRA;
2677cabdff1aSopenharmony_ci        break;
2678cabdff1aSopenharmony_ci    }
2679cabdff1aSopenharmony_ci
2680cabdff1aSopenharmony_ci    switch (v->c_ac_table_index) {
2681cabdff1aSopenharmony_ci    case 0:
2682cabdff1aSopenharmony_ci        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2683cabdff1aSopenharmony_ci        break;
2684cabdff1aSopenharmony_ci    case 1:
2685cabdff1aSopenharmony_ci        v->codingset2 = CS_HIGH_MOT_INTER;
2686cabdff1aSopenharmony_ci        break;
2687cabdff1aSopenharmony_ci    case 2:
2688cabdff1aSopenharmony_ci        v->codingset2 = CS_MID_RATE_INTER;
2689cabdff1aSopenharmony_ci        break;
2690cabdff1aSopenharmony_ci    }
2691cabdff1aSopenharmony_ci
2692cabdff1aSopenharmony_ci    // do frame decode
2693cabdff1aSopenharmony_ci    s->mb_x             = s->mb_y = 0;
2694cabdff1aSopenharmony_ci    s->mb_intra         = 1;
2695cabdff1aSopenharmony_ci    s->first_slice_line = 1;
2696cabdff1aSopenharmony_ci    s->mb_y             = s->start_mb_y;
2697cabdff1aSopenharmony_ci    if (s->start_mb_y) {
2698cabdff1aSopenharmony_ci        s->mb_x = 0;
2699cabdff1aSopenharmony_ci        init_block_index(v);
2700cabdff1aSopenharmony_ci        memset(&s->coded_block[s->block_index[0] - s->b8_stride], 0,
2701cabdff1aSopenharmony_ci               (1 + s->b8_stride) * sizeof(*s->coded_block));
2702cabdff1aSopenharmony_ci    }
2703cabdff1aSopenharmony_ci    for (; s->mb_y < s->end_mb_y; s->mb_y++) {
2704cabdff1aSopenharmony_ci        s->mb_x = 0;
2705cabdff1aSopenharmony_ci        init_block_index(v);
2706cabdff1aSopenharmony_ci        for (;s->mb_x < s->mb_width; s->mb_x++) {
2707cabdff1aSopenharmony_ci            mquant = v->pq;
2708cabdff1aSopenharmony_ci            ff_update_block_index(s);
2709cabdff1aSopenharmony_ci            s->bdsp.clear_blocks(v->block[v->cur_blk_idx][0]);
2710cabdff1aSopenharmony_ci            mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2711cabdff1aSopenharmony_ci            s->current_picture.mb_type[mb_pos + v->mb_off]                         = MB_TYPE_INTRA;
2712cabdff1aSopenharmony_ci            for (int i = 0; i < 4; i++) {
2713cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[i] + v->blocks_off][0] = 0;
2714cabdff1aSopenharmony_ci                s->current_picture.motion_val[1][s->block_index[i] + v->blocks_off][1] = 0;
2715cabdff1aSopenharmony_ci            }
2716cabdff1aSopenharmony_ci
2717cabdff1aSopenharmony_ci            // do actual MB decoding and displaying
2718cabdff1aSopenharmony_ci            if (v->fieldtx_is_raw)
2719cabdff1aSopenharmony_ci                v->fieldtx_plane[mb_pos] = get_bits1(&v->s.gb);
2720cabdff1aSopenharmony_ci            if (get_bits_left(&v->s.gb) <= 1) {
2721cabdff1aSopenharmony_ci                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
2722cabdff1aSopenharmony_ci                return 0;
2723cabdff1aSopenharmony_ci            }
2724cabdff1aSopenharmony_ci
2725cabdff1aSopenharmony_ci            cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
2726cabdff1aSopenharmony_ci            if (v->acpred_is_raw)
2727cabdff1aSopenharmony_ci                v->s.ac_pred = get_bits1(&v->s.gb);
2728cabdff1aSopenharmony_ci            else
2729cabdff1aSopenharmony_ci                v->s.ac_pred = v->acpred_plane[mb_pos];
2730cabdff1aSopenharmony_ci
2731cabdff1aSopenharmony_ci            if (v->condover == CONDOVER_SELECT && v->overflg_is_raw)
2732cabdff1aSopenharmony_ci                v->over_flags_plane[mb_pos] = get_bits1(&v->s.gb);
2733cabdff1aSopenharmony_ci
2734cabdff1aSopenharmony_ci            GET_MQUANT();
2735cabdff1aSopenharmony_ci
2736cabdff1aSopenharmony_ci            s->current_picture.qscale_table[mb_pos] = mquant;
2737cabdff1aSopenharmony_ci            /* Set DC scale - y and c use the same */
2738cabdff1aSopenharmony_ci            s->y_dc_scale = s->y_dc_scale_table[FFABS(mquant)];
2739cabdff1aSopenharmony_ci            s->c_dc_scale = s->c_dc_scale_table[FFABS(mquant)];
2740cabdff1aSopenharmony_ci
2741cabdff1aSopenharmony_ci            for (k = 0; k < 6; k++) {
2742cabdff1aSopenharmony_ci                v->mb_type[0][s->block_index[k]] = 1;
2743cabdff1aSopenharmony_ci
2744cabdff1aSopenharmony_ci                val = ((cbp >> (5 - k)) & 1);
2745cabdff1aSopenharmony_ci
2746cabdff1aSopenharmony_ci                if (k < 4) {
2747cabdff1aSopenharmony_ci                    int pred   = vc1_coded_block_pred(&v->s, k, &coded_val);
2748cabdff1aSopenharmony_ci                    val        = val ^ pred;
2749cabdff1aSopenharmony_ci                    *coded_val = val;
2750cabdff1aSopenharmony_ci                }
2751cabdff1aSopenharmony_ci                cbp |= val << (5 - k);
2752cabdff1aSopenharmony_ci
2753cabdff1aSopenharmony_ci                v->a_avail = !s->first_slice_line || (k == 2 || k == 3);
2754cabdff1aSopenharmony_ci                v->c_avail = !!s->mb_x || (k == 1 || k == 3);
2755cabdff1aSopenharmony_ci
2756cabdff1aSopenharmony_ci                vc1_decode_i_block_adv(v, v->block[v->cur_blk_idx][block_map[k]], k, val,
2757cabdff1aSopenharmony_ci                                       (k < 4) ? v->codingset : v->codingset2, mquant);
2758cabdff1aSopenharmony_ci
2759cabdff1aSopenharmony_ci                if (CONFIG_GRAY && k > 3 && (s->avctx->flags & AV_CODEC_FLAG_GRAY))
2760cabdff1aSopenharmony_ci                    continue;
2761cabdff1aSopenharmony_ci                v->vc1dsp.vc1_inv_trans_8x8(v->block[v->cur_blk_idx][block_map[k]]);
2762cabdff1aSopenharmony_ci            }
2763cabdff1aSopenharmony_ci
2764cabdff1aSopenharmony_ci            if (v->overlap && (v->pq >= 9 || v->condover != CONDOVER_NONE))
2765cabdff1aSopenharmony_ci                ff_vc1_i_overlap_filter(v);
2766cabdff1aSopenharmony_ci            vc1_put_blocks_clamped(v, 1);
2767cabdff1aSopenharmony_ci            if (v->s.loop_filter)
2768cabdff1aSopenharmony_ci                ff_vc1_i_loop_filter(v);
2769cabdff1aSopenharmony_ci
2770cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0) {
2771cabdff1aSopenharmony_ci                // TODO: may need modification to handle slice coding
2772cabdff1aSopenharmony_ci                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
2773cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n",
2774cabdff1aSopenharmony_ci                       get_bits_count(&s->gb), s->gb.size_in_bits);
2775cabdff1aSopenharmony_ci                return 0;
2776cabdff1aSopenharmony_ci            }
2777cabdff1aSopenharmony_ci            inc_blk_idx(v->topleft_blk_idx);
2778cabdff1aSopenharmony_ci            inc_blk_idx(v->top_blk_idx);
2779cabdff1aSopenharmony_ci            inc_blk_idx(v->left_blk_idx);
2780cabdff1aSopenharmony_ci            inc_blk_idx(v->cur_blk_idx);
2781cabdff1aSopenharmony_ci        }
2782cabdff1aSopenharmony_ci        if (!v->s.loop_filter)
2783cabdff1aSopenharmony_ci            ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
2784cabdff1aSopenharmony_ci        else if (s->mb_y)
2785cabdff1aSopenharmony_ci            ff_mpeg_draw_horiz_band(s, (s->mb_y-1) * 16, 16);
2786cabdff1aSopenharmony_ci        s->first_slice_line = 0;
2787cabdff1aSopenharmony_ci    }
2788cabdff1aSopenharmony_ci
2789cabdff1aSopenharmony_ci    if (v->s.loop_filter)
2790cabdff1aSopenharmony_ci        ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
2791cabdff1aSopenharmony_ci    ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
2792cabdff1aSopenharmony_ci                    (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
2793cabdff1aSopenharmony_ci    return 0;
2794cabdff1aSopenharmony_ci}
2795cabdff1aSopenharmony_ci
2796cabdff1aSopenharmony_cistatic void vc1_decode_p_blocks(VC1Context *v)
2797cabdff1aSopenharmony_ci{
2798cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
2799cabdff1aSopenharmony_ci    int apply_loop_filter;
2800cabdff1aSopenharmony_ci
2801cabdff1aSopenharmony_ci    /* select coding mode used for VLC tables selection */
2802cabdff1aSopenharmony_ci    switch (v->c_ac_table_index) {
2803cabdff1aSopenharmony_ci    case 0:
2804cabdff1aSopenharmony_ci        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2805cabdff1aSopenharmony_ci        break;
2806cabdff1aSopenharmony_ci    case 1:
2807cabdff1aSopenharmony_ci        v->codingset = CS_HIGH_MOT_INTRA;
2808cabdff1aSopenharmony_ci        break;
2809cabdff1aSopenharmony_ci    case 2:
2810cabdff1aSopenharmony_ci        v->codingset = CS_MID_RATE_INTRA;
2811cabdff1aSopenharmony_ci        break;
2812cabdff1aSopenharmony_ci    }
2813cabdff1aSopenharmony_ci
2814cabdff1aSopenharmony_ci    switch (v->c_ac_table_index) {
2815cabdff1aSopenharmony_ci    case 0:
2816cabdff1aSopenharmony_ci        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2817cabdff1aSopenharmony_ci        break;
2818cabdff1aSopenharmony_ci    case 1:
2819cabdff1aSopenharmony_ci        v->codingset2 = CS_HIGH_MOT_INTER;
2820cabdff1aSopenharmony_ci        break;
2821cabdff1aSopenharmony_ci    case 2:
2822cabdff1aSopenharmony_ci        v->codingset2 = CS_MID_RATE_INTER;
2823cabdff1aSopenharmony_ci        break;
2824cabdff1aSopenharmony_ci    }
2825cabdff1aSopenharmony_ci
2826cabdff1aSopenharmony_ci    apply_loop_filter   = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
2827cabdff1aSopenharmony_ci    s->first_slice_line = 1;
2828cabdff1aSopenharmony_ci    memset(v->cbp_base, 0, sizeof(v->cbp_base[0]) * 3 * s->mb_stride);
2829cabdff1aSopenharmony_ci    for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2830cabdff1aSopenharmony_ci        s->mb_x = 0;
2831cabdff1aSopenharmony_ci        init_block_index(v);
2832cabdff1aSopenharmony_ci        for (; s->mb_x < s->mb_width; s->mb_x++) {
2833cabdff1aSopenharmony_ci            ff_update_block_index(s);
2834cabdff1aSopenharmony_ci
2835cabdff1aSopenharmony_ci            if (v->fcm == ILACE_FIELD || (v->fcm == PROGRESSIVE && v->mv_type_is_raw) || v->skip_is_raw)
2836cabdff1aSopenharmony_ci                if (get_bits_left(&v->s.gb) <= 1) {
2837cabdff1aSopenharmony_ci                    ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
2838cabdff1aSopenharmony_ci                    return;
2839cabdff1aSopenharmony_ci                }
2840cabdff1aSopenharmony_ci
2841cabdff1aSopenharmony_ci            if (v->fcm == ILACE_FIELD) {
2842cabdff1aSopenharmony_ci                vc1_decode_p_mb_intfi(v);
2843cabdff1aSopenharmony_ci                if (apply_loop_filter)
2844cabdff1aSopenharmony_ci                    ff_vc1_p_loop_filter(v);
2845cabdff1aSopenharmony_ci            } else if (v->fcm == ILACE_FRAME) {
2846cabdff1aSopenharmony_ci                vc1_decode_p_mb_intfr(v);
2847cabdff1aSopenharmony_ci                if (apply_loop_filter)
2848cabdff1aSopenharmony_ci                    ff_vc1_p_intfr_loop_filter(v);
2849cabdff1aSopenharmony_ci            } else {
2850cabdff1aSopenharmony_ci                vc1_decode_p_mb(v);
2851cabdff1aSopenharmony_ci                if (apply_loop_filter)
2852cabdff1aSopenharmony_ci                    ff_vc1_p_loop_filter(v);
2853cabdff1aSopenharmony_ci            }
2854cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0 || get_bits_count(&s->gb) < 0) {
2855cabdff1aSopenharmony_ci                // TODO: may need modification to handle slice coding
2856cabdff1aSopenharmony_ci                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
2857cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
2858cabdff1aSopenharmony_ci                       get_bits_count(&s->gb), s->gb.size_in_bits, s->mb_x, s->mb_y);
2859cabdff1aSopenharmony_ci                return;
2860cabdff1aSopenharmony_ci            }
2861cabdff1aSopenharmony_ci            inc_blk_idx(v->topleft_blk_idx);
2862cabdff1aSopenharmony_ci            inc_blk_idx(v->top_blk_idx);
2863cabdff1aSopenharmony_ci            inc_blk_idx(v->left_blk_idx);
2864cabdff1aSopenharmony_ci            inc_blk_idx(v->cur_blk_idx);
2865cabdff1aSopenharmony_ci        }
2866cabdff1aSopenharmony_ci        memmove(v->cbp_base,
2867cabdff1aSopenharmony_ci                v->cbp - s->mb_stride,
2868cabdff1aSopenharmony_ci                sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
2869cabdff1aSopenharmony_ci        memmove(v->ttblk_base,
2870cabdff1aSopenharmony_ci                v->ttblk - s->mb_stride,
2871cabdff1aSopenharmony_ci                sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
2872cabdff1aSopenharmony_ci        memmove(v->is_intra_base,
2873cabdff1aSopenharmony_ci                v->is_intra - s->mb_stride,
2874cabdff1aSopenharmony_ci                sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
2875cabdff1aSopenharmony_ci        memmove(v->luma_mv_base,
2876cabdff1aSopenharmony_ci                v->luma_mv - s->mb_stride,
2877cabdff1aSopenharmony_ci                sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
2878cabdff1aSopenharmony_ci        if (s->mb_y != s->start_mb_y)
2879cabdff1aSopenharmony_ci            ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
2880cabdff1aSopenharmony_ci        s->first_slice_line = 0;
2881cabdff1aSopenharmony_ci    }
2882cabdff1aSopenharmony_ci    if (s->end_mb_y >= s->start_mb_y)
2883cabdff1aSopenharmony_ci        ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
2884cabdff1aSopenharmony_ci    ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
2885cabdff1aSopenharmony_ci                    (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
2886cabdff1aSopenharmony_ci}
2887cabdff1aSopenharmony_ci
2888cabdff1aSopenharmony_cistatic void vc1_decode_b_blocks(VC1Context *v)
2889cabdff1aSopenharmony_ci{
2890cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
2891cabdff1aSopenharmony_ci
2892cabdff1aSopenharmony_ci    /* select coding mode used for VLC tables selection */
2893cabdff1aSopenharmony_ci    switch (v->c_ac_table_index) {
2894cabdff1aSopenharmony_ci    case 0:
2895cabdff1aSopenharmony_ci        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
2896cabdff1aSopenharmony_ci        break;
2897cabdff1aSopenharmony_ci    case 1:
2898cabdff1aSopenharmony_ci        v->codingset = CS_HIGH_MOT_INTRA;
2899cabdff1aSopenharmony_ci        break;
2900cabdff1aSopenharmony_ci    case 2:
2901cabdff1aSopenharmony_ci        v->codingset = CS_MID_RATE_INTRA;
2902cabdff1aSopenharmony_ci        break;
2903cabdff1aSopenharmony_ci    }
2904cabdff1aSopenharmony_ci
2905cabdff1aSopenharmony_ci    switch (v->c_ac_table_index) {
2906cabdff1aSopenharmony_ci    case 0:
2907cabdff1aSopenharmony_ci        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
2908cabdff1aSopenharmony_ci        break;
2909cabdff1aSopenharmony_ci    case 1:
2910cabdff1aSopenharmony_ci        v->codingset2 = CS_HIGH_MOT_INTER;
2911cabdff1aSopenharmony_ci        break;
2912cabdff1aSopenharmony_ci    case 2:
2913cabdff1aSopenharmony_ci        v->codingset2 = CS_MID_RATE_INTER;
2914cabdff1aSopenharmony_ci        break;
2915cabdff1aSopenharmony_ci    }
2916cabdff1aSopenharmony_ci
2917cabdff1aSopenharmony_ci    s->first_slice_line = 1;
2918cabdff1aSopenharmony_ci    for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2919cabdff1aSopenharmony_ci        s->mb_x = 0;
2920cabdff1aSopenharmony_ci        init_block_index(v);
2921cabdff1aSopenharmony_ci        for (; s->mb_x < s->mb_width; s->mb_x++) {
2922cabdff1aSopenharmony_ci            ff_update_block_index(s);
2923cabdff1aSopenharmony_ci
2924cabdff1aSopenharmony_ci            if (v->fcm == ILACE_FIELD || v->skip_is_raw || v->dmb_is_raw)
2925cabdff1aSopenharmony_ci                if (get_bits_left(&v->s.gb) <= 1) {
2926cabdff1aSopenharmony_ci                    ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
2927cabdff1aSopenharmony_ci                    return;
2928cabdff1aSopenharmony_ci                }
2929cabdff1aSopenharmony_ci
2930cabdff1aSopenharmony_ci            if (v->fcm == ILACE_FIELD) {
2931cabdff1aSopenharmony_ci                vc1_decode_b_mb_intfi(v);
2932cabdff1aSopenharmony_ci                if (v->s.loop_filter)
2933cabdff1aSopenharmony_ci                    ff_vc1_b_intfi_loop_filter(v);
2934cabdff1aSopenharmony_ci            } else if (v->fcm == ILACE_FRAME) {
2935cabdff1aSopenharmony_ci                vc1_decode_b_mb_intfr(v);
2936cabdff1aSopenharmony_ci                if (v->s.loop_filter)
2937cabdff1aSopenharmony_ci                    ff_vc1_p_intfr_loop_filter(v);
2938cabdff1aSopenharmony_ci            } else {
2939cabdff1aSopenharmony_ci                vc1_decode_b_mb(v);
2940cabdff1aSopenharmony_ci                if (v->s.loop_filter)
2941cabdff1aSopenharmony_ci                    ff_vc1_i_loop_filter(v);
2942cabdff1aSopenharmony_ci            }
2943cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0 || get_bits_count(&s->gb) < 0) {
2944cabdff1aSopenharmony_ci                // TODO: may need modification to handle slice coding
2945cabdff1aSopenharmony_ci                ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_x, s->mb_y, ER_MB_ERROR);
2946cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n",
2947cabdff1aSopenharmony_ci                       get_bits_count(&s->gb), s->gb.size_in_bits, s->mb_x, s->mb_y);
2948cabdff1aSopenharmony_ci                return;
2949cabdff1aSopenharmony_ci            }
2950cabdff1aSopenharmony_ci        }
2951cabdff1aSopenharmony_ci        memmove(v->cbp_base,
2952cabdff1aSopenharmony_ci                v->cbp - s->mb_stride,
2953cabdff1aSopenharmony_ci                sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
2954cabdff1aSopenharmony_ci        memmove(v->ttblk_base,
2955cabdff1aSopenharmony_ci                v->ttblk - s->mb_stride,
2956cabdff1aSopenharmony_ci                sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
2957cabdff1aSopenharmony_ci        memmove(v->is_intra_base,
2958cabdff1aSopenharmony_ci                v->is_intra - s->mb_stride,
2959cabdff1aSopenharmony_ci                sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
2960cabdff1aSopenharmony_ci        if (!v->s.loop_filter)
2961cabdff1aSopenharmony_ci            ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
2962cabdff1aSopenharmony_ci        else if (s->mb_y)
2963cabdff1aSopenharmony_ci            ff_mpeg_draw_horiz_band(s, (s->mb_y - 1) * 16, 16);
2964cabdff1aSopenharmony_ci        s->first_slice_line = 0;
2965cabdff1aSopenharmony_ci    }
2966cabdff1aSopenharmony_ci    if (v->s.loop_filter)
2967cabdff1aSopenharmony_ci        ff_mpeg_draw_horiz_band(s, (s->end_mb_y - 1) * 16, 16);
2968cabdff1aSopenharmony_ci    ff_er_add_slice(&s->er, 0, s->start_mb_y << v->field_mode, s->mb_width - 1,
2969cabdff1aSopenharmony_ci                    (s->end_mb_y << v->field_mode) - 1, ER_MB_END);
2970cabdff1aSopenharmony_ci}
2971cabdff1aSopenharmony_ci
2972cabdff1aSopenharmony_cistatic void vc1_decode_skip_blocks(VC1Context *v)
2973cabdff1aSopenharmony_ci{
2974cabdff1aSopenharmony_ci    MpegEncContext *s = &v->s;
2975cabdff1aSopenharmony_ci
2976cabdff1aSopenharmony_ci    if (!v->s.last_picture.f->data[0])
2977cabdff1aSopenharmony_ci        return;
2978cabdff1aSopenharmony_ci
2979cabdff1aSopenharmony_ci    ff_er_add_slice(&s->er, 0, s->start_mb_y, s->mb_width - 1, s->end_mb_y - 1, ER_MB_END);
2980cabdff1aSopenharmony_ci    s->first_slice_line = 1;
2981cabdff1aSopenharmony_ci    for (s->mb_y = s->start_mb_y; s->mb_y < s->end_mb_y; s->mb_y++) {
2982cabdff1aSopenharmony_ci        s->mb_x = 0;
2983cabdff1aSopenharmony_ci        init_block_index(v);
2984cabdff1aSopenharmony_ci        ff_update_block_index(s);
2985cabdff1aSopenharmony_ci        memcpy(s->dest[0], s->last_picture.f->data[0] + s->mb_y * 16 * s->linesize,   s->linesize   * 16);
2986cabdff1aSopenharmony_ci        memcpy(s->dest[1], s->last_picture.f->data[1] + s->mb_y *  8 * s->uvlinesize, s->uvlinesize *  8);
2987cabdff1aSopenharmony_ci        memcpy(s->dest[2], s->last_picture.f->data[2] + s->mb_y *  8 * s->uvlinesize, s->uvlinesize *  8);
2988cabdff1aSopenharmony_ci        ff_mpeg_draw_horiz_band(s, s->mb_y * 16, 16);
2989cabdff1aSopenharmony_ci        s->first_slice_line = 0;
2990cabdff1aSopenharmony_ci    }
2991cabdff1aSopenharmony_ci    s->pict_type = AV_PICTURE_TYPE_P;
2992cabdff1aSopenharmony_ci}
2993cabdff1aSopenharmony_ci
2994cabdff1aSopenharmony_civoid ff_vc1_decode_blocks(VC1Context *v)
2995cabdff1aSopenharmony_ci{
2996cabdff1aSopenharmony_ci
2997cabdff1aSopenharmony_ci    v->s.esc3_level_length = 0;
2998cabdff1aSopenharmony_ci    if (v->x8_type) {
2999cabdff1aSopenharmony_ci        ff_intrax8_decode_picture(&v->x8, &v->s.current_picture,
3000cabdff1aSopenharmony_ci                                  &v->s.gb, &v->s.mb_x, &v->s.mb_y,
3001cabdff1aSopenharmony_ci                                  2 * v->pq + v->halfpq, v->pq * !v->pquantizer,
3002cabdff1aSopenharmony_ci                                  v->s.loop_filter, v->s.low_delay);
3003cabdff1aSopenharmony_ci
3004cabdff1aSopenharmony_ci        ff_er_add_slice(&v->s.er, 0, 0,
3005cabdff1aSopenharmony_ci                        (v->s.mb_x >> 1) - 1, (v->s.mb_y >> 1) - 1,
3006cabdff1aSopenharmony_ci                        ER_MB_END);
3007cabdff1aSopenharmony_ci    } else {
3008cabdff1aSopenharmony_ci        v->cur_blk_idx     =  0;
3009cabdff1aSopenharmony_ci        v->left_blk_idx    = -1;
3010cabdff1aSopenharmony_ci        v->topleft_blk_idx =  1;
3011cabdff1aSopenharmony_ci        v->top_blk_idx     =  2;
3012cabdff1aSopenharmony_ci        switch (v->s.pict_type) {
3013cabdff1aSopenharmony_ci        case AV_PICTURE_TYPE_I:
3014cabdff1aSopenharmony_ci            if (v->profile == PROFILE_ADVANCED)
3015cabdff1aSopenharmony_ci                vc1_decode_i_blocks_adv(v);
3016cabdff1aSopenharmony_ci            else
3017cabdff1aSopenharmony_ci                vc1_decode_i_blocks(v);
3018cabdff1aSopenharmony_ci            break;
3019cabdff1aSopenharmony_ci        case AV_PICTURE_TYPE_P:
3020cabdff1aSopenharmony_ci            if (v->p_frame_skipped)
3021cabdff1aSopenharmony_ci                vc1_decode_skip_blocks(v);
3022cabdff1aSopenharmony_ci            else
3023cabdff1aSopenharmony_ci                vc1_decode_p_blocks(v);
3024cabdff1aSopenharmony_ci            break;
3025cabdff1aSopenharmony_ci        case AV_PICTURE_TYPE_B:
3026cabdff1aSopenharmony_ci            if (v->bi_type) {
3027cabdff1aSopenharmony_ci                if (v->profile == PROFILE_ADVANCED)
3028cabdff1aSopenharmony_ci                    vc1_decode_i_blocks_adv(v);
3029cabdff1aSopenharmony_ci                else
3030cabdff1aSopenharmony_ci                    vc1_decode_i_blocks(v);
3031cabdff1aSopenharmony_ci            } else
3032cabdff1aSopenharmony_ci                vc1_decode_b_blocks(v);
3033cabdff1aSopenharmony_ci            break;
3034cabdff1aSopenharmony_ci        }
3035cabdff1aSopenharmony_ci    }
3036cabdff1aSopenharmony_ci}
3037