FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/vc1dec.c
Date: 2025-03-08 20:38:41
Exec Total Coverage
Lines: 428 877 48.8%
Functions: 10 16 62.5%
Branches: 212 558 38.0%

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 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[0] = v->mb_type_base + s->b8_stride + 1;
400 34 v->mb_type[1] = v->mb_type_base + s->b8_stride * (mb_height * 2 + 1) + s->mb_stride + 1;
401 34 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (mb_height + 1);
402
403 /* allocate memory to store block level MV info */
404 34 v->blk_mv_type_base = av_mallocz( s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
405
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->blk_mv_type_base)
406 return AVERROR(ENOMEM);
407 34 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
408 34 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
409
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->mv_f_base)
410 return AVERROR(ENOMEM);
411 34 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
412 34 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
413 34 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
414
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (!v->mv_f_next_base)
415 return AVERROR(ENOMEM);
416 34 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
417 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);
418
419
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) {
420 for (i = 0; i < 4; i++)
421 if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width)))
422 return AVERROR(ENOMEM);
423 }
424
425 34 ret = ff_intrax8_common_init(s->avctx, &v->x8,
426 34 s->block, s->block_last_index,
427 s->mb_width, s->mb_height);
428
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
429 return ret;
430
431 34 return 0;
432 }
433
434 34 static enum AVPixelFormat vc1_get_format(AVCodecContext *avctx)
435 {
436
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 22 times.
34 if (avctx->codec_id == AV_CODEC_ID_MSS2)
437 12 return AV_PIX_FMT_YUV420P;
438
439 if (CONFIG_GRAY && (avctx->flags & AV_CODEC_FLAG_GRAY)) {
440 if (avctx->color_range == AVCOL_RANGE_UNSPECIFIED)
441 avctx->color_range = AVCOL_RANGE_MPEG;
442 return AV_PIX_FMT_GRAY8;
443 }
444
445
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
22 if (avctx->codec_id == AV_CODEC_ID_VC1IMAGE ||
446
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 avctx->codec_id == AV_CODEC_ID_WMV3IMAGE)
447 return AV_PIX_FMT_YUV420P;
448
449 22 return ff_get_format(avctx, vc1_hwaccel_pixfmt_list_420);
450 }
451
452 static void vc1_decode_reset(AVCodecContext *avctx);
453
454 34 av_cold int ff_vc1_decode_init(AVCodecContext *avctx)
455 {
456 34 VC1Context *const v = avctx->priv_data;
457 34 MpegEncContext *const s = &v->s;
458 int ret;
459
460 34 ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
461
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
462 return ret;
463
464 34 ret = ff_mpv_decode_init(s, avctx);
465
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
466 return ret;
467
468 34 avctx->pix_fmt = vc1_get_format(avctx);
469
470 34 ret = ff_mpv_common_init(s);
471
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0)
472 return ret;
473
474 34 ff_permute_scantable(s->intra_scantable.permutated, ff_wmv1_scantable[1],
475 34 s->idsp.idct_permutation);
476
477 34 ret = vc1_decode_init_alloc_tables(v);
478
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34 times.
34 if (ret < 0) {
479 vc1_decode_reset(avctx);
480 return ret;
481 }
482 34 return 0;
483 }
484
485 34 av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
486 {
487 int i;
488
2/2
✓ Branch 0 taken 2176 times.
✓ Branch 1 taken 34 times.
2210 for (i = 0; i < 64; i++) {
489 #define transpose(x) (((x) >> 3) | (((x) & 7) << 3))
490 2176 v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
491 2176 v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
492 2176 v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
493 2176 v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
494 2176 v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
495 }
496 34 v->left_blk_sh = 0;
497 34 v->top_blk_sh = 3;
498 34 }
499
500 18 static av_cold void vc1_init_static(void)
501 {
502 static VLCElem vlc_table[32372];
503 18 VLCInitState state = VLC_INIT_STATE(vlc_table);
504
505 18 VLC_INIT_STATIC_TABLE(ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
506 vc1_norm2_bits, 1, 1,
507 vc1_norm2_codes, 1, 1, 0);
508 18 VLC_INIT_STATIC_TABLE(ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
509 vc1_norm6_bits, 1, 1,
510 vc1_norm6_codes, 2, 2, 0);
511 18 VLC_INIT_STATIC_TABLE(ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
512 vc1_imode_bits, 1, 1,
513 vc1_imode_codes, 1, 1, 0);
514
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 18 times.
72 for (int i = 0; i < 3; i++) {
515 54 ff_vc1_ttmb_vlc[i] =
516 54 ff_vlc_init_tables(&state, VC1_TTMB_VLC_BITS, 16,
517 54 vc1_ttmb_bits[i], 1, 1,
518 54 vc1_ttmb_codes[i], 2, 2, 0);
519 54 ff_vc1_ttblk_vlc[i] =
520 54 ff_vlc_init_tables(&state, VC1_TTBLK_VLC_BITS, 8,
521 54 vc1_ttblk_bits[i], 1, 1,
522 54 vc1_ttblk_codes[i], 1, 1, 0);
523 54 ff_vc1_subblkpat_vlc[i] =
524 54 ff_vlc_init_tables(&state, VC1_SUBBLKPAT_VLC_BITS, 15,
525 54 vc1_subblkpat_bits[i], 1, 1,
526 54 vc1_subblkpat_codes[i], 1, 1, 0);
527 }
528
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 18 times.
90 for (int i = 0; i < 4; i++) {
529 72 ff_vc1_4mv_block_pattern_vlc[i] =
530 72 ff_vlc_init_tables(&state, VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
531 72 vc1_4mv_block_pattern_bits[i], 1, 1,
532 72 vc1_4mv_block_pattern_codes[i], 1, 1, 0);
533 72 ff_vc1_cbpcy_p_vlc[i] =
534 72 ff_vlc_init_tables(&state, VC1_CBPCY_P_VLC_BITS, 64,
535 72 vc1_cbpcy_p_bits[i], 1, 1,
536 72 vc1_cbpcy_p_codes[i], 2, 2, 0);
537 72 ff_vc1_mv_diff_vlc[i] =
538 72 ff_vlc_init_tables(&state, VC1_MV_DIFF_VLC_BITS, 73,
539 72 vc1_mv_diff_bits[i], 1, 1,
540 72 vc1_mv_diff_codes[i], 2, 2, 0);
541 /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
542 72 ff_vc1_intfr_4mv_mbmode_vlc[i] =
543 72 ff_vlc_init_tables(&state, VC1_INTFR_4MV_MBMODE_VLC_BITS, 15,
544 72 vc1_intfr_4mv_mbmode_bits[i], 1, 1,
545 72 vc1_intfr_4mv_mbmode_codes[i], 2, 2, 0);
546 /* initialize NON-4MV MBMODE VLC tables for the same */
547 72 ff_vc1_intfr_non4mv_mbmode_vlc[i] =
548 72 ff_vlc_init_tables(&state, VC1_INTFR_NON4MV_MBMODE_VLC_BITS, 9,
549 72 vc1_intfr_non4mv_mbmode_bits[i], 1, 1,
550 72 vc1_intfr_non4mv_mbmode_codes[i], 1, 1, 0);
551 /* initialize interlaced MVDATA tables (1-Ref) */
552 72 ff_vc1_1ref_mvdata_vlc[i] =
553 72 ff_vlc_init_tables(&state, VC1_1REF_MVDATA_VLC_BITS, 72,
554 72 vc1_1ref_mvdata_bits[i], 1, 1,
555 72 vc1_1ref_mvdata_codes[i], 4, 4, 0);
556 /* Initialize 2MV Block pattern VLC tables */
557 72 ff_vc1_2mv_block_pattern_vlc[i] =
558 72 ff_vlc_init_tables(&state, VC1_2MV_BLOCK_PATTERN_VLC_BITS, 4,
559 72 vc1_2mv_block_pattern_bits[i], 1, 1,
560 72 vc1_2mv_block_pattern_codes[i], 1, 1, 0);
561 }
562
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 18 times.
162 for (int i = 0; i < 8; i++) {
563 144 ff_vc1_ac_coeff_table[i] =
564 144 ff_vlc_init_tables(&state, AC_VLC_BITS, ff_vc1_ac_sizes[i],
565 144 &vc1_ac_tables[i][0][1], 8, 4,
566 144 &vc1_ac_tables[i][0][0], 8, 4, 0);
567 /* initialize interlaced MVDATA tables (2-Ref) */
568 144 ff_vc1_2ref_mvdata_vlc[i] =
569 144 ff_vlc_init_tables(&state, VC1_2REF_MVDATA_VLC_BITS, 126,
570 144 vc1_2ref_mvdata_bits[i], 1, 1,
571 144 vc1_2ref_mvdata_codes[i], 4, 4, 0);
572 /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
573 144 ff_vc1_icbpcy_vlc[i] =
574 144 ff_vlc_init_tables(&state, VC1_ICBPCY_VLC_BITS, 63,
575 144 vc1_icbpcy_p_bits[i], 1, 1,
576 144 vc1_icbpcy_p_codes[i], 2, 2, 0);
577 /* Initialize interlaced field picture MBMODE VLC tables */
578 144 ff_vc1_if_mmv_mbmode_vlc[i] =
579 144 ff_vlc_init_tables(&state, VC1_IF_MMV_MBMODE_VLC_BITS, 8,
580 144 vc1_if_mmv_mbmode_bits[i], 1, 1,
581 144 vc1_if_mmv_mbmode_codes[i], 1, 1, 0);
582 144 ff_vc1_if_1mv_mbmode_vlc[i] =
583 144 ff_vlc_init_tables(&state, VC1_IF_1MV_MBMODE_VLC_BITS, 6,
584 144 vc1_if_1mv_mbmode_bits[i], 1, 1,
585 144 vc1_if_1mv_mbmode_codes[i], 1, 1, 0);
586 }
587 18 ff_msmp4_vc1_vlcs_init_once();
588 18 }
589
590 /**
591 * Init VC-1 specific tables and VC1Context members
592 * @param v The VC1Context to initialize
593 * @return Status
594 */
595 34 av_cold void ff_vc1_init_common(VC1Context *v)
596 {
597 static AVOnce init_static_once = AV_ONCE_INIT;
598 34 MpegEncContext *const s = &v->s;
599
600 /* defaults */
601 34 v->pq = -1;
602 34 v->mvrange = 0; /* 7.1.1.18, p80 */
603
604 34 s->avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
605 34 s->out_format = FMT_H263;
606
607 34 s->h263_pred = 1;
608 34 s->msmpeg4_version = MSMP4_VC1;
609
610 34 ff_vc1dsp_init(&v->vc1dsp);
611
612 /* For error resilience */
613 34 ff_qpeldsp_init(&s->qdsp);
614
615 /* VLC tables */
616 34 ff_thread_once(&init_static_once, vc1_init_static);
617 34 }
618
619 /** Initialize a VC1/WMV3 decoder
620 * @todo TODO: Handle VC-1 IDUs (Transport level?)
621 * @todo TODO: Decipher remaining bits in extra_data
622 */
623 28 static av_cold int vc1_decode_init(AVCodecContext *avctx)
624 {
625 28 VC1Context *v = avctx->priv_data;
626 28 MpegEncContext *s = &v->s;
627 GetBitContext gb;
628 int ret;
629
630 /* save the container output size for WMImage */
631 28 v->output_width = avctx->width;
632 28 v->output_height = avctx->height;
633
634
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)
635 6 return AVERROR_INVALIDDATA;
636 22 v->s.avctx = avctx;
637
638 22 ff_vc1_init_common(v);
639
640
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) {
641 7 int count = 0;
642
643 // looks like WMV3 has a sequence header stored in the extradata
644 // advanced sequence header may be before the first frame
645 // the last byte of the extradata is a version number, 1 for the
646 // samples we can decode
647
648 7 ret = init_get_bits8(&gb, avctx->extradata, avctx->extradata_size);
649
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if (ret < 0)
650 return ret;
651
652
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
7 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0)
653 return ret;
654
655
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) {
656 avpriv_request_sample(avctx, "Non sprite WMV3IMAGE");
657 return AVERROR_PATCHWELCOME;
658 }
659
660 7 count = avctx->extradata_size*8 - get_bits_count(&gb);
661
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if (count > 0) {
662 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
663 count, get_bits_long(&gb, FFMIN(count, 32)));
664
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 } else if (count < 0) {
665 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
666 }
667 } else { // VC1/WVC1/WVP2
668 15 const uint8_t *start = avctx->extradata;
669 15 const uint8_t *end = avctx->extradata + avctx->extradata_size;
670 const uint8_t *next;
671 int size, buf2_size;
672 15 uint8_t *buf2 = NULL;
673 15 int seq_initialized = 0, ep_initialized = 0;
674
675
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
15 if (avctx->extradata_size < 16) {
676 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
677 return AVERROR_INVALIDDATA;
678 }
679
680 15 buf2 = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
681
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
15 if (!buf2)
682 return AVERROR(ENOMEM);
683
684 15 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
685 15 next = start;
686
2/2
✓ Branch 0 taken 40 times.
✓ Branch 1 taken 15 times.
55 for (; next < end; start = next) {
687 40 next = find_next_marker(start + 4, end);
688 40 size = next - start - 4;
689
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 40 times.
40 if (size <= 0)
690 continue;
691 40 buf2_size = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
692 40 init_get_bits(&gb, buf2, buf2_size * 8);
693
2/3
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
40 switch (AV_RB32(start)) {
694 15 case VC1_CODE_SEQHDR:
695
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
15 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0) {
696 av_free(buf2);
697 return ret;
698 }
699 15 seq_initialized = 1;
700 15 break;
701 25 case VC1_CODE_ENTRYPOINT:
702
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 25 times.
25 if ((ret = ff_vc1_decode_entry_point(avctx, v, &gb)) < 0) {
703 av_free(buf2);
704 return ret;
705 }
706 25 ep_initialized = 1;
707 25 break;
708 }
709 }
710 15 av_free(buf2);
711
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) {
712 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
713 return AVERROR_INVALIDDATA;
714 }
715 15 v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
716 }
717
718 22 avctx->profile = v->profile;
719
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 7 times.
22 if (v->profile == PROFILE_ADVANCED)
720 15 avctx->level = v->level;
721
722 22 ff_blockdsp_init(&s->bdsp);
723 22 ff_h264chroma_init(&v->h264chroma, 8);
724
725 22 avctx->has_b_frames = !!avctx->max_b_frames;
726
727
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)
728 avctx->color_primaries = v->color_prim;
729
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)
730 avctx->color_trc = v->transfer_char;
731
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)
732 avctx->colorspace = v->matrix_coef;
733
734 22 s->mb_width = (avctx->coded_width + 15) >> 4;
735 22 s->mb_height = (avctx->coded_height + 15) >> 4;
736
737
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) {
738 22 ff_vc1_init_transposed_scantables(v);
739 } else {
740 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
741 v->left_blk_sh = 3;
742 v->top_blk_sh = 0;
743 v->vc1dsp.vc1_inv_trans_8x8 = ff_simple_idct_int16_8bit;
744 v->vc1dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
745 v->vc1dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
746 v->vc1dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
747 v->vc1dsp.vc1_inv_trans_8x8_dc = ff_simple_idct_add_int16_8bit;
748 v->vc1dsp.vc1_inv_trans_8x4_dc = ff_simple_idct84_add;
749 v->vc1dsp.vc1_inv_trans_4x8_dc = ff_simple_idct48_add;
750 v->vc1dsp.vc1_inv_trans_4x4_dc = ff_simple_idct44_add;
751 }
752
753
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) {
754 v->sprite_width = avctx->coded_width;
755 v->sprite_height = avctx->coded_height;
756
757 avctx->coded_width = avctx->width = v->output_width;
758 avctx->coded_height = avctx->height = v->output_height;
759
760 // prevent 16.16 overflows
761 if (v->sprite_width > 1 << 14 ||
762 v->sprite_height > 1 << 14 ||
763 v->output_width > 1 << 14 ||
764 v->output_height > 1 << 14) {
765 return AVERROR_INVALIDDATA;
766 }
767
768 if ((v->sprite_width&1) || (v->sprite_height&1)) {
769 avpriv_request_sample(avctx, "odd sprites support");
770 return AVERROR_PATCHWELCOME;
771 }
772 }
773 22 return 0;
774 }
775
776 34 static av_cold void vc1_decode_reset(AVCodecContext *avctx)
777 {
778 34 VC1Context *v = avctx->priv_data;
779 int i;
780
781 34 av_frame_free(&v->sprite_output_frame);
782
783
2/2
✓ Branch 0 taken 136 times.
✓ Branch 1 taken 34 times.
170 for (i = 0; i < 4; i++)
784 136 av_freep(&v->sr_rows[i >> 1][i & 1]);
785 34 ff_mpv_common_end(&v->s);
786 34 memset(v->s.block_index, 0, sizeof(v->s.block_index));
787 34 av_freep(&v->mv_type_mb_plane);
788 34 av_freep(&v->direct_mb_plane);
789 34 av_freep(&v->forward_mb_plane);
790 34 av_freep(&v->fieldtx_plane);
791 34 av_freep(&v->acpred_plane);
792 34 av_freep(&v->over_flags_plane);
793 34 av_freep(&v->mb_type_base);
794 34 av_freep(&v->blk_mv_type_base);
795 34 av_freep(&v->mv_f_base);
796 34 av_freep(&v->mv_f_next_base);
797 34 av_freep(&v->block);
798 34 av_freep(&v->cbp_base);
799 34 av_freep(&v->ttblk_base);
800 34 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
801 34 av_freep(&v->luma_mv_base);
802 34 ff_intrax8_common_end(&v->x8);
803 34 }
804
805 /**
806 * Close a MSS2/VC1/WMV3 decoder
807 */
808 34 av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
809 {
810 34 vc1_decode_reset(avctx);
811 34 return ff_mpv_decode_close(avctx);
812 }
813
814 /** Decode a VC1/WMV3 frame
815 * @todo TODO: Handle VC-1 IDUs (Transport level?)
816 */
817 507 static int vc1_decode_frame(AVCodecContext *avctx, AVFrame *pict,
818 int *got_frame, AVPacket *avpkt)
819 {
820 507 const uint8_t *buf = avpkt->data;
821 507 int buf_size = avpkt->size, n_slices = 0, i, ret;
822 507 VC1Context *v = avctx->priv_data;
823 507 MpegEncContext *s = &v->s;
824 507 uint8_t *buf2 = NULL;
825 507 const uint8_t *buf_start = buf, *buf_start_second_field = NULL;
826 507 int mb_height, n_slices1=-1;
827 struct {
828 uint8_t *buf;
829 GetBitContext gb;
830 int mby_start;
831 const uint8_t *rawbuf;
832 int raw_size;
833 507 } *slices = NULL, *tmp;
834 507 unsigned slices_allocated = 0;
835
836 507 v->second_field = 0;
837
838
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 507 times.
507 if(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
839 s->low_delay = 1;
840
841 /* no supplementary picture */
842
5/6
✓ Branch 0 taken 490 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 489 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
507 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
843 /* special case for last picture */
844
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) {
845
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
8 if ((ret = av_frame_ref(pict, s->next_pic.ptr->f)) < 0)
846 return ret;
847 8 ff_mpv_unref_picture(&s->next_pic);
848
849 8 *got_frame = 1;
850 }
851
852 18 return buf_size;
853 }
854
855 //for advanced profile we may need to parse and unescape data
856
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) {
857 306 int buf_size2 = 0;
858 306 size_t next_allocated = 0;
859 306 buf2 = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
860
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 306 times.
306 if (!buf2)
861 return AVERROR(ENOMEM);
862
863
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 */
864 const uint8_t *start, *end, *next;
865 int size;
866
867 306 next = buf;
868
2/2
✓ Branch 0 taken 988 times.
✓ Branch 1 taken 306 times.
1294 for (start = buf, end = buf + buf_size; next < end; start = next) {
869 988 next = find_next_marker(start + 4, end);
870 988 size = next - start - 4;
871
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 988 times.
988 if (size <= 0) continue;
872
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)) {
873 306 case VC1_CODE_FRAME:
874 306 buf_start = start;
875 306 buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
876 306 break;
877 37 case VC1_CODE_FIELD: {
878 int buf_size3;
879 37 buf_start_second_field = start;
880 37 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
881
1/2
✓ Branch 0 taken 37 times.
✗ Branch 1 not taken.
37 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
882
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (!tmp) {
883 ret = AVERROR(ENOMEM);
884 goto err;
885 }
886 37 slices = tmp;
887 37 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
888
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (!slices[n_slices].buf) {
889 ret = AVERROR(ENOMEM);
890 goto err;
891 }
892 37 buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size,
893 37 slices[n_slices].buf);
894 37 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
895 buf_size3 << 3);
896 37 slices[n_slices].mby_start = avctx->coded_height + 31 >> 5;
897 37 slices[n_slices].rawbuf = start;
898 37 slices[n_slices].raw_size = size + 4;
899 37 n_slices1 = n_slices - 1; // index of the last slice of the first field
900 37 n_slices++;
901 37 break;
902 }
903 26 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
904 26 buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
905 26 init_get_bits(&s->gb, buf2, buf_size2 * 8);
906 26 ff_vc1_decode_entry_point(avctx, v, &s->gb);
907 26 break;
908 603 case VC1_CODE_SLICE: {
909 int buf_size3;
910 603 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
911
1/2
✓ Branch 0 taken 603 times.
✗ Branch 1 not taken.
603 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
912
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 603 times.
603 if (!tmp) {
913 ret = AVERROR(ENOMEM);
914 goto err;
915 }
916 603 slices = tmp;
917 603 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
918
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 603 times.
603 if (!slices[n_slices].buf) {
919 ret = AVERROR(ENOMEM);
920 goto err;
921 }
922 603 buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size,
923 603 slices[n_slices].buf);
924 603 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
925 buf_size3 << 3);
926 603 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
927 603 slices[n_slices].rawbuf = start;
928 603 slices[n_slices].raw_size = size + 4;
929 603 n_slices++;
930 603 break;
931 }
932 }
933 }
934 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
935 const uint8_t *divider;
936 int buf_size3;
937
938 divider = find_next_marker(buf, buf + buf_size);
939 if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
940 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
941 ret = AVERROR_INVALIDDATA;
942 goto err;
943 } else { // found field marker, unescape second field
944 buf_start_second_field = divider;
945 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
946 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
947 if (!tmp) {
948 ret = AVERROR(ENOMEM);
949 goto err;
950 }
951 slices = tmp;
952 slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
953 if (!slices[n_slices].buf) {
954 ret = AVERROR(ENOMEM);
955 goto err;
956 }
957 buf_size3 = v->vc1dsp.vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
958 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
959 buf_size3 << 3);
960 slices[n_slices].mby_start = s->mb_height + 1 >> 1;
961 slices[n_slices].rawbuf = divider;
962 slices[n_slices].raw_size = buf + buf_size - divider;
963 n_slices1 = n_slices - 1;
964 n_slices++;
965 }
966 buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, divider - buf, buf2);
967 } else {
968 buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, buf_size, buf2);
969 }
970 306 init_get_bits(&s->gb, buf2, buf_size2*8);
971 } else{
972 183 ret = init_get_bits8(&s->gb, buf, buf_size);
973
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 183 times.
183 if (ret < 0)
974 return ret;
975 }
976
977
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (v->res_sprite) {
978 v->new_sprite = !get_bits1(&s->gb);
979 v->two_sprites = get_bits1(&s->gb);
980 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
981 we're using the sprite compositor. These are intentionally kept separate
982 so you can get the raw sprites by using the wmv3 decoder for WMVP or
983 the vc1 one for WVP2 */
984 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
985 if (v->new_sprite) {
986 // switch AVCodecContext parameters to those of the sprites
987 avctx->width = avctx->coded_width = v->sprite_width;
988 avctx->height = avctx->coded_height = v->sprite_height;
989 } else {
990 goto image;
991 }
992 }
993 }
994
995
2/2
✓ Branch 0 taken 467 times.
✓ Branch 1 taken 22 times.
489 if (s->context_initialized &&
996
1/2
✓ Branch 0 taken 467 times.
✗ Branch 1 not taken.
467 (s->width != avctx->coded_width ||
997
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 467 times.
467 s->height != avctx->coded_height)) {
998 vc1_decode_reset(avctx);
999 }
1000
1001
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 467 times.
489 if (!s->context_initialized) {
1002 22 ret = ff_vc1_decode_init(avctx);
1003
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
22 if (ret < 0)
1004 goto err;
1005
1006
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;
1007
1008
2/2
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 7 times.
22 if (v->profile == PROFILE_ADVANCED) {
1009
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) {
1010 ret = AVERROR_INVALIDDATA;
1011 goto err;
1012 }
1013 15 s->h_edge_pos = avctx->coded_width;
1014 15 s->v_edge_pos = avctx->coded_height;
1015 }
1016 }
1017
1018 // do parse frame header
1019 489 v->pic_header_flag = 0;
1020 489 v->first_pic_header_flag = 1;
1021
2/2
✓ Branch 0 taken 183 times.
✓ Branch 1 taken 306 times.
489 if (v->profile < PROFILE_ADVANCED) {
1022
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 183 times.
183 if ((ret = ff_vc1_parse_frame_header(v, &s->gb)) < 0) {
1023 goto err;
1024 }
1025 } else {
1026
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 306 times.
306 if ((ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
1027 goto err;
1028 }
1029 }
1030 489 v->first_pic_header_flag = 0;
1031
1032
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (avctx->debug & FF_DEBUG_PICT_INFO)
1033 av_log(v->s.avctx, AV_LOG_DEBUG, "pict_type: %c\n", av_get_picture_type_char(s->pict_type));
1034
1035
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)
1036 && s->pict_type != AV_PICTURE_TYPE_I) {
1037 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
1038 ret = AVERROR_INVALIDDATA;
1039 goto err;
1040 }
1041
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)
1042 && v->field_mode) {
1043 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected Frames not Fields\n");
1044 ret = AVERROR_INVALIDDATA;
1045 goto err;
1046 }
1047
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if ((s->mb_height >> v->field_mode) == 0) {
1048 av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
1049 ret = AVERROR_INVALIDDATA;
1050 goto err;
1051 }
1052
1053 /* skip B-frames if we don't have reference frames */
1054
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) {
1055 av_log(v->s.avctx, AV_LOG_DEBUG, "Skipping B frame without reference frames\n");
1056 goto end;
1057 }
1058
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) ||
1059
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) ||
1060
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 avctx->skip_frame >= AVDISCARD_ALL) {
1061 goto end;
1062 }
1063
1064
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 489 times.
489 if ((ret = ff_mpv_frame_start(s, avctx)) < 0) {
1065 goto err;
1066 }
1067
1068 489 v->s.cur_pic.ptr->field_picture = v->field_mode;
1069
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);
1070
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;
1071
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;
1072
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;
1073
1074 // process pulldown flags
1075 489 s->cur_pic.ptr->f->repeat_pict = 0;
1076 // Pulldown flags are only valid when 'broadcast' has been set.
1077
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (v->rff) {
1078 // repeat field
1079 s->cur_pic.ptr->f->repeat_pict = 1;
1080
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 } else if (v->rptfrm) {
1081 // repeat frames
1082 s->cur_pic.ptr->f->repeat_pict = v->rptfrm * 2;
1083 }
1084
1085
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 if (avctx->hwaccel) {
1086 const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
1087 s->mb_y = 0;
1088 if (v->field_mode && buf_start_second_field) {
1089 // decode first field
1090 s->picture_structure = PICT_BOTTOM_FIELD - v->tff;
1091 ret = hwaccel->start_frame(avctx, buf_start,
1092 buf_start_second_field - buf_start);
1093 if (ret < 0)
1094 goto err;
1095
1096 if (n_slices1 == -1) {
1097 // no slices, decode the field as-is
1098 ret = hwaccel->decode_slice(avctx, buf_start,
1099 buf_start_second_field - buf_start);
1100 if (ret < 0)
1101 goto err;
1102 } else {
1103 ret = hwaccel->decode_slice(avctx, buf_start,
1104 slices[0].rawbuf - buf_start);
1105 if (ret < 0)
1106 goto err;
1107
1108 for (i = 0 ; i < n_slices1 + 1; i++) {
1109 s->gb = slices[i].gb;
1110 s->mb_y = slices[i].mby_start;
1111
1112 v->pic_header_flag = get_bits1(&s->gb);
1113 if (v->pic_header_flag) {
1114 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
1115 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1116 ret = AVERROR_INVALIDDATA;
1117 if (avctx->err_recognition & AV_EF_EXPLODE)
1118 goto err;
1119 continue;
1120 }
1121 }
1122
1123 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1124 slices[i].raw_size);
1125 if (ret < 0)
1126 goto err;
1127 }
1128 }
1129
1130 if ((ret = hwaccel->end_frame(avctx)) < 0)
1131 goto err;
1132
1133 // decode second field
1134 s->gb = slices[n_slices1 + 1].gb;
1135 s->mb_y = slices[n_slices1 + 1].mby_start;
1136 s->picture_structure = PICT_TOP_FIELD + v->tff;
1137 v->second_field = 1;
1138 v->pic_header_flag = 0;
1139 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
1140 av_log(avctx, AV_LOG_ERROR, "parsing header for second field failed");
1141 ret = AVERROR_INVALIDDATA;
1142 goto err;
1143 }
1144 v->s.cur_pic.ptr->f->pict_type = v->s.pict_type;
1145
1146 ret = hwaccel->start_frame(avctx, buf_start_second_field,
1147 (buf + buf_size) - buf_start_second_field);
1148 if (ret < 0)
1149 goto err;
1150
1151 if (n_slices - n_slices1 == 2) {
1152 // no slices, decode the field as-is
1153 ret = hwaccel->decode_slice(avctx, buf_start_second_field,
1154 (buf + buf_size) - buf_start_second_field);
1155 if (ret < 0)
1156 goto err;
1157 } else {
1158 ret = hwaccel->decode_slice(avctx, buf_start_second_field,
1159 slices[n_slices1 + 2].rawbuf - buf_start_second_field);
1160 if (ret < 0)
1161 goto err;
1162
1163 for (i = n_slices1 + 2; i < n_slices; i++) {
1164 s->gb = slices[i].gb;
1165 s->mb_y = slices[i].mby_start;
1166
1167 v->pic_header_flag = get_bits1(&s->gb);
1168 if (v->pic_header_flag) {
1169 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
1170 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1171 ret = AVERROR_INVALIDDATA;
1172 if (avctx->err_recognition & AV_EF_EXPLODE)
1173 goto err;
1174 continue;
1175 }
1176 }
1177
1178 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1179 slices[i].raw_size);
1180 if (ret < 0)
1181 goto err;
1182 }
1183 }
1184
1185 if ((ret = hwaccel->end_frame(avctx)) < 0)
1186 goto err;
1187 } else {
1188 s->picture_structure = PICT_FRAME;
1189 ret = hwaccel->start_frame(avctx, buf_start,
1190 (buf + buf_size) - buf_start);
1191 if (ret < 0)
1192 goto err;
1193
1194 if (n_slices == 0) {
1195 // no slices, decode the frame as-is
1196 ret = hwaccel->decode_slice(avctx, buf_start,
1197 (buf + buf_size) - buf_start);
1198 if (ret < 0)
1199 goto err;
1200 } else {
1201 // decode the frame part as the first slice
1202 ret = hwaccel->decode_slice(avctx, buf_start,
1203 slices[0].rawbuf - buf_start);
1204 if (ret < 0)
1205 goto err;
1206
1207 // and process the slices as additional slices afterwards
1208 for (i = 0 ; i < n_slices; i++) {
1209 s->gb = slices[i].gb;
1210 s->mb_y = slices[i].mby_start;
1211
1212 v->pic_header_flag = get_bits1(&s->gb);
1213 if (v->pic_header_flag) {
1214 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
1215 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1216 ret = AVERROR_INVALIDDATA;
1217 if (avctx->err_recognition & AV_EF_EXPLODE)
1218 goto err;
1219 continue;
1220 }
1221 }
1222
1223 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1224 slices[i].raw_size);
1225 if (ret < 0)
1226 goto err;
1227 }
1228 }
1229 if ((ret = hwaccel->end_frame(avctx)) < 0)
1230 goto err;
1231 }
1232 } else {
1233 489 int header_ret = 0;
1234
1235 489 ff_mpeg_er_frame_start(s);
1236
1237 489 v->end_mb_x = s->mb_width;
1238
2/2
✓ Branch 0 taken 37 times.
✓ Branch 1 taken 452 times.
489 if (v->field_mode) {
1239 37 s->cur_pic.linesize[0] <<= 1;
1240 37 s->cur_pic.linesize[1] <<= 1;
1241 37 s->cur_pic.linesize[2] <<= 1;
1242 37 s->linesize <<= 1;
1243 37 s->uvlinesize <<= 1;
1244 }
1245 489 mb_height = s->mb_height >> v->field_mode;
1246
1247
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
489 av_assert0 (mb_height > 0);
1248
1249
2/2
✓ Branch 0 taken 1129 times.
✓ Branch 1 taken 489 times.
1618 for (i = 0; i <= n_slices; i++) {
1250
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) {
1251
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (v->field_mode <= 0) {
1252 av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
1253 "picture boundary (%d >= %d)\n", i,
1254 slices[i - 1].mby_start, mb_height);
1255 continue;
1256 }
1257 37 v->second_field = 1;
1258
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 av_assert0((s->mb_height & 1) == 0);
1259 37 v->blocks_off = s->b8_stride * (s->mb_height&~1);
1260 37 v->mb_off = s->mb_stride * s->mb_height >> 1;
1261 } else {
1262 1092 v->second_field = 0;
1263 1092 v->blocks_off = 0;
1264 1092 v->mb_off = 0;
1265 }
1266
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
1129 if (i) {
1267 640 v->pic_header_flag = 0;
1268
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) {
1269
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 37 times.
37 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
1270 av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
1271 ret = AVERROR_INVALIDDATA;
1272 if (avctx->err_recognition & AV_EF_EXPLODE)
1273 goto err;
1274 continue;
1275 }
1276
2/2
✓ Branch 1 taken 273 times.
✓ Branch 2 taken 330 times.
603 } else if (get_bits1(&s->gb)) {
1277 273 v->pic_header_flag = 1;
1278
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 273 times.
273 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
1279 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1280 ret = AVERROR_INVALIDDATA;
1281 if (avctx->err_recognition & AV_EF_EXPLODE)
1282 goto err;
1283 continue;
1284 }
1285 }
1286 }
1287
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1129 times.
1129 if (header_ret < 0)
1288 continue;
1289
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);
1290
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)
1291
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);
1292 else {
1293
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
37 if (i >= n_slices) {
1294 av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
1295 continue;
1296 }
1297
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);
1298 }
1299
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1129 times.
1129 if (s->end_mb_y <= s->start_mb_y) {
1300 av_log(v->s.avctx, AV_LOG_ERROR, "end mb y %d %d invalid\n", s->end_mb_y, s->start_mb_y);
1301 continue;
1302 }
1303
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) ||
1304
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)) &&
1305
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1026 times.
1026 !v->cbpcy_vlc) {
1306 av_log(v->s.avctx, AV_LOG_ERROR, "missing cbpcy_vlc\n");
1307 continue;
1308 }
1309 1129 ff_vc1_decode_blocks(v);
1310
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
1129 if (i != n_slices) {
1311 640 s->gb = slices[i].gb;
1312 }
1313 }
1314
2/2
✓ Branch 0 taken 37 times.
✓ Branch 1 taken 452 times.
489 if (v->field_mode) {
1315 37 v->second_field = 0;
1316 37 s->cur_pic.linesize[0] >>= 1;
1317 37 s->cur_pic.linesize[1] >>= 1;
1318 37 s->cur_pic.linesize[2] >>= 1;
1319 37 s->linesize >>= 1;
1320 37 s->uvlinesize >>= 1;
1321
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) {
1322 19 FFSWAP(uint8_t *, v->mv_f_next[0], v->mv_f[0]);
1323 19 FFSWAP(uint8_t *, v->mv_f_next[1], v->mv_f[1]);
1324 }
1325 }
1326 ff_dlog(s->avctx, "Consumed %i/%i bits\n",
1327 get_bits_count(&s->gb), s->gb.size_in_bits);
1328 // if (get_bits_count(&s->gb) > buf_size * 8)
1329 // return -1;
1330
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) {
1331 ret = AVERROR_INVALIDDATA;
1332 goto err;
1333 }
1334
2/2
✓ Branch 0 taken 452 times.
✓ Branch 1 taken 37 times.
489 if ( !v->field_mode
1335
1/2
✓ Branch 0 taken 452 times.
✗ Branch 1 not taken.
452 && avctx->codec_id != AV_CODEC_ID_WMV3IMAGE
1336
1/2
✓ Branch 0 taken 452 times.
✗ Branch 1 not taken.
452 && avctx->codec_id != AV_CODEC_ID_VC1IMAGE)
1337 452 ff_er_frame_end(&s->er, NULL);
1338 }
1339
1340 489 ff_mpv_frame_end(s);
1341
1342
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) {
1343 image:
1344 avctx->width = avctx->coded_width = v->output_width;
1345 avctx->height = avctx->coded_height = v->output_height;
1346 if (avctx->skip_frame >= AVDISCARD_NONREF)
1347 goto end;
1348 if (!v->sprite_output_frame &&
1349 !(v->sprite_output_frame = av_frame_alloc())) {
1350 ret = AVERROR(ENOMEM);
1351 goto err;
1352 }
1353 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
1354 if ((ret = vc1_decode_sprites(v, &s->gb)) < 0)
1355 goto err;
1356 #endif
1357 if ((ret = av_frame_ref(pict, v->sprite_output_frame)) < 0)
1358 goto err;
1359 *got_frame = 1;
1360 } else {
1361
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) {
1362
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 249 times.
249 if ((ret = av_frame_ref(pict, s->cur_pic.ptr->f)) < 0)
1363 goto err;
1364 249 ff_print_debug_info(s, s->cur_pic.ptr, pict);
1365 249 *got_frame = 1;
1366
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 223 times.
240 } else if (s->last_pic.ptr) {
1367
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 223 times.
223 if ((ret = av_frame_ref(pict, s->last_pic.ptr->f)) < 0)
1368 goto err;
1369 223 ff_print_debug_info(s, s->last_pic.ptr, pict);
1370 223 *got_frame = 1;
1371 }
1372 }
1373
1374 17 end:
1375 489 av_free(buf2);
1376
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 489 times.
1129 for (i = 0; i < n_slices; i++)
1377 640 av_free(slices[i].buf);
1378 489 av_free(slices);
1379 489 return buf_size;
1380
1381 err:
1382 av_free(buf2);
1383 for (i = 0; i < n_slices; i++)
1384 av_free(slices[i].buf);
1385 av_free(slices);
1386 return ret;
1387 }
1388
1389
1390 const FFCodec ff_vc1_decoder = {
1391 .p.name = "vc1",
1392 CODEC_LONG_NAME("SMPTE VC-1"),
1393 .p.type = AVMEDIA_TYPE_VIDEO,
1394 .p.id = AV_CODEC_ID_VC1,
1395 .priv_data_size = sizeof(VC1Context),
1396 .init = vc1_decode_init,
1397 .close = ff_vc1_decode_end,
1398 FF_CODEC_DECODE_CB(vc1_decode_frame),
1399 .flush = ff_mpeg_flush,
1400 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1401 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1402 #if CONFIG_VC1_DXVA2_HWACCEL
1403 HWACCEL_DXVA2(vc1),
1404 #endif
1405 #if CONFIG_VC1_D3D11VA_HWACCEL
1406 HWACCEL_D3D11VA(vc1),
1407 #endif
1408 #if CONFIG_VC1_D3D11VA2_HWACCEL
1409 HWACCEL_D3D11VA2(vc1),
1410 #endif
1411 #if CONFIG_VC1_D3D12VA_HWACCEL
1412 HWACCEL_D3D12VA(vc1),
1413 #endif
1414 #if CONFIG_VC1_NVDEC_HWACCEL
1415 HWACCEL_NVDEC(vc1),
1416 #endif
1417 #if CONFIG_VC1_VAAPI_HWACCEL
1418 HWACCEL_VAAPI(vc1),
1419 #endif
1420 #if CONFIG_VC1_VDPAU_HWACCEL
1421 HWACCEL_VDPAU(vc1),
1422 #endif
1423 NULL
1424 },
1425 .p.profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
1426 };
1427
1428 #if CONFIG_WMV3_DECODER
1429 const FFCodec ff_wmv3_decoder = {
1430 .p.name = "wmv3",
1431 CODEC_LONG_NAME("Windows Media Video 9"),
1432 .p.type = AVMEDIA_TYPE_VIDEO,
1433 .p.id = AV_CODEC_ID_WMV3,
1434 .priv_data_size = sizeof(VC1Context),
1435 .init = vc1_decode_init,
1436 .close = ff_vc1_decode_end,
1437 FF_CODEC_DECODE_CB(vc1_decode_frame),
1438 .flush = ff_mpeg_flush,
1439 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1440 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1441 #if CONFIG_WMV3_DXVA2_HWACCEL
1442 HWACCEL_DXVA2(wmv3),
1443 #endif
1444 #if CONFIG_WMV3_D3D11VA_HWACCEL
1445 HWACCEL_D3D11VA(wmv3),
1446 #endif
1447 #if CONFIG_WMV3_D3D11VA2_HWACCEL
1448 HWACCEL_D3D11VA2(wmv3),
1449 #endif
1450 #if CONFIG_WMV3_D3D12VA_HWACCEL
1451 HWACCEL_D3D12VA(wmv3),
1452 #endif
1453 #if CONFIG_WMV3_NVDEC_HWACCEL
1454 HWACCEL_NVDEC(wmv3),
1455 #endif
1456 #if CONFIG_WMV3_VAAPI_HWACCEL
1457 HWACCEL_VAAPI(wmv3),
1458 #endif
1459 #if CONFIG_WMV3_VDPAU_HWACCEL
1460 HWACCEL_VDPAU(wmv3),
1461 #endif
1462 NULL
1463 },
1464 .p.profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
1465 };
1466 #endif
1467
1468 #if CONFIG_WMV3IMAGE_DECODER
1469 const FFCodec ff_wmv3image_decoder = {
1470 .p.name = "wmv3image",
1471 CODEC_LONG_NAME("Windows Media Video 9 Image"),
1472 .p.type = AVMEDIA_TYPE_VIDEO,
1473 .p.id = AV_CODEC_ID_WMV3IMAGE,
1474 .priv_data_size = sizeof(VC1Context),
1475 .init = vc1_decode_init,
1476 .close = ff_vc1_decode_end,
1477 FF_CODEC_DECODE_CB(vc1_decode_frame),
1478 .p.capabilities = AV_CODEC_CAP_DR1,
1479 .flush = vc1_sprite_flush,
1480 };
1481 #endif
1482
1483 #if CONFIG_VC1IMAGE_DECODER
1484 const FFCodec ff_vc1image_decoder = {
1485 .p.name = "vc1image",
1486 CODEC_LONG_NAME("Windows Media Video 9 Image v2"),
1487 .p.type = AVMEDIA_TYPE_VIDEO,
1488 .p.id = AV_CODEC_ID_VC1IMAGE,
1489 .priv_data_size = sizeof(VC1Context),
1490 .init = vc1_decode_init,
1491 .close = ff_vc1_decode_end,
1492 FF_CODEC_DECODE_CB(vc1_decode_frame),
1493 .p.capabilities = AV_CODEC_CAP_DR1,
1494 .flush = vc1_sprite_flush,
1495 };
1496 #endif
1497