FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vc1dec.c
Date: 2026-01-16 07:34:38
Exec Total Coverage
Lines: 432 887 48.7%
Functions: 10 16 62.5%
Branches: 218 568 38.4%

Line Branch Exec Source
1 /*
2 * VC-1 and WMV3 decoder
3 * Copyright (c) 2011 Mashiat Sarker Shakkhar
4 * Copyright (c) 2006-2007 Konstantin Shishkov
5 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
6 *
7 * This file is part of FFmpeg.
8 *
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 */
23
24 /**
25 * @file
26 * VC-1 and WMV3 decoder
27 */
28
29 #include "config_components.h"
30
31 #include "avcodec.h"
32 #include "blockdsp.h"
33 #include "codec_internal.h"
34 #include "decode.h"
35 #include "get_bits.h"
36 #include "hwaccel_internal.h"
37 #include "hwconfig.h"
38 #include "mpeg_er.h"
39 #include "mpegutils.h"
40 #include "mpegvideo.h"
41 #include "mpegvideodec.h"
42 #include "msmpeg4_vc1_data.h"
43 #include "profiles.h"
44 #include "simple_idct.h"
45 #include "vc1.h"
46 #include "vc1data.h"
47 #include "vc1_vlc_data.h"
48 #include "libavutil/attributes.h"
49 #include "libavutil/avassert.h"
50 #include "libavutil/imgutils.h"
51 #include "libavutil/mem.h"
52 #include "libavutil/thread.h"
53
54
55 static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
56 #if CONFIG_VC1_DXVA2_HWACCEL
57 AV_PIX_FMT_DXVA2_VLD,
58 #endif
59 #if CONFIG_VC1_D3D11VA_HWACCEL
60 AV_PIX_FMT_D3D11VA_VLD,
61 AV_PIX_FMT_D3D11,
62 #endif
63 #if CONFIG_VC1_D3D12VA_HWACCEL
64 AV_PIX_FMT_D3D12,
65 #endif
66 #if CONFIG_VC1_NVDEC_HWACCEL
67 AV_PIX_FMT_CUDA,
68 #endif
69 #if CONFIG_VC1_VAAPI_HWACCEL
70 AV_PIX_FMT_VAAPI,
71 #endif
72 #if CONFIG_VC1_VDPAU_HWACCEL
73 AV_PIX_FMT_VDPAU,
74 #endif
75 AV_PIX_FMT_YUV420P,
76 AV_PIX_FMT_NONE
77 };
78
79 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
80
81 typedef struct SpriteData {
82 /**
83 * Transform coefficients for both sprites in 16.16 fixed point format,
84 * in the order they appear in the bitstream:
85 * x scale
86 * rotation 1 (unused)
87 * x offset
88 * rotation 2 (unused)
89 * y scale
90 * y offset
91 * alpha
92 */
93 int coefs[2][7];
94
95 int effect_type, effect_flag;
96 int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
97 int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
98 } SpriteData;
99
100 static inline int get_fp_val(GetBitContext* gb)
101 {
102 return (get_bits_long(gb, 30) - (1 << 29)) << 1;
103 }
104
105 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
106 {
107 c[1] = c[3] = 0;
108
109 switch (get_bits(gb, 2)) {
110 case 0:
111 c[0] = 1 << 16;
112 c[2] = get_fp_val(gb);
113 c[4] = 1 << 16;
114 break;
115 case 1:
116 c[0] = c[4] = get_fp_val(gb);
117 c[2] = get_fp_val(gb);
118 break;
119 case 2:
120 c[0] = get_fp_val(gb);
121 c[2] = get_fp_val(gb);
122 c[4] = get_fp_val(gb);
123 break;
124 case 3:
125 c[0] = get_fp_val(gb);
126 c[1] = get_fp_val(gb);
127 c[2] = get_fp_val(gb);
128 c[3] = get_fp_val(gb);
129 c[4] = get_fp_val(gb);
130 break;
131 }
132 c[5] = get_fp_val(gb);
133 if (get_bits1(gb))
134 c[6] = get_fp_val(gb);
135 else
136 c[6] = 1 << 16;
137 }
138
139 static int vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
140 {
141 AVCodecContext *avctx = v->s.avctx;
142 int sprite, i;
143
144 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
145 vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
146 if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
147 avpriv_request_sample(avctx, "Non-zero rotation coefficients");
148 av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
149 for (i = 0; i < 7; i++)
150 av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
151 sd->coefs[sprite][i] / (1<<16),
152 (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1 << 16));
153 av_log(avctx, AV_LOG_DEBUG, "\n");
154 }
155
156 skip_bits(gb, 2);
157 if (sd->effect_type = get_bits_long(gb, 30)) {
158 switch (sd->effect_pcount1 = get_bits(gb, 4)) {
159 case 7:
160 vc1_sprite_parse_transform(gb, sd->effect_params1);
161 break;
162 case 14:
163 vc1_sprite_parse_transform(gb, sd->effect_params1);
164 vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
165 break;
166 default:
167 for (i = 0; i < sd->effect_pcount1; i++)
168 sd->effect_params1[i] = get_fp_val(gb);
169 }
170 if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
171 // effect 13 is simple alpha blending and matches the opacity above
172 av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
173 for (i = 0; i < sd->effect_pcount1; i++)
174 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
175 sd->effect_params1[i] / (1 << 16),
176 (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1 << 16));
177 av_log(avctx, AV_LOG_DEBUG, "\n");
178 }
179
180 sd->effect_pcount2 = get_bits(gb, 16);
181 if (sd->effect_pcount2 > 10) {
182 av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
183 return AVERROR_INVALIDDATA;
184 } else if (sd->effect_pcount2) {
185 i = -1;
186 av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
187 while (++i < sd->effect_pcount2) {
188 sd->effect_params2[i] = get_fp_val(gb);
189 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
190 sd->effect_params2[i] / (1 << 16),
191 (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1 << 16));
192 }
193 av_log(avctx, AV_LOG_DEBUG, "\n");
194 }
195 }
196 if (sd->effect_flag = get_bits1(gb))
197 av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
198
199 if (get_bits_count(gb) >= gb->size_in_bits +
200 (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0)) {
201 av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
202 return AVERROR_INVALIDDATA;
203 }
204 if (get_bits_count(gb) < gb->size_in_bits - 8)
205 av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
206
207 return 0;
208 }
209
210 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
211 {
212 int i, plane, row, sprite;
213 int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
214 const uint8_t *src_h[2][2];
215 int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
216 int ysub[2];
217 MpegEncContext *s = &v->s;
218
219 for (i = 0; i <= v->two_sprites; i++) {
220 xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
221 xadv[i] = sd->coefs[i][0];
222 if (xadv[i] != 1<<16 || (v->sprite_width << 16) - (v->output_width << 16) - xoff[i])
223 xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
224
225 yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
226 yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height << 16) - yoff[i]) / v->output_height);
227 }
228 alpha = av_clip_uint16(sd->coefs[1][6]);
229
230 for (plane = 0; plane < (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY ? 1 : 3); plane++) {
231 int width = v->output_width>>!!plane;
232
233 for (row = 0; row < v->output_height>>!!plane; row++) {
234 uint8_t *dst = v->sprite_output_frame->data[plane] +
235 v->sprite_output_frame->linesize[plane] * row;
236
237 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
238 const uint8_t *iplane = s->cur_pic.data[plane];
239 int iline = s->cur_pic.linesize[plane];
240 int ycoord = yoff[sprite] + yadv[sprite] * row;
241 int yline = ycoord >> 16;
242 int next_line;
243 ysub[sprite] = ycoord & 0xFFFF;
244 if (sprite) {
245 iplane = s->last_pic.data[plane];
246 iline = s->last_pic.linesize[plane];
247 }
248 next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
249 if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
250 src_h[sprite][0] = iplane + (xoff[sprite] >> 16) + yline * iline;
251 if (ysub[sprite])
252 src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
253 } else {
254 if (sr_cache[sprite][0] != yline) {
255 if (sr_cache[sprite][1] == yline) {
256 FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
257 FFSWAP(int, sr_cache[sprite][0], sr_cache[sprite][1]);
258 } else {
259 v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
260 sr_cache[sprite][0] = yline;
261 }
262 }
263 if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
264 v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
265 iplane + next_line, xoff[sprite],
266 xadv[sprite], width);
267 sr_cache[sprite][1] = yline + 1;
268 }
269 src_h[sprite][0] = v->sr_rows[sprite][0];
270 src_h[sprite][1] = v->sr_rows[sprite][1];
271 }
272 }
273
274 if (!v->two_sprites) {
275 if (ysub[0]) {
276 v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
277 } else {
278 memcpy(dst, src_h[0][0], width);
279 }
280 } else {
281 if (ysub[0] && ysub[1]) {
282 v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
283 src_h[1][0], src_h[1][1], ysub[1], alpha, width);
284 } else if (ysub[0]) {
285 v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
286 src_h[1][0], alpha, width);
287 } else if (ysub[1]) {
288 v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
289 src_h[0][0], (1<<16)-1-alpha, width);
290 } else {
291 v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
292 }
293 }
294 }
295
296 if (!plane) {
297 for (i = 0; i <= v->two_sprites; i++) {
298 xoff[i] >>= 1;
299 yoff[i] >>= 1;
300 }
301 }
302
303 }
304 }
305
306
307 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
308 {
309 int ret;
310 MpegEncContext *s = &v->s;
311 AVCodecContext *avctx = s->avctx;
312 SpriteData sd;
313
314 memset(&sd, 0, sizeof(sd));
315
316 ret = vc1_parse_sprites(v, gb, &sd);
317 if (ret < 0)
318 return ret;
319
320 if (!s->cur_pic.data[0]) {
321 av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
322 return AVERROR_UNKNOWN;
323 }
324
325 if (v->two_sprites && (!s->last_pic.ptr || !s->last_pic.data[0])) {
326 av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
327 v->two_sprites = 0;
328 }
329
330 av_frame_unref(v->sprite_output_frame);
331 if ((ret = ff_get_buffer(avctx, v->sprite_output_frame, 0)) < 0)
332 return ret;
333
334 vc1_draw_sprites(v, &sd);
335
336 return 0;
337 }
338
339 static av_cold void vc1_sprite_flush(AVCodecContext *avctx)
340 {
341 VC1Context *v = avctx->priv_data;
342 MpegEncContext *s = &v->s;
343 MPVWorkPicture *f = &s->cur_pic;
344 int plane, i;
345
346 /* Windows Media Image codecs have a convergence interval of two keyframes.
347 Since we can't enforce it, clear to black the missing sprite. This is
348 wrong but it looks better than doing nothing. */
349
350 if (f->data[0])
351 for (plane = 0; plane < (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY ? 1 : 3); plane++)
352 for (i = 0; i < v->sprite_height>>!!plane; i++)
353 memset(f->data[plane] + i * f->linesize[plane],
354 plane ? 128 : 0, f->linesize[plane]);
355 }
356
357 #endif
358
359 34 static av_cold int vc1_decode_init_alloc_tables(VC1Context *v)
360 {
361 34 MpegEncContext *s = &v->s;
362 int i, ret;
363 34 int mb_height = FFALIGN(s->mb_height, 2);
364
365 /* Allocate mb bitplanes */
366 34 v->mv_type_mb_plane = av_malloc (s->mb_stride * mb_height);
367 34 v->direct_mb_plane = av_malloc (s->mb_stride * mb_height);
368 34 v->forward_mb_plane = av_malloc (s->mb_stride * mb_height);
369 34 v->fieldtx_plane = av_mallocz(s->mb_stride * mb_height);
370 34 v->acpred_plane = av_malloc (s->mb_stride * mb_height);
371 34 v->over_flags_plane = av_malloc (s->mb_stride * mb_height);
372
3/6
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
34 if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->forward_mb_plane ||
373
3/6
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 34 times.
34 !v->fieldtx_plane || !v->acpred_plane || !v->over_flags_plane)
374 return AVERROR(ENOMEM);
375
376 34 v->n_allocated_blks = s->mb_width + 2;
377 34 v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
378 34 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 3 * s->mb_stride);
379
2/4
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 34 times.
34 if (!v->block || !v->cbp_base)
380 return AVERROR(ENOMEM);
381 34 v->cbp = v->cbp_base + 2 * s->mb_stride;
382 34 v->ttblk_base = av_mallocz(sizeof(v->ttblk_base[0]) * 3 * s->mb_stride);
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->ttblk_base)
384 return AVERROR(ENOMEM);
385 34 v->ttblk = v->ttblk_base + 2 * s->mb_stride;
386 34 v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 3 * s->mb_stride);
387
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->is_intra_base)
388 return AVERROR(ENOMEM);
389 34 v->is_intra = v->is_intra_base + 2 * s->mb_stride;
390 34 v->luma_mv_base = av_mallocz(sizeof(v->luma_mv_base[0]) * 3 * s->mb_stride);
391
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->luma_mv_base)
392 return AVERROR(ENOMEM);
393 34 v->luma_mv = v->luma_mv_base + 2 * s->mb_stride;
394
395 /* allocate block type info in that way so it could be used with s->block_index[] */
396 34 v->mb_type_base = av_mallocz(s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
397
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->mb_type_base)
398 return AVERROR(ENOMEM);
399 34 v->mb_type = v->mb_type_base + s->b8_stride + 1;
400
401 /* allocate memory to store block level MV info */
402 34 v->blk_mv_type_base = av_mallocz( s->b8_stride * (mb_height * 2 + 1));
403
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->blk_mv_type_base)
404 return AVERROR(ENOMEM);
405 34 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
406 34 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
407
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->mv_f_base)
408 return AVERROR(ENOMEM);
409 34 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
410 34 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
411 34 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
412
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->mv_f_next_base)
413 return AVERROR(ENOMEM);
414 34 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
415 34 v->mv_f_next[1] = v->mv_f_next[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
416
417
2/4
✓ Branch 0 taken 34 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 34 times.
34 if (s->avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || s->avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
418 for (i = 0; i < 4; i++)
419 if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width)))
420 return AVERROR(ENOMEM);
421 }
422
423 34 ret = ff_intrax8_common_init(s->avctx, &v->x8, v->blocks[0],
424 s->mb_width, s->mb_height);
425
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
426 return ret;
427
428 34 return 0;
429 }
430
431 34 static enum AVPixelFormat vc1_get_format(AVCodecContext *avctx)
432 {
433
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 22 times.
34 if (avctx->codec_id == AV_CODEC_ID_MSS2)
434 12 return AV_PIX_FMT_YUV420P;
435
436 if (CONFIG_GRAY && (avctx->flags & AV_CODEC_FLAG_GRAY)) {
437 if (avctx->color_range == AVCOL_RANGE_UNSPECIFIED)
438 avctx->color_range = AVCOL_RANGE_MPEG;
439 return AV_PIX_FMT_GRAY8;
440 }
441
442
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
22 if (avctx->codec_id == AV_CODEC_ID_VC1IMAGE ||
443
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 avctx->codec_id == AV_CODEC_ID_WMV3IMAGE)
444 return AV_PIX_FMT_YUV420P;
445
446 22 return ff_get_format(avctx, vc1_hwaccel_pixfmt_list_420);
447 }
448
449 static void vc1_decode_reset(AVCodecContext *avctx);
450
451 34 av_cold int ff_vc1_decode_init(AVCodecContext *avctx)
452 {
453 34 VC1Context *const v = avctx->priv_data;
454 34 MpegEncContext *const s = &v->s;
455 int ret;
456
457 34 ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
458
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
459 return ret;
460
461 34 ret = ff_mpv_decode_init(s, avctx);
462
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
463 return ret;
464
465 34 avctx->pix_fmt = vc1_get_format(avctx);
466
467 34 ret = ff_mpv_common_init(s);
468
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
469 return ret;
470
471 34 ret = vc1_decode_init_alloc_tables(v);
472
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0) {
473 vc1_decode_reset(avctx);
474 return ret;
475 }
476 34 return 0;
477 }
478
479 34 av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
480 {
481 int i;
482
2/2
✓ Branch 0 taken 2176 times.
✓ Branch 1 taken 34 times.
2210 for (i = 0; i < 64; i++) {
483 #define transpose(x) (((x) >> 3) | (((x) & 7) << 3))
484 2176 v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
485 2176 v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
486 2176 v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
487 2176 v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
488 2176 v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
489 }
490 34 v->left_blk_sh = 0;
491 34 v->top_blk_sh = 3;
492 34 }
493
494 18 static av_cold void vc1_init_static(void)
495 {
496 static VLCElem vlc_table[32372];
497 18 VLCInitState state = VLC_INIT_STATE(vlc_table);
498
499 18 VLC_INIT_STATIC_TABLE(ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
500 vc1_norm2_bits, 1, 1,
501 vc1_norm2_codes, 1, 1, 0);
502 18 VLC_INIT_STATIC_TABLE(ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
503 vc1_norm6_bits, 1, 1,
504 vc1_norm6_codes, 2, 2, 0);
505 18 VLC_INIT_STATIC_TABLE(ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
506 vc1_imode_bits, 1, 1,
507 vc1_imode_codes, 1, 1, 0);
508
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 18 times.
72 for (int i = 0; i < 3; i++) {
509 54 ff_vc1_ttmb_vlc[i] =
510 54 ff_vlc_init_tables(&state, VC1_TTMB_VLC_BITS, 16,
511 54 vc1_ttmb_bits[i], 1, 1,
512 54 vc1_ttmb_codes[i], 2, 2, 0);
513 54 ff_vc1_ttblk_vlc[i] =
514 54 ff_vlc_init_tables(&state, VC1_TTBLK_VLC_BITS, 8,
515 54 vc1_ttblk_bits[i], 1, 1,
516 54 vc1_ttblk_codes[i], 1, 1, 0);
517 54 ff_vc1_subblkpat_vlc[i] =
518 54 ff_vlc_init_tables(&state, VC1_SUBBLKPAT_VLC_BITS, 15,
519 54 vc1_subblkpat_bits[i], 1, 1,
520 54 vc1_subblkpat_codes[i], 1, 1, 0);
521 }
522
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 18 times.
90 for (int i = 0; i < 4; i++) {
523 72 ff_vc1_4mv_block_pattern_vlc[i] =
524 72 ff_vlc_init_tables(&state, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
525 72 vc1_4mv_block_pattern_bits[i], 1, 1,
526 72 vc1_4mv_block_pattern_codes[i], 1, 1, 0);
527 72 ff_vc1_cbpcy_p_vlc[i] =
528 72 ff_vlc_init_tables(&state, VC1_CBPCY_P_VLC_BITS, 64,
529 72 vc1_cbpcy_p_bits[i], 1, 1,
530 72 vc1_cbpcy_p_codes[i], 2, 2, 0);
531 72 ff_vc1_mv_diff_vlc[i] =
532 72 ff_vlc_init_tables(&state, VC1_MV_DIFF_VLC_BITS, 73,
533 72 vc1_mv_diff_bits[i], 1, 1,
534 72 vc1_mv_diff_codes[i], 2, 2, 0);
535 /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
536 72 ff_vc1_intfr_4mv_mbmode_vlc[i] =
537 72 ff_vlc_init_tables(&state, VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
538 72 vc1_intfr_4mv_mbmode_bits[i], 1, 1,
539 72 vc1_intfr_4mv_mbmode_codes[i], 2, 2, 0);
540 /* initialize NON-4MV MBMODE VLC tables for the same */
541 72 ff_vc1_intfr_non4mv_mbmode_vlc[i] =
542 72 ff_vlc_init_tables(&state, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
543 72 vc1_intfr_non4mv_mbmode_bits[i], 1, 1,
544 72 vc1_intfr_non4mv_mbmode_codes[i], 1, 1, 0);
545 /* initialize interlaced MVDATA tables (1-Ref) */
546 72 ff_vc1_1ref_mvdata_vlc[i] =
547 72 ff_vlc_init_tables(&state, VC1_1REF_MVDATA_VLC_BITS, 72,
548 72 vc1_1ref_mvdata_bits[i], 1, 1,
549 72 vc1_1ref_mvdata_codes[i], 4, 4, 0);
550 /* Initialize 2MV Block pattern VLC tables */
551 72 ff_vc1_2mv_block_pattern_vlc[i] =
552 72 ff_vlc_init_tables(&state, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
553 72 vc1_2mv_block_pattern_bits[i], 1, 1,
554 72 vc1_2mv_block_pattern_codes[i], 1, 1, 0);
555 }
556
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 18 times.
162 for (int i = 0; i < 8; i++) {
557 144 ff_vc1_ac_coeff_table[i] =
558 144 ff_vlc_init_tables(&state, AC_VLC_BITS, ff_vc1_ac_sizes[i],
559 144 &vc1_ac_tables[i][0][1], 8, 4,
560 144 &vc1_ac_tables[i][0][0], 8, 4, 0);
561 /* initialize interlaced MVDATA tables (2-Ref) */
562 144 ff_vc1_2ref_mvdata_vlc[i] =
563 144 ff_vlc_init_tables(&state, VC1_2REF_MVDATA_VLC_BITS, 126,
564 144 vc1_2ref_mvdata_bits[i], 1, 1,
565 144 vc1_2ref_mvdata_codes[i], 4, 4, 0);
566 /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
567 144 ff_vc1_icbpcy_vlc[i] =
568 144 ff_vlc_init_tables(&state, VC1_ICBPCY_VLC_BITS, 63,
569 144 vc1_icbpcy_p_bits[i], 1, 1,
570 144 vc1_icbpcy_p_codes[i], 2, 2, 0);
571 /* Initialize interlaced field picture MBMODE VLC tables */
572 144 ff_vc1_if_mmv_mbmode_vlc[i] =
573 144 ff_vlc_init_tables(&state, VC1_IF_MMV_MBMODE_VLC_BITS, 8,
574 144 vc1_if_mmv_mbmode_bits[i], 1, 1,
575 144 vc1_if_mmv_mbmode_codes[i], 1, 1, 0);
576 144 ff_vc1_if_1mv_mbmode_vlc[i] =
577 144 ff_vlc_init_tables(&state, VC1_IF_1MV_MBMODE_VLC_BITS, 6,
578 144 vc1_if_1mv_mbmode_bits[i], 1, 1,
579 144 vc1_if_1mv_mbmode_codes[i], 1, 1, 0);
580 }
581 18 ff_msmp4_vc1_vlcs_init_once();
582 18 }
583
584 /**
585 * Init VC-1 specific tables and VC1Context members
586 * @param v The VC1Context to initialize
587 * @return Status
588 */
589 34 av_cold void ff_vc1_init_common(VC1Context *v)
590 {
591 static AVOnce init_static_once = AV_ONCE_INIT;
592 34 MpegEncContext *const s = &v->s;
593
594 /* defaults */
595 34 v->pq = -1;
596 34 v->mvrange = 0; /* 7.1.1.18, p80 */
597
598 34 s->avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
599 34 s->out_format = FMT_H263;
600
601 34 s->h263_pred = 1;
602 34 s->msmpeg4_version = MSMP4_VC1;
603
604 34 ff_vc1dsp_init(&v->vc1dsp);
605
606 /* For error resilience */
607 34 ff_qpeldsp_init(&s->qdsp);
608
609 /* VLC tables */
610 34 ff_thread_once(&init_static_once, vc1_init_static);
611 34 }
612
613 /** Initialize a VC1/WMV3 decoder
614 * @todo TODO: Handle VC-1 IDUs (Transport level?)
615 * @todo TODO: Decipher remaining bits in extra_data
616 */
617 28 static av_cold int vc1_decode_init(AVCodecContext *avctx)
618 {
619 28 VC1Context *v = avctx->priv_data;
620 28 MpegEncContext *s = &v->s;
621 GetBitContext gb;
622 int ret;
623
624 /* save the container output size for WMImage */
625 28 v->output_width = avctx->width;
626 28 v->output_height = avctx->height;
627
628
3/4
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
28 if (!avctx->extradata_size || !avctx->extradata)
629 6 return AVERROR_INVALIDDATA;
630 22 v->s.avctx = avctx;
631
632 22 ff_vc1_init_common(v);
633
634
3/4
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
29 if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
635 7 int count = 0;
636
637 // looks like WMV3 has a sequence header stored in the extradata
638 // advanced sequence header may be before the first frame
639 // the last byte of the extradata is a version number, 1 for the
640 // samples we can decode
641
642 7 ret = init_get_bits8(&gb, avctx->extradata, avctx->extradata_size);
643
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if (ret < 0)
644 return ret;
645
646
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0)
647 return ret;
648
649
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE && !v->res_sprite) {
650 avpriv_request_sample(avctx, "Non sprite WMV3IMAGE");
651 return AVERROR_PATCHWELCOME;
652 }
653
654 7 count = avctx->extradata_size*8 - get_bits_count(&gb);
655
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if (count > 0) {
656 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
657 count, get_bits_long(&gb, FFMIN(count, 32)));
658
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 } else if (count < 0) {
659 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
660 }
661 } else { // VC1/WVC1/WVP2
662 15 const uint8_t *start = avctx->extradata;
663 15 const uint8_t *end = avctx->extradata + avctx->extradata_size;
664 const uint8_t *next;
665 int size, buf2_size;
666 15 uint8_t *buf2 = NULL;
667 15 int seq_initialized = 0, ep_initialized = 0;
668
669
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
15 if (avctx->extradata_size < 16) {
670 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
671 return AVERROR_INVALIDDATA;
672 }
673
674 15 buf2 = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
675
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
15 if (!buf2)
676 return AVERROR(ENOMEM);
677
678 15 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
679 15 next = start;
680
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 15 times.
55 for (; next < end; start = next) {
681 40 next = find_next_marker(start + 4, end);
682 40 size = next - start - 4;
683
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40 times.
40 if (size <= 0)
684 continue;
685 40 buf2_size = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
686 40 ret = init_get_bits8(&gb, buf2, buf2_size);
687
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40 times.
40 if (ret < 0) {
688 av_free(buf2);
689 return ret;
690 }
691
2/3
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
40 switch (AV_RB32(start)) {
692 15 case VC1_CODE_SEQHDR:
693
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
15 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0) {
694 av_free(buf2);
695 return ret;
696 }
697 15 seq_initialized = 1;
698 15 break;
699 25 case VC1_CODE_ENTRYPOINT:
700
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 25 times.
25 if ((ret = ff_vc1_decode_entry_point(avctx, v, &gb)) < 0) {
701 av_free(buf2);
702 return ret;
703 }
704 25 ep_initialized = 1;
705 25 break;
706 }
707 }
708 15 av_free(buf2);
709
2/4
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
15 if (!seq_initialized || !ep_initialized) {
710 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
711 return AVERROR_INVALIDDATA;
712 }
713 15 v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
714 }
715
716 22 avctx->profile = v->profile;
717
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 7 times.
22 if (v->profile == PROFILE_ADVANCED)
718 15 avctx->level = v->level;
719
720 22 ff_blockdsp_init(&s->bdsp);
721 22 ff_h264chroma_init(&v->h264chroma, 8);
722
723 22 avctx->has_b_frames = !!avctx->max_b_frames;
724
725
3/6
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 22 times.
22 if (v->color_prim == 1 || v->color_prim == 5 || v->color_prim == 6)
726 avctx->color_primaries = v->color_prim;
727
2/4
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
22 if (v->transfer_char == 1 || v->transfer_char == 7)
728 avctx->color_trc = v->transfer_char;
729
3/6
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 22 times.
22 if (v->matrix_coef == 1 || v->matrix_coef == 6 || v->matrix_coef == 7)
730 avctx->colorspace = v->matrix_coef;
731
732 22 s->mb_width = (avctx->coded_width + 15) >> 4;
733 22 s->mb_height = (avctx->coded_height + 15) >> 4;
734
735
3/4
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
22 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
736 22 ff_vc1_init_transposed_scantables(v);
737 } else {
738 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
739 v->left_blk_sh = 3;
740 v->top_blk_sh = 0;
741 v->vc1dsp.vc1_inv_trans_8x8 = ff_simple_idct_int16_8bit;
742 v->vc1dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
743 v->vc1dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
744 v->vc1dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
745 v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add_int16_8bit;
746 v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
747 v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
748 v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
749 }
750
751
2/4
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
22 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
752 v->sprite_width = avctx->coded_width;
753 v->sprite_height = avctx->coded_height;
754
755 avctx->coded_width = avctx->width = v->output_width;
756 avctx->coded_height = avctx->height = v->output_height;
757
758 // prevent 16.16 overflows
759 if (v->sprite_width > 1 << 14 ||
760 v->sprite_height > 1 << 14 ||
761 v->output_width > 1 << 14 ||
762 v->output_height > 1 << 14) {
763 return AVERROR_INVALIDDATA;
764 }
765
766 if ((v->sprite_width&1) || (v->sprite_height&1)) {
767 avpriv_request_sample(avctx, "odd sprites support");
768 return AVERROR_PATCHWELCOME;
769 }
770 }
771 22 return 0;
772 }
773
774 34 static av_cold void vc1_decode_reset(AVCodecContext *avctx)
775 {
776 34 VC1Context *v = avctx->priv_data;
777 int i;
778
779 34 av_frame_free(&v->sprite_output_frame);
780
781
2/2
✓ Branch 0 taken 136 times.
✓ Branch 1 taken 34 times.
170 for (i = 0; i < 4; i++)
782 136 av_freep(&v->sr_rows[i >> 1][i & 1]);
783 34 ff_mpv_common_end(&v->s);
784 34 memset(v->s.block_index, 0, sizeof(v->s.block_index));
785 34 av_freep(&v->mv_type_mb_plane);
786 34 av_freep(&v->direct_mb_plane);
787 34 av_freep(&v->forward_mb_plane);
788 34 av_freep(&v->fieldtx_plane);
789 34 av_freep(&v->acpred_plane);
790 34 av_freep(&v->over_flags_plane);
791 34 av_freep(&v->mb_type_base);
792 34 av_freep(&v->blk_mv_type_base);
793 34 av_freep(&v->mv_f_base);
794 34 av_freep(&v->mv_f_next_base);
795 34 av_freep(&v->block);
796 34 av_freep(&v->cbp_base);
797 34 av_freep(&v->ttblk_base);
798 34 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
799 34 av_freep(&v->luma_mv_base);
800 34 ff_intrax8_common_end(&v->x8);
801 34 }
802
803 /**
804 * Close a MSS2/VC1/WMV3 decoder
805 */
806 34 av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
807 {
808 34 vc1_decode_reset(avctx);
809 34 return ff_mpv_decode_close(avctx);
810 }
811
812 /** Decode a VC1/WMV3 frame
813 * @todo TODO: Handle VC-1 IDUs (Transport level?)
814 */
815 507 static int vc1_decode_frame(AVCodecContext *avctx, AVFrame *pict,
816 int *got_frame, AVPacket *avpkt)
817 {
818 507 const uint8_t *buf = avpkt->data;
819 507 int buf_size = avpkt->size, n_slices = 0, i, ret;
820 507 VC1Context *v = avctx->priv_data;
821 507 MpegEncContext *s = &v->s;
822 507 uint8_t *buf2 = NULL;
823 507 const uint8_t *buf_start = buf, *buf_start_second_field = NULL;
824 507 int mb_height, n_slices1=-1;
825 struct {
826 uint8_t *buf;
827 GetBitContext gb;
828 int mby_start;
829 const uint8_t *rawbuf;
830 int raw_size;
831 507 } *slices = NULL, *tmp;
832 507 unsigned slices_allocated = 0;
833
834 507 v->second_field = 0;
835
836
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 507 times.
507 if(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
837 s->low_delay = 1;
838
839
4/4
✓ Branch 0 taken 489 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 488 times.
507 if (buf_size >= 4 && AV_RB32(&buf[buf_size-4]) == VC1_CODE_ENDOFSEQ)
840 1 buf_size -= 4;
841
842 /* no supplementary picture */
843
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 489 times.
507 if (buf_size == 0) {
844 /* special case for last picture */
845
4/4
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
18 if (s->low_delay == 0 && s->next_pic.ptr) {
846
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 if ((ret = av_frame_ref(pict, s->next_pic.ptr->f)) < 0)
847 return ret;
848 8 ff_mpv_unref_picture(&s->next_pic);
849
850 8 *got_frame = 1;
851 }
852
853 18 return buf_size;
854 }
855
856 //for advanced profile we may need to parse and unescape data
857
3/4
✓ Branch 0 taken 183 times.
✓ Branch 1 taken 306 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 183 times.
795 if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
858 306 int buf_size2 = 0;
859 306 size_t next_allocated = 0;
860 306 buf2 = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
861
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 306 times.
306 if (!buf2)
862 return AVERROR(ENOMEM);
863
864
1/2
✓ Branch 0 taken 306 times.
✗ Branch 1 not taken.
306 if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
865 const uint8_t *start, *end, *next;
866 int size;
867
868 306 next = buf;
869
2/2
✓ Branch 0 taken 988 times.
✓ Branch 1 taken 306 times.
1294 for (start = buf, end = buf + buf_size; next < end; start = next) {
870 988 next = find_next_marker(start + 4, end);
871 988 size = next - start - 4;
872
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 988 times.
988 if (size <= 0) continue;
873
5/5
✓ Branch 0 taken 306 times.
✓ Branch 1 taken 37 times.
✓ Branch 2 taken 26 times.
✓ Branch 3 taken 603 times.
✓ Branch 4 taken 16 times.
988 switch (AV_RB32(start)) {
874 306 case VC1_CODE_FRAME:
875 306 buf_start = start;
876 306 buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
877 306 break;
878 37 case VC1_CODE_FIELD: {
879 int buf_size3;
880 37 buf_start_second_field = start;
881 37 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
882
1/2
✓ Branch 0 taken 37 times.
✗ Branch 1 not taken.
37 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
883
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (!tmp) {
884 ret = AVERROR(ENOMEM);
885 goto err;
886 }
887 37 slices = tmp;
888 37 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
889
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (!slices[n_slices].buf) {
890 ret = AVERROR(ENOMEM);
891 goto err;
892 }
893 37 buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size,
894 37 slices[n_slices].buf);
895 37 ret = init_get_bits8(&slices[n_slices].gb, slices[n_slices].buf, buf_size3);
896
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (ret < 0) {
897 ret = AVERROR(ENOMEM);
898 goto err;
899 }
900 37 slices[n_slices].mby_start = avctx->coded_height + 31 >> 5;
901 37 slices[n_slices].rawbuf = start;
902 37 slices[n_slices].raw_size = size + 4;
903 37 n_slices1 = n_slices - 1; // index of the last slice of the first field
904 37 n_slices++;
905 37 break;
906 }
907 26 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
908 26 buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
909 26 ret = init_get_bits8(&v->gb, buf2, buf_size2);
910
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
26 if (ret < 0) {
911 ret = AVERROR(ENOMEM);
912 goto err;
913 }
914 26 ff_vc1_decode_entry_point(avctx, v, &v->gb);
915 26 break;
916 603 case VC1_CODE_SLICE: {
917 int buf_size3;
918 603 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
919
1/2
✓ Branch 0 taken 603 times.
✗ Branch 1 not taken.
603 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
920
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 603 times.
603 if (!tmp) {
921 ret = AVERROR(ENOMEM);
922 goto err;
923 }
924 603 slices = tmp;
925 603 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
926
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 603 times.
603 if (!slices[n_slices].buf) {
927 ret = AVERROR(ENOMEM);
928 goto err;
929 }
930 603 buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size,
931 603 slices[n_slices].buf);
932 603 ret = init_get_bits8(&slices[n_slices].gb, slices[n_slices].buf, buf_size3);
933
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 603 times.
603 if (ret < 0) {
934 ret = AVERROR(ENOMEM);
935 goto err;
936 }
937 603 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
938 603 slices[n_slices].rawbuf = start;
939 603 slices[n_slices].raw_size = size + 4;
940 603 n_slices++;
941 603 break;
942 }
943 }
944 }
945 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
946 const uint8_t *divider;
947 int buf_size3;
948
949 divider = find_next_marker(buf, buf + buf_size);
950 if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
951 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
952 ret = AVERROR_INVALIDDATA;
953 goto err;
954 } else { // found field marker, unescape second field
955 buf_start_second_field = divider;
956 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
957 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
958 if (!tmp) {
959 ret = AVERROR(ENOMEM);
960 goto err;
961 }
962 slices = tmp;
963 slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
964 if (!slices[n_slices].buf) {
965 ret = AVERROR(ENOMEM);
966 goto err;
967 }
968 buf_size3 = v->vc1dsp.vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
969 ret = init_get_bits8(&slices[n_slices].gb, slices[n_slices].buf, buf_size3);
970 if (ret < 0) {
971 ret = AVERROR(ENOMEM);
972 goto err;
973 }
974 slices[n_slices].mby_start = s->mb_height + 1 >> 1;
975 slices[n_slices].rawbuf = divider;
976 slices[n_slices].raw_size = buf + buf_size - divider;
977 n_slices1 = n_slices - 1;
978 n_slices++;
979 }
980 buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, divider - buf, buf2);
981 } else {
982 buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, buf_size, buf2);
983 }
984 306 ret = init_get_bits8(&v->gb, buf2, buf_size2);
985
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 306 times.
306 if (ret < 0)
986 return ret;
987 } else{
988 183 ret = init_get_bits8(&v->gb, buf, buf_size);
989
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 183 times.
183 if (ret < 0)
990 return ret;
991 }
992
993
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (v->res_sprite) {
994 v->new_sprite = !get_bits1(&v->gb);
995 v->two_sprites = get_bits1(&v->gb);
996 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
997 we're using the sprite compositor. These are intentionally kept separate
998 so you can get the raw sprites by using the wmv3 decoder for WMVP or
999 the vc1 one for WVP2 */
1000 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
1001 if (v->new_sprite) {
1002 // switch AVCodecContext parameters to those of the sprites
1003 avctx->width = avctx->coded_width = v->sprite_width;
1004 avctx->height = avctx->coded_height = v->sprite_height;
1005 } else {
1006 goto image;
1007 }
1008 }
1009 }
1010
1011
2/2
✓ Branch 0 taken 467 times.
✓ Branch 1 taken 22 times.
489 if (s->context_initialized &&
1012
1/2
✓ Branch 0 taken 467 times.
✗ Branch 1 not taken.
467 (s->width != avctx->coded_width ||
1013
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 467 times.
467 s->height != avctx->coded_height)) {
1014 vc1_decode_reset(avctx);
1015 }
1016
1017
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 467 times.
489 if (!s->context_initialized) {
1018 22 ret = ff_vc1_decode_init(avctx);
1019
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0)
1020 goto err;
1021
1022
3/4
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 17 times.
22 s->low_delay = !avctx->has_b_frames || v->res_sprite;
1023
1024
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 7 times.
22 if (v->profile == PROFILE_ADVANCED) {
1025
2/4
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
15 if(avctx->coded_width<=1 || avctx->coded_height<=1) {
1026 ret = AVERROR_INVALIDDATA;
1027 goto err;
1028 }
1029 15 s->h_edge_pos = avctx->coded_width;
1030 15 s->v_edge_pos = avctx->coded_height;
1031 }
1032 }
1033
1034 // do parse frame header
1035 489 v->pic_header_flag = 0;
1036 489 v->first_pic_header_flag = 1;
1037
2/2
✓ Branch 0 taken 183 times.
✓ Branch 1 taken 306 times.
489 if (v->profile < PROFILE_ADVANCED) {
1038
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 183 times.
183 if ((ret = ff_vc1_parse_frame_header(v, &v->gb)) < 0) {
1039 goto err;
1040 }
1041 } else {
1042
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 306 times.
306 if ((ret = ff_vc1_parse_frame_header_adv(v, &v->gb)) < 0) {
1043 goto err;
1044 }
1045 }
1046 489 v->first_pic_header_flag = 0;
1047
1048
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (avctx->debug & FF_DEBUG_PICT_INFO)
1049 av_log(v->s.avctx, AV_LOG_DEBUG, "pict_type: %c\n", av_get_picture_type_char(s->pict_type));
1050
1051
2/4
✓ Branch 0 taken 489 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 489 times.
489 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
1052 && s->pict_type != AV_PICTURE_TYPE_I) {
1053 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
1054 ret = AVERROR_INVALIDDATA;
1055 goto err;
1056 }
1057
2/4
✓ Branch 0 taken 489 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 489 times.
489 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
1058 && v->field_mode) {
1059 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected Frames not Fields\n");
1060 ret = AVERROR_INVALIDDATA;
1061 goto err;
1062 }
1063
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if ((s->mb_height >> v->field_mode) == 0) {
1064 av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
1065 ret = AVERROR_INVALIDDATA;
1066 goto err;
1067 }
1068
1069 /* skip B-frames if we don't have reference frames */
1070
3/4
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 457 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
489 if (!s->last_pic.ptr && s->pict_type == AV_PICTURE_TYPE_B) {
1071 av_log(v->s.avctx, AV_LOG_DEBUG, "Skipping B frame without reference frames\n");
1072 goto end;
1073 }
1074
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
489 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
1075
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
489 (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
1076
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 avctx->skip_frame >= AVDISCARD_ALL) {
1077 goto end;
1078 }
1079
1080
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 489 times.
489 if ((ret = ff_mpv_frame_start(s, avctx)) < 0) {
1081 goto err;
1082 }
1083
1084 489 v->s.cur_pic.ptr->field_picture = v->field_mode;
1085
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 444 times.
489 v->s.cur_pic.ptr->f->flags |= AV_FRAME_FLAG_INTERLACED * (v->fcm != PROGRESSIVE);
1086
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 444 times.
489 v->s.cur_pic.ptr->f->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST * !!v->tff;
1087
2/2
✓ Branch 0 taken 467 times.
✓ Branch 1 taken 22 times.
489 v->last_interlaced = v->s.last_pic.ptr ? v->s.last_pic.ptr->f->flags & AV_FRAME_FLAG_INTERLACED : 0;
1088
1/2
✓ Branch 0 taken 489 times.
✗ Branch 1 not taken.
489 v->next_interlaced = v->s.next_pic.ptr ? v->s.next_pic.ptr->f->flags & AV_FRAME_FLAG_INTERLACED : 0;
1089
1090 // process pulldown flags
1091 489 s->cur_pic.ptr->f->repeat_pict = 0;
1092 // Pulldown flags are only valid when 'broadcast' has been set.
1093
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (v->rff) {
1094 // repeat field
1095 s->cur_pic.ptr->f->repeat_pict = 1;
1096
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 } else if (v->rptfrm) {
1097 // repeat frames
1098 s->cur_pic.ptr->f->repeat_pict = v->rptfrm * 2;
1099 }
1100
1101
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (avctx->hwaccel) {
1102 const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
1103 s->mb_y = 0;
1104 if (v->field_mode && buf_start_second_field) {
1105 // decode first field
1106 s->picture_structure = PICT_BOTTOM_FIELD - v->tff;
1107 ret = hwaccel->start_frame(avctx, avpkt->buf, buf_start,
1108 buf_start_second_field - buf_start);
1109 if (ret < 0)
1110 goto err;
1111
1112 if (n_slices1 == -1) {
1113 // no slices, decode the field as-is
1114 ret = hwaccel->decode_slice(avctx, buf_start,
1115 buf_start_second_field - buf_start);
1116 if (ret < 0)
1117 goto err;
1118 } else {
1119 ret = hwaccel->decode_slice(avctx, buf_start,
1120 slices[0].rawbuf - buf_start);
1121 if (ret < 0)
1122 goto err;
1123
1124 for (i = 0 ; i < n_slices1 + 1; i++) {
1125 v->gb = slices[i].gb;
1126 s->mb_y = slices[i].mby_start;
1127
1128 v->pic_header_flag = get_bits1(&v->gb);
1129 if (v->pic_header_flag) {
1130 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1131 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1132 ret = AVERROR_INVALIDDATA;
1133 if (avctx->err_recognition & AV_EF_EXPLODE)
1134 goto err;
1135 continue;
1136 }
1137 }
1138
1139 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1140 slices[i].raw_size);
1141 if (ret < 0)
1142 goto err;
1143 }
1144 }
1145
1146 if ((ret = hwaccel->end_frame(avctx)) < 0)
1147 goto err;
1148
1149 // decode second field
1150 v->gb = slices[n_slices1 + 1].gb;
1151 s->mb_y = slices[n_slices1 + 1].mby_start;
1152 s->picture_structure = PICT_TOP_FIELD + v->tff;
1153 v->second_field = 1;
1154 v->pic_header_flag = 0;
1155 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1156 av_log(avctx, AV_LOG_ERROR, "parsing header for second field failed");
1157 ret = AVERROR_INVALIDDATA;
1158 goto err;
1159 }
1160 v->s.cur_pic.ptr->f->pict_type = v->s.pict_type;
1161
1162 ret = hwaccel->start_frame(avctx, avpkt->buf, buf_start_second_field,
1163 (buf + buf_size) - buf_start_second_field);
1164 if (ret < 0)
1165 goto err;
1166
1167 if (n_slices - n_slices1 == 2) {
1168 // no slices, decode the field as-is
1169 ret = hwaccel->decode_slice(avctx, buf_start_second_field,
1170 (buf + buf_size) - buf_start_second_field);
1171 if (ret < 0)
1172 goto err;
1173 } else {
1174 ret = hwaccel->decode_slice(avctx, buf_start_second_field,
1175 slices[n_slices1 + 2].rawbuf - buf_start_second_field);
1176 if (ret < 0)
1177 goto err;
1178
1179 for (i = n_slices1 + 2; i < n_slices; i++) {
1180 v->gb = slices[i].gb;
1181 s->mb_y = slices[i].mby_start;
1182
1183 v->pic_header_flag = get_bits1(&v->gb);
1184 if (v->pic_header_flag) {
1185 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1186 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1187 ret = AVERROR_INVALIDDATA;
1188 if (avctx->err_recognition & AV_EF_EXPLODE)
1189 goto err;
1190 continue;
1191 }
1192 }
1193
1194 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1195 slices[i].raw_size);
1196 if (ret < 0)
1197 goto err;
1198 }
1199 }
1200
1201 if ((ret = hwaccel->end_frame(avctx)) < 0)
1202 goto err;
1203 } else {
1204 s->picture_structure = PICT_FRAME;
1205 ret = hwaccel->start_frame(avctx, avpkt->buf, buf_start,
1206 (buf + buf_size) - buf_start);
1207 if (ret < 0)
1208 goto err;
1209
1210 if (n_slices == 0) {
1211 // no slices, decode the frame as-is
1212 ret = hwaccel->decode_slice(avctx, buf_start,
1213 (buf + buf_size) - buf_start);
1214 if (ret < 0)
1215 goto err;
1216 } else {
1217 // decode the frame part as the first slice
1218 ret = hwaccel->decode_slice(avctx, buf_start,
1219 slices[0].rawbuf - buf_start);
1220 if (ret < 0)
1221 goto err;
1222
1223 // and process the slices as additional slices afterwards
1224 for (i = 0 ; i < n_slices; i++) {
1225 v->gb = slices[i].gb;
1226 s->mb_y = slices[i].mby_start;
1227
1228 v->pic_header_flag = get_bits1(&v->gb);
1229 if (v->pic_header_flag) {
1230 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1231 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1232 ret = AVERROR_INVALIDDATA;
1233 if (avctx->err_recognition & AV_EF_EXPLODE)
1234 goto err;
1235 continue;
1236 }
1237 }
1238
1239 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1240 slices[i].raw_size);
1241 if (ret < 0)
1242 goto err;
1243 }
1244 }
1245 if ((ret = hwaccel->end_frame(avctx)) < 0)
1246 goto err;
1247 }
1248 } else {
1249 489 int header_ret = 0;
1250
1251 489 ff_mpeg_er_frame_start(s);
1252
1253 489 v->end_mb_x = s->mb_width;
1254
2/2
✓ Branch 0 taken 37 times.
✓ Branch 1 taken 452 times.
489 if (v->field_mode) {
1255 37 s->cur_pic.linesize[0] <<= 1;
1256 37 s->cur_pic.linesize[1] <<= 1;
1257 37 s->cur_pic.linesize[2] <<= 1;
1258 37 s->linesize <<= 1;
1259 37 s->uvlinesize <<= 1;
1260 }
1261 489 mb_height = s->mb_height >> v->field_mode;
1262
1263
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 av_assert0 (mb_height > 0);
1264
1265
2/2
✓ Branch 0 taken 1129 times.
✓ Branch 1 taken 489 times.
1618 for (i = 0; i <= n_slices; i++) {
1266
4/4
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 603 times.
1129 if (i > 0 && slices[i - 1].mby_start >= mb_height) {
1267
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (v->field_mode <= 0) {
1268 av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
1269 "picture boundary (%d >= %d)\n", i,
1270 slices[i - 1].mby_start, mb_height);
1271 continue;
1272 }
1273 37 v->second_field = 1;
1274
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 av_assert0((s->mb_height & 1) == 0);
1275 37 v->blocks_off = s->b8_stride * (s->mb_height&~1);
1276 37 v->mb_off = s->mb_stride * s->mb_height >> 1;
1277 } else {
1278 1092 v->second_field = 0;
1279 1092 v->blocks_off = 0;
1280 1092 v->mb_off = 0;
1281 }
1282
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
1129 if (i) {
1283 640 v->pic_header_flag = 0;
1284
3/4
✓ Branch 0 taken 37 times.
✓ Branch 1 taken 603 times.
✓ Branch 2 taken 37 times.
✗ Branch 3 not taken.
640 if (v->field_mode && i == n_slices1 + 2) {
1285
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 37 times.
37 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &v->gb)) < 0) {
1286 av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
1287 ret = AVERROR_INVALIDDATA;
1288 if (avctx->err_recognition & AV_EF_EXPLODE)
1289 goto err;
1290 continue;
1291 }
1292
2/2
✓ Branch 1 taken 273 times.
✓ Branch 2 taken 330 times.
603 } else if (get_bits1(&v->gb)) {
1293 273 v->pic_header_flag = 1;
1294
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 273 times.
273 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &v->gb)) < 0) {
1295 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1296 ret = AVERROR_INVALIDDATA;
1297 if (avctx->err_recognition & AV_EF_EXPLODE)
1298 goto err;
1299 continue;
1300 }
1301 }
1302 }
1303
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1129 times.
1129 if (header_ret < 0)
1304 continue;
1305
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
1129 s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
1306
4/4
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 1055 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 37 times.
1129 if (!v->field_mode || v->second_field)
1307
2/2
✓ Branch 0 taken 603 times.
✓ Branch 1 taken 489 times.
1092 s->end_mb_y = (i == n_slices ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
1308 else {
1309
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (i >= n_slices) {
1310 av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
1311 continue;
1312 }
1313
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 s->end_mb_y = (i == n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
1314 }
1315
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1129 times.
1129 if (s->end_mb_y <= s->start_mb_y) {
1316 av_log(v->s.avctx, AV_LOG_ERROR, "end mb y %d %d invalid\n", s->end_mb_y, s->start_mb_y);
1317 continue;
1318 }
1319
4/4
✓ Branch 0 taken 984 times.
✓ Branch 1 taken 145 times.
✓ Branch 2 taken 67 times.
✓ Branch 3 taken 917 times.
1129 if (((s->pict_type == AV_PICTURE_TYPE_P && !v->p_frame_skipped) ||
1320
3/4
✓ Branch 0 taken 109 times.
✓ Branch 1 taken 103 times.
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
212 (s->pict_type == AV_PICTURE_TYPE_B && !v->bi_type)) &&
1321
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1026 times.
1026 !v->cbpcy_vlc) {
1322 av_log(v->s.avctx, AV_LOG_ERROR, "missing cbpcy_vlc\n");
1323 continue;
1324 }
1325 1129 ff_vc1_decode_blocks(v);
1326
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
1129 if (i != n_slices) {
1327 640 v->gb = slices[i].gb;
1328 }
1329 }
1330
2/2
✓ Branch 0 taken 37 times.
✓ Branch 1 taken 452 times.
489 if (v->field_mode) {
1331 37 v->second_field = 0;
1332 37 s->cur_pic.linesize[0] >>= 1;
1333 37 s->cur_pic.linesize[1] >>= 1;
1334 37 s->cur_pic.linesize[2] >>= 1;
1335 37 s->linesize >>= 1;
1336 37 s->uvlinesize >>= 1;
1337
3/4
✓ Branch 0 taken 37 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 18 times.
37 if (v->s.pict_type != AV_PICTURE_TYPE_BI && v->s.pict_type != AV_PICTURE_TYPE_B) {
1338 19 FFSWAP(uint8_t *, v->mv_f_next[0], v->mv_f[0]);
1339 19 FFSWAP(uint8_t *, v->mv_f_next[1], v->mv_f[1]);
1340 }
1341 }
1342 ff_dlog(s->avctx, "Consumed %i/%i bits\n",
1343 get_bits_count(&v->gb), v->gb.size_in_bits);
1344 // if (get_bits_count(&v->gb) > buf_size * 8)
1345 // return -1;
1346
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 488 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
489 if(s->er.error_occurred && s->pict_type == AV_PICTURE_TYPE_B) {
1347 ret = AVERROR_INVALIDDATA;
1348 goto err;
1349 }
1350
2/2
✓ Branch 0 taken 452 times.
✓ Branch 1 taken 37 times.
489 if ( !v->field_mode
1351
1/2
✓ Branch 0 taken 452 times.
✗ Branch 1 not taken.
452 && avctx->codec_id != AV_CODEC_ID_WMV3IMAGE
1352
1/2
✓ Branch 0 taken 452 times.
✗ Branch 1 not taken.
452 && avctx->codec_id != AV_CODEC_ID_VC1IMAGE)
1353 452 ff_er_frame_end(&s->er, NULL);
1354 }
1355
1356 489 ff_mpv_frame_end(s);
1357
1358
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 489 times.
489 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
1359 image:
1360 avctx->width = avctx->coded_width = v->output_width;
1361 avctx->height = avctx->coded_height = v->output_height;
1362 if (avctx->skip_frame >= AVDISCARD_NONREF)
1363 goto end;
1364 if (!v->sprite_output_frame &&
1365 !(v->sprite_output_frame = av_frame_alloc())) {
1366 ret = AVERROR(ENOMEM);
1367 goto err;
1368 }
1369 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
1370 if ((ret = vc1_decode_sprites(v, &v->gb)) < 0)
1371 goto err;
1372 #endif
1373 if ((ret = av_frame_ref(pict, v->sprite_output_frame)) < 0)
1374 goto err;
1375 *got_frame = 1;
1376 } else {
1377
4/4
✓ Branch 0 taken 398 times.
✓ Branch 1 taken 91 times.
✓ Branch 2 taken 158 times.
✓ Branch 3 taken 240 times.
489 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
1378
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 249 times.
249 if ((ret = av_frame_ref(pict, s->cur_pic.ptr->f)) < 0)
1379 goto err;
1380 249 ff_print_debug_info(s, s->cur_pic.ptr, pict);
1381 249 *got_frame = 1;
1382
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 223 times.
240 } else if (s->last_pic.ptr) {
1383
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 223 times.
223 if ((ret = av_frame_ref(pict, s->last_pic.ptr->f)) < 0)
1384 goto err;
1385 223 ff_print_debug_info(s, s->last_pic.ptr, pict);
1386 223 *got_frame = 1;
1387 }
1388 }
1389
1390 17 end:
1391 489 ret = buf_size;
1392 489 err:
1393 489 av_free(buf2);
1394
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
1129 for (i = 0; i < n_slices; i++)
1395 640 av_free(slices[i].buf);
1396 489 av_free(slices);
1397 489 return ret;
1398 }
1399
1400
1401 const FFCodec ff_vc1_decoder = {
1402 .p.name = "vc1",
1403 CODEC_LONG_NAME("SMPTE VC-1"),
1404 .p.type = AVMEDIA_TYPE_VIDEO,
1405 .p.id = AV_CODEC_ID_VC1,
1406 .priv_data_size = sizeof(VC1Context),
1407 .init = vc1_decode_init,
1408 .close = ff_vc1_decode_end,
1409 FF_CODEC_DECODE_CB(vc1_decode_frame),
1410 .flush = ff_mpeg_flush,
1411 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1412 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1413 #if CONFIG_VC1_DXVA2_HWACCEL
1414 HWACCEL_DXVA2(vc1),
1415 #endif
1416 #if CONFIG_VC1_D3D11VA_HWACCEL
1417 HWACCEL_D3D11VA(vc1),
1418 #endif
1419 #if CONFIG_VC1_D3D11VA2_HWACCEL
1420 HWACCEL_D3D11VA2(vc1),
1421 #endif
1422 #if CONFIG_VC1_D3D12VA_HWACCEL
1423 HWACCEL_D3D12VA(vc1),
1424 #endif
1425 #if CONFIG_VC1_NVDEC_HWACCEL
1426 HWACCEL_NVDEC(vc1),
1427 #endif
1428 #if CONFIG_VC1_VAAPI_HWACCEL
1429 HWACCEL_VAAPI(vc1),
1430 #endif
1431 #if CONFIG_VC1_VDPAU_HWACCEL
1432 HWACCEL_VDPAU(vc1),
1433 #endif
1434 NULL
1435 },
1436 .p.profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
1437 };
1438
1439 #if CONFIG_WMV3_DECODER
1440 const FFCodec ff_wmv3_decoder = {
1441 .p.name = "wmv3",
1442 CODEC_LONG_NAME("Windows Media Video 9"),
1443 .p.type = AVMEDIA_TYPE_VIDEO,
1444 .p.id = AV_CODEC_ID_WMV3,
1445 .priv_data_size = sizeof(VC1Context),
1446 .init = vc1_decode_init,
1447 .close = ff_vc1_decode_end,
1448 FF_CODEC_DECODE_CB(vc1_decode_frame),
1449 .flush = ff_mpeg_flush,
1450 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1451 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1452 #if CONFIG_WMV3_DXVA2_HWACCEL
1453 HWACCEL_DXVA2(wmv3),
1454 #endif
1455 #if CONFIG_WMV3_D3D11VA_HWACCEL
1456 HWACCEL_D3D11VA(wmv3),
1457 #endif
1458 #if CONFIG_WMV3_D3D11VA2_HWACCEL
1459 HWACCEL_D3D11VA2(wmv3),
1460 #endif
1461 #if CONFIG_WMV3_D3D12VA_HWACCEL
1462 HWACCEL_D3D12VA(wmv3),
1463 #endif
1464 #if CONFIG_WMV3_NVDEC_HWACCEL
1465 HWACCEL_NVDEC(wmv3),
1466 #endif
1467 #if CONFIG_WMV3_VAAPI_HWACCEL
1468 HWACCEL_VAAPI(wmv3),
1469 #endif
1470 #if CONFIG_WMV3_VDPAU_HWACCEL
1471 HWACCEL_VDPAU(wmv3),
1472 #endif
1473 NULL
1474 },
1475 .p.profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
1476 };
1477 #endif
1478
1479 #if CONFIG_WMV3IMAGE_DECODER
1480 const FFCodec ff_wmv3image_decoder = {
1481 .p.name = "wmv3image",
1482 CODEC_LONG_NAME("Windows Media Video 9 Image"),
1483 .p.type = AVMEDIA_TYPE_VIDEO,
1484 .p.id = AV_CODEC_ID_WMV3IMAGE,
1485 .priv_data_size = sizeof(VC1Context),
1486 .init = vc1_decode_init,
1487 .close = ff_vc1_decode_end,
1488 FF_CODEC_DECODE_CB(vc1_decode_frame),
1489 .p.capabilities = AV_CODEC_CAP_DR1,
1490 .flush = vc1_sprite_flush,
1491 };
1492 #endif
1493
1494 #if CONFIG_VC1IMAGE_DECODER
1495 const FFCodec ff_vc1image_decoder = {
1496 .p.name = "vc1image",
1497 CODEC_LONG_NAME("Windows Media Video 9 Image v2"),
1498 .p.type = AVMEDIA_TYPE_VIDEO,
1499 .p.id = AV_CODEC_ID_VC1IMAGE,
1500 .priv_data_size = sizeof(VC1Context),
1501 .init = vc1_decode_init,
1502 .close = ff_vc1_decode_end,
1503 FF_CODEC_DECODE_CB(vc1_decode_frame),
1504 .p.capabilities = AV_CODEC_CAP_DR1,
1505 .flush = vc1_sprite_flush,
1506 };
1507 #endif
1508