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