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