1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2002 The FFmpeg Project 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "avcodec.h" 24cabdff1aSopenharmony_ci#include "codec_internal.h" 25cabdff1aSopenharmony_ci#include "h263dec.h" 26cabdff1aSopenharmony_ci#include "intrax8.h" 27cabdff1aSopenharmony_ci#include "mathops.h" 28cabdff1aSopenharmony_ci#include "mpegutils.h" 29cabdff1aSopenharmony_ci#include "mpegvideo.h" 30cabdff1aSopenharmony_ci#include "msmpeg4.h" 31cabdff1aSopenharmony_ci#include "msmpeg4data.h" 32cabdff1aSopenharmony_ci#include "msmpeg4dec.h" 33cabdff1aSopenharmony_ci#include "simple_idct.h" 34cabdff1aSopenharmony_ci#include "wmv2.h" 35cabdff1aSopenharmony_ci#include "wmv2data.h" 36cabdff1aSopenharmony_ci#include "wmv2dec.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_citypedef struct WMV2DecContext { 39cabdff1aSopenharmony_ci MpegEncContext s; 40cabdff1aSopenharmony_ci WMV2Context common; 41cabdff1aSopenharmony_ci IntraX8Context x8; 42cabdff1aSopenharmony_ci int j_type_bit; 43cabdff1aSopenharmony_ci int j_type; 44cabdff1aSopenharmony_ci int abt_flag; 45cabdff1aSopenharmony_ci int abt_type; 46cabdff1aSopenharmony_ci int abt_type_table[6]; 47cabdff1aSopenharmony_ci int per_mb_abt; 48cabdff1aSopenharmony_ci int per_block_abt; 49cabdff1aSopenharmony_ci int mspel_bit; 50cabdff1aSopenharmony_ci int cbp_table_index; 51cabdff1aSopenharmony_ci int top_left_mv_flag; 52cabdff1aSopenharmony_ci int per_mb_rl_bit; 53cabdff1aSopenharmony_ci int skip_type; 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci ScanTable abt_scantable[2]; 56cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, int16_t, abt_block2)[6][64]; 57cabdff1aSopenharmony_ci} WMV2DecContext; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_cistatic void wmv2_add_block(WMV2DecContext *w, int16_t *block1, 60cabdff1aSopenharmony_ci uint8_t *dst, int stride, int n) 61cabdff1aSopenharmony_ci{ 62cabdff1aSopenharmony_ci MpegEncContext *const s = &w->s; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci if (s->block_last_index[n] >= 0) { 65cabdff1aSopenharmony_ci switch (w->abt_type_table[n]) { 66cabdff1aSopenharmony_ci case 0: 67cabdff1aSopenharmony_ci w->common.wdsp.idct_add(dst, stride, block1); 68cabdff1aSopenharmony_ci break; 69cabdff1aSopenharmony_ci case 1: 70cabdff1aSopenharmony_ci ff_simple_idct84_add(dst, stride, block1); 71cabdff1aSopenharmony_ci ff_simple_idct84_add(dst + 4 * stride, stride, w->abt_block2[n]); 72cabdff1aSopenharmony_ci s->bdsp.clear_block(w->abt_block2[n]); 73cabdff1aSopenharmony_ci break; 74cabdff1aSopenharmony_ci case 2: 75cabdff1aSopenharmony_ci ff_simple_idct48_add(dst, stride, block1); 76cabdff1aSopenharmony_ci ff_simple_idct48_add(dst + 4, stride, w->abt_block2[n]); 77cabdff1aSopenharmony_ci s->bdsp.clear_block(w->abt_block2[n]); 78cabdff1aSopenharmony_ci break; 79cabdff1aSopenharmony_ci default: 80cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "internal error in WMV2 abt\n"); 81cabdff1aSopenharmony_ci } 82cabdff1aSopenharmony_ci } 83cabdff1aSopenharmony_ci} 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_civoid ff_wmv2_add_mb(MpegEncContext *s, int16_t block1[6][64], 86cabdff1aSopenharmony_ci uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr) 87cabdff1aSopenharmony_ci{ 88cabdff1aSopenharmony_ci WMV2DecContext *const w = (WMV2DecContext *) s; 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci wmv2_add_block(w, block1[0], dest_y, s->linesize, 0); 91cabdff1aSopenharmony_ci wmv2_add_block(w, block1[1], dest_y + 8, s->linesize, 1); 92cabdff1aSopenharmony_ci wmv2_add_block(w, block1[2], dest_y + 8 * s->linesize, s->linesize, 2); 93cabdff1aSopenharmony_ci wmv2_add_block(w, block1[3], dest_y + 8 + 8 * s->linesize, s->linesize, 3); 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci if (s->avctx->flags & AV_CODEC_FLAG_GRAY) 96cabdff1aSopenharmony_ci return; 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci wmv2_add_block(w, block1[4], dest_cb, s->uvlinesize, 4); 99cabdff1aSopenharmony_ci wmv2_add_block(w, block1[5], dest_cr, s->uvlinesize, 5); 100cabdff1aSopenharmony_ci} 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_cistatic int parse_mb_skip(WMV2DecContext *w) 103cabdff1aSopenharmony_ci{ 104cabdff1aSopenharmony_ci int mb_x, mb_y; 105cabdff1aSopenharmony_ci int coded_mb_count = 0; 106cabdff1aSopenharmony_ci MpegEncContext *const s = &w->s; 107cabdff1aSopenharmony_ci uint32_t *const mb_type = s->current_picture_ptr->mb_type; 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci w->skip_type = get_bits(&s->gb, 2); 110cabdff1aSopenharmony_ci switch (w->skip_type) { 111cabdff1aSopenharmony_ci case SKIP_TYPE_NONE: 112cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < s->mb_height; mb_y++) 113cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < s->mb_width; mb_x++) 114cabdff1aSopenharmony_ci mb_type[mb_y * s->mb_stride + mb_x] = 115cabdff1aSopenharmony_ci MB_TYPE_16x16 | MB_TYPE_L0; 116cabdff1aSopenharmony_ci break; 117cabdff1aSopenharmony_ci case SKIP_TYPE_MPEG: 118cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < s->mb_height * s->mb_width) 119cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 120cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < s->mb_height; mb_y++) 121cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < s->mb_width; mb_x++) 122cabdff1aSopenharmony_ci mb_type[mb_y * s->mb_stride + mb_x] = 123cabdff1aSopenharmony_ci (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0; 124cabdff1aSopenharmony_ci break; 125cabdff1aSopenharmony_ci case SKIP_TYPE_ROW: 126cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < s->mb_height; mb_y++) { 127cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 1) 128cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 129cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 130cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < s->mb_width; mb_x++) 131cabdff1aSopenharmony_ci mb_type[mb_y * s->mb_stride + mb_x] = 132cabdff1aSopenharmony_ci MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; 133cabdff1aSopenharmony_ci } else { 134cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < s->mb_width; mb_x++) 135cabdff1aSopenharmony_ci mb_type[mb_y * s->mb_stride + mb_x] = 136cabdff1aSopenharmony_ci (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0; 137cabdff1aSopenharmony_ci } 138cabdff1aSopenharmony_ci } 139cabdff1aSopenharmony_ci break; 140cabdff1aSopenharmony_ci case SKIP_TYPE_COL: 141cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < s->mb_width; mb_x++) { 142cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 1) 143cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 144cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 145cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < s->mb_height; mb_y++) 146cabdff1aSopenharmony_ci mb_type[mb_y * s->mb_stride + mb_x] = 147cabdff1aSopenharmony_ci MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0; 148cabdff1aSopenharmony_ci } else { 149cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < s->mb_height; mb_y++) 150cabdff1aSopenharmony_ci mb_type[mb_y * s->mb_stride + mb_x] = 151cabdff1aSopenharmony_ci (get_bits1(&s->gb) ? MB_TYPE_SKIP : 0) | MB_TYPE_16x16 | MB_TYPE_L0; 152cabdff1aSopenharmony_ci } 153cabdff1aSopenharmony_ci } 154cabdff1aSopenharmony_ci break; 155cabdff1aSopenharmony_ci } 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci for (mb_y = 0; mb_y < s->mb_height; mb_y++) 158cabdff1aSopenharmony_ci for (mb_x = 0; mb_x < s->mb_width; mb_x++) 159cabdff1aSopenharmony_ci coded_mb_count += !IS_SKIP(mb_type[mb_y * s->mb_stride + mb_x]); 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ci if (coded_mb_count > get_bits_left(&s->gb)) 162cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci return 0; 165cabdff1aSopenharmony_ci} 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_cistatic int decode_ext_header(WMV2DecContext *w) 168cabdff1aSopenharmony_ci{ 169cabdff1aSopenharmony_ci MpegEncContext *const s = &w->s; 170cabdff1aSopenharmony_ci GetBitContext gb; 171cabdff1aSopenharmony_ci int fps; 172cabdff1aSopenharmony_ci int code; 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci if (s->avctx->extradata_size < 4) 175cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci init_get_bits(&gb, s->avctx->extradata, 32); 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ci fps = get_bits(&gb, 5); 180cabdff1aSopenharmony_ci s->bit_rate = get_bits(&gb, 11) * 1024; 181cabdff1aSopenharmony_ci w->mspel_bit = get_bits1(&gb); 182cabdff1aSopenharmony_ci s->loop_filter = get_bits1(&gb); 183cabdff1aSopenharmony_ci w->abt_flag = get_bits1(&gb); 184cabdff1aSopenharmony_ci w->j_type_bit = get_bits1(&gb); 185cabdff1aSopenharmony_ci w->top_left_mv_flag = get_bits1(&gb); 186cabdff1aSopenharmony_ci w->per_mb_rl_bit = get_bits1(&gb); 187cabdff1aSopenharmony_ci code = get_bits(&gb, 3); 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_ci if (code == 0) 190cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci s->slice_height = s->mb_height / code; 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci if (s->avctx->debug & FF_DEBUG_PICT_INFO) 195cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 196cabdff1aSopenharmony_ci "fps:%d, br:%"PRId64", qpbit:%d, abt_flag:%d, j_type_bit:%d, " 197cabdff1aSopenharmony_ci "tl_mv_flag:%d, mbrl_bit:%d, code:%d, loop_filter:%d, " 198cabdff1aSopenharmony_ci "slices:%d\n", 199cabdff1aSopenharmony_ci fps, s->bit_rate, w->mspel_bit, w->abt_flag, w->j_type_bit, 200cabdff1aSopenharmony_ci w->top_left_mv_flag, w->per_mb_rl_bit, code, s->loop_filter, 201cabdff1aSopenharmony_ci code); 202cabdff1aSopenharmony_ci return 0; 203cabdff1aSopenharmony_ci} 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_ciint ff_wmv2_decode_picture_header(MpegEncContext *s) 206cabdff1aSopenharmony_ci{ 207cabdff1aSopenharmony_ci WMV2DecContext *const w = (WMV2DecContext *) s; 208cabdff1aSopenharmony_ci int code; 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ci if (s->picture_number == 0) 211cabdff1aSopenharmony_ci decode_ext_header(w); 212cabdff1aSopenharmony_ci 213cabdff1aSopenharmony_ci s->pict_type = get_bits1(&s->gb) + 1; 214cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_I) { 215cabdff1aSopenharmony_ci code = get_bits(&s->gb, 7); 216cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, "I7:%X/\n", code); 217cabdff1aSopenharmony_ci } 218cabdff1aSopenharmony_ci s->chroma_qscale = s->qscale = get_bits(&s->gb, 5); 219cabdff1aSopenharmony_ci if (s->qscale <= 0) 220cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 221cabdff1aSopenharmony_ci 222cabdff1aSopenharmony_ci if (s->pict_type != AV_PICTURE_TYPE_I && show_bits(&s->gb, 1)) { 223cabdff1aSopenharmony_ci GetBitContext gb = s->gb; 224cabdff1aSopenharmony_ci int skip_type = get_bits(&gb, 2); 225cabdff1aSopenharmony_ci int run = skip_type == SKIP_TYPE_COL ? s->mb_width : s->mb_height; 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci while (run > 0) { 228cabdff1aSopenharmony_ci int block = FFMIN(run, 25); 229cabdff1aSopenharmony_ci if (get_bits(&gb, block) + 1 != 1<<block) 230cabdff1aSopenharmony_ci break; 231cabdff1aSopenharmony_ci run -= block; 232cabdff1aSopenharmony_ci } 233cabdff1aSopenharmony_ci if (!run) 234cabdff1aSopenharmony_ci return FRAME_SKIPPED; 235cabdff1aSopenharmony_ci } 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci return 0; 238cabdff1aSopenharmony_ci} 239cabdff1aSopenharmony_ci 240cabdff1aSopenharmony_ciint ff_wmv2_decode_secondary_picture_header(MpegEncContext *s) 241cabdff1aSopenharmony_ci{ 242cabdff1aSopenharmony_ci WMV2DecContext *const w = (WMV2DecContext *) s; 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_I) { 245cabdff1aSopenharmony_ci if (w->j_type_bit) 246cabdff1aSopenharmony_ci w->j_type = get_bits1(&s->gb); 247cabdff1aSopenharmony_ci else 248cabdff1aSopenharmony_ci w->j_type = 0; // FIXME check 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci if (!w->j_type) { 251cabdff1aSopenharmony_ci if (w->per_mb_rl_bit) 252cabdff1aSopenharmony_ci s->per_mb_rl_table = get_bits1(&s->gb); 253cabdff1aSopenharmony_ci else 254cabdff1aSopenharmony_ci s->per_mb_rl_table = 0; 255cabdff1aSopenharmony_ci 256cabdff1aSopenharmony_ci if (!s->per_mb_rl_table) { 257cabdff1aSopenharmony_ci s->rl_chroma_table_index = decode012(&s->gb); 258cabdff1aSopenharmony_ci s->rl_table_index = decode012(&s->gb); 259cabdff1aSopenharmony_ci } 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci s->dc_table_index = get_bits1(&s->gb); 262cabdff1aSopenharmony_ci 263cabdff1aSopenharmony_ci // at minimum one bit per macroblock is required at least in a valid frame, 264cabdff1aSopenharmony_ci // we discard frames much smaller than this. Frames smaller than 1/8 of the 265cabdff1aSopenharmony_ci // smallest "black/skip" frame generally contain not much recoverable content 266cabdff1aSopenharmony_ci // while at the same time they have the highest computational requirements 267cabdff1aSopenharmony_ci // per byte 268cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) * 8LL < (s->width+15)/16 * ((s->height+15)/16)) 269cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 270cabdff1aSopenharmony_ci } 271cabdff1aSopenharmony_ci s->inter_intra_pred = 0; 272cabdff1aSopenharmony_ci s->no_rounding = 1; 273cabdff1aSopenharmony_ci if (s->avctx->debug & FF_DEBUG_PICT_INFO) { 274cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 275cabdff1aSopenharmony_ci "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d j_type:%d \n", 276cabdff1aSopenharmony_ci s->qscale, s->rl_chroma_table_index, s->rl_table_index, 277cabdff1aSopenharmony_ci s->dc_table_index, s->per_mb_rl_table, w->j_type); 278cabdff1aSopenharmony_ci } 279cabdff1aSopenharmony_ci } else { 280cabdff1aSopenharmony_ci int cbp_index; 281cabdff1aSopenharmony_ci int ret; 282cabdff1aSopenharmony_ci w->j_type = 0; 283cabdff1aSopenharmony_ci 284cabdff1aSopenharmony_ci ret = parse_mb_skip(w); 285cabdff1aSopenharmony_ci if (ret < 0) 286cabdff1aSopenharmony_ci return ret; 287cabdff1aSopenharmony_ci cbp_index = decode012(&s->gb); 288cabdff1aSopenharmony_ci w->cbp_table_index = wmv2_get_cbp_table_index(s, cbp_index); 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci if (w->mspel_bit) 291cabdff1aSopenharmony_ci s->mspel = get_bits1(&s->gb); 292cabdff1aSopenharmony_ci else 293cabdff1aSopenharmony_ci s->mspel = 0; // FIXME check 294cabdff1aSopenharmony_ci 295cabdff1aSopenharmony_ci if (w->abt_flag) { 296cabdff1aSopenharmony_ci w->per_mb_abt = get_bits1(&s->gb) ^ 1; 297cabdff1aSopenharmony_ci if (!w->per_mb_abt) 298cabdff1aSopenharmony_ci w->abt_type = decode012(&s->gb); 299cabdff1aSopenharmony_ci } 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_ci if (w->per_mb_rl_bit) 302cabdff1aSopenharmony_ci s->per_mb_rl_table = get_bits1(&s->gb); 303cabdff1aSopenharmony_ci else 304cabdff1aSopenharmony_ci s->per_mb_rl_table = 0; 305cabdff1aSopenharmony_ci 306cabdff1aSopenharmony_ci if (!s->per_mb_rl_table) { 307cabdff1aSopenharmony_ci s->rl_table_index = decode012(&s->gb); 308cabdff1aSopenharmony_ci s->rl_chroma_table_index = s->rl_table_index; 309cabdff1aSopenharmony_ci } 310cabdff1aSopenharmony_ci 311cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 2) 312cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci s->dc_table_index = get_bits1(&s->gb); 315cabdff1aSopenharmony_ci s->mv_table_index = get_bits1(&s->gb); 316cabdff1aSopenharmony_ci 317cabdff1aSopenharmony_ci s->inter_intra_pred = 0; // (s->width * s->height < 320 * 240 && s->bit_rate <= II_BITRATE); 318cabdff1aSopenharmony_ci s->no_rounding ^= 1; 319cabdff1aSopenharmony_ci 320cabdff1aSopenharmony_ci if (s->avctx->debug & FF_DEBUG_PICT_INFO) { 321cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_DEBUG, 322cabdff1aSopenharmony_ci "rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d mspel:%d " 323cabdff1aSopenharmony_ci "per_mb_abt:%d abt_type:%d cbp:%d ii:%d\n", 324cabdff1aSopenharmony_ci s->rl_table_index, s->rl_chroma_table_index, 325cabdff1aSopenharmony_ci s->dc_table_index, s->mv_table_index, 326cabdff1aSopenharmony_ci s->per_mb_rl_table, s->qscale, s->mspel, 327cabdff1aSopenharmony_ci w->per_mb_abt, w->abt_type, w->cbp_table_index, 328cabdff1aSopenharmony_ci s->inter_intra_pred); 329cabdff1aSopenharmony_ci } 330cabdff1aSopenharmony_ci } 331cabdff1aSopenharmony_ci s->esc3_level_length = 0; 332cabdff1aSopenharmony_ci s->esc3_run_length = 0; 333cabdff1aSopenharmony_ci s->picture_number++; // FIXME ? 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci if (w->j_type) { 336cabdff1aSopenharmony_ci ff_intrax8_decode_picture(&w->x8, &s->current_picture, 337cabdff1aSopenharmony_ci &s->gb, &s->mb_x, &s->mb_y, 338cabdff1aSopenharmony_ci 2 * s->qscale, (s->qscale - 1) | 1, 339cabdff1aSopenharmony_ci s->loop_filter, s->low_delay); 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci ff_er_add_slice(&w->s.er, 0, 0, 342cabdff1aSopenharmony_ci (w->s.mb_x >> 1) - 1, (w->s.mb_y >> 1) - 1, 343cabdff1aSopenharmony_ci ER_MB_END); 344cabdff1aSopenharmony_ci return 1; 345cabdff1aSopenharmony_ci } 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci return 0; 348cabdff1aSopenharmony_ci} 349cabdff1aSopenharmony_ci 350cabdff1aSopenharmony_cistatic inline void wmv2_decode_motion(WMV2DecContext *w, int *mx_ptr, int *my_ptr) 351cabdff1aSopenharmony_ci{ 352cabdff1aSopenharmony_ci MpegEncContext *const s = &w->s; 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci ff_msmpeg4_decode_motion(s, mx_ptr, my_ptr); 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci if ((((*mx_ptr) | (*my_ptr)) & 1) && s->mspel) 357cabdff1aSopenharmony_ci w->common.hshift = get_bits1(&s->gb); 358cabdff1aSopenharmony_ci else 359cabdff1aSopenharmony_ci w->common.hshift = 0; 360cabdff1aSopenharmony_ci} 361cabdff1aSopenharmony_ci 362cabdff1aSopenharmony_cistatic int16_t *wmv2_pred_motion(WMV2DecContext *w, int *px, int *py) 363cabdff1aSopenharmony_ci{ 364cabdff1aSopenharmony_ci MpegEncContext *const s = &w->s; 365cabdff1aSopenharmony_ci int xy, wrap, diff, type; 366cabdff1aSopenharmony_ci int16_t *A, *B, *C, *mot_val; 367cabdff1aSopenharmony_ci 368cabdff1aSopenharmony_ci wrap = s->b8_stride; 369cabdff1aSopenharmony_ci xy = s->block_index[0]; 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci mot_val = s->current_picture.motion_val[0][xy]; 372cabdff1aSopenharmony_ci 373cabdff1aSopenharmony_ci A = s->current_picture.motion_val[0][xy - 1]; 374cabdff1aSopenharmony_ci B = s->current_picture.motion_val[0][xy - wrap]; 375cabdff1aSopenharmony_ci C = s->current_picture.motion_val[0][xy + 2 - wrap]; 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_ci if (s->mb_x && !s->first_slice_line && !s->mspel && w->top_left_mv_flag) 378cabdff1aSopenharmony_ci diff = FFMAX(FFABS(A[0] - B[0]), FFABS(A[1] - B[1])); 379cabdff1aSopenharmony_ci else 380cabdff1aSopenharmony_ci diff = 0; 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_ci if (diff >= 8) 383cabdff1aSopenharmony_ci type = get_bits1(&s->gb); 384cabdff1aSopenharmony_ci else 385cabdff1aSopenharmony_ci type = 2; 386cabdff1aSopenharmony_ci 387cabdff1aSopenharmony_ci if (type == 0) { 388cabdff1aSopenharmony_ci *px = A[0]; 389cabdff1aSopenharmony_ci *py = A[1]; 390cabdff1aSopenharmony_ci } else if (type == 1) { 391cabdff1aSopenharmony_ci *px = B[0]; 392cabdff1aSopenharmony_ci *py = B[1]; 393cabdff1aSopenharmony_ci } else { 394cabdff1aSopenharmony_ci /* special case for first (slice) line */ 395cabdff1aSopenharmony_ci if (s->first_slice_line) { 396cabdff1aSopenharmony_ci *px = A[0]; 397cabdff1aSopenharmony_ci *py = A[1]; 398cabdff1aSopenharmony_ci } else { 399cabdff1aSopenharmony_ci *px = mid_pred(A[0], B[0], C[0]); 400cabdff1aSopenharmony_ci *py = mid_pred(A[1], B[1], C[1]); 401cabdff1aSopenharmony_ci } 402cabdff1aSopenharmony_ci } 403cabdff1aSopenharmony_ci 404cabdff1aSopenharmony_ci return mot_val; 405cabdff1aSopenharmony_ci} 406cabdff1aSopenharmony_ci 407cabdff1aSopenharmony_cistatic inline int wmv2_decode_inter_block(WMV2DecContext *w, int16_t *block, 408cabdff1aSopenharmony_ci int n, int cbp) 409cabdff1aSopenharmony_ci{ 410cabdff1aSopenharmony_ci MpegEncContext *const s = &w->s; 411cabdff1aSopenharmony_ci static const int sub_cbp_table[3] = { 2, 3, 1 }; 412cabdff1aSopenharmony_ci int sub_cbp, ret; 413cabdff1aSopenharmony_ci 414cabdff1aSopenharmony_ci if (!cbp) { 415cabdff1aSopenharmony_ci s->block_last_index[n] = -1; 416cabdff1aSopenharmony_ci return 0; 417cabdff1aSopenharmony_ci } 418cabdff1aSopenharmony_ci 419cabdff1aSopenharmony_ci if (w->per_block_abt) 420cabdff1aSopenharmony_ci w->abt_type = decode012(&s->gb); 421cabdff1aSopenharmony_ci w->abt_type_table[n] = w->abt_type; 422cabdff1aSopenharmony_ci 423cabdff1aSopenharmony_ci if (w->abt_type) { 424cabdff1aSopenharmony_ci// const uint8_t *scantable = w->abt_scantable[w->abt_type - 1].permutated; 425cabdff1aSopenharmony_ci const uint8_t *scantable = w->abt_scantable[w->abt_type - 1].scantable; 426cabdff1aSopenharmony_ci// const uint8_t *scantable = w->abt_type - 1 ? w->abt_scantable[1].permutated : w->abt_scantable[0].scantable; 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_ci sub_cbp = sub_cbp_table[decode012(&s->gb)]; 429cabdff1aSopenharmony_ci 430cabdff1aSopenharmony_ci if (sub_cbp & 1) 431cabdff1aSopenharmony_ci if ((ret = ff_msmpeg4_decode_block(s, block, n, 1, scantable)) < 0) 432cabdff1aSopenharmony_ci return ret; 433cabdff1aSopenharmony_ci 434cabdff1aSopenharmony_ci if (sub_cbp & 2) 435cabdff1aSopenharmony_ci if ((ret = ff_msmpeg4_decode_block(s, w->abt_block2[n], n, 1, scantable)) < 0) 436cabdff1aSopenharmony_ci return ret; 437cabdff1aSopenharmony_ci 438cabdff1aSopenharmony_ci s->block_last_index[n] = 63; 439cabdff1aSopenharmony_ci 440cabdff1aSopenharmony_ci return 0; 441cabdff1aSopenharmony_ci } else { 442cabdff1aSopenharmony_ci return ff_msmpeg4_decode_block(s, block, n, 1, 443cabdff1aSopenharmony_ci s->inter_scantable.permutated); 444cabdff1aSopenharmony_ci } 445cabdff1aSopenharmony_ci} 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_ciint ff_wmv2_decode_mb(MpegEncContext *s, int16_t block[6][64]) 448cabdff1aSopenharmony_ci{ 449cabdff1aSopenharmony_ci /* The following is only allowed because this encoder 450cabdff1aSopenharmony_ci * does not use slice threading. */ 451cabdff1aSopenharmony_ci WMV2DecContext *const w = (WMV2DecContext *) s; 452cabdff1aSopenharmony_ci int cbp, code, i, ret; 453cabdff1aSopenharmony_ci uint8_t *coded_val; 454cabdff1aSopenharmony_ci 455cabdff1aSopenharmony_ci if (w->j_type) 456cabdff1aSopenharmony_ci return 0; 457cabdff1aSopenharmony_ci 458cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_P) { 459cabdff1aSopenharmony_ci if (IS_SKIP(s->current_picture.mb_type[s->mb_y * s->mb_stride + s->mb_x])) { 460cabdff1aSopenharmony_ci /* skip mb */ 461cabdff1aSopenharmony_ci s->mb_intra = 0; 462cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) 463cabdff1aSopenharmony_ci s->block_last_index[i] = -1; 464cabdff1aSopenharmony_ci s->mv_dir = MV_DIR_FORWARD; 465cabdff1aSopenharmony_ci s->mv_type = MV_TYPE_16X16; 466cabdff1aSopenharmony_ci s->mv[0][0][0] = 0; 467cabdff1aSopenharmony_ci s->mv[0][0][1] = 0; 468cabdff1aSopenharmony_ci s->mb_skipped = 1; 469cabdff1aSopenharmony_ci w->common.hshift = 0; 470cabdff1aSopenharmony_ci return 0; 471cabdff1aSopenharmony_ci } 472cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) <= 0) 473cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_ci code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[w->cbp_table_index].table, 476cabdff1aSopenharmony_ci MB_NON_INTRA_VLC_BITS, 3); 477cabdff1aSopenharmony_ci s->mb_intra = (~code & 0x40) >> 6; 478cabdff1aSopenharmony_ci 479cabdff1aSopenharmony_ci cbp = code & 0x3f; 480cabdff1aSopenharmony_ci } else { 481cabdff1aSopenharmony_ci s->mb_intra = 1; 482cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) <= 0) 483cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 484cabdff1aSopenharmony_ci code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2); 485cabdff1aSopenharmony_ci /* predict coded block pattern */ 486cabdff1aSopenharmony_ci cbp = 0; 487cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 488cabdff1aSopenharmony_ci int val = ((code >> (5 - i)) & 1); 489cabdff1aSopenharmony_ci if (i < 4) { 490cabdff1aSopenharmony_ci int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val); 491cabdff1aSopenharmony_ci val = val ^ pred; 492cabdff1aSopenharmony_ci *coded_val = val; 493cabdff1aSopenharmony_ci } 494cabdff1aSopenharmony_ci cbp |= val << (5 - i); 495cabdff1aSopenharmony_ci } 496cabdff1aSopenharmony_ci } 497cabdff1aSopenharmony_ci 498cabdff1aSopenharmony_ci if (!s->mb_intra) { 499cabdff1aSopenharmony_ci int mx, my; 500cabdff1aSopenharmony_ci wmv2_pred_motion(w, &mx, &my); 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci if (cbp) { 503cabdff1aSopenharmony_ci s->bdsp.clear_blocks(s->block[0]); 504cabdff1aSopenharmony_ci if (s->per_mb_rl_table) { 505cabdff1aSopenharmony_ci s->rl_table_index = decode012(&s->gb); 506cabdff1aSopenharmony_ci s->rl_chroma_table_index = s->rl_table_index; 507cabdff1aSopenharmony_ci } 508cabdff1aSopenharmony_ci 509cabdff1aSopenharmony_ci if (w->abt_flag && w->per_mb_abt) { 510cabdff1aSopenharmony_ci w->per_block_abt = get_bits1(&s->gb); 511cabdff1aSopenharmony_ci if (!w->per_block_abt) 512cabdff1aSopenharmony_ci w->abt_type = decode012(&s->gb); 513cabdff1aSopenharmony_ci } else 514cabdff1aSopenharmony_ci w->per_block_abt = 0; 515cabdff1aSopenharmony_ci } 516cabdff1aSopenharmony_ci 517cabdff1aSopenharmony_ci wmv2_decode_motion(w, &mx, &my); 518cabdff1aSopenharmony_ci 519cabdff1aSopenharmony_ci s->mv_dir = MV_DIR_FORWARD; 520cabdff1aSopenharmony_ci s->mv_type = MV_TYPE_16X16; 521cabdff1aSopenharmony_ci s->mv[0][0][0] = mx; 522cabdff1aSopenharmony_ci s->mv[0][0][1] = my; 523cabdff1aSopenharmony_ci 524cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 525cabdff1aSopenharmony_ci if ((ret = wmv2_decode_inter_block(w, block[i], i, (cbp >> (5 - i)) & 1)) < 0) { 526cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 527cabdff1aSopenharmony_ci "\nerror while decoding inter block: %d x %d (%d)\n", 528cabdff1aSopenharmony_ci s->mb_x, s->mb_y, i); 529cabdff1aSopenharmony_ci return ret; 530cabdff1aSopenharmony_ci } 531cabdff1aSopenharmony_ci } 532cabdff1aSopenharmony_ci } else { 533cabdff1aSopenharmony_ci if (s->pict_type == AV_PICTURE_TYPE_P) 534cabdff1aSopenharmony_ci ff_dlog(s->avctx, "%d%d ", s->inter_intra_pred, cbp); 535cabdff1aSopenharmony_ci ff_dlog(s->avctx, "I at %d %d %d %06X\n", s->mb_x, s->mb_y, 536cabdff1aSopenharmony_ci ((cbp & 3) ? 1 : 0) + ((cbp & 0x3C) ? 2 : 0), 537cabdff1aSopenharmony_ci show_bits(&s->gb, 24)); 538cabdff1aSopenharmony_ci s->ac_pred = get_bits1(&s->gb); 539cabdff1aSopenharmony_ci if (s->inter_intra_pred) { 540cabdff1aSopenharmony_ci s->h263_aic_dir = get_vlc2(&s->gb, ff_inter_intra_vlc.table, 541cabdff1aSopenharmony_ci INTER_INTRA_VLC_BITS, 1); 542cabdff1aSopenharmony_ci ff_dlog(s->avctx, "%d%d %d %d/", 543cabdff1aSopenharmony_ci s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y); 544cabdff1aSopenharmony_ci } 545cabdff1aSopenharmony_ci if (s->per_mb_rl_table && cbp) { 546cabdff1aSopenharmony_ci s->rl_table_index = decode012(&s->gb); 547cabdff1aSopenharmony_ci s->rl_chroma_table_index = s->rl_table_index; 548cabdff1aSopenharmony_ci } 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci s->bdsp.clear_blocks(s->block[0]); 551cabdff1aSopenharmony_ci for (i = 0; i < 6; i++) { 552cabdff1aSopenharmony_ci if ((ret = ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL)) < 0) { 553cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, 554cabdff1aSopenharmony_ci "\nerror while decoding intra block: %d x %d (%d)\n", 555cabdff1aSopenharmony_ci s->mb_x, s->mb_y, i); 556cabdff1aSopenharmony_ci return ret; 557cabdff1aSopenharmony_ci } 558cabdff1aSopenharmony_ci } 559cabdff1aSopenharmony_ci } 560cabdff1aSopenharmony_ci 561cabdff1aSopenharmony_ci return 0; 562cabdff1aSopenharmony_ci} 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_cistatic av_cold int wmv2_decode_init(AVCodecContext *avctx) 565cabdff1aSopenharmony_ci{ 566cabdff1aSopenharmony_ci WMV2DecContext *const w = avctx->priv_data; 567cabdff1aSopenharmony_ci MpegEncContext *const s = &w->s; 568cabdff1aSopenharmony_ci int ret; 569cabdff1aSopenharmony_ci 570cabdff1aSopenharmony_ci s->private_ctx = &w->common; 571cabdff1aSopenharmony_ci 572cabdff1aSopenharmony_ci if ((ret = ff_msmpeg4_decode_init(avctx)) < 0) 573cabdff1aSopenharmony_ci return ret; 574cabdff1aSopenharmony_ci 575cabdff1aSopenharmony_ci ff_wmv2_common_init(s); 576cabdff1aSopenharmony_ci ff_init_scantable(s->idsp.idct_permutation, &w->abt_scantable[0], 577cabdff1aSopenharmony_ci ff_wmv2_scantableA); 578cabdff1aSopenharmony_ci ff_init_scantable(s->idsp.idct_permutation, &w->abt_scantable[1], 579cabdff1aSopenharmony_ci ff_wmv2_scantableB); 580cabdff1aSopenharmony_ci 581cabdff1aSopenharmony_ci return ff_intrax8_common_init(avctx, &w->x8, &w->s.idsp, 582cabdff1aSopenharmony_ci w->s.block, w->s.block_last_index, 583cabdff1aSopenharmony_ci w->s.mb_width, w->s.mb_height); 584cabdff1aSopenharmony_ci} 585cabdff1aSopenharmony_ci 586cabdff1aSopenharmony_cistatic av_cold int wmv2_decode_end(AVCodecContext *avctx) 587cabdff1aSopenharmony_ci{ 588cabdff1aSopenharmony_ci WMV2DecContext *const w = avctx->priv_data; 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ci ff_intrax8_common_end(&w->x8); 591cabdff1aSopenharmony_ci return ff_h263_decode_end(avctx); 592cabdff1aSopenharmony_ci} 593cabdff1aSopenharmony_ci 594cabdff1aSopenharmony_ciconst FFCodec ff_wmv2_decoder = { 595cabdff1aSopenharmony_ci .p.name = "wmv2", 596cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 8"), 597cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 598cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_WMV2, 599cabdff1aSopenharmony_ci .priv_data_size = sizeof(WMV2DecContext), 600cabdff1aSopenharmony_ci .init = wmv2_decode_init, 601cabdff1aSopenharmony_ci .close = wmv2_decode_end, 602cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(ff_h263_decode_frame), 603cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1, 604cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 605cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P, 606cabdff1aSopenharmony_ci AV_PIX_FMT_NONE }, 607cabdff1aSopenharmony_ci}; 608