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
7 * This file is part of Libav.
9 * Libav 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.
14 * Libav 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.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with Libav; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 * VC-1 and WMV3 decoder
34 #include "mpegvideo.h"
36 #include "msmpeg4data.h"
41 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
43 typedef struct SpriteData {
45 * Transform coefficients for both sprites in 16.16 fixed point format,
46 * in the order they appear in the bitstream:
57 int effect_type, effect_flag;
58 int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
59 int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
62 static inline int get_fp_val(GetBitContext* gb)
64 return (get_bits_long(gb, 30) - (1 << 29)) << 1;
67 static void vc1_sprite_parse_transform(GetBitContext* gb, int c[7])
71 switch (get_bits(gb, 2)) {
74 c[2] = get_fp_val(gb);
78 c[0] = c[4] = get_fp_val(gb);
79 c[2] = get_fp_val(gb);
82 c[0] = get_fp_val(gb);
83 c[2] = get_fp_val(gb);
84 c[4] = get_fp_val(gb);
87 c[0] = get_fp_val(gb);
88 c[1] = get_fp_val(gb);
89 c[2] = get_fp_val(gb);
90 c[3] = get_fp_val(gb);
91 c[4] = get_fp_val(gb);
94 c[5] = get_fp_val(gb);
96 c[6] = get_fp_val(gb);
101 static void vc1_parse_sprites(VC1Context *v, GetBitContext* gb, SpriteData* sd)
103 AVCodecContext *avctx = v->s.avctx;
106 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
107 vc1_sprite_parse_transform(gb, sd->coefs[sprite]);
108 if (sd->coefs[sprite][1] || sd->coefs[sprite][3])
109 avpriv_request_sample(avctx, "Non-zero rotation coefficients");
110 av_log(avctx, AV_LOG_DEBUG, sprite ? "S2:" : "S1:");
111 for (i = 0; i < 7; i++)
112 av_log(avctx, AV_LOG_DEBUG, " %d.%.3d",
113 sd->coefs[sprite][i] / (1<<16),
114 (abs(sd->coefs[sprite][i]) & 0xFFFF) * 1000 / (1 << 16));
115 av_log(avctx, AV_LOG_DEBUG, "\n");
119 if (sd->effect_type = get_bits_long(gb, 30)) {
120 switch (sd->effect_pcount1 = get_bits(gb, 4)) {
122 vc1_sprite_parse_transform(gb, sd->effect_params1);
125 vc1_sprite_parse_transform(gb, sd->effect_params1);
126 vc1_sprite_parse_transform(gb, sd->effect_params1 + 7);
129 for (i = 0; i < sd->effect_pcount1; i++)
130 sd->effect_params1[i] = get_fp_val(gb);
132 if (sd->effect_type != 13 || sd->effect_params1[0] != sd->coefs[0][6]) {
133 // effect 13 is simple alpha blending and matches the opacity above
134 av_log(avctx, AV_LOG_DEBUG, "Effect: %d; params: ", sd->effect_type);
135 for (i = 0; i < sd->effect_pcount1; i++)
136 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
137 sd->effect_params1[i] / (1 << 16),
138 (abs(sd->effect_params1[i]) & 0xFFFF) * 1000 / (1 << 16));
139 av_log(avctx, AV_LOG_DEBUG, "\n");
142 sd->effect_pcount2 = get_bits(gb, 16);
143 if (sd->effect_pcount2 > 10) {
144 av_log(avctx, AV_LOG_ERROR, "Too many effect parameters\n");
146 } else if (sd->effect_pcount2) {
148 av_log(avctx, AV_LOG_DEBUG, "Effect params 2: ");
149 while (++i < sd->effect_pcount2) {
150 sd->effect_params2[i] = get_fp_val(gb);
151 av_log(avctx, AV_LOG_DEBUG, " %d.%.2d",
152 sd->effect_params2[i] / (1 << 16),
153 (abs(sd->effect_params2[i]) & 0xFFFF) * 1000 / (1 << 16));
155 av_log(avctx, AV_LOG_DEBUG, "\n");
158 if (sd->effect_flag = get_bits1(gb))
159 av_log(avctx, AV_LOG_DEBUG, "Effect flag set\n");
161 if (get_bits_count(gb) >= gb->size_in_bits +
162 (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE ? 64 : 0))
163 av_log(avctx, AV_LOG_ERROR, "Buffer overrun\n");
164 if (get_bits_count(gb) < gb->size_in_bits - 8)
165 av_log(avctx, AV_LOG_WARNING, "Buffer not fully read\n");
168 static void vc1_draw_sprites(VC1Context *v, SpriteData* sd)
170 int i, plane, row, sprite;
171 int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
172 uint8_t* src_h[2][2];
173 int xoff[2], xadv[2], yoff[2], yadv[2], alpha;
175 MpegEncContext *s = &v->s;
177 for (i = 0; i < 2; i++) {
178 xoff[i] = av_clip(sd->coefs[i][2], 0, v->sprite_width-1 << 16);
179 xadv[i] = sd->coefs[i][0];
180 if (xadv[i] != 1<<16 || (v->sprite_width << 16) - (v->output_width << 16) - xoff[i])
181 xadv[i] = av_clip(xadv[i], 0, ((v->sprite_width<<16) - xoff[i] - 1) / v->output_width);
183 yoff[i] = av_clip(sd->coefs[i][5], 0, v->sprite_height-1 << 16);
184 yadv[i] = av_clip(sd->coefs[i][4], 0, ((v->sprite_height << 16) - yoff[i]) / v->output_height);
186 alpha = av_clip_uint16(sd->coefs[1][6]);
188 for (plane = 0; plane < (s->avctx->flags & AV_CODEC_FLAG_GRAY ? 1 : 3); plane++) {
189 int width = v->output_width>>!!plane;
191 for (row = 0; row < v->output_height>>!!plane; row++) {
192 uint8_t *dst = v->sprite_output_frame->data[plane] +
193 v->sprite_output_frame->linesize[plane] * row;
195 for (sprite = 0; sprite <= v->two_sprites; sprite++) {
196 uint8_t *iplane = s->current_picture.f->data[plane];
197 int iline = s->current_picture.f->linesize[plane];
198 int ycoord = yoff[sprite] + yadv[sprite] * row;
199 int yline = ycoord >> 16;
201 ysub[sprite] = ycoord & 0xFFFF;
203 iplane = s->last_picture.f->data[plane];
204 iline = s->last_picture.f->linesize[plane];
206 next_line = FFMIN(yline + 1, (v->sprite_height >> !!plane) - 1) * iline;
207 if (!(xoff[sprite] & 0xFFFF) && xadv[sprite] == 1 << 16) {
208 src_h[sprite][0] = iplane + (xoff[sprite] >> 16) + yline * iline;
210 src_h[sprite][1] = iplane + (xoff[sprite] >> 16) + next_line;
212 if (sr_cache[sprite][0] != yline) {
213 if (sr_cache[sprite][1] == yline) {
214 FFSWAP(uint8_t*, v->sr_rows[sprite][0], v->sr_rows[sprite][1]);
215 FFSWAP(int, sr_cache[sprite][0], sr_cache[sprite][1]);
217 v->vc1dsp.sprite_h(v->sr_rows[sprite][0], iplane + yline * iline, xoff[sprite], xadv[sprite], width);
218 sr_cache[sprite][0] = yline;
221 if (ysub[sprite] && sr_cache[sprite][1] != yline + 1) {
222 v->vc1dsp.sprite_h(v->sr_rows[sprite][1],
223 iplane + next_line, xoff[sprite],
224 xadv[sprite], width);
225 sr_cache[sprite][1] = yline + 1;
227 src_h[sprite][0] = v->sr_rows[sprite][0];
228 src_h[sprite][1] = v->sr_rows[sprite][1];
232 if (!v->two_sprites) {
234 v->vc1dsp.sprite_v_single(dst, src_h[0][0], src_h[0][1], ysub[0], width);
236 memcpy(dst, src_h[0][0], width);
239 if (ysub[0] && ysub[1]) {
240 v->vc1dsp.sprite_v_double_twoscale(dst, src_h[0][0], src_h[0][1], ysub[0],
241 src_h[1][0], src_h[1][1], ysub[1], alpha, width);
242 } else if (ysub[0]) {
243 v->vc1dsp.sprite_v_double_onescale(dst, src_h[0][0], src_h[0][1], ysub[0],
244 src_h[1][0], alpha, width);
245 } else if (ysub[1]) {
246 v->vc1dsp.sprite_v_double_onescale(dst, src_h[1][0], src_h[1][1], ysub[1],
247 src_h[0][0], (1<<16)-1-alpha, width);
249 v->vc1dsp.sprite_v_double_noscale(dst, src_h[0][0], src_h[1][0], alpha, width);
255 for (i = 0; i < 2; i++) {
265 static int vc1_decode_sprites(VC1Context *v, GetBitContext* gb)
267 MpegEncContext *s = &v->s;
268 AVCodecContext *avctx = s->avctx;
271 vc1_parse_sprites(v, gb, &sd);
273 if (!s->current_picture.f->data[0]) {
274 av_log(avctx, AV_LOG_ERROR, "Got no sprites\n");
278 if (v->two_sprites && (!s->last_picture_ptr || !s->last_picture.f->data[0])) {
279 av_log(avctx, AV_LOG_WARNING, "Need two sprites, only got one\n");
283 av_frame_unref(v->sprite_output_frame);
284 if (ff_get_buffer(avctx, v->sprite_output_frame, 0) < 0) {
285 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
289 vc1_draw_sprites(v, &sd);
294 static void vc1_sprite_flush(AVCodecContext *avctx)
296 VC1Context *v = avctx->priv_data;
297 MpegEncContext *s = &v->s;
298 AVFrame *f = s->current_picture.f;
301 /* Windows Media Image codecs have a convergence interval of two keyframes.
302 Since we can't enforce it, clear to black the missing sprite. This is
303 wrong but it looks better than doing nothing. */
306 for (plane = 0; plane < (s->avctx->flags & AV_CODEC_FLAG_GRAY ? 1 : 3); plane++)
307 for (i = 0; i < v->sprite_height>>!!plane; i++)
308 memset(f->data[plane] + i * f->linesize[plane],
309 plane ? 128 : 0, f->linesize[plane]);
314 av_cold int ff_vc1_decode_init_alloc_tables(VC1Context *v)
316 MpegEncContext *s = &v->s;
318 int mb_height = FFALIGN(s->mb_height, 2);
320 /* Allocate mb bitplanes */
321 v->mv_type_mb_plane = av_malloc (s->mb_stride * mb_height);
322 v->direct_mb_plane = av_malloc (s->mb_stride * mb_height);
323 v->forward_mb_plane = av_malloc (s->mb_stride * mb_height);
324 v->fieldtx_plane = av_mallocz(s->mb_stride * mb_height);
325 v->acpred_plane = av_malloc (s->mb_stride * mb_height);
326 v->over_flags_plane = av_malloc (s->mb_stride * mb_height);
328 v->n_allocated_blks = s->mb_width + 2;
329 v->block = av_malloc(sizeof(*v->block) * v->n_allocated_blks);
330 v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
331 v->cbp = v->cbp_base + s->mb_stride;
332 v->ttblk_base = av_malloc(sizeof(v->ttblk_base[0]) * 2 * s->mb_stride);
333 v->ttblk = v->ttblk_base + s->mb_stride;
334 v->is_intra_base = av_mallocz(sizeof(v->is_intra_base[0]) * 2 * s->mb_stride);
335 v->is_intra = v->is_intra_base + s->mb_stride;
336 v->luma_mv_base = av_malloc(sizeof(v->luma_mv_base[0]) * 2 * s->mb_stride);
337 v->luma_mv = v->luma_mv_base + s->mb_stride;
339 /* allocate block type info in that way so it could be used with s->block_index[] */
340 v->mb_type_base = av_malloc(s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
341 v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
342 v->mb_type[1] = v->mb_type_base + s->b8_stride * (mb_height * 2 + 1) + s->mb_stride + 1;
343 v->mb_type[2] = v->mb_type[1] + s->mb_stride * (mb_height + 1);
345 /* allocate memory to store block level MV info */
346 v->blk_mv_type_base = av_mallocz( s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
347 v->blk_mv_type = v->blk_mv_type_base + s->b8_stride + 1;
348 v->mv_f_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
349 v->mv_f[0] = v->mv_f_base + s->b8_stride + 1;
350 v->mv_f[1] = v->mv_f[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
351 v->mv_f_next_base = av_mallocz(2 * (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2));
352 v->mv_f_next[0] = v->mv_f_next_base + s->b8_stride + 1;
353 v->mv_f_next[1] = v->mv_f_next[0] + (s->b8_stride * (mb_height * 2 + 1) + s->mb_stride * (mb_height + 1) * 2);
355 ff_intrax8_common_init(&v->x8,s);
357 if (s->avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || s->avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
358 for (i = 0; i < 4; i++)
359 if (!(v->sr_rows[i >> 1][i & 1] = av_malloc(v->output_width))) return -1;
362 if (!v->mv_type_mb_plane || !v->direct_mb_plane || !v->acpred_plane || !v->over_flags_plane ||
363 !v->block || !v->cbp_base || !v->ttblk_base || !v->is_intra_base || !v->luma_mv_base ||
371 ff_vc1_decode_end(s->avctx);
372 return AVERROR(ENOMEM);
375 av_cold void ff_vc1_init_transposed_scantables(VC1Context *v)
378 for (i = 0; i < 64; i++) {
379 #define transpose(x) ((x >> 3) | ((x & 7) << 3))
380 v->zz_8x8[0][i] = transpose(ff_wmv1_scantable[0][i]);
381 v->zz_8x8[1][i] = transpose(ff_wmv1_scantable[1][i]);
382 v->zz_8x8[2][i] = transpose(ff_wmv1_scantable[2][i]);
383 v->zz_8x8[3][i] = transpose(ff_wmv1_scantable[3][i]);
384 v->zzi_8x8[i] = transpose(ff_vc1_adv_interlaced_8x8_zz[i]);
390 /** Initialize a VC1/WMV3 decoder
391 * @todo TODO: Handle VC-1 IDUs (Transport level?)
392 * @todo TODO: Decypher remaining bits in extra_data
394 static av_cold int vc1_decode_init(AVCodecContext *avctx)
396 VC1Context *v = avctx->priv_data;
397 MpegEncContext *s = &v->s;
400 /* save the container output size for WMImage */
401 v->output_width = avctx->width;
402 v->output_height = avctx->height;
404 if (!avctx->extradata_size || !avctx->extradata)
406 if (!(avctx->flags & AV_CODEC_FLAG_GRAY))
407 avctx->pix_fmt = ff_get_format(avctx, avctx->codec->pix_fmts);
409 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
412 if (ff_vc1_init_common(v) < 0)
414 ff_blockdsp_init(&s->bdsp, avctx);
415 ff_h264chroma_init(&v->h264chroma, 8);
416 ff_qpeldsp_init(&s->qdsp);
418 if (avctx->codec_id == AV_CODEC_ID_WMV3 || avctx->codec_id == AV_CODEC_ID_WMV3IMAGE) {
421 // looks like WMV3 has a sequence header stored in the extradata
422 // advanced sequence header may be before the first frame
423 // the last byte of the extradata is a version number, 1 for the
424 // samples we can decode
426 init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
428 if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0)
431 count = avctx->extradata_size*8 - get_bits_count(&gb);
433 av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
434 count, get_bits_long(&gb, FFMIN(count, 32)));
435 } else if (count < 0) {
436 av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
438 } else { // VC1/WVC1/WVP2
439 const uint8_t *start = avctx->extradata;
440 uint8_t *end = avctx->extradata + avctx->extradata_size;
443 uint8_t *buf2 = NULL;
444 int seq_initialized = 0, ep_initialized = 0;
446 if (avctx->extradata_size < 16) {
447 av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
451 buf2 = av_mallocz(avctx->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
452 start = find_next_marker(start, end); // in WVC1 extradata first byte is its size, but can be 0 in mkv
454 for (; next < end; start = next) {
455 next = find_next_marker(start + 4, end);
456 size = next - start - 4;
459 buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
460 init_get_bits(&gb, buf2, buf2_size * 8);
461 switch (AV_RB32(start)) {
462 case VC1_CODE_SEQHDR:
463 if (ff_vc1_decode_sequence_header(avctx, v, &gb) < 0) {
469 case VC1_CODE_ENTRYPOINT:
470 if (ff_vc1_decode_entry_point(avctx, v, &gb) < 0) {
479 if (!seq_initialized || !ep_initialized) {
480 av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
483 v->res_sprite = (avctx->codec_id == AV_CODEC_ID_VC1IMAGE);
486 v->sprite_output_frame = av_frame_alloc();
487 if (!v->sprite_output_frame)
488 return AVERROR(ENOMEM);
490 avctx->profile = v->profile;
491 if (v->profile == PROFILE_ADVANCED)
492 avctx->level = v->level;
494 avctx->has_b_frames = !!avctx->max_b_frames;
496 if (v->color_prim == 1 || v->color_prim == 5 || v->color_prim == 6)
497 avctx->color_primaries = v->color_prim;
498 if (v->transfer_char == 1 || v->transfer_char == 7)
499 avctx->color_trc = v->transfer_char;
500 if (v->matrix_coef == 1 || v->matrix_coef == 6 || v->matrix_coef == 7)
501 avctx->colorspace = v->matrix_coef;
503 s->mb_width = (avctx->coded_width + 15) >> 4;
504 s->mb_height = (avctx->coded_height + 15) >> 4;
506 if (v->profile == PROFILE_ADVANCED || v->res_fasttx) {
507 ff_vc1_init_transposed_scantables(v);
509 memcpy(v->zz_8x8, ff_wmv1_scantable, 4*64);
514 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
515 v->sprite_width = avctx->coded_width;
516 v->sprite_height = avctx->coded_height;
518 avctx->coded_width = avctx->width = v->output_width;
519 avctx->coded_height = avctx->height = v->output_height;
521 // prevent 16.16 overflows
522 if (v->sprite_width > 1 << 14 ||
523 v->sprite_height > 1 << 14 ||
524 v->output_width > 1 << 14 ||
525 v->output_height > 1 << 14) return -1;
530 /** Close a VC1/WMV3 decoder
531 * @warning Initial try at using MpegEncContext stuff
533 av_cold int ff_vc1_decode_end(AVCodecContext *avctx)
535 VC1Context *v = avctx->priv_data;
538 av_frame_free(&v->sprite_output_frame);
540 for (i = 0; i < 4; i++)
541 av_freep(&v->sr_rows[i >> 1][i & 1]);
542 av_freep(&v->hrd_rate);
543 av_freep(&v->hrd_buffer);
544 ff_mpv_common_end(&v->s);
545 av_freep(&v->mv_type_mb_plane);
546 av_freep(&v->direct_mb_plane);
547 av_freep(&v->forward_mb_plane);
548 av_freep(&v->fieldtx_plane);
549 av_freep(&v->acpred_plane);
550 av_freep(&v->over_flags_plane);
551 av_freep(&v->mb_type_base);
552 av_freep(&v->blk_mv_type_base);
553 av_freep(&v->mv_f_base);
554 av_freep(&v->mv_f_next_base);
556 av_freep(&v->cbp_base);
557 av_freep(&v->ttblk_base);
558 av_freep(&v->is_intra_base); // FIXME use v->mb_type[]
559 av_freep(&v->luma_mv_base);
560 ff_intrax8_common_end(&v->x8);
565 /** Decode a VC1/WMV3 frame
566 * @todo TODO: Handle VC-1 IDUs (Transport level?)
568 static int vc1_decode_frame(AVCodecContext *avctx, void *data,
569 int *got_frame, AVPacket *avpkt)
571 const uint8_t *buf = avpkt->data;
572 int buf_size = avpkt->size, n_slices = 0, i, ret;
573 VC1Context *v = avctx->priv_data;
574 MpegEncContext *s = &v->s;
575 AVFrame *pict = data;
576 uint8_t *buf2 = NULL;
577 const uint8_t *buf_start = buf;
578 int mb_height, n_slices1;
583 } *slices = NULL, *tmp;
585 /* no supplementary picture */
586 if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == VC1_CODE_ENDOFSEQ)) {
587 /* special case for last picture */
588 if (s->low_delay == 0 && s->next_picture_ptr) {
589 if ((ret = av_frame_ref(pict, s->next_picture_ptr->f)) < 0)
591 s->next_picture_ptr = NULL;
599 //for advanced profile we may need to parse and unescape data
600 if (avctx->codec_id == AV_CODEC_ID_VC1 || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
602 buf2 = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
604 if (IS_MARKER(AV_RB32(buf))) { /* frame starts with marker and needs to be parsed */
605 const uint8_t *start, *end, *next;
609 for (start = buf, end = buf + buf_size; next < end; start = next) {
610 next = find_next_marker(start + 4, end);
611 size = next - start - 4;
612 if (size <= 0) continue;
613 switch (AV_RB32(start)) {
617 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
619 case VC1_CODE_FIELD: {
621 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
625 slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
626 if (!slices[n_slices].buf)
628 buf_size3 = vc1_unescape_buffer(start + 4, size,
629 slices[n_slices].buf);
630 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
632 /* assuming that the field marker is at the exact middle,
634 slices[n_slices].mby_start = s->mb_height >> 1;
635 n_slices1 = n_slices - 1; // index of the last slice of the first field
639 case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
640 buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
641 init_get_bits(&s->gb, buf2, buf_size2 * 8);
642 ff_vc1_decode_entry_point(avctx, v, &s->gb);
644 case VC1_CODE_SLICE: {
646 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
650 slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
651 if (!slices[n_slices].buf)
653 buf_size3 = vc1_unescape_buffer(start + 4, size,
654 slices[n_slices].buf);
655 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
657 slices[n_slices].mby_start = get_bits(&slices[n_slices].gb, 9);
663 } else if (v->interlace && ((buf[0] & 0xC0) == 0xC0)) { /* WVC1 interlaced stores both fields divided by marker */
664 const uint8_t *divider;
667 divider = find_next_marker(buf, buf + buf_size);
668 if ((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD) {
669 av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
671 } else { // found field marker, unescape second field
672 tmp = av_realloc(slices, sizeof(*slices) * (n_slices+1));
676 slices[n_slices].buf = av_mallocz(buf_size + AV_INPUT_BUFFER_PADDING_SIZE);
677 if (!slices[n_slices].buf)
679 buf_size3 = vc1_unescape_buffer(divider + 4, buf + buf_size - divider - 4, slices[n_slices].buf);
680 init_get_bits(&slices[n_slices].gb, slices[n_slices].buf,
682 slices[n_slices].mby_start = s->mb_height >> 1;
683 n_slices1 = n_slices - 1;
686 buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
688 buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
690 init_get_bits(&s->gb, buf2, buf_size2*8);
692 init_get_bits(&s->gb, buf, buf_size*8);
695 v->new_sprite = !get_bits1(&s->gb);
696 v->two_sprites = get_bits1(&s->gb);
697 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
698 we're using the sprite compositor. These are intentionally kept separate
699 so you can get the raw sprites by using the wmv3 decoder for WMVP or
700 the vc1 one for WVP2 */
701 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
703 // switch AVCodecContext parameters to those of the sprites
704 avctx->width = avctx->coded_width = v->sprite_width;
705 avctx->height = avctx->coded_height = v->sprite_height;
712 if (s->context_initialized &&
713 (s->width != avctx->coded_width ||
714 s->height != avctx->coded_height)) {
715 ff_vc1_decode_end(avctx);
718 if (!s->context_initialized) {
719 if (ff_msmpeg4_decode_init(avctx) < 0)
721 if (ff_vc1_decode_init_alloc_tables(v) < 0) {
722 ff_mpv_common_end(s);
726 s->low_delay = !avctx->has_b_frames || v->res_sprite;
728 if (v->profile == PROFILE_ADVANCED) {
729 s->h_edge_pos = avctx->coded_width;
730 s->v_edge_pos = avctx->coded_height;
734 // do parse frame header
735 v->pic_header_flag = 0;
736 v->first_pic_header_flag = 1;
737 if (v->profile < PROFILE_ADVANCED) {
738 if (ff_vc1_parse_frame_header(v, &s->gb) < 0) {
742 if (ff_vc1_parse_frame_header_adv(v, &s->gb) < 0) {
746 v->first_pic_header_flag = 0;
748 if ((avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE)
749 && s->pict_type != AV_PICTURE_TYPE_I) {
750 av_log(v->s.avctx, AV_LOG_ERROR, "Sprite decoder: expected I-frame\n");
754 // for skipping the frame
755 s->current_picture.f->pict_type = s->pict_type;
756 s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
758 /* skip B-frames if we don't have reference frames */
759 if (!s->last_picture_ptr && (s->pict_type == AV_PICTURE_TYPE_B || s->droppable)) {
762 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) ||
763 (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) ||
764 avctx->skip_frame >= AVDISCARD_ALL) {
768 if (s->next_p_frame_damaged) {
769 if (s->pict_type == AV_PICTURE_TYPE_B)
772 s->next_p_frame_damaged = 0;
775 if (ff_mpv_frame_start(s, avctx) < 0) {
779 // process pulldown flags
780 s->current_picture_ptr->f->repeat_pict = 0;
781 // Pulldown flags are only valid when 'broadcast' has been set.
782 // So ticks_per_frame will be 2
785 s->current_picture_ptr->f->repeat_pict = 1;
786 } else if (v->rptfrm) {
788 s->current_picture_ptr->f->repeat_pict = v->rptfrm * 2;
791 s->me.qpel_put = s->qdsp.put_qpel_pixels_tab;
792 s->me.qpel_avg = s->qdsp.avg_qpel_pixels_tab;
794 if (avctx->hwaccel) {
795 if (avctx->hwaccel->start_frame(avctx, buf, buf_size) < 0)
797 if (avctx->hwaccel->decode_slice(avctx, buf_start, (buf + buf_size) - buf_start) < 0)
799 if (avctx->hwaccel->end_frame(avctx) < 0)
804 ff_mpeg_er_frame_start(s);
806 v->bits = buf_size * 8;
807 v->end_mb_x = s->mb_width;
809 s->current_picture.f->linesize[0] <<= 1;
810 s->current_picture.f->linesize[1] <<= 1;
811 s->current_picture.f->linesize[2] <<= 1;
815 mb_height = s->mb_height >> v->field_mode;
818 av_log(v->s.avctx, AV_LOG_ERROR, "Invalid mb_height.\n");
822 for (i = 0; i <= n_slices; i++) {
823 if (i > 0 && slices[i - 1].mby_start >= mb_height) {
824 if (v->field_mode <= 0) {
825 av_log(v->s.avctx, AV_LOG_ERROR, "Slice %d starts beyond "
826 "picture boundary (%d >= %d)\n", i,
827 slices[i - 1].mby_start, mb_height);
831 v->blocks_off = s->mb_width * s->mb_height << 1;
832 v->mb_off = s->mb_stride * s->mb_height >> 1;
839 v->pic_header_flag = 0;
840 if (v->field_mode && i == n_slices1 + 2) {
841 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
842 av_log(v->s.avctx, AV_LOG_ERROR, "Field header damaged\n");
843 if (avctx->err_recognition & AV_EF_EXPLODE)
847 } else if (get_bits1(&s->gb)) {
848 v->pic_header_flag = 1;
849 if ((header_ret = ff_vc1_parse_frame_header_adv(v, &s->gb)) < 0) {
850 av_log(v->s.avctx, AV_LOG_ERROR, "Slice header damaged\n");
851 if (avctx->err_recognition & AV_EF_EXPLODE)
859 s->start_mb_y = (i == 0) ? 0 : FFMAX(0, slices[i-1].mby_start % mb_height);
860 if (!v->field_mode || v->second_field)
861 s->end_mb_y = (i == n_slices ) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
863 s->end_mb_y = (i <= n_slices1 + 1) ? mb_height : FFMIN(mb_height, slices[i].mby_start % mb_height);
864 ff_vc1_decode_blocks(v);
866 s->gb = slices[i].gb;
870 s->current_picture.f->linesize[0] >>= 1;
871 s->current_picture.f->linesize[1] >>= 1;
872 s->current_picture.f->linesize[2] >>= 1;
875 if (v->s.pict_type != AV_PICTURE_TYPE_BI && v->s.pict_type != AV_PICTURE_TYPE_B) {
876 FFSWAP(uint8_t *, v->mv_f_next[0], v->mv_f[0]);
877 FFSWAP(uint8_t *, v->mv_f_next[1], v->mv_f[1]);
880 ff_dlog(s->avctx, "Consumed %i/%i bits\n",
881 get_bits_count(&s->gb), s->gb.size_in_bits);
882 // if (get_bits_count(&s->gb) > buf_size * 8)
885 ff_er_frame_end(&s->er);
890 if (avctx->codec_id == AV_CODEC_ID_WMV3IMAGE || avctx->codec_id == AV_CODEC_ID_VC1IMAGE) {
892 avctx->width = avctx->coded_width = v->output_width;
893 avctx->height = avctx->coded_height = v->output_height;
894 if (avctx->skip_frame >= AVDISCARD_NONREF)
896 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
897 if (vc1_decode_sprites(v, &s->gb))
900 if ((ret = av_frame_ref(pict, v->sprite_output_frame)) < 0)
904 if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
905 if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0)
907 ff_print_debug_info(s, s->current_picture_ptr);
909 } else if (s->last_picture_ptr) {
910 if ((ret = av_frame_ref(pict, s->last_picture_ptr->f)) < 0)
912 ff_print_debug_info(s, s->last_picture_ptr);
919 for (i = 0; i < n_slices; i++)
920 av_free(slices[i].buf);
926 for (i = 0; i < n_slices; i++)
927 av_free(slices[i].buf);
933 static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
934 #if CONFIG_VC1_DXVA2_HWACCEL
935 AV_PIX_FMT_DXVA2_VLD,
937 #if CONFIG_VC1_D3D11VA_HWACCEL
938 AV_PIX_FMT_D3D11VA_VLD,
940 #if CONFIG_VC1_VAAPI_HWACCEL
941 AV_PIX_FMT_VAAPI_VLD,
943 #if CONFIG_VC1_VDPAU_HWACCEL
950 AVCodec ff_vc1_decoder = {
952 .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
953 .type = AVMEDIA_TYPE_VIDEO,
954 .id = AV_CODEC_ID_VC1,
955 .priv_data_size = sizeof(VC1Context),
956 .init = vc1_decode_init,
957 .close = ff_vc1_decode_end,
958 .decode = vc1_decode_frame,
959 .flush = ff_mpeg_flush,
960 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
961 .pix_fmts = vc1_hwaccel_pixfmt_list_420,
962 .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
965 #if CONFIG_WMV3_DECODER
966 AVCodec ff_wmv3_decoder = {
968 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
969 .type = AVMEDIA_TYPE_VIDEO,
970 .id = AV_CODEC_ID_WMV3,
971 .priv_data_size = sizeof(VC1Context),
972 .init = vc1_decode_init,
973 .close = ff_vc1_decode_end,
974 .decode = vc1_decode_frame,
975 .flush = ff_mpeg_flush,
976 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY,
977 .pix_fmts = vc1_hwaccel_pixfmt_list_420,
978 .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles)
982 #if CONFIG_WMV3IMAGE_DECODER
983 AVCodec ff_wmv3image_decoder = {
985 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image"),
986 .type = AVMEDIA_TYPE_VIDEO,
987 .id = AV_CODEC_ID_WMV3IMAGE,
988 .priv_data_size = sizeof(VC1Context),
989 .init = vc1_decode_init,
990 .close = ff_vc1_decode_end,
991 .decode = vc1_decode_frame,
992 .capabilities = AV_CODEC_CAP_DR1,
993 .flush = vc1_sprite_flush,
994 .pix_fmts = (const enum AVPixelFormat[]) {
1001 #if CONFIG_VC1IMAGE_DECODER
1002 AVCodec ff_vc1image_decoder = {
1004 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9 Image v2"),
1005 .type = AVMEDIA_TYPE_VIDEO,
1006 .id = AV_CODEC_ID_VC1IMAGE,
1007 .priv_data_size = sizeof(VC1Context),
1008 .init = vc1_decode_init,
1009 .close = ff_vc1_decode_end,
1010 .decode = vc1_decode_frame,
1011 .capabilities = AV_CODEC_CAP_DR1,
1012 .flush = vc1_sprite_flush,
1013 .pix_fmts = (const enum AVPixelFormat[]) {