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 "avcodec.h"
30 #include "blockdsp.h"
31 #include "get_bits.h"
32 #include "hwconfig.h"
33 #include "internal.h"
34 #include "mpeg_er.h"
35 #include "mpegvideo.h"
36 #include "msmpeg4.h"
37 #include "msmpeg4data.h"
38 #include "profiles.h"
39 #include "vc1.h"
40 #include "vc1data.h"
41 #include "libavutil/avassert.h"
42
43
44 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
45
46 typedef struct SpriteData {
47 /**
48 * Transform coefficients for both sprites in 16.16 fixed point format,
49 * in the order they appear in the bitstream:
50 * x scale
51 * rotation 1 (unused)
52 * x offset
53 * rotation 2 (unused)
54 * y scale
55 * y offset
56 * alpha
57 */
58 int coefs[2][7];
59
60 int effect_type, effect_flag;
61 int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
62 int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
63 } SpriteData;
64
get_fp_val(GetBitContext * gb)65 static inline int get_fp_val(GetBitContext* gb)
66 {
67 return (get_bits_long(gb, 30) - (1 << 29)) << 1;
68 }
69
vc1_sprite_parse_transform(GetBitContext * gb,int c[7])70 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
71 {
72 c[1] = c[3] = 0;
73
74 switch (get_bits(gb, 2)) {
75 case 0:
76 c[0] = 1 << 16;
77 c[2] = get_fp_val(gb);
78 c[4] = 1 << 16;
79 break;
80 case 1:
81 c[0] = c[4] = get_fp_val(gb);
82 c[2] = get_fp_val(gb);
83 break;
84 case 2:
85 c[0] = get_fp_val(gb);
86 c[2] = get_fp_val(gb);
87 c[4] = get_fp_val(gb);
88 break;
89 case 3:
90 c[0] = get_fp_val(gb);
91 c[1] = get_fp_val(gb);
92 c[2] = get_fp_val(gb);
93 c[3] = get_fp_val(gb);
94 c[4] = get_fp_val(gb);
95 break;
96 }
97 c[5] = get_fp_val(gb);
98 if (get_bits1(gb))
99 c[6] = get_fp_val(gb);
100 else
101 c[6] = 1 << 16;
102 }
103
vc1_parse_sprites(VC1Context * v,GetBitContext * gb,SpriteData * sd)104 static int vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
105 {
106 AVCodecContext *avctx = v->s.avctx;
107 int sprite, i;
108
109 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
110 vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
111 if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
112 avpriv_request_sample(avctx, "Non-zero rotation coefficients");
113 av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
114 for (i = 0; i < 7; i++)
115 av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
116 sd->coefs[sprite][i] / (1<<16),
117 (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1 << 16));
118 av_log(avctx, AV_LOG_DEBUG, "\n");
119 }
120
121 skip_bits(gb, 2);
122 if (sd->effect_type = get_bits_long(gb, 30)) {
123 switch (sd->effect_pcount1 = get_bits(gb, 4)) {
124 case 7:
125 vc1_sprite_parse_transform(gb, sd->effect_params1);
126 break;
127 case 14:
128 vc1_sprite_parse_transform(gb, sd->effect_params1);
129 vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
130 break;
131 default:
132 for (i = 0; i < sd->effect_pcount1; i++)
133 sd->effect_params1[i] = get_fp_val(gb);
134 }
135 if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
136 // effect 13 is simple alpha blending and matches the opacity above
137 av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
138 for (i = 0; i < sd->effect_pcount1; i++)
139 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
140 sd->effect_params1[i] / (1 << 16),
141 (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1 << 16));
142 av_log(avctx, AV_LOG_DEBUG, "\n");
143 }
144
145 sd->effect_pcount2 = get_bits(gb, 16);
146 if (sd->effect_pcount2 > 10) {
147 av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
148 return AVERROR_INVALIDDATA;
149 } else if (sd->effect_pcount2) {
150 i = -1;
151 av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
152 while (++i < sd->effect_pcount2) {
153 sd->effect_params2[i] = get_fp_val(gb);
154 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
155 sd->effect_params2[i] / (1 << 16),
156 (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1 << 16));
157 }
158 av_log(avctx, AV_LOG_DEBUG, "\n");
159 }
160 }
161 if (sd->effect_flag = get_bits1(gb))
162 av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
163
164 if (get_bits_count(gb) >= gb->size_in_bits +
165 (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0)) {
166 av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
167 return AVERROR_INVALIDDATA;
168 }
169 if (get_bits_count(gb) < gb->size_in_bits - 8)
170 av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
171
172 return 0;
173 }
174
vc1_draw_sprites(VC1Context * v,SpriteData * sd)175 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
176 {
177 int i, plane, row, sprite;
178 int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
179 uint8_t* src_h[2][2];
180 int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
181 int ysub[2];
182 MpegEncContext *s = &v->s;
183
184 for (i = 0; i <= v->two_sprites; i++) {
185 xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
186 xadv[i] = sd->coefs[i][0];
187 if (xadv[i] != 1<<16 || (v->sprite_width << 16) - (v->output_width << 16) - xoff[i])
188 xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
189
190 yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
191 yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height << 16) - yoff[i]) / v->output_height);
192 }
193 alpha = av_clip_uint16(sd->coefs[1][6]);
194
195 for (plane = 0; plane < (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY ? 1 : 3); plane++) {
196 int width = v->output_width>>!!plane;
197
198 for (row = 0; row < v->output_height>>!!plane; row++) {
199 uint8_t *dst = v->sprite_output_frame->data[plane] +
200 v->sprite_output_frame->linesize[plane] * row;
201
202 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
203 uint8_t *iplane = s->current_picture.f->data[plane];
204 int iline = s->current_picture.f->linesize[plane];
205 int ycoord = yoff[sprite] + yadv[sprite] * row;
206 int yline = ycoord >> 16;
207 int next_line;
208 ysub[sprite] = ycoord & 0xFFFF;
209 if (sprite) {
210 iplane = s->last_picture.f->data[plane];
211 iline = s->last_picture.f->linesize[plane];
212 }
213 next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
214 if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
215 src_h[sprite][0] = iplane + (xoff[sprite] >> 16) + yline * iline;
216 if (ysub[sprite])
217 src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
218 } else {
219 if (sr_cache[sprite][0] != yline) {
220 if (sr_cache[sprite][1] == yline) {
221 FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
222 FFSWAP(int, sr_cache[sprite][0], sr_cache[sprite][1]);
223 } else {
224 v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
225 sr_cache[sprite][0] = yline;
226 }
227 }
228 if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
229 v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
230 iplane + next_line, xoff[sprite],
231 xadv[sprite], width);
232 sr_cache[sprite][1] = yline + 1;
233 }
234 src_h[sprite][0] = v->sr_rows[sprite][0];
235 src_h[sprite][1] = v->sr_rows[sprite][1];
236 }
237 }
238
239 if (!v->two_sprites) {
240 if (ysub[0]) {
241 v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
242 } else {
243 memcpy(dst, src_h[0][0], width);
244 }
245 } else {
246 if (ysub[0] && ysub[1]) {
247 v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
248 src_h[1][0], src_h[1][1], ysub[1], alpha, width);
249 } else if (ysub[0]) {
250 v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
251 src_h[1][0], alpha, width);
252 } else if (ysub[1]) {
253 v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
254 src_h[0][0], (1<<16)-1-alpha, width);
255 } else {
256 v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
257 }
258 }
259 }
260
261 if (!plane) {
262 for (i = 0; i <= v->two_sprites; i++) {
263 xoff[i] >>= 1;
264 yoff[i] >>= 1;
265 }
266 }
267
268 }
269 }
270
271
vc1_decode_sprites(VC1Context * v,GetBitContext * gb)272 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
273 {
274 int ret;
275 MpegEncContext *s = &v->s;
276 AVCodecContext *avctx = s->avctx;
277 SpriteData sd;
278
279 memset(&sd, 0, sizeof(sd));
280
281 ret = vc1_parse_sprites(v, gb, &sd);
282 if (ret < 0)
283 return ret;
284
285 if (!s->current_picture.f || !s->current_picture.f->data[0]) {
286 av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
287 return AVERROR_UNKNOWN;
288 }
289
290 if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f->data[0])) {
291 av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
292 v->two_sprites = 0;
293 }
294
295 av_frame_unref(v->sprite_output_frame);
296 if ((ret = ff_get_buffer(avctx, v->sprite_output_frame, 0)) < 0)
297 return ret;
298
299 vc1_draw_sprites(v, &sd);
300
301 return 0;
302 }
303
vc1_sprite_flush(AVCodecContext * avctx)304 static void vc1_sprite_flush(AVCodecContext *avctx)
305 {
306 VC1Context *v = avctx->priv_data;
307 MpegEncContext *s = &v->s;
308 AVFrame *f = s->current_picture.f;
309 int plane, i;
310
311 /* Windows Media Image codecs have a convergence interval of two keyframes.
312 Since we can't enforce it, clear to black the missing sprite. This is
313 wrong but it looks better than doing nothing. */
314
315 if (f && f->data[0])
316 for (plane = 0; plane < (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY ? 1 : 3); plane++)
317 for (i = 0; i < v->sprite_height>>!!plane; i++)
318 memset(f->data[plane] + i * f->linesize[plane],
319 plane ? 128 : 0, f->linesize[plane]);
320 }
321
322 #endif
323
ff_vc1_decode_init_alloc_tables(VC1Context * v)324 av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
325 {
326 MpegEncContext *s = &v->s;
327 int i, ret = AVERROR(ENOMEM);
328 int mb_height = FFALIGN(s->mb_height, 2);
329
330 /* Allocate mb bitplanes */
331 v->mv_type_mb_plane = av_malloc (s->mb_stride * mb_height);
332 v->direct_mb_plane = av_malloc (s->mb_stride * mb_height);
333 v->forward_mb_plane = av_malloc (s->mb_stride * mb_height);
334 v->fieldtx_plane = av_mallocz(s->mb_stride * mb_height);
335 v->acpred_plane = av_malloc (s->mb_stride * mb_height);
336 v->over_flags_plane = av_malloc (s->mb_stride * mb_height);
337 if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->forward_mb_plane ||
338 !v->fieldtx_plane || !v->acpred_plane || !v->over_flags_plane)
339 goto error;
340
341 v->n_allocated_blks = s->mb_width + 2;
342 v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
343 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 3 * s->mb_stride);
344 if (!v->block || !v->cbp_base)
345 goto error;
346 v->cbp = v->cbp_base + 2 * s->mb_stride;
347 v->ttblk_base = av_malloc(sizeof(v->ttblk_base[0]) * 3 * s->mb_stride);
348 if (!v->ttblk_base)
349 goto error;
350 v->ttblk = v->ttblk_base + 2 * s->mb_stride;
351 v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 3 * s->mb_stride);
352 if (!v->is_intra_base)
353 goto error;
354 v->is_intra = v->is_intra_base + 2 * s->mb_stride;
355 v->luma_mv_base = av_mallocz(sizeof(v->luma_mv_base[0]) * 3 * s->mb_stride);
356 if (!v->luma_mv_base)
357 goto error;
358 v->luma_mv = v->luma_mv_base + 2 * s->mb_stride;
359
360 /* allocate block type info in that way so it could be used with s->block_index[] */
361 v->mb_type_base = av_malloc(s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
362 if (!v->mb_type_base)
363 goto error;
364 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
365 v->mb_type[1] = v->mb_type_base + s->b8_stride * (mb_height * 2 + 1) + s->mb_stride + 1;
366 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (mb_height + 1);
367
368 /* allocate memory to store block level MV info */
369 v->blk_mv_type_base = av_mallocz( s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
370 if (!v->blk_mv_type_base)
371 goto error;
372 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
373 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
374 if (!v->mv_f_base)
375 goto error;
376 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
377 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
378 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
379 if (!v->mv_f_next_base)
380 goto error;
381 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
382 v->mv_f_next[1] = v->mv_f_next[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
383
384 if (s->avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || s->avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
385 for (i = 0; i < 4; i++)
386 if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width)))
387 goto error;
388 }
389
390 ret = ff_intrax8_common_init(s->avctx, &v->x8, &s->idsp,
391 s->block, s->block_last_index,
392 s->mb_width, s->mb_height);
393 if (ret < 0)
394 goto error;
395
396 return 0;
397
398 error:
399 ff_vc1_decode_end(s->avctx);
400 return ret;
401 }
402
ff_vc1_init_transposed_scantables(VC1Context * v)403 av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
404 {
405 int i;
406 for (i = 0; i < 64; i++) {
407 #define transpose(x) (((x) >> 3) | (((x) & 7) << 3))
408 v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
409 v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
410 v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
411 v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
412 v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
413 }
414 v->left_blk_sh = 0;
415 v->top_blk_sh = 3;
416 }
417
418 /** Initialize a VC1/WMV3 decoder
419 * @todo TODO: Handle VC-1 IDUs (Transport level?)
420 * @todo TODO: Decipher remaining bits in extra_data
421 */
vc1_decode_init(AVCodecContext * avctx)422 static av_cold int vc1_decode_init(AVCodecContext *avctx)
423 {
424 VC1Context *v = avctx->priv_data;
425 MpegEncContext *s = &v->s;
426 GetBitContext gb;
427 int ret;
428
429 /* save the container output size for WMImage */
430 v->output_width = avctx->width;
431 v->output_height = avctx->height;
432
433 if (!avctx->extradata_size || !avctx->extradata)
434 return AVERROR_INVALIDDATA;
435 v->s.avctx = avctx;
436
437 if ((ret = ff_vc1_init_common(v)) < 0)
438 return ret;
439
440 if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
441 int count = 0;
442
443 // looks like WMV3 has a sequence header stored in the extradata
444 // advanced sequence header may be before the first frame
445 // the last byte of the extradata is a version number, 1 for the
446 // samples we can decode
447
448 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
449
450 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0)
451 return ret;
452
453 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE && !v->res_sprite) {
454 avpriv_request_sample(avctx, "Non sprite WMV3IMAGE");
455 return AVERROR_PATCHWELCOME;
456 }
457
458 count = avctx->extradata_size*8 - get_bits_count(&gb);
459 if (count > 0) {
460 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
461 count, get_bits_long(&gb, FFMIN(count, 32)));
462 } else if (count < 0) {
463 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
464 }
465 } else { // VC1/WVC1/WVP2
466 const uint8_t *start = avctx->extradata;
467 uint8_t *end = avctx->extradata + avctx->extradata_size;
468 const uint8_t *next;
469 int size, buf2_size;
470 uint8_t *buf2 = NULL;
471 int seq_initialized = 0, ep_initialized = 0;
472
473 if (avctx->extradata_size < 16) {
474 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
475 return AVERROR_INVALIDDATA;
476 }
477
478 buf2 = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
479 if (!buf2)
480 return AVERROR(ENOMEM);
481
482 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
483 next = start;
484 for (; next < end; start = next) {
485 next = find_next_marker(start + 4, end);
486 size = next - start - 4;
487 if (size <= 0)
488 continue;
489 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
490 init_get_bits(&gb, buf2, buf2_size * 8);
491 switch (AV_RB32(start)) {
492 case VC1_CODE_SEQHDR:
493 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0) {
494 av_free(buf2);
495 return ret;
496 }
497 seq_initialized = 1;
498 break;
499 case VC1_CODE_ENTRYPOINT:
500 if ((ret = ff_vc1_decode_entry_point(avctx, v, &gb)) < 0) {
501 av_free(buf2);
502 return ret;
503 }
504 ep_initialized = 1;
505 break;
506 }
507 }
508 av_free(buf2);
509 if (!seq_initialized || !ep_initialized) {
510 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
511 return AVERROR_INVALIDDATA;
512 }
513 v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
514 }
515
516 avctx->profile = v->profile;
517 if (v->profile == PROFILE_ADVANCED)
518 avctx->level = v->level;
519
520 if (!CONFIG_GRAY || !(avctx->flags & AV_CODEC_FLAG_GRAY))
521 avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
522 else {
523 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
524 if (avctx->color_range == AVCOL_RANGE_UNSPECIFIED)
525 avctx->color_range = AVCOL_RANGE_MPEG;
526 }
527
528 // ensure static VLC tables are initialized
529 if ((ret = ff_msmpeg4_decode_init(avctx)) < 0)
530 return ret;
531 if ((ret = ff_vc1_decode_init_alloc_tables(v)) < 0)
532 return ret;
533 // Hack to ensure the above functions will be called
534 // again once we know all necessary settings.
535 // That this is necessary might indicate a bug.
536 ff_vc1_decode_end(avctx);
537
538 ff_blockdsp_init(&s->bdsp, avctx);
539 ff_h264chroma_init(&v->h264chroma, 8);
540 ff_qpeldsp_init(&s->qdsp);
541
542 avctx->has_b_frames = !!avctx->max_b_frames;
543
544 if (v->color_prim == 1 || v->color_prim == 5 || v->color_prim == 6)
545 avctx->color_primaries = v->color_prim;
546 if (v->transfer_char == 1 || v->transfer_char == 7)
547 avctx->color_trc = v->transfer_char;
548 if (v->matrix_coef == 1 || v->matrix_coef == 6 || v->matrix_coef == 7)
549 avctx->colorspace = v->matrix_coef;
550
551 s->mb_width = (avctx->coded_width + 15) >> 4;
552 s->mb_height = (avctx->coded_height + 15) >> 4;
553
554 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
555 ff_vc1_init_transposed_scantables(v);
556 } else {
557 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
558 v->left_blk_sh = 3;
559 v->top_blk_sh = 0;
560 }
561
562 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
563 v->sprite_width = avctx->coded_width;
564 v->sprite_height = avctx->coded_height;
565
566 avctx->coded_width = avctx->width = v->output_width;
567 avctx->coded_height = avctx->height = v->output_height;
568
569 // prevent 16.16 overflows
570 if (v->sprite_width > 1 << 14 ||
571 v->sprite_height > 1 << 14 ||
572 v->output_width > 1 << 14 ||
573 v->output_height > 1 << 14) {
574 return AVERROR_INVALIDDATA;
575 }
576
577 if ((v->sprite_width&1) || (v->sprite_height&1)) {
578 avpriv_request_sample(avctx, "odd sprites support");
579 return AVERROR_PATCHWELCOME;
580 }
581 }
582 return 0;
583 }
584
585 /** Close a VC1/WMV3 decoder
586 * @warning Initial try at using MpegEncContext stuff
587 */
ff_vc1_decode_end(AVCodecContext * avctx)588 av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
589 {
590 VC1Context *v = avctx->priv_data;
591 int i;
592
593 av_frame_free(&v->sprite_output_frame);
594
595 for (i = 0; i < 4; i++)
596 av_freep(&v->sr_rows[i >> 1][i & 1]);
597 av_freep(&v->hrd_rate);
598 av_freep(&v->hrd_buffer);
599 ff_mpv_common_end(&v->s);
600 av_freep(&v->mv_type_mb_plane);
601 av_freep(&v->direct_mb_plane);
602 av_freep(&v->forward_mb_plane);
603 av_freep(&v->fieldtx_plane);
604 av_freep(&v->acpred_plane);
605 av_freep(&v->over_flags_plane);
606 av_freep(&v->mb_type_base);
607 av_freep(&v->blk_mv_type_base);
608 av_freep(&v->mv_f_base);
609 av_freep(&v->mv_f_next_base);
610 av_freep(&v->block);
611 av_freep(&v->cbp_base);
612 av_freep(&v->ttblk_base);
613 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
614 av_freep(&v->luma_mv_base);
615 ff_intrax8_common_end(&v->x8);
616 return 0;
617 }
618
619
620 /** Decode a VC1/WMV3 frame
621 * @todo TODO: Handle VC-1 IDUs (Transport level?)
622 */
vc1_decode_frame(AVCodecContext * avctx,void * data,int * got_frame,AVPacket * avpkt)623 static int vc1_decode_frame(AVCodecContext *avctx, void *data,
624 int *got_frame, AVPacket *avpkt)
625 {
626 const uint8_t *buf = avpkt->data;
627 int buf_size = avpkt->size, n_slices = 0, i, ret;
628 VC1Context *v = avctx->priv_data;
629 MpegEncContext *s = &v->s;
630 AVFrame *pict = data;
631 uint8_t *buf2 = NULL;
632 const uint8_t *buf_start = buf, *buf_start_second_field = NULL;
633 int mb_height, n_slices1=-1;
634 struct {
635 uint8_t *buf;
636 GetBitContext gb;
637 int mby_start;
638 const uint8_t *rawbuf;
639 int raw_size;
640 } *slices = NULL, *tmp;
641
642 v->second_field = 0;
643
644 if(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
645 s->low_delay = 1;
646
647 /* no supplementary picture */
648 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
649 /* special case for last picture */
650 if (s->low_delay == 0 && s->next_picture_ptr) {
651 if ((ret = av_frame_ref(pict, s->next_picture_ptr->f)) < 0)
652 return ret;
653 s->next_picture_ptr = NULL;
654
655 *got_frame = 1;
656 }
657
658 return buf_size;
659 }
660
661 //for advanced profile we may need to parse and unescape data
662 if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
663 int buf_size2 = 0;
664 buf2 = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
665 if (!buf2)
666 return AVERROR(ENOMEM);
667
668 if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
669 const uint8_t *start, *end, *next;
670 int size;
671
672 next = buf;
673 for (start = buf, end = buf + buf_size; next < end; start = next) {
674 next = find_next_marker(start + 4, end);
675 size = next - start - 4;
676 if (size <= 0) continue;
677 switch (AV_RB32(start)) {
678 case VC1_CODE_FRAME:
679 if (avctx->hwaccel)
680 buf_start = start;
681 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
682 break;
683 case VC1_CODE_FIELD: {
684 int buf_size3;
685 if (avctx->hwaccel)
686 buf_start_second_field = start;
687 tmp = av_realloc_array(slices, sizeof(*slices), n_slices+1);
688 if (!tmp) {
689 ret = AVERROR(ENOMEM);
690 goto err;
691 }
692 slices = tmp;
693 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
694 if (!slices[n_slices].buf) {
695 ret = AVERROR(ENOMEM);
696 goto err;
697 }
698 buf_size3 = vc1_unescape_buffer(start + 4, size,
699 slices[n_slices].buf);
700 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
701 buf_size3 << 3);
702 slices[n_slices].mby_start = avctx->coded_height + 31 >> 5;
703 slices[n_slices].rawbuf = start;
704 slices[n_slices].raw_size = size + 4;
705 n_slices1 = n_slices - 1; // index of the last slice of the first field
706 n_slices++;
707 break;
708 }
709 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
710 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
711 init_get_bits(&s->gb, buf2, buf_size2 * 8);
712 ff_vc1_decode_entry_point(avctx, v, &s->gb);
713 break;
714 case VC1_CODE_SLICE: {
715 int buf_size3;
716 tmp = av_realloc_array(slices, sizeof(*slices), n_slices+1);
717 if (!tmp) {
718 ret = AVERROR(ENOMEM);
719 goto err;
720 }
721 slices = tmp;
722 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
723 if (!slices[n_slices].buf) {
724 ret = AVERROR(ENOMEM);
725 goto err;
726 }
727 buf_size3 = vc1_unescape_buffer(start + 4, size,
728 slices[n_slices].buf);
729 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
730 buf_size3 << 3);
731 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
732 slices[n_slices].rawbuf = start;
733 slices[n_slices].raw_size = size + 4;
734 n_slices++;
735 break;
736 }
737 }
738 }
739 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
740 const uint8_t *divider;
741 int buf_size3;
742
743 divider = find_next_marker(buf, buf + buf_size);
744 if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
745 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
746 ret = AVERROR_INVALIDDATA;
747 goto err;
748 } else { // found field marker, unescape second field
749 if (avctx->hwaccel)
750 buf_start_second_field = divider;
751 tmp = av_realloc_array(slices, sizeof(*slices), n_slices+1);
752 if (!tmp) {
753 ret = AVERROR(ENOMEM);
754 goto err;
755 }
756 slices = tmp;
757 slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
758 if (!slices[n_slices].buf) {
759 ret = AVERROR(ENOMEM);
760 goto err;
761 }
762 buf_size3 = vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
763 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
764 buf_size3 << 3);
765 slices[n_slices].mby_start = s->mb_height + 1 >> 1;
766 slices[n_slices].rawbuf = divider;
767 slices[n_slices].raw_size = buf + buf_size - divider;
768 n_slices1 = n_slices - 1;
769 n_slices++;
770 }
771 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
772 } else {
773 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
774 }
775 init_get_bits(&s->gb, buf2, buf_size2*8);
776 } else
777 init_get_bits(&s->gb, buf, buf_size*8);
778
779 if (v->res_sprite) {
780 v->new_sprite = !get_bits1(&s->gb);
781 v->two_sprites = get_bits1(&s->gb);
782 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
783 we're using the sprite compositor. These are intentionally kept separate
784 so you can get the raw sprites by using the wmv3 decoder for WMVP or
785 the vc1 one for WVP2 */
786 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
787 if (v->new_sprite) {
788 // switch AVCodecContext parameters to those of the sprites
789 avctx->width = avctx->coded_width = v->sprite_width;
790 avctx->height = avctx->coded_height = v->sprite_height;
791 } else {
792 goto image;
793 }
794 }
795 }
796
797 if (s->context_initialized &&
798 (s->width != avctx->coded_width ||
799 s->height != avctx->coded_height)) {
800 ff_vc1_decode_end(avctx);
801 }
802
803 if (!s->context_initialized) {
804 if ((ret = ff_msmpeg4_decode_init(avctx)) < 0)
805 goto err;
806 if ((ret = ff_vc1_decode_init_alloc_tables(v)) < 0) {
807 ff_mpv_common_end(s);
808 goto err;
809 }
810
811 s->low_delay = !avctx->has_b_frames || v->res_sprite;
812
813 if (v->profile == PROFILE_ADVANCED) {
814 if(avctx->coded_width<=1 || avctx->coded_height<=1) {
815 ret = AVERROR_INVALIDDATA;
816 goto err;
817 }
818 s->h_edge_pos = avctx->coded_width;
819 s->v_edge_pos = avctx->coded_height;
820 }
821 }
822
823 // do parse frame header
824 v->pic_header_flag = 0;
825 v->first_pic_header_flag = 1;
826 if (v->profile < PROFILE_ADVANCED) {
827 if ((ret = ff_vc1_parse_frame_header(v, &s->gb)) < 0) {
828 goto err;
829 }
830 } else {
831 if ((ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
832 goto err;
833 }
834 }
835 v->first_pic_header_flag = 0;
836
837 if (avctx->debug & FF_DEBUG_PICT_INFO)
838 av_log(v->s.avctx, AV_LOG_DEBUG, "pict_type: %c\n", av_get_picture_type_char(s->pict_type));
839
840 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
841 && s->pict_type != AV_PICTURE_TYPE_I) {
842 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
843 ret = AVERROR_INVALIDDATA;
844 goto err;
845 }
846 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
847 && v->field_mode) {
848 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected Frames not Fields\n");
849 ret = AVERROR_INVALIDDATA;
850 goto err;
851 }
852 if ((s->mb_height >> v->field_mode) == 0) {
853 av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
854 ret = AVERROR_INVALIDDATA;
855 goto err;
856 }
857
858 // for skipping the frame
859 s->current_picture.f->pict_type = s->pict_type;
860 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
861
862 /* skip B-frames if we don't have reference frames */
863 if (!s->last_picture_ptr && (s->pict_type == AV_PICTURE_TYPE_B || s->droppable)) {
864 av_log(v->s.avctx, AV_LOG_DEBUG, "Skipping B frame without reference frames\n");
865 goto end;
866 }
867 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
868 (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
869 avctx->skip_frame >= AVDISCARD_ALL) {
870 goto end;
871 }
872
873 if (s->next_p_frame_damaged) {
874 if (s->pict_type == AV_PICTURE_TYPE_B)
875 goto end;
876 else
877 s->next_p_frame_damaged = 0;
878 }
879
880 if ((ret = ff_mpv_frame_start(s, avctx)) < 0) {
881 goto err;
882 }
883
884 v->s.current_picture_ptr->field_picture = v->field_mode;
885 v->s.current_picture_ptr->f->interlaced_frame = (v->fcm != PROGRESSIVE);
886 v->s.current_picture_ptr->f->top_field_first = v->tff;
887
888 // process pulldown flags
889 s->current_picture_ptr->f->repeat_pict = 0;
890 // Pulldown flags are only valid when 'broadcast' has been set.
891 // So ticks_per_frame will be 2
892 if (v->rff) {
893 // repeat field
894 s->current_picture_ptr->f->repeat_pict = 1;
895 } else if (v->rptfrm) {
896 // repeat frames
897 s->current_picture_ptr->f->repeat_pict = v->rptfrm * 2;
898 }
899
900 s->me.qpel_put = s->qdsp.put_qpel_pixels_tab;
901 s->me.qpel_avg = s->qdsp.avg_qpel_pixels_tab;
902
903 if (avctx->hwaccel) {
904 s->mb_y = 0;
905 if (v->field_mode && buf_start_second_field) {
906 // decode first field
907 s->picture_structure = PICT_BOTTOM_FIELD - v->tff;
908 if ((ret = avctx->hwaccel->start_frame(avctx, buf_start, buf_start_second_field - buf_start)) < 0)
909 goto err;
910
911 if (n_slices1 == -1) {
912 // no slices, decode the field as-is
913 if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, buf_start_second_field - buf_start)) < 0)
914 goto err;
915 } else {
916 if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, slices[0].rawbuf - buf_start)) < 0)
917 goto err;
918
919 for (i = 0 ; i < n_slices1 + 1; i++) {
920 s->gb = slices[i].gb;
921 s->mb_y = slices[i].mby_start;
922
923 v->pic_header_flag = get_bits1(&s->gb);
924 if (v->pic_header_flag) {
925 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
926 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
927 ret = AVERROR_INVALIDDATA;
928 if (avctx->err_recognition & AV_EF_EXPLODE)
929 goto err;
930 continue;
931 }
932 }
933
934 if ((ret = avctx->hwaccel->decode_slice(avctx, slices[i].rawbuf, slices[i].raw_size)) < 0)
935 goto err;
936 }
937 }
938
939 if ((ret = avctx->hwaccel->end_frame(avctx)) < 0)
940 goto err;
941
942 // decode second field
943 s->gb = slices[n_slices1 + 1].gb;
944 s->mb_y = slices[n_slices1 + 1].mby_start;
945 s->picture_structure = PICT_TOP_FIELD + v->tff;
946 v->second_field = 1;
947 v->pic_header_flag = 0;
948 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
949 av_log(avctx, AV_LOG_ERROR, "parsing header for second field failed");
950 ret = AVERROR_INVALIDDATA;
951 goto err;
952 }
953 v->s.current_picture_ptr->f->pict_type = v->s.pict_type;
954
955 if ((ret = avctx->hwaccel->start_frame(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field)) < 0)
956 goto err;
957
958 if (n_slices - n_slices1 == 2) {
959 // no slices, decode the field as-is
960 if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start_second_field, (buf + buf_size) - buf_start_second_field)) < 0)
961 goto err;
962 } else {
963 if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start_second_field, slices[n_slices1 + 2].rawbuf - buf_start_second_field)) < 0)
964 goto err;
965
966 for (i = n_slices1 + 2; i < n_slices; i++) {
967 s->gb = slices[i].gb;
968 s->mb_y = slices[i].mby_start;
969
970 v->pic_header_flag = get_bits1(&s->gb);
971 if (v->pic_header_flag) {
972 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
973 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
974 ret = AVERROR_INVALIDDATA;
975 if (avctx->err_recognition & AV_EF_EXPLODE)
976 goto err;
977 continue;
978 }
979 }
980
981 if ((ret = avctx->hwaccel->decode_slice(avctx, slices[i].rawbuf, slices[i].raw_size)) < 0)
982 goto err;
983 }
984 }
985
986 if ((ret = avctx->hwaccel->end_frame(avctx)) < 0)
987 goto err;
988 } else {
989 s->picture_structure = PICT_FRAME;
990 if ((ret = avctx->hwaccel->start_frame(avctx, buf_start, (buf + buf_size) - buf_start)) < 0)
991 goto err;
992
993 if (n_slices == 0) {
994 // no slices, decode the frame as-is
995 if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start)) < 0)
996 goto err;
997 } else {
998 // decode the frame part as the first slice
999 if ((ret = avctx->hwaccel->decode_slice(avctx, buf_start, slices[0].rawbuf - buf_start)) < 0)
1000 goto err;
1001
1002 // and process the slices as additional slices afterwards
1003 for (i = 0 ; i < n_slices; i++) {
1004 s->gb = slices[i].gb;
1005 s->mb_y = slices[i].mby_start;
1006
1007 v->pic_header_flag = get_bits1(&s->gb);
1008 if (v->pic_header_flag) {
1009 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
1010 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1011 ret = AVERROR_INVALIDDATA;
1012 if (avctx->err_recognition & AV_EF_EXPLODE)
1013 goto err;
1014 continue;
1015 }
1016 }
1017
1018 if ((ret = avctx->hwaccel->decode_slice(avctx, slices[i].rawbuf, slices[i].raw_size)) < 0)
1019 goto err;
1020 }
1021 }
1022 if ((ret = avctx->hwaccel->end_frame(avctx)) < 0)
1023 goto err;
1024 }
1025 } else {
1026 int header_ret = 0;
1027
1028 ff_mpeg_er_frame_start(s);
1029
1030 v->end_mb_x = s->mb_width;
1031 if (v->field_mode) {
1032 s->current_picture.f->linesize[0] <<= 1;
1033 s->current_picture.f->linesize[1] <<= 1;
1034 s->current_picture.f->linesize[2] <<= 1;
1035 s->linesize <<= 1;
1036 s->uvlinesize <<= 1;
1037 }
1038 mb_height = s->mb_height >> v->field_mode;
1039
1040 av_assert0 (mb_height > 0);
1041
1042 for (i = 0; i <= n_slices; i++) {
1043 if (i > 0 && slices[i - 1].mby_start >= mb_height) {
1044 if (v->field_mode <= 0) {
1045 av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
1046 "picture boundary (%d >= %d)\n", i,
1047 slices[i - 1].mby_start, mb_height);
1048 continue;
1049 }
1050 v->second_field = 1;
1051 av_assert0((s->mb_height & 1) == 0);
1052 v->blocks_off = s->b8_stride * (s->mb_height&~1);
1053 v->mb_off = s->mb_stride * s->mb_height >> 1;
1054 } else {
1055 v->second_field = 0;
1056 v->blocks_off = 0;
1057 v->mb_off = 0;
1058 }
1059 if (i) {
1060 v->pic_header_flag = 0;
1061 if (v->field_mode && i == n_slices1 + 2) {
1062 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
1063 av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
1064 ret = AVERROR_INVALIDDATA;
1065 if (avctx->err_recognition & AV_EF_EXPLODE)
1066 goto err;
1067 continue;
1068 }
1069 } else if (get_bits1(&s->gb)) {
1070 v->pic_header_flag = 1;
1071 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
1072 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1073 ret = AVERROR_INVALIDDATA;
1074 if (avctx->err_recognition & AV_EF_EXPLODE)
1075 goto err;
1076 continue;
1077 }
1078 }
1079 }
1080 if (header_ret < 0)
1081 continue;
1082 s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
1083 if (!v->field_mode || v->second_field)
1084 s->end_mb_y = (i == n_slices ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
1085 else {
1086 if (i >= n_slices) {
1087 av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
1088 continue;
1089 }
1090 s->end_mb_y = (i == n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
1091 }
1092 if (s->end_mb_y <= s->start_mb_y) {
1093 av_log(v->s.avctx, AV_LOG_ERROR, "end mb y %d %d invalid\n", s->end_mb_y, s->start_mb_y);
1094 continue;
1095 }
1096 if (((s->pict_type == AV_PICTURE_TYPE_P && !v->p_frame_skipped) ||
1097 (s->pict_type == AV_PICTURE_TYPE_B && !v->bi_type)) &&
1098 !v->cbpcy_vlc) {
1099 av_log(v->s.avctx, AV_LOG_ERROR, "missing cbpcy_vlc\n");
1100 continue;
1101 }
1102 ff_vc1_decode_blocks(v);
1103 if (i != n_slices) {
1104 s->gb = slices[i].gb;
1105 }
1106 }
1107 if (v->field_mode) {
1108 v->second_field = 0;
1109 s->current_picture.f->linesize[0] >>= 1;
1110 s->current_picture.f->linesize[1] >>= 1;
1111 s->current_picture.f->linesize[2] >>= 1;
1112 s->linesize >>= 1;
1113 s->uvlinesize >>= 1;
1114 if (v->s.pict_type != AV_PICTURE_TYPE_BI && v->s.pict_type != AV_PICTURE_TYPE_B) {
1115 FFSWAP(uint8_t *, v->mv_f_next[0], v->mv_f[0]);
1116 FFSWAP(uint8_t *, v->mv_f_next[1], v->mv_f[1]);
1117 }
1118 }
1119 ff_dlog(s->avctx, "Consumed %i/%i bits\n",
1120 get_bits_count(&s->gb), s->gb.size_in_bits);
1121 // if (get_bits_count(&s->gb) > buf_size * 8)
1122 // return -1;
1123 if(s->er.error_occurred && s->pict_type == AV_PICTURE_TYPE_B) {
1124 ret = AVERROR_INVALIDDATA;
1125 goto err;
1126 }
1127 if ( !v->field_mode
1128 && avctx->codec_id != AV_CODEC_ID_WMV3IMAGE
1129 && avctx->codec_id != AV_CODEC_ID_VC1IMAGE)
1130 ff_er_frame_end(&s->er);
1131 }
1132
1133 ff_mpv_frame_end(s);
1134
1135 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
1136 image:
1137 avctx->width = avctx->coded_width = v->output_width;
1138 avctx->height = avctx->coded_height = v->output_height;
1139 if (avctx->skip_frame >= AVDISCARD_NONREF)
1140 goto end;
1141 if (!v->sprite_output_frame &&
1142 !(v->sprite_output_frame = av_frame_alloc())) {
1143 ret = AVERROR(ENOMEM);
1144 goto err;
1145 }
1146 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
1147 if ((ret = vc1_decode_sprites(v, &s->gb)) < 0)
1148 goto err;
1149 #endif
1150 if ((ret = av_frame_ref(pict, v->sprite_output_frame)) < 0)
1151 goto err;
1152 *got_frame = 1;
1153 } else {
1154 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
1155 if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0)
1156 goto err;
1157 if (!v->field_mode)
1158 ff_print_debug_info(s, s->current_picture_ptr, pict);
1159 *got_frame = 1;
1160 } else if (s->last_picture_ptr) {
1161 if ((ret = av_frame_ref(pict, s->last_picture_ptr->f)) < 0)
1162 goto err;
1163 if (!v->field_mode)
1164 ff_print_debug_info(s, s->last_picture_ptr, pict);
1165 *got_frame = 1;
1166 }
1167 }
1168
1169 end:
1170 av_free(buf2);
1171 for (i = 0; i < n_slices; i++)
1172 av_free(slices[i].buf);
1173 av_free(slices);
1174 return buf_size;
1175
1176 err:
1177 av_free(buf2);
1178 for (i = 0; i < n_slices; i++)
1179 av_free(slices[i].buf);
1180 av_free(slices);
1181 return ret;
1182 }
1183
1184
1185 static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
1186 #if CONFIG_VC1_DXVA2_HWACCEL
1187 AV_PIX_FMT_DXVA2_VLD,
1188 #endif
1189 #if CONFIG_VC1_D3D11VA_HWACCEL
1190 AV_PIX_FMT_D3D11VA_VLD,
1191 AV_PIX_FMT_D3D11,
1192 #endif
1193 #if CONFIG_VC1_NVDEC_HWACCEL
1194 AV_PIX_FMT_CUDA,
1195 #endif
1196 #if CONFIG_VC1_VAAPI_HWACCEL
1197 AV_PIX_FMT_VAAPI,
1198 #endif
1199 #if CONFIG_VC1_VDPAU_HWACCEL
1200 AV_PIX_FMT_VDPAU,
1201 #endif
1202 AV_PIX_FMT_YUV420P,
1203 AV_PIX_FMT_NONE
1204 };
1205
1206 AVCodec ff_vc1_decoder = {
1207 .name = "vc1",
1208 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
1209 .type = AVMEDIA_TYPE_VIDEO,
1210 .id = AV_CODEC_ID_VC1,
1211 .priv_data_size = sizeof(VC1Context),
1212 .init = vc1_decode_init,
1213 .close = ff_vc1_decode_end,
1214 .decode = vc1_decode_frame,
1215 .flush = ff_mpeg_flush,
1216 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1217 .pix_fmts = vc1_hwaccel_pixfmt_list_420,
1218 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1219 #if CONFIG_VC1_DXVA2_HWACCEL
1220 HWACCEL_DXVA2(vc1),
1221 #endif
1222 #if CONFIG_VC1_D3D11VA_HWACCEL
1223 HWACCEL_D3D11VA(vc1),
1224 #endif
1225 #if CONFIG_VC1_D3D11VA2_HWACCEL
1226 HWACCEL_D3D11VA2(vc1),
1227 #endif
1228 #if CONFIG_VC1_NVDEC_HWACCEL
1229 HWACCEL_NVDEC(vc1),
1230 #endif
1231 #if CONFIG_VC1_VAAPI_HWACCEL
1232 HWACCEL_VAAPI(vc1),
1233 #endif
1234 #if CONFIG_VC1_VDPAU_HWACCEL
1235 HWACCEL_VDPAU(vc1),
1236 #endif
1237 NULL
1238 },
1239 .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
1240 };
1241
1242 #if CONFIG_WMV3_DECODER
1243 AVCodec ff_wmv3_decoder = {
1244 .name = "wmv3",
1245 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
1246 .type = AVMEDIA_TYPE_VIDEO,
1247 .id = AV_CODEC_ID_WMV3,
1248 .priv_data_size = sizeof(VC1Context),
1249 .init = vc1_decode_init,
1250 .close = ff_vc1_decode_end,
1251 .decode = vc1_decode_frame,
1252 .flush = ff_mpeg_flush,
1253 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1254 .pix_fmts = vc1_hwaccel_pixfmt_list_420,
1255 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1256 #if CONFIG_WMV3_DXVA2_HWACCEL
1257 HWACCEL_DXVA2(wmv3),
1258 #endif
1259 #if CONFIG_WMV3_D3D11VA_HWACCEL
1260 HWACCEL_D3D11VA(wmv3),
1261 #endif
1262 #if CONFIG_WMV3_D3D11VA2_HWACCEL
1263 HWACCEL_D3D11VA2(wmv3),
1264 #endif
1265 #if CONFIG_WMV3_NVDEC_HWACCEL
1266 HWACCEL_NVDEC(wmv3),
1267 #endif
1268 #if CONFIG_WMV3_VAAPI_HWACCEL
1269 HWACCEL_VAAPI(wmv3),
1270 #endif
1271 #if CONFIG_WMV3_VDPAU_HWACCEL
1272 HWACCEL_VDPAU(wmv3),
1273 #endif
1274 NULL
1275 },
1276 .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
1277 };
1278 #endif
1279
1280 #if CONFIG_WMV3IMAGE_DECODER
1281 AVCodec ff_wmv3image_decoder = {
1282 .name = "wmv3image",
1283 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
1284 .type = AVMEDIA_TYPE_VIDEO,
1285 .id = AV_CODEC_ID_WMV3IMAGE,
1286 .priv_data_size = sizeof(VC1Context),
1287 .init = vc1_decode_init,
1288 .close = ff_vc1_decode_end,
1289 .decode = vc1_decode_frame,
1290 .capabilities = AV_CODEC_CAP_DR1,
1291 .flush = vc1_sprite_flush,
1292 .pix_fmts = (const enum AVPixelFormat[]) {
1293 AV_PIX_FMT_YUV420P,
1294 AV_PIX_FMT_NONE
1295 },
1296 };
1297 #endif
1298
1299 #if CONFIG_VC1IMAGE_DECODER
1300 AVCodec ff_vc1image_decoder = {
1301 .name = "vc1image",
1302 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
1303 .type = AVMEDIA_TYPE_VIDEO,
1304 .id = AV_CODEC_ID_VC1IMAGE,
1305 .priv_data_size = sizeof(VC1Context),
1306 .init = vc1_decode_init,
1307 .close = ff_vc1_decode_end,
1308 .decode = vc1_decode_frame,
1309 .capabilities = AV_CODEC_CAP_DR1,
1310 .flush = vc1_sprite_flush,
1311 .pix_fmts = (const enum AVPixelFormat[]) {
1312 AV_PIX_FMT_YUV420P,
1313 AV_PIX_FMT_NONE
1314 },
1315 };
1316 #endif
1317