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 |