FFmpeg
Loading...
Searching...
No Matches
vc1dec.c
Go to the documentation of this file.
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"
49#include "libavutil/avassert.h"
50#include "libavutil/imgutils.h"
51#include "libavutil/mem.h"
52#include "libavutil/thread.h"
53
54
56#if CONFIG_VC1_DXVA2_HWACCEL
58#endif
59#if CONFIG_VC1_D3D11VA_HWACCEL
62#endif
63#if CONFIG_VC1_D3D12VA_HWACCEL
65#endif
66#if CONFIG_VC1_NVDEC_HWACCEL
68#endif
69#if CONFIG_VC1_VAAPI_HWACCEL
71#endif
72#if CONFIG_VC1_VDPAU_HWACCEL
74#endif
77};
78
79#if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
80
81typedef 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
100static inline int get_fp_val(GetBitContext* gb)
101{
102 return (get_bits_long(gb, 30) - (1 << 29)) << 1;
103}
104
105static 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
139static 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
210static 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
307static 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
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
339static av_cold void vc1_sprite_flush(AVCodecContext *avctx)
340{
341 VC1Context *v = avctx->priv_data;
342 MpegEncContext *s = &v->s;
343 MPVWorkPicture *f = &s->cur_pic;
344 int plane, i;
345
346 /* Windows Media Image codecs have a convergence interval of two keyframes.
347 Since we can't enforce it, clear to black the missing sprite. This is
348 wrong but it looks better than doing nothing. */
349
350 if (f->data[0])
351 for (plane = 0; plane < (CONFIG_GRAY && s->avctx->flags & AV_CODEC_FLAG_GRAY ? 1 : 3); plane++)
352 for (i = 0; i < v->sprite_height>>!!plane; i++)
353 memset(f->data[plane] + i * f->linesize[plane],
354 plane ? 128 : 0, f->linesize[plane]);
355}
356
357#endif
358
360{
361 MpegEncContext *s = &v->s;
362 int i, ret;
363 int mb_height = FFALIGN(s->mb_height, 2);
364
365 /* Allocate mb bitplanes */
366 v->mv_type_mb_plane = av_malloc (s->mb_stride * mb_height);
367 v->direct_mb_plane = av_malloc (s->mb_stride * mb_height);
368 v->forward_mb_plane = av_malloc (s->mb_stride * mb_height);
369 v->fieldtx_plane = av_mallocz(s->mb_stride * mb_height);
370 v->acpred_plane = av_malloc (s->mb_stride * mb_height);
371 v->over_flags_plane = av_malloc (s->mb_stride * mb_height);
372 if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->forward_mb_plane ||
374 return AVERROR(ENOMEM);
375
376 v->n_allocated_blks = s->mb_width + 2;
377 v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
378 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 3 * s->mb_stride);
379 if (!v->block || !v->cbp_base)
380 return AVERROR(ENOMEM);
381 v->cbp = v->cbp_base + 2 * s->mb_stride;
382 v->ttblk_base = av_mallocz(sizeof(v->ttblk_base[0]) * 3 * s->mb_stride);
383 if (!v->ttblk_base)
384 return AVERROR(ENOMEM);
385 v->ttblk = v->ttblk_base + 2 * s->mb_stride;
386 v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 3 * s->mb_stride);
387 if (!v->is_intra_base)
388 return AVERROR(ENOMEM);
389 v->is_intra = v->is_intra_base + 2 * s->mb_stride;
390 v->luma_mv_base = av_mallocz(sizeof(v->luma_mv_base[0]) * 3 * s->mb_stride);
391 if (!v->luma_mv_base)
392 return AVERROR(ENOMEM);
393 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 v->mb_type_base = av_mallocz(s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
397 if (!v->mb_type_base)
398 return AVERROR(ENOMEM);
399 v->mb_type = v->mb_type_base + s->b8_stride + 1;
400
401 /* allocate memory to store block level MV info */
402 v->blk_mv_type_base = av_mallocz( s->b8_stride * (mb_height * 2 + 1));
403 if (!v->blk_mv_type_base)
404 return AVERROR(ENOMEM);
405 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
406 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
407 if (!v->mv_f_base)
408 return AVERROR(ENOMEM);
409 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
410 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
411 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
412 if (!v->mv_f_next_base)
413 return AVERROR(ENOMEM);
414 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
415 v->mv_f_next[1] = v->mv_f_next[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
416
417 if (s->avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || s->avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
418 for (i = 0; i < 4; i++)
419 if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width)))
420 return AVERROR(ENOMEM);
421 }
422
423 ret = ff_intrax8_common_init(s->avctx, &v->x8, v->blocks[0],
424 s->mb_width, s->mb_height);
425 if (ret < 0)
426 return ret;
427
428 return 0;
429}
430
432{
433 if (avctx->codec_id == AV_CODEC_ID_MSS2)
434 return AV_PIX_FMT_YUV420P;
435
436 if (CONFIG_GRAY && (avctx->flags & AV_CODEC_FLAG_GRAY)) {
439 return AV_PIX_FMT_GRAY8;
440 }
441
442 if (avctx->codec_id == AV_CODEC_ID_VC1IMAGE ||
444 return AV_PIX_FMT_YUV420P;
445
447}
448
449static void vc1_decode_reset(AVCodecContext *avctx);
450
452{
453 VC1Context *const v = avctx->priv_data;
454 MpegEncContext *const s = &v->s;
455 int ret;
456
457 ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
458 if (ret < 0)
459 return ret;
460
461 ret = ff_mpv_decode_init(s, avctx);
462 if (ret < 0)
463 return ret;
464
465 avctx->pix_fmt = vc1_get_format(avctx);
466
467 ret = ff_mpv_common_init(s);
468 if (ret < 0)
469 return ret;
470
472 if (ret < 0) {
473 vc1_decode_reset(avctx);
474 return ret;
475 }
476 return 0;
477}
478
480{
481 int i;
482 for (i = 0; i < 64; i++) {
483#define transpose(x) (((x) >> 3) | (((x) & 7) << 3))
484 v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
485 v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
486 v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
487 v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
489 }
490 v->left_blk_sh = 0;
491 v->top_blk_sh = 3;
492}
493
494static av_cold void vc1_init_static(void)
495{
496 static VLCElem vlc_table[32372];
497 VLCInitState state = VLC_INIT_STATE(vlc_table);
498
500 vc1_norm2_bits, 1, 1,
501 vc1_norm2_codes, 1, 1, 0);
503 vc1_norm6_bits, 1, 1,
504 vc1_norm6_codes, 2, 2, 0);
506 vc1_imode_bits, 1, 1,
507 vc1_imode_codes, 1, 1, 0);
508 for (int i = 0; i < 3; i++) {
511 vc1_ttmb_bits[i], 1, 1,
512 vc1_ttmb_codes[i], 2, 2, 0);
515 vc1_ttblk_bits[i], 1, 1,
516 vc1_ttblk_codes[i], 1, 1, 0);
519 vc1_subblkpat_bits[i], 1, 1,
520 vc1_subblkpat_codes[i], 1, 1, 0);
521 }
522 for (int i = 0; i < 4; i++) {
529 vc1_cbpcy_p_bits[i], 1, 1,
530 vc1_cbpcy_p_codes[i], 2, 2, 0);
533 vc1_mv_diff_bits[i], 1, 1,
534 vc1_mv_diff_codes[i], 2, 2, 0);
535 /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
539 vc1_intfr_4mv_mbmode_codes[i], 2, 2, 0);
540 /* initialize NON-4MV MBMODE VLC tables for the same */
545 /* initialize interlaced MVDATA tables (1-Ref) */
548 vc1_1ref_mvdata_bits[i], 1, 1,
549 vc1_1ref_mvdata_codes[i], 4, 4, 0);
550 /* Initialize 2MV Block pattern VLC tables */
555 }
556 for (int i = 0; i < 8; i++) {
559 &vc1_ac_tables[i][0][1], 8, 4,
560 &vc1_ac_tables[i][0][0], 8, 4, 0);
561 /* initialize interlaced MVDATA tables (2-Ref) */
564 vc1_2ref_mvdata_bits[i], 1, 1,
565 vc1_2ref_mvdata_codes[i], 4, 4, 0);
566 /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
569 vc1_icbpcy_p_bits[i], 1, 1,
570 vc1_icbpcy_p_codes[i], 2, 2, 0);
571 /* Initialize interlaced field picture MBMODE VLC tables */
575 vc1_if_mmv_mbmode_codes[i], 1, 1, 0);
579 vc1_if_1mv_mbmode_codes[i], 1, 1, 0);
580 }
582}
583
584/**
585 * Init VC-1 specific tables and VC1Context members
586 * @param v The VC1Context to initialize
587 * @return Status
588 */
590{
591 static AVOnce init_static_once = AV_ONCE_INIT;
592 MpegEncContext *const s = &v->s;
593
594 /* defaults */
595 v->pq = -1;
596 v->mvrange = 0; /* 7.1.1.18, p80 */
597
598 s->avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
599 s->out_format = FMT_H263;
600
601 s->h263_pred = 1;
602 s->msmpeg4_version = MSMP4_VC1;
603
605
606 /* For error resilience */
607 ff_qpeldsp_init(&s->qdsp);
608
609 /* VLC tables */
610 ff_thread_once(&init_static_once, vc1_init_static);
611}
612
613/** Initialize a VC1/WMV3 decoder
614 * @todo TODO: Handle VC-1 IDUs (Transport level?)
615 * @todo TODO: Decipher remaining bits in extra_data
616 */
618{
619 VC1Context *v = avctx->priv_data;
620 MpegEncContext *s = &v->s;
621 GetBitContext gb;
622 int ret;
623
624 /* save the container output size for WMImage */
625 v->output_width = avctx->width;
626 v->output_height = avctx->height;
627
628 if (!avctx->extradata_size || !avctx->extradata)
629 return AVERROR_INVALIDDATA;
630 v->s.avctx = avctx;
631
633
634 if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
635 int count = 0;
636
637 // looks like WMV3 has a sequence header stored in the extradata
638 // advanced sequence header may be before the first frame
639 // the last byte of the extradata is a version number, 1 for the
640 // samples we can decode
641
642 ret = init_get_bits8(&gb, avctx->extradata, avctx->extradata_size);
643 if (ret < 0)
644 return ret;
645
646 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0)
647 return ret;
648
649 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE && !v->res_sprite) {
650 avpriv_request_sample(avctx, "Non sprite WMV3IMAGE");
652 }
653
654 count = avctx->extradata_size*8 - get_bits_count(&gb);
655 if (count > 0) {
656 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
657 count, get_bits_long(&gb, FFMIN(count, 32)));
658 } else if (count < 0) {
659 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
660 }
661 } else { // VC1/WVC1/WVP2
662 const uint8_t *start = avctx->extradata;
663 const uint8_t *end = avctx->extradata + avctx->extradata_size;
664 const uint8_t *next;
665 int size, buf2_size;
666 uint8_t *buf2 = NULL;
667 int seq_initialized = 0, ep_initialized = 0;
668
669 if (avctx->extradata_size < 16) {
670 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
671 return AVERROR_INVALIDDATA;
672 }
673
675 if (!buf2)
676 return AVERROR(ENOMEM);
677
678 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
679 next = start;
680 for (; next < end; start = next) {
681 next = find_next_marker(start + 4, end);
682 size = next - start - 4;
683 if (size <= 0)
684 continue;
685 buf2_size = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
686 ret = init_get_bits8(&gb, buf2, buf2_size);
687 if (ret < 0) {
688 av_free(buf2);
689 return ret;
690 }
691 switch (AV_RB32(start)) {
692 case VC1_CODE_SEQHDR:
693 if ((ret = ff_vc1_decode_sequence_header(avctx, v, &gb)) < 0) {
694 av_free(buf2);
695 return ret;
696 }
697 seq_initialized = 1;
698 break;
700 if ((ret = ff_vc1_decode_entry_point(avctx, v, &gb)) < 0) {
701 av_free(buf2);
702 return ret;
703 }
704 ep_initialized = 1;
705 break;
706 }
707 }
708 av_free(buf2);
709 if (!seq_initialized || !ep_initialized) {
710 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
711 return AVERROR_INVALIDDATA;
712 }
714 }
715
716 avctx->profile = v->profile;
717 if (v->profile == PROFILE_ADVANCED)
718 avctx->level = v->level;
719
720 ff_blockdsp_init(&s->bdsp);
722
723 avctx->has_b_frames = !!avctx->max_b_frames;
724
725 if (v->color_prim == 1 || v->color_prim == 5 || v->color_prim == 6)
726 avctx->color_primaries = v->color_prim;
727 if (v->transfer_char == 1 || v->transfer_char == 7)
728 avctx->color_trc = v->transfer_char;
729 if (v->matrix_coef == 1 || v->matrix_coef == 6 || v->matrix_coef == 7)
730 avctx->colorspace = v->matrix_coef;
731
732 s->mb_width = (avctx->coded_width + 15) >> 4;
733 s->mb_height = (avctx->coded_height + 15) >> 4;
734
735 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
737 } else {
738 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
739 v->left_blk_sh = 3;
740 v->top_blk_sh = 0;
749 }
750
751 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
752 v->sprite_width = avctx->coded_width;
753 v->sprite_height = avctx->coded_height;
754
755 avctx->coded_width = avctx->width = v->output_width;
756 avctx->coded_height = avctx->height = v->output_height;
757
758 // prevent 16.16 overflows
759 if (v->sprite_width > 1 << 14 ||
760 v->sprite_height > 1 << 14 ||
761 v->output_width > 1 << 14 ||
762 v->output_height > 1 << 14) {
763 return AVERROR_INVALIDDATA;
764 }
765
766 if ((v->sprite_width&1) || (v->sprite_height&1)) {
767 avpriv_request_sample(avctx, "odd sprites support");
769 }
770 }
771 return 0;
772}
773
775{
776 VC1Context *v = avctx->priv_data;
777 int i;
778
780
781 for (i = 0; i < 4; i++)
782 av_freep(&v->sr_rows[i >> 1][i & 1]);
783 ff_mpv_common_end(&v->s);
784 memset(v->s.block_index, 0, sizeof(v->s.block_index));
793 av_freep(&v->mv_f_base);
795 av_freep(&v->block);
796 av_freep(&v->cbp_base);
797 av_freep(&v->ttblk_base);
798 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
801}
802
803/**
804 * Close a MSS2/VC1/WMV3 decoder
805 */
807{
808 vc1_decode_reset(avctx);
809 return ff_mpv_decode_close(avctx);
810}
811
812/** Decode a VC1/WMV3 frame
813 * @todo TODO: Handle VC-1 IDUs (Transport level?)
814 */
815static int vc1_decode_frame(AVCodecContext *avctx, AVFrame *pict,
816 int *got_frame, AVPacket *avpkt)
817{
818 const uint8_t *buf = avpkt->data;
819 int buf_size = avpkt->size, n_slices = 0, i, ret;
820 VC1Context *v = avctx->priv_data;
821 MpegEncContext *s = &v->s;
822 uint8_t *buf2 = NULL;
823 const uint8_t *buf_start = buf, *buf_start_second_field = NULL;
824 int mb_height, n_slices1=-1;
825 struct {
826 uint8_t *buf;
827 GetBitContext gb;
828 int mby_start;
829 const uint8_t *rawbuf;
830 int raw_size;
831 } *slices = NULL, *tmp;
832 unsigned slices_allocated = 0;
833
834 v->second_field = 0;
835
836 if(s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY)
837 s->low_delay = 1;
838
839 if (buf_size >= 4 && AV_RB32(&buf[buf_size-4]) == VC1_CODE_ENDOFSEQ)
840 buf_size -= 4;
841
842 /* no supplementary picture */
843 if (buf_size == 0) {
844 /* special case for last picture */
845 if (s->low_delay == 0 && s->next_pic.ptr) {
846 if ((ret = av_frame_ref(pict, s->next_pic.ptr->f)) < 0)
847 return ret;
848 ff_mpv_unref_picture(&s->next_pic);
849
850 *got_frame = 1;
851 }
852
853 return buf_size;
854 }
855
856 //for advanced profile we may need to parse and unescape data
857 if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
858 int buf_size2 = 0;
859 size_t next_allocated = 0;
860 buf2 = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
861 if (!buf2)
862 return AVERROR(ENOMEM);
863
864 if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
865 const uint8_t *start, *end, *next;
866 int size;
867
868 next = buf;
869 for (start = buf, end = buf + buf_size; next < end; start = next) {
870 next = find_next_marker(start + 4, end);
871 size = next - start - 4;
872 if (size <= 0) continue;
873 switch (AV_RB32(start)) {
874 case VC1_CODE_FRAME:
875 buf_start = start;
876 buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
877 break;
878 case VC1_CODE_FIELD: {
879 int buf_size3;
880 buf_start_second_field = start;
881 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
882 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
883 if (!tmp) {
884 ret = AVERROR(ENOMEM);
885 goto err;
886 }
887 slices = tmp;
888 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
889 if (!slices[n_slices].buf) {
890 ret = AVERROR(ENOMEM);
891 goto err;
892 }
893 buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size,
894 slices[n_slices].buf);
895 ret = init_get_bits8(&slices[n_slices].gb, slices[n_slices].buf, buf_size3);
896 if (ret < 0)
897 goto err;
898 slices[n_slices].mby_start = avctx->coded_height + 31 >> 5;
899 slices[n_slices].rawbuf = start;
900 slices[n_slices].raw_size = size + 4;
901 n_slices1 = n_slices - 1; // index of the last slice of the first field
902 n_slices++;
903 break;
904 }
905 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
906 buf_size2 = v->vc1dsp.vc1_unescape_buffer(start + 4, size, buf2);
907 ret = init_get_bits8(&v->gb, buf2, buf_size2);
908 if (ret < 0)
909 goto err;
910 ff_vc1_decode_entry_point(avctx, v, &v->gb);
911 break;
912 case VC1_CODE_SLICE: {
913 int buf_size3;
914 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
915 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
916 if (!tmp) {
917 ret = AVERROR(ENOMEM);
918 goto err;
919 }
920 slices = tmp;
921 slices[n_slices].buf = av_mallocz(size + AV_INPUT_BUFFER_PADDING_SIZE);
922 if (!slices[n_slices].buf) {
923 ret = AVERROR(ENOMEM);
924 goto err;
925 }
926 buf_size3 = v->vc1dsp.vc1_unescape_buffer(start + 4, size,
927 slices[n_slices].buf);
928 ret = init_get_bits8(&slices[n_slices].gb, slices[n_slices].buf, buf_size3);
929 if (ret < 0)
930 goto err;
931 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
932 slices[n_slices].rawbuf = start;
933 slices[n_slices].raw_size = size + 4;
934 n_slices++;
935 break;
936 }
937 }
938 }
939 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
940 const uint8_t *divider;
941 int buf_size3;
942
943 divider = find_next_marker(buf, buf + buf_size);
944 if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
945 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
947 goto err;
948 } else { // found field marker, unescape second field
949 buf_start_second_field = divider;
950 av_size_mult(sizeof(*slices), n_slices+1, &next_allocated);
951 tmp = next_allocated ? av_fast_realloc(slices, &slices_allocated, next_allocated) : NULL;
952 if (!tmp) {
953 ret = AVERROR(ENOMEM);
954 goto err;
955 }
956 slices = tmp;
957 slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
958 if (!slices[n_slices].buf) {
959 ret = AVERROR(ENOMEM);
960 goto err;
961 }
962 buf_size3 = v->vc1dsp.vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
963 ret = init_get_bits8(&slices[n_slices].gb, slices[n_slices].buf, buf_size3);
964 if (ret < 0)
965 goto err;
966 slices[n_slices].mby_start = s->mb_height + 1 >> 1;
967 slices[n_slices].rawbuf = divider;
968 slices[n_slices].raw_size = buf + buf_size - divider;
969 n_slices1 = n_slices - 1;
970 n_slices++;
971 }
972 buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, divider - buf, buf2);
973 } else {
974 buf_size2 = v->vc1dsp.vc1_unescape_buffer(buf, buf_size, buf2);
975 }
976 ret = init_get_bits8(&v->gb, buf2, buf_size2);
977 if (ret < 0)
978 goto err;
979 } else{
980 ret = init_get_bits8(&v->gb, buf, buf_size);
981 if (ret < 0)
982 goto err;
983 }
984
985 if (v->res_sprite) {
986 v->new_sprite = !get_bits1(&v->gb);
987 v->two_sprites = get_bits1(&v->gb);
988 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
989 we're using the sprite compositor. These are intentionally kept separate
990 so you can get the raw sprites by using the wmv3 decoder for WMVP or
991 the vc1 one for WVP2 */
992 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
993 if (v->new_sprite) {
994 // switch AVCodecContext parameters to those of the sprites
995 avctx->width = avctx->coded_width = v->sprite_width;
996 avctx->height = avctx->coded_height = v->sprite_height;
997 } else {
998 goto image;
999 }
1000 }
1001 }
1002
1003 if (s->context_initialized &&
1004 (s->width != avctx->coded_width ||
1005 s->height != avctx->coded_height)) {
1006 vc1_decode_reset(avctx);
1007 }
1008
1009 if (!s->context_initialized) {
1010 ret = ff_vc1_decode_init(avctx);
1011 if (ret < 0)
1012 goto err;
1013
1014 s->low_delay = !avctx->has_b_frames || v->res_sprite;
1015
1016 if (v->profile == PROFILE_ADVANCED) {
1017 if(avctx->coded_width<=1 || avctx->coded_height<=1) {
1018 ret = AVERROR_INVALIDDATA;
1019 goto err;
1020 }
1021 s->h_edge_pos = avctx->coded_width;
1022 s->v_edge_pos = avctx->coded_height;
1023 }
1024 }
1025
1026 // do parse frame header
1027 v->pic_header_flag = 0;
1028 v->first_pic_header_flag = 1;
1029 if (v->profile < PROFILE_ADVANCED) {
1030 if ((ret = ff_vc1_parse_frame_header(v, &v->gb)) < 0) {
1031 goto err;
1032 }
1033 } else {
1034 if ((ret = ff_vc1_parse_frame_header_adv(v, &v->gb)) < 0) {
1035 goto err;
1036 }
1037 }
1038 v->first_pic_header_flag = 0;
1039
1040 if (avctx->debug & FF_DEBUG_PICT_INFO)
1041 av_log(v->s.avctx, AV_LOG_DEBUG, "pict_type: %c\n", av_get_picture_type_char(s->pict_type));
1042
1043 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
1044 && s->pict_type != AV_PICTURE_TYPE_I) {
1045 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
1046 ret = AVERROR_INVALIDDATA;
1047 goto err;
1048 }
1049 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
1050 && v->field_mode) {
1051 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected Frames not Fields\n");
1052 ret = AVERROR_INVALIDDATA;
1053 goto err;
1054 }
1055 if ((s->mb_height >> v->field_mode) == 0) {
1056 av_log(v->s.avctx, AV_LOG_ERROR, "image too short\n");
1057 ret = AVERROR_INVALIDDATA;
1058 goto err;
1059 }
1060
1061 /* skip B-frames if we don't have reference frames */
1062 if (!s->last_pic.ptr && s->pict_type == AV_PICTURE_TYPE_B) {
1063 av_log(v->s.avctx, AV_LOG_DEBUG, "Skipping B frame without reference frames\n");
1064 goto end;
1065 }
1066 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
1067 (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
1068 avctx->skip_frame >= AVDISCARD_ALL) {
1069 goto end;
1070 }
1071
1072 if ((ret = ff_mpv_frame_start(s, avctx)) < 0) {
1073 goto err;
1074 }
1075
1081
1082 // process pulldown flags
1083 s->cur_pic.ptr->f->repeat_pict = 0;
1084 // Pulldown flags are only valid when 'broadcast' has been set.
1085 if (v->rff) {
1086 // repeat field
1087 s->cur_pic.ptr->f->repeat_pict = 1;
1088 } else if (v->rptfrm) {
1089 // repeat frames
1090 s->cur_pic.ptr->f->repeat_pict = v->rptfrm * 2;
1091 }
1092
1093 if (avctx->hwaccel) {
1094 const FFHWAccel *hwaccel = ffhwaccel(avctx->hwaccel);
1095 s->mb_y = 0;
1096 if (v->field_mode && buf_start_second_field) {
1097 // decode first field
1098 s->picture_structure = PICT_BOTTOM_FIELD - v->tff;
1099 ret = hwaccel->start_frame(avctx, avpkt->buf, buf_start,
1100 buf_start_second_field - buf_start);
1101 if (ret < 0)
1102 goto err;
1103
1104 if (n_slices1 == -1) {
1105 // no slices, decode the field as-is
1106 ret = hwaccel->decode_slice(avctx, buf_start,
1107 buf_start_second_field - buf_start);
1108 if (ret < 0)
1109 goto err;
1110 } else {
1111 ret = hwaccel->decode_slice(avctx, buf_start,
1112 slices[0].rawbuf - buf_start);
1113 if (ret < 0)
1114 goto err;
1115
1116 for (i = 0 ; i < n_slices1 + 1; i++) {
1117 v->gb = slices[i].gb;
1118 s->mb_y = slices[i].mby_start;
1119
1120 v->pic_header_flag = get_bits1(&v->gb);
1121 if (v->pic_header_flag) {
1122 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1123 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1124 ret = AVERROR_INVALIDDATA;
1125 if (avctx->err_recognition & AV_EF_EXPLODE)
1126 goto err;
1127 continue;
1128 }
1129 }
1130
1131 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1132 slices[i].raw_size);
1133 if (ret < 0)
1134 goto err;
1135 }
1136 }
1137
1138 if ((ret = hwaccel->end_frame(avctx)) < 0)
1139 goto err;
1140
1141 // decode second field
1142 v->gb = slices[n_slices1 + 1].gb;
1143 s->mb_y = slices[n_slices1 + 1].mby_start;
1144 s->picture_structure = PICT_TOP_FIELD + v->tff;
1145 v->second_field = 1;
1146 v->pic_header_flag = 0;
1147 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1148 av_log(avctx, AV_LOG_ERROR, "parsing header for second field failed");
1149 ret = AVERROR_INVALIDDATA;
1150 goto err;
1151 }
1152 v->s.cur_pic.ptr->f->pict_type = v->s.pict_type;
1153
1154 ret = hwaccel->start_frame(avctx, avpkt->buf, buf_start_second_field,
1155 (buf + buf_size) - buf_start_second_field);
1156 if (ret < 0)
1157 goto err;
1158
1159 if (n_slices - n_slices1 == 2) {
1160 // no slices, decode the field as-is
1161 ret = hwaccel->decode_slice(avctx, buf_start_second_field,
1162 (buf + buf_size) - buf_start_second_field);
1163 if (ret < 0)
1164 goto err;
1165 } else {
1166 ret = hwaccel->decode_slice(avctx, buf_start_second_field,
1167 slices[n_slices1 + 2].rawbuf - buf_start_second_field);
1168 if (ret < 0)
1169 goto err;
1170
1171 for (i = n_slices1 + 2; i < n_slices; i++) {
1172 v->gb = slices[i].gb;
1173 s->mb_y = slices[i].mby_start;
1174
1175 v->pic_header_flag = get_bits1(&v->gb);
1176 if (v->pic_header_flag) {
1177 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1178 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1179 ret = AVERROR_INVALIDDATA;
1180 if (avctx->err_recognition & AV_EF_EXPLODE)
1181 goto err;
1182 continue;
1183 }
1184 }
1185
1186 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1187 slices[i].raw_size);
1188 if (ret < 0)
1189 goto err;
1190 }
1191 }
1192
1193 if ((ret = hwaccel->end_frame(avctx)) < 0)
1194 goto err;
1195 } else {
1196 s->picture_structure = PICT_FRAME;
1197 ret = hwaccel->start_frame(avctx, avpkt->buf, buf_start,
1198 (buf + buf_size) - buf_start);
1199 if (ret < 0)
1200 goto err;
1201
1202 if (n_slices == 0) {
1203 // no slices, decode the frame as-is
1204 ret = hwaccel->decode_slice(avctx, buf_start,
1205 (buf + buf_size) - buf_start);
1206 if (ret < 0)
1207 goto err;
1208 } else {
1209 // decode the frame part as the first slice
1210 ret = hwaccel->decode_slice(avctx, buf_start,
1211 slices[0].rawbuf - buf_start);
1212 if (ret < 0)
1213 goto err;
1214
1215 // and process the slices as additional slices afterwards
1216 for (i = 0 ; i < n_slices; i++) {
1217 v->gb = slices[i].gb;
1218 s->mb_y = slices[i].mby_start;
1219
1220 v->pic_header_flag = get_bits1(&v->gb);
1221 if (v->pic_header_flag) {
1222 if (ff_vc1_parse_frame_header_adv(v, &v->gb) < 0) {
1223 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1224 ret = AVERROR_INVALIDDATA;
1225 if (avctx->err_recognition & AV_EF_EXPLODE)
1226 goto err;
1227 continue;
1228 }
1229 }
1230
1231 ret = hwaccel->decode_slice(avctx, slices[i].rawbuf,
1232 slices[i].raw_size);
1233 if (ret < 0)
1234 goto err;
1235 }
1236 }
1237 if ((ret = hwaccel->end_frame(avctx)) < 0)
1238 goto err;
1239 }
1240 } else {
1241 int header_ret = 0;
1242
1244
1245 v->end_mb_x = s->mb_width;
1246 if (v->field_mode) {
1247 s->cur_pic.linesize[0] <<= 1;
1248 s->cur_pic.linesize[1] <<= 1;
1249 s->cur_pic.linesize[2] <<= 1;
1250 s->linesize <<= 1;
1251 s->uvlinesize <<= 1;
1252 }
1253 mb_height = s->mb_height >> v->field_mode;
1254
1255 av_assert0 (mb_height > 0);
1256
1257 for (i = 0; i <= n_slices; i++) {
1258 if (i > 0 && slices[i - 1].mby_start >= mb_height) {
1259 if (v->field_mode <= 0) {
1260 av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
1261 "picture boundary (%d >= %d)\n", i,
1262 slices[i - 1].mby_start, mb_height);
1263 continue;
1264 }
1265 v->second_field = 1;
1266 av_assert0((s->mb_height & 1) == 0);
1267 v->blocks_off = s->b8_stride * (s->mb_height&~1);
1268 v->mb_off = s->mb_stride * s->mb_height >> 1;
1269 } else {
1270 v->second_field = 0;
1271 v->blocks_off = 0;
1272 v->mb_off = 0;
1273 }
1274 if (i) {
1275 v->pic_header_flag = 0;
1276 if (v->field_mode && i == n_slices1 + 2) {
1277 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &v->gb)) < 0) {
1278 av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
1279 ret = AVERROR_INVALIDDATA;
1280 if (avctx->err_recognition & AV_EF_EXPLODE)
1281 goto err;
1282 continue;
1283 }
1284 } else if (get_bits1(&v->gb)) {
1285 v->pic_header_flag = 1;
1286 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &v->gb)) < 0) {
1287 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
1288 ret = AVERROR_INVALIDDATA;
1289 if (avctx->err_recognition & AV_EF_EXPLODE)
1290 goto err;
1291 continue;
1292 }
1293 }
1294 }
1295 if (header_ret < 0)
1296 continue;
1297 s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
1298 if (!v->field_mode || v->second_field)
1299 s->end_mb_y = (i == n_slices ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
1300 else {
1301 if (i >= n_slices) {
1302 av_log(v->s.avctx, AV_LOG_ERROR, "first field slice count too large\n");
1303 continue;
1304 }
1305 s->end_mb_y = (i == n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
1306 }
1307 if (s->end_mb_y <= s->start_mb_y) {
1308 av_log(v->s.avctx, AV_LOG_ERROR, "end mb y %d %d invalid\n", s->end_mb_y, s->start_mb_y);
1309 continue;
1310 }
1311 if (((s->pict_type == AV_PICTURE_TYPE_P && !v->p_frame_skipped) ||
1312 (s->pict_type == AV_PICTURE_TYPE_B && !v->bi_type)) &&
1313 !v->cbpcy_vlc) {
1314 av_log(v->s.avctx, AV_LOG_ERROR, "missing cbpcy_vlc\n");
1315 continue;
1316 }
1318 if (i != n_slices) {
1319 v->gb = slices[i].gb;
1320 }
1321 }
1322 if (v->field_mode) {
1323 v->second_field = 0;
1324 s->cur_pic.linesize[0] >>= 1;
1325 s->cur_pic.linesize[1] >>= 1;
1326 s->cur_pic.linesize[2] >>= 1;
1327 s->linesize >>= 1;
1328 s->uvlinesize >>= 1;
1330 FFSWAP(uint8_t *, v->mv_f_next[0], v->mv_f[0]);
1331 FFSWAP(uint8_t *, v->mv_f_next[1], v->mv_f[1]);
1332 }
1333 }
1334 ff_dlog(s->avctx, "Consumed %i/%i bits\n",
1335 get_bits_count(&v->gb), v->gb.size_in_bits);
1336// if (get_bits_count(&v->gb) > buf_size * 8)
1337// return -1;
1338 if(s->er.error_occurred && s->pict_type == AV_PICTURE_TYPE_B) {
1339 ret = AVERROR_INVALIDDATA;
1340 goto err;
1341 }
1342 if ( !v->field_mode
1343 && avctx->codec_id != AV_CODEC_ID_WMV3IMAGE
1344 && avctx->codec_id != AV_CODEC_ID_VC1IMAGE)
1345 ff_er_frame_end(&s->er, NULL);
1346 }
1347
1349
1350 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
1351image:
1352 avctx->width = avctx->coded_width = v->output_width;
1353 avctx->height = avctx->coded_height = v->output_height;
1354 if (avctx->skip_frame >= AVDISCARD_NONREF)
1355 goto end;
1356 if (!v->sprite_output_frame &&
1358 ret = AVERROR(ENOMEM);
1359 goto err;
1360 }
1361#if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
1362 if ((ret = vc1_decode_sprites(v, &v->gb)) < 0)
1363 goto err;
1364#endif
1365 if ((ret = av_frame_ref(pict, v->sprite_output_frame)) < 0)
1366 goto err;
1367 *got_frame = 1;
1368 } else {
1369 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
1370 if ((ret = av_frame_ref(pict, s->cur_pic.ptr->f)) < 0)
1371 goto err;
1372 ff_print_debug_info(s, s->cur_pic.ptr, pict);
1373 *got_frame = 1;
1374 } else if (s->last_pic.ptr) {
1375 if ((ret = av_frame_ref(pict, s->last_pic.ptr->f)) < 0)
1376 goto err;
1377 ff_print_debug_info(s, s->last_pic.ptr, pict);
1378 *got_frame = 1;
1379 }
1380 }
1381
1382end:
1383 ret = buf_size;
1384err:
1385 av_free(buf2);
1386 for (i = 0; i < n_slices; i++)
1387 av_free(slices[i].buf);
1388 av_free(slices);
1389 return ret;
1390}
1391
1392
1394 .p.name = "vc1",
1395 CODEC_LONG_NAME("SMPTE VC-1"),
1396 .p.type = AVMEDIA_TYPE_VIDEO,
1397 .p.id = AV_CODEC_ID_VC1,
1398 .priv_data_size = sizeof(VC1Context),
1402 .flush = ff_mpeg_flush,
1403 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1404 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1405#if CONFIG_VC1_DXVA2_HWACCEL
1406 HWACCEL_DXVA2(vc1),
1407#endif
1408#if CONFIG_VC1_D3D11VA_HWACCEL
1409 HWACCEL_D3D11VA(vc1),
1410#endif
1411#if CONFIG_VC1_D3D11VA2_HWACCEL
1412 HWACCEL_D3D11VA2(vc1),
1413#endif
1414#if CONFIG_VC1_D3D12VA_HWACCEL
1415 HWACCEL_D3D12VA(vc1),
1416#endif
1417#if CONFIG_VC1_NVDEC_HWACCEL
1418 HWACCEL_NVDEC(vc1),
1419#endif
1420#if CONFIG_VC1_NVDEC_CUARRAY_HWACCEL
1422#endif
1423#if CONFIG_VC1_VAAPI_HWACCEL
1424 HWACCEL_VAAPI(vc1),
1425#endif
1426#if CONFIG_VC1_VDPAU_HWACCEL
1427 HWACCEL_VDPAU(vc1),
1428#endif
1429 NULL
1430 },
1432};
1433
1434#if CONFIG_WMV3_DECODER
1435const FFCodec ff_wmv3_decoder = {
1436 .p.name = "wmv3",
1437 CODEC_LONG_NAME("Windows Media Video 9"),
1438 .p.type = AVMEDIA_TYPE_VIDEO,
1439 .p.id = AV_CODEC_ID_WMV3,
1440 .priv_data_size = sizeof(VC1Context),
1444 .flush = ff_mpeg_flush,
1445 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
1446 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1447#if CONFIG_WMV3_DXVA2_HWACCEL
1448 HWACCEL_DXVA2(wmv3),
1449#endif
1450#if CONFIG_WMV3_D3D11VA_HWACCEL
1451 HWACCEL_D3D11VA(wmv3),
1452#endif
1453#if CONFIG_WMV3_D3D11VA2_HWACCEL
1454 HWACCEL_D3D11VA2(wmv3),
1455#endif
1456#if CONFIG_WMV3_D3D12VA_HWACCEL
1457 HWACCEL_D3D12VA(wmv3),
1458#endif
1459#if CONFIG_WMV3_NVDEC_HWACCEL
1460 HWACCEL_NVDEC(wmv3),
1461#endif
1462#if CONFIG_WMV3_NVDEC_CUARRAY_HWACCEL
1464#endif
1465#if CONFIG_WMV3_VAAPI_HWACCEL
1466 HWACCEL_VAAPI(wmv3),
1467#endif
1468#if CONFIG_WMV3_VDPAU_HWACCEL
1469 HWACCEL_VDPAU(wmv3),
1470#endif
1471 NULL
1472 },
1474};
1475#endif
1476
1477#if CONFIG_WMV3IMAGE_DECODER
1479 .p.name = "wmv3image",
1480 CODEC_LONG_NAME("Windows Media Video 9 Image"),
1481 .p.type = AVMEDIA_TYPE_VIDEO,
1482 .p.id = AV_CODEC_ID_WMV3IMAGE,
1483 .priv_data_size = sizeof(VC1Context),
1487 .p.capabilities = AV_CODEC_CAP_DR1,
1488 .flush = vc1_sprite_flush,
1489};
1490#endif
1491
1492#if CONFIG_VC1IMAGE_DECODER
1494 .p.name = "vc1image",
1495 CODEC_LONG_NAME("Windows Media Video 9 Image v2"),
1496 .p.type = AVMEDIA_TYPE_VIDEO,
1497 .p.id = AV_CODEC_ID_VC1IMAGE,
1498 .priv_data_size = sizeof(VC1Context),
1502 .p.capabilities = AV_CODEC_CAP_DR1,
1503 .flush = vc1_sprite_flush,
1504};
1505#endif
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
const FFCodec ff_vc1_decoder
Definition vc1dec.c:1393
const FFCodec ff_vc1image_decoder
const FFCodec ff_wmv3_decoder
const FFCodec ff_wmv3image_decoder
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define FF_DEBUG_PICT_INFO
Definition avcodec.h:1393
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
#define s(width, name)
Definition cbs_vp9.c:198
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define av_clip
Definition common.h:100
#define av_clip_uint16
Definition common.h:112
#define NULL
Definition coverity.c:32
#define abs(x)
#define IS_MARKER(state)
Definition dca_parser.c:52
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
Definition decode.c:1777
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition decode.c:1229
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition defs.h:51
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
void ff_er_frame_end(ERContext *s, int *decode_error_flags)
Indicate that a frame has finished decoding and perform error concealment in case it has been enabled...
static struct @346255127015250356166251341105367306144006377143 state
static const char * hwaccel
Definition ffplay.c:357
bitstream reader API header.
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition get_bits.h:424
static unsigned int get_bits1(GetBitContext *s)
Definition get_bits.h:391
static void skip_bits(GetBitContext *s, int n)
Definition get_bits.h:383
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition get_bits.h:544
static int get_bits_count(const GetBitContext *s)
Definition get_bits.h:254
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
Definition codec.h:79
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition avcodec.h:302
#define AV_CODEC_FLAG_LOW_DELAY
Force low delay.
Definition avcodec.h:314
@ AV_CODEC_ID_VC1IMAGE
Definition codec_id.h:202
@ AV_CODEC_ID_VC1
Definition codec_id.h:120
@ AV_CODEC_ID_WMV3IMAGE
Definition codec_id.h:201
@ AV_CODEC_ID_MSS2
Definition codec_id.h:216
@ AV_CODEC_ID_WMV3
Definition codec_id.h:121
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
@ AVDISCARD_ALL
discard all
Definition defs.h:232
@ AVDISCARD_NONKEY
discard all frames except keyframes
Definition defs.h:231
@ AVDISCARD_NONREF
discard all non reference
Definition defs.h:228
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
Definition error.h:73
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition frame.h:695
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition frame.h:700
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
Definition frame.c:496
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:278
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Definition frame.c:52
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_INFO
Standard information.
Definition log.h:221
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
Definition mem.c:495
int av_size_mult(size_t a, size_t b, size_t *r)
Multiply two size_t values checking for overflow.
Definition mem.c:565
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition imgutils.c:318
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
Definition utils.c:40
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
@ AV_PICTURE_TYPE_BI
BI type.
Definition avutil.h:284
@ AV_PICTURE_TYPE_P
Predicted.
Definition avutil.h:279
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition avutil.h:280
static const FFHWAccel * ffhwaccel(const AVHWAccel *codec)
#define HWACCEL_NVDEC_CUARRAY(codec)
Definition hwconfig.h:70
#define HWACCEL_DXVA2(codec)
Definition hwconfig.h:64
#define HWACCEL_VDPAU(codec)
Definition hwconfig.h:74
#define HWACCEL_D3D12VA(codec)
Definition hwconfig.h:82
#define HWACCEL_NVDEC(codec)
Definition hwconfig.h:68
#define HWACCEL_VAAPI(codec)
Definition hwconfig.h:72
#define HWACCEL_D3D11VA(codec)
Definition hwconfig.h:80
#define HWACCEL_D3D11VA2(codec)
Definition hwconfig.h:66
static const int16_t alpha[]
Definition ilbcdata.h:55
misc image utilities
av_cold int ff_intrax8_common_init(AVCodecContext *avctx, IntraX8Context *w, int16_t block[64], int mb_width, int mb_height)
Initialize IntraX8 frame decoder.
Definition intrax8.c:679
#define AC_VLC_BITS
Definition intrax8.c:42
av_cold void ff_intrax8_common_end(IntraX8Context *w)
Destroy IntraX8 frame structure.
Definition intrax8.c:713
#define AV_RB32(p)
av_cold void ff_blockdsp_init(BlockDSPContext *c)
Definition blockdsp.c:58
av_cold void ff_h264chroma_init(H264ChromaContext *c, int bit_depth)
Definition h264chroma.c:43
av_cold void ff_qpeldsp_init(QpelDSPContext *c)
Definition qpeldsp.c:784
av_cold int ff_vc1_decode_init(AVCodecContext *avctx)
Definition vc1dec.c:451
av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
Close a MSS2/VC1/WMV3 decoder.
Definition vc1dec.c:806
static av_cold int vc1_decode_init(AVCodecContext *avctx)
Initialize a VC1/WMV3 decoder.
Definition vc1dec.c:617
static av_cold void vc1_init_static(void)
Definition vc1dec.c:494
static void vc1_decode_reset(AVCodecContext *avctx)
Definition vc1dec.c:774
static enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[]
Definition vc1dec.c:55
static int vc1_decode_frame(AVCodecContext *avctx, AVFrame *pict, int *got_frame, AVPacket *avpkt)
Decode a VC1/WMV3 frame.
Definition vc1dec.c:815
#define transpose(x)
static enum AVPixelFormat vc1_get_format(AVCodecContext *avctx)
Definition vc1dec.c:431
static av_cold int vc1_decode_init_alloc_tables(VC1Context *v)
Definition vc1dec.c:359
av_cold void ff_vc1_init_common(VC1Context *v)
Init VC-1 specific tables and VC1Context members.
Definition vc1dec.c:589
av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
Definition vc1dec.c:479
av_cold void ff_vc1dsp_init(VC1DSPContext *dsp)
Definition vc1dsp.c:968
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
#define AVOnce
Definition thread.h:202
static int ff_thread_once(char *control, void(*routine)(void))
Definition thread.h:205
#define AV_ONCE_INIT
Definition thread.h:203
#define FFSWAP(type, a, b)
Definition macros.h:52
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
#define FFALIGN(x, a)
Definition macros.h:78
Memory handling functions.
void ff_mpeg_er_frame_start(MpegEncContext *s)
Definition mpeg_er.c:46
void ff_mpv_unref_picture(MPVWorkPicture *pic)
Definition mpegpicture.c:98
#define PICT_TOP_FIELD
Definition mpegutils.h:31
#define PICT_BOTTOM_FIELD
Definition mpegutils.h:32
#define PICT_FRAME
Definition mpegutils.h:33
av_cold int ff_mpv_common_init(MpegEncContext *s)
init common structure for both encoder and decoder.
Definition mpegvideo.c:359
av_cold void ff_mpv_common_end(MpegEncContext *s)
Definition mpegvideo.c:428
mpegvideo header.
@ FMT_H263
Definition mpegvideo.h:57
int ff_mpv_frame_start(MpegEncContext *s, AVCodecContext *avctx)
generic function called after decoding the header and before a frame is decoded.
av_cold void ff_mpeg_flush(AVCodecContext *avctx)
void ff_mpv_frame_end(MpegEncContext *s)
void ff_print_debug_info(const MpegEncContext *s, const MPVPicture *p, AVFrame *pict)
av_cold int ff_mpv_decode_close(AVCodecContext *avctx)
av_cold int ff_mpv_decode_init(MpegEncContext *s, AVCodecContext *avctx)
Initialize the given MpegEncContext for decoding.
mpegvideo decoder header.
av_cold void ff_msmp4_vc1_vlcs_init_once(void)
const uint8_t ff_wmv1_scantable[WMV1_SCANTABLE_COUNT][64]
#define av_malloc(s)
Definition ops_static.c:52
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:804
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_UNSPECIFIED
Definition pixfmt.h:749
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_D3D12
Hardware surfaces for Direct3D 12.
Definition pixfmt.h:440
@ AV_PIX_FMT_DXVA2_VLD
HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer.
Definition pixfmt.h:134
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_CUDA
HW acceleration through CUDA.
Definition pixfmt.h:260
@ AV_PIX_FMT_D3D11
Hardware surfaces for Direct3D11.
Definition pixfmt.h:336
@ AV_PIX_FMT_D3D11VA_VLD
HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView p...
Definition pixfmt.h:254
@ AV_PIX_FMT_VAAPI
Hardware acceleration through VA-API, data[3] contains a VASurfaceID.
Definition pixfmt.h:126
@ AV_PIX_FMT_VDPAU
HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface.
Definition pixfmt.h:194
const AVProfile ff_vc1_profiles[]
Definition profiles.c:147
void ff_simple_idct44_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
void ff_simple_idct84_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
void ff_simple_idct48_add(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
simple idct header.
void ff_simple_idct_int16_8bit(int16_t *block)
void ff_simple_idct_add_int16_8bit(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
int debug
debug
Definition avcodec.h:1392
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition avcodec.h:681
enum AVColorPrimaries color_primaries
Chromaticity coordinates of the source primaries.
Definition avcodec.h:657
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
Definition avcodec.h:781
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition avcodec.h:1423
int has_b_frames
Size of the frame reordering buffer in the decoder.
Definition avcodec.h:709
int level
Encoding level descriptor.
Definition avcodec.h:1646
int profile
profile
Definition avcodec.h:1636
enum AVColorSpace colorspace
YUV colorspace type.
Definition avcodec.h:671
enum AVColorTransferCharacteristic color_trc
Color Transfer Characteristic.
Definition avcodec.h:664
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
enum AVCodecID codec_id
Definition avcodec.h:453
int extradata_size
Definition avcodec.h:527
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition avcodec.h:619
void * priv_data
Definition avcodec.h:470
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition avcodec.h:1667
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
Definition avcodec.h:1416
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition frame.h:493
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition frame.h:716
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition frame.h:517
enum AVPictureType pict_type
Picture type of the frame.
Definition frame.h:564
This structure stores compressed data.
Definition packet.h:580
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition packet.h:586
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
struct AVFrame * f
Definition mpegpicture.h:59
int field_picture
whether or not the picture was encoded in separate fields
Definition mpegpicture.h:82
MPVPicture * ptr
RefStruct reference.
Definition mpegpicture.h:99
MpegEncContext.
Definition mpegvideo.h:67
struct AVCodecContext * avctx
Definition mpegvideo.h:82
MPVWorkPicture next_pic
copy of the next picture structure.
Definition mpegvideo.h:126
MPVWorkPicture last_pic
copy of the previous picture structure.
Definition mpegvideo.h:120
enum AVPictureType pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition mpegvideo.h:154
int block_index[6]
index to current MB in block based arrays with edges
Definition mpegvideo.h:194
MPVWorkPicture cur_pic
copy of the current picture structure.
Definition mpegvideo.h:132
The VC1 Context.
Definition vc1.h:176
uint8_t * sr_rows[2][2]
Sprite resizer line cache.
Definition vc1.h:385
int16_t(* luma_mv_base)[2]
Definition vc1.h:396
int next_interlaced
whether last_pic, next_pic is interlaced
Definition vc1.h:306
int transfer_char
8 bits, Opto-electronic transfer characteristics
Definition vc1.h:209
int profile
Sequence header data for all Profiles TODO: choose between ints, uint8_ts and monobit flags.
Definition vc1.h:220
int top_blk_sh
Either 3 or 0, positions of l/t in blk[].
Definition vc1.h:244
int left_blk_sh
Definition vc1.h:244
uint8_t * over_flags_plane
Overflags bitplane.
Definition vc1.h:329
uint8_t * direct_mb_plane
bitplane for "direct" MBs
Definition vc1.h:295
int pic_header_flag
Definition vc1.h:372
int first_pic_header_flag
Definition vc1.h:371
int output_width
Definition vc1.h:384
int p_frame_skipped
Definition vc1.h:388
int two_sprites
Definition vc1.h:382
uint8_t tff
Definition vc1.h:321
const VLCElem * cbpcy_vlc
CBPCY VLC table.
Definition vc1.h:291
uint8_t * mb_type
Definition vc1.h:271
VC1DSPContext vc1dsp
Definition vc1.h:181
uint8_t * is_intra
Definition vc1.h:395
int new_sprite
Frame decoding info for sprite modes.
Definition vc1.h:381
int bi_type
Definition vc1.h:389
int second_field
Definition vc1.h:358
uint8_t zz_8x8[4][64]
Zigzag table for TT_8x8, permuted for IDCT.
Definition vc1.h:243
int end_mb_x
Horizontal macroblock limit (used only by mss2)
Definition vc1.h:401
uint8_t * is_intra_base
Definition vc1.h:395
uint8_t pq
Definition vc1.h:242
H264ChromaContext h264chroma
Definition vc1.h:180
uint8_t * mb_type_base
Definition vc1.h:271
int * ttblk
Transform type at the block level.
Definition vc1.h:266
int res_fasttx
reserved, always 1
Definition vc1.h:189
int field_mode
1 for interlaced field pictures
Definition vc1.h:356
uint32_t * cbp_base
Definition vc1.h:394
int res_sprite
Simple/Main Profile sequence header.
Definition vc1.h:185
int16_t(* block)[6][64]
Definition vc1.h:392
int sprite_height
Definition vc1.h:384
uint8_t * fieldtx_plane
Definition vc1.h:350
uint8_t * mv_f_next_base
Definition vc1.h:355
uint8_t * mv_type_mb_plane
bitplane for mv_type == (4MV)
Definition vc1.h:294
MpegEncContext s
Definition vc1.h:177
int color_prim
8 bits, chroma coordinates of the color primaries
Definition vc1.h:208
GetBitContext gb
Definition vc1.h:178
uint8_t * mv_f[2]
0: MV obtained from same field, 1: opposite field
Definition vc1.h:354
uint8_t * acpred_plane
AC prediction flags bitplane.
Definition vc1.h:327
int n_allocated_blks
Definition vc1.h:393
uint8_t mvrange
Ranges:
Definition vc1.h:289
IntraX8Context x8
Definition vc1.h:179
int sprite_width
Definition vc1.h:384
uint8_t * blk_mv_type
0: frame MV, 1: field MV (interlaced frame)
Definition vc1.h:353
int level
Advanced Profile.
Definition vc1.h:199
uint8_t rff
Definition vc1.h:321
int last_interlaced
Definition vc1.h:306
uint32_t * cbp
Definition vc1.h:394
enum FrameCodingMode fcm
Frame decoding info for Advanced profile.
Definition vc1.h:318
int interlace
Progressive/interlaced (RPTFTM syntax element)
Definition vc1.h:203
int * ttblk_base
Definition vc1.h:266
int blocks_off
Definition vc1.h:368
int output_height
Definition vc1.h:384
uint8_t * blk_mv_type_base
Definition vc1.h:353
uint8_t * forward_mb_plane
bitplane for "forward" MBs
Definition vc1.h:296
int16_t((* luma_mv)[2]
Definition vc1.h:396
AVFrame * sprite_output_frame
Definition vc1.h:383
uint8_t * mv_f_next[2]
Definition vc1.h:355
int matrix_coef
8 bits, Color primaries->YCbCr transform matrix
Definition vc1.h:210
int mb_off
Definition vc1.h:368
uint8_t rptfrm
Definition vc1.h:321
uint8_t zzi_8x8[64]
Definition vc1.h:352
uint8_t * mv_f_base
Definition vc1.h:354
void(* vc1_inv_trans_8x4_dc)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition vc1dsp.h:44
void(* sprite_v_single)(uint8_t *dst, const uint8_t *src1a, const uint8_t *src1b, int offset, int width)
Definition vc1dsp.h:70
void(* vc1_inv_trans_4x8_dc)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition vc1dsp.h:45
void(* vc1_inv_trans_4x8)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition vc1dsp.h:41
void(* sprite_v_double_onescale)(uint8_t *dst, const uint8_t *src1a, const uint8_t *src1b, int offset1, const uint8_t *src2a, int alpha, int width)
Definition vc1dsp.h:72
void(* sprite_v_double_twoscale)(uint8_t *dst, const uint8_t *src1a, const uint8_t *src1b, int offset1, const uint8_t *src2a, const uint8_t *src2b, int offset2, int alpha, int width)
Definition vc1dsp.h:74
void(* sprite_v_double_noscale)(uint8_t *dst, const uint8_t *src1a, const uint8_t *src2a, int alpha, int width)
Definition vc1dsp.h:71
void(* vc1_inv_trans_8x4)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition vc1dsp.h:40
int(* vc1_unescape_buffer)(const uint8_t *src, int size, uint8_t *dst)
Definition vc1dsp.h:87
void(* vc1_inv_trans_4x4)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition vc1dsp.h:42
void(* vc1_inv_trans_4x4_dc)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition vc1dsp.h:46
void(* vc1_inv_trans_8x8)(int16_t *b)
Definition vc1dsp.h:39
void(* vc1_inv_trans_8x8_dc)(uint8_t *dest, ptrdiff_t stride, int16_t *block)
Definition vc1dsp.h:43
void(* sprite_h)(uint8_t *dst, const uint8_t *src, int offset, int advance, int count)
Definition vc1dsp.h:69
Definition vlc.h:32
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
Definition vlc.h:220
#define av_free(p)
#define av_mallocz(s)
#define ff_dlog(a,...)
#define avpriv_request_sample(...)
#define av_freep(p)
#define av_log(a,...)
static uint8_t tmp[40]
Definition aes_ctr.c:52
#define width
Definition dsp.h:89
int size
int ff_vc1_parse_frame_header_adv(VC1Context *v, GetBitContext *gb)
Definition vc1.c:837
int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
Decode Simple/Main Profiles sequence header.
Definition vc1.c:275
int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext *gb)
Definition vc1.c:617
int ff_vc1_decode_entry_point(AVCodecContext *avctx, VC1Context *v, GetBitContext *gb)
Definition vc1.c:494
int ff_vc1_decode_end(AVCodecContext *avctx)
Close a MSS2/VC1/WMV3 decoder.
Definition vc1dec.c:806
void ff_vc1_decode_blocks(VC1Context *v)
Definition vc1_block.c:2937
@ PROGRESSIVE
in the bitstream is reported as 00b
Definition vc1.h:152
static av_always_inline const uint8_t * find_next_marker(const uint8_t *src, const uint8_t *end)
Find VC-1 marker in buffer.
Definition vc1_common.h:59
@ PROFILE_ADVANCED
Definition vc1_common.h:52
@ VC1_CODE_SEQHDR
Definition vc1_common.h:40
@ VC1_CODE_ENDOFSEQ
Definition vc1_common.h:35
@ VC1_CODE_FIELD
Definition vc1_common.h:37
@ VC1_CODE_FRAME
Definition vc1_common.h:38
@ VC1_CODE_SLICE
Definition vc1_common.h:36
@ VC1_CODE_ENTRYPOINT
Definition vc1_common.h:39
VC-1 tables.
static const uint8_t vc1_if_mmv_mbmode_codes[8][8]
static const uint8_t vc1_2mv_block_pattern_bits[4][4]
static const uint8_t vc1_intfr_4mv_mbmode_bits[4][15]
static const uint8_t vc1_norm2_bits[4]
static const uint8_t vc1_2ref_mvdata_bits[8][126]
static const uint16_t vc1_cbpcy_p_codes[4][64]
static const uint8_t vc1_subblkpat_bits[3][15]
static const uint8_t vc1_ttmb_bits[3][16]
static const uint8_t vc1_intfr_non4mv_mbmode_bits[4][9]
static const uint8_t vc1_4mv_block_pattern_bits[4][16]
static const uint8_t vc1_subblkpat_codes[3][15]
static const uint8_t vc1_4mv_block_pattern_codes[4][16]
static const uint8_t vc1_if_1mv_mbmode_codes[8][6]
static const uint32_t vc1_1ref_mvdata_codes[4][72]
static const uint8_t vc1_norm6_bits[64]
static const uint16_t vc1_intfr_4mv_mbmode_codes[4][15]
static const uint8_t vc1_if_1mv_mbmode_bits[8][6]
static const uint32_t vc1_ac_tables[AC_MODES][186][2]
static const uint8_t vc1_1ref_mvdata_bits[4][72]
static const uint8_t vc1_ttblk_bits[3][8]
const int ff_vc1_ac_sizes[AC_MODES]
static const uint8_t vc1_intfr_non4mv_mbmode_codes[4][9]
static const uint16_t vc1_norm6_codes[64]
static const uint32_t vc1_2ref_mvdata_codes[8][126]
static const uint8_t vc1_imode_bits[7]
static const uint8_t vc1_if_mmv_mbmode_bits[8][8]
static const uint8_t vc1_norm2_codes[4]
static const uint8_t vc1_ttblk_codes[3][8]
static const uint16_t vc1_mv_diff_codes[4][73]
static const uint8_t vc1_mv_diff_bits[4][73]
static const uint8_t vc1_cbpcy_p_bits[4][64]
static const uint8_t vc1_2mv_block_pattern_codes[4][4]
static const uint8_t vc1_imode_codes[7]
static const uint8_t vc1_icbpcy_p_bits[8][63]
static const uint16_t vc1_icbpcy_p_codes[8][63]
static const uint16_t vc1_ttmb_codes[3][16]
const VLCElem * ff_vc1_2ref_mvdata_vlc[8]
Definition vc1data.c:122
const VLCElem * ff_vc1_ttblk_vlc[3]
Definition vc1data.c:115
const VLCElem * ff_vc1_icbpcy_vlc[8]
Definition vc1data.c:112
const VLCElem * ff_vc1_ac_coeff_table[8]
Definition vc1data.c:124
VLCElem ff_vc1_norm6_vlc[556]
Definition vc1data.c:107
VLCElem ff_vc1_imode_vlc[1<< VC1_IMODE_VLC_BITS]
Definition vc1data.c:105
const VLCElem * ff_vc1_subblkpat_vlc[3]
Definition vc1data.c:116
VLCElem ff_vc1_norm2_vlc[1<< VC1_NORM2_VLC_BITS]
Definition vc1data.c:106
const VLCElem * ff_vc1_ttmb_vlc[3]
Definition vc1data.c:109
const VLCElem * ff_vc1_if_1mv_mbmode_vlc[8]
Definition vc1data.c:120
const VLCElem * ff_vc1_if_mmv_mbmode_vlc[8]
Definition vc1data.c:119
const VLCElem * ff_vc1_intfr_4mv_mbmode_vlc[4]
Definition vc1data.c:117
const uint8_t ff_vc1_adv_interlaced_8x8_zz[64]
Definition vc1data.c:207
const VLCElem * ff_vc1_intfr_non4mv_mbmode_vlc[4]
Definition vc1data.c:118
const VLCElem * ff_vc1_2mv_block_pattern_vlc[4]
Definition vc1data.c:114
const VLCElem * ff_vc1_1ref_mvdata_vlc[4]
Definition vc1data.c:121
const VLCElem * ff_vc1_4mv_block_pattern_vlc[4]
Definition vc1data.c:113
const VLCElem * ff_vc1_cbpcy_p_vlc[4]
Definition vc1data.c:111
const VLCElem * ff_vc1_mv_diff_vlc[4]
Definition vc1data.c:110
VC-1 tables.
#define VC1_NORM6_VLC_BITS
Definition vc1data.h:62
#define VC1_4MV_BLOCK_PATTERN_VLC_BITS
Definition vc1data.h:73
#define VC1_INTFR_NON4MV_MBMODE_VLC_BITS
Definition vc1data.h:83
#define VC1_IMODE_VLC_BITS
Definition vc1data.h:58
#define VC1_1REF_MVDATA_VLC_BITS
Definition vc1data.h:89
#define VC1_INTFR_4MV_MBMODE_VLC_BITS
Definition vc1data.h:81
#define VC1_SUBBLKPAT_VLC_BITS
Definition vc1data.h:79
#define VC1_CBPCY_P_VLC_BITS
Definition vc1data.h:69
#define VC1_IF_1MV_MBMODE_VLC_BITS
Definition vc1data.h:87
#define VC1_TTMB_VLC_BITS
Definition vc1data.h:65
#define VC1_2MV_BLOCK_PATTERN_VLC_BITS
Definition vc1data.h:75
#define VC1_2REF_MVDATA_VLC_BITS
Definition vc1data.h:91
#define VC1_TTBLK_VLC_BITS
Definition vc1data.h:77
#define VC1_ICBPCY_VLC_BITS
Definition vc1data.h:71
#define VC1_IF_MMV_MBMODE_VLC_BITS
Definition vc1data.h:85
#define VC1_NORM2_VLC_BITS
Definition vc1data.h:60
#define VC1_MV_DIFF_VLC_BITS
Definition vc1data.h:67
#define VLC_INIT_STATIC_TABLE(vlc_table, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition vlc.h:278
#define VLC_INIT_STATE(_table)
Definition vlc.h:225
static const VLCElem * ff_vlc_init_tables(VLCInitState *state, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, int flags)
Definition vlc.h:254
static double c[64]