2 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
4 * This file is part of Libav.
6 * Libav is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * Libav is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * Microsoft Screen 2 (aka Windows Media Video V9 Screen) decoder
26 #include "libavutil/avassert.h"
27 #include "error_resilience.h"
37 typedef struct MSS2Context
{
47 static void arith2_normalise(ArithCoder
*c
)
49 while ((c
->high
>> 15) - (c
->low
>> 15) < 2) {
50 if ((c
->low
^ c
->high
) & 0x10000) {
55 c
->high
= c
->high
<< 8 & 0xFFFFFF | 0xFF;
56 c
->value
= c
->value
<< 8 & 0xFFFFFF | bytestream2_get_byte(c
->gbc
.gB
);
57 c
->low
= c
->low
<< 8 & 0xFFFFFF;
63 /* L. Stuiver and A. Moffat: "Piecewise Integer Mapping for Arithmetic Coding."
64 * In Proc. 8th Data Compression Conference (DCC '98), pp. 3-12, Mar. 1998 */
66 static int arith2_get_scaled_value(int value
, int n
, int range
)
68 int split
= (n
<< 1) - range
;
71 return split
+ (value
- split
>> 1);
76 static void arith2_rescale_interval(ArithCoder
*c
, int range
,
77 int low
, int high
, int n
)
79 int split
= (n
<< 1) - range
;
82 c
->high
= split
+ (high
- split
<< 1);
86 c
->high
+= c
->low
- 1;
89 c
->low
+= split
+ (low
- split
<< 1);
94 static int arith2_get_number(ArithCoder
*c
, int n
)
96 int range
= c
->high
- c
->low
+ 1;
97 int scale
= av_log2(range
) - av_log2(n
);
100 if (n
<< scale
> range
)
105 val
= arith2_get_scaled_value(c
->value
- c
->low
, n
, range
) >> scale
;
107 arith2_rescale_interval(c
, range
, val
<< scale
, (val
+ 1) << scale
, n
);
114 static int arith2_get_prob(ArithCoder
*c
, int16_t *probs
)
116 int range
= c
->high
- c
->low
+ 1, n
= *probs
;
117 int scale
= av_log2(range
) - av_log2(n
);
120 if (n
<< scale
> range
)
125 val
= arith2_get_scaled_value(c
->value
- c
->low
, n
, range
) >> scale
;
126 while (probs
[++i
] > val
) ;
128 arith2_rescale_interval(c
, range
,
129 probs
[i
] << scale
, probs
[i
- 1] << scale
, n
);
134 ARITH_GET_MODEL_SYM(2)
136 static int arith2_get_consumed_bytes(ArithCoder
*c
)
138 int diff
= (c
->high
>> 16) - (c
->low
>> 16);
139 int bp
= bytestream2_tell(c
->gbc
.gB
) - 3 << 3;
142 while (!(diff
& 0x80)) {
147 return (bits
+ bp
+ 7 >> 3) + ((c
->low
>> 16) + 1 == c
->high
>> 16);
150 static void arith2_init(ArithCoder
*c
, GetByteContext
*gB
)
154 c
->value
= bytestream2_get_be24(gB
);
156 c
->get_model_sym
= arith2_get_model_sym
;
157 c
->get_number
= arith2_get_number
;
160 static int decode_pal_v2(MSS12Context
*ctx
, const uint8_t *buf
, int buf_size
)
163 uint32_t *pal
= ctx
->pal
+ 256 - ctx
->free_colours
;
165 if (!ctx
->free_colours
)
169 if (ncol
> ctx
->free_colours
|| buf_size
< 2 + ncol
* 3)
170 return AVERROR_INVALIDDATA
;
171 for (i
= 0; i
< ncol
; i
++)
172 *pal
++ = AV_RB24(buf
+ 3 * i
);
177 static int decode_555(GetByteContext
*gB
, uint16_t *dst
, ptrdiff_t stride
,
178 int keyframe
, int w
, int h
)
180 int last_symbol
= 0, repeat
= 0, prev_avail
= 0;
183 int x
, y
, endx
, endy
, t
;
185 #define READ_PAIR(a, b) \
186 a = bytestream2_get_byte(gB) << 4; \
187 t = bytestream2_get_byte(gB); \
189 b = (t & 0xF) << 8; \
190 b |= bytestream2_get_byte(gB); \
195 if (endx
>= w
|| endy
>= h
|| x
> endx
|| y
> endy
)
196 return AVERROR_INVALIDDATA
;
197 dst
+= x
+ stride
* y
;
208 int b
= bytestream2_get_byte(gB
);
210 last_symbol
= b
<< 8 | bytestream2_get_byte(gB
);
214 repeat
= (repeat
<< 8) + bytestream2_get_byte(gB
) + 1;
215 if (last_symbol
== -2) {
216 int skip
= FFMIN((unsigned)repeat
, dst
+ w
- p
);
221 last_symbol
= 127 - b
;
223 if (last_symbol
>= 0)
225 else if (last_symbol
== -1 && prev_avail
)
227 } while (++p
< dst
+ w
);
235 static int decode_rle(GetBitContext
*gb
, uint8_t *pal_dst
, ptrdiff_t pal_stride
,
236 uint8_t *rgb_dst
, ptrdiff_t rgb_stride
, uint32_t *pal
,
237 int keyframe
, int kf_slipt
, int slice
, int w
, int h
)
239 uint8_t bits
[270] = { 0 };
243 int current_length
= 0, read_codes
= 0, next_code
= 0, current_codes
= 0;
244 int remaining_codes
, surplus_codes
, i
;
246 const int alphabet_size
= 270 - keyframe
;
248 int last_symbol
= 0, repeat
= 0, prev_avail
= 0;
251 int x
, y
, clipw
, cliph
;
253 x
= get_bits(gb
, 12);
254 y
= get_bits(gb
, 12);
255 clipw
= get_bits(gb
, 12) + 1;
256 cliph
= get_bits(gb
, 12) + 1;
258 if (x
+ clipw
> w
|| y
+ cliph
> h
)
259 return AVERROR_INVALIDDATA
;
260 pal_dst
+= pal_stride
* y
+ x
;
261 rgb_dst
+= rgb_stride
* y
+ x
* 3;
268 pal_dst
+= pal_stride
* kf_slipt
;
269 rgb_dst
+= rgb_stride
* kf_slipt
;
276 /* read explicit codes */
278 while (current_codes
--) {
279 int symbol
= get_bits(gb
, 8);
280 if (symbol
>= 204 - keyframe
)
281 symbol
+= 14 - keyframe
;
282 else if (symbol
> 189)
283 symbol
= get_bits1(gb
) + (symbol
<< 1) - 190;
285 return AVERROR_INVALIDDATA
;
286 bits
[symbol
] = current_length
;
287 codes
[symbol
] = next_code
++;
292 remaining_codes
= (1 << current_length
) - next_code
;
293 current_codes
= get_bits(gb
, av_ceil_log2(remaining_codes
+ 1));
294 if (current_length
> 22 || current_codes
> remaining_codes
)
295 return AVERROR_INVALIDDATA
;
296 } while (current_codes
!= remaining_codes
);
298 remaining_codes
= alphabet_size
- read_codes
;
300 /* determine the minimum length to fit the rest of the alphabet */
301 while ((surplus_codes
= (2 << current_length
) -
302 (next_code
<< 1) - remaining_codes
) < 0) {
307 /* add the rest of the symbols lexicographically */
308 for (i
= 0; i
< alphabet_size
; i
++)
310 if (surplus_codes
-- == 0) {
314 bits
[i
] = current_length
;
315 codes
[i
] = next_code
++;
318 if (next_code
!= 1 << current_length
)
319 return AVERROR_INVALIDDATA
;
321 if (i
= init_vlc(&vlc
, 9, alphabet_size
, bits
, 1, 1, codes
, 4, 4, 0))
326 uint8_t *pp
= pal_dst
;
327 uint8_t *rp
= rgb_dst
;
330 int b
= get_vlc2(gb
, vlc
.table
, 9, 3);
336 b
= get_bits(gb
, 4) + 10;
341 repeat
= get_bits(gb
, b
);
343 repeat
+= (1 << b
) - 1;
345 if (last_symbol
== -2) {
346 int skip
= FFMIN(repeat
, pal_dst
+ w
- pp
);
352 last_symbol
= 267 - b
;
354 if (last_symbol
>= 0) {
356 AV_WB24(rp
, pal
[last_symbol
]);
357 } else if (last_symbol
== -1 && prev_avail
) {
358 *pp
= *(pp
- pal_stride
);
359 memcpy(rp
, rp
- rgb_stride
, 3);
362 } while (++pp
< pal_dst
+ w
);
363 pal_dst
+= pal_stride
;
364 rgb_dst
+= rgb_stride
;
372 static int decode_wmv9(AVCodecContext
*avctx
, const uint8_t *buf
, int buf_size
,
373 int x
, int y
, int w
, int h
, int wmv9_mask
)
375 MSS2Context
*ctx
= avctx
->priv_data
;
376 MSS12Context
*c
= &ctx
->c
;
377 VC1Context
*v
= avctx
->priv_data
;
378 MpegEncContext
*s
= &v
->s
;
382 ff_mpeg_flush(avctx
);
384 init_get_bits(&s
->gb
, buf
, buf_size
* 8);
386 s
->loop_filter
= avctx
->skip_loop_filter
< AVDISCARD_ALL
;
388 if (ff_vc1_parse_frame_header(v
, &s
->gb
) < 0) {
389 av_log(v
->s
.avctx
, AV_LOG_ERROR
, "header error\n");
390 return AVERROR_INVALIDDATA
;
393 if (s
->pict_type
!= AV_PICTURE_TYPE_I
) {
394 av_log(v
->s
.avctx
, AV_LOG_ERROR
, "expected I-frame\n");
395 return AVERROR_INVALIDDATA
;
398 avctx
->pix_fmt
= AV_PIX_FMT_YUV420P
;
400 if ((ret
= ff_mpv_frame_start(s
, avctx
)) < 0) {
401 av_log(v
->s
.avctx
, AV_LOG_ERROR
, "ff_mpv_frame_start error\n");
402 avctx
->pix_fmt
= AV_PIX_FMT_RGB24
;
406 ff_mpeg_er_frame_start(s
);
408 v
->bits
= buf_size
* 8;
410 v
->end_mb_x
= (w
+ 15) >> 4;
411 s
->end_mb_y
= (h
+ 15) >> 4;
413 v
->end_mb_x
= v
->end_mb_x
+ 1 >> 1;
415 s
->end_mb_y
= s
->end_mb_y
+ 1 >> 1;
417 ff_vc1_decode_blocks(v
);
419 if (v
->end_mb_x
== s
->mb_width
&& s
->end_mb_y
== s
->mb_height
) {
420 ff_er_frame_end(&s
->er
);
422 av_log(v
->s
.avctx
, AV_LOG_WARNING
,
423 "disabling error correction due to block count mismatch %dx%d != %dx%d\n",
424 v
->end_mb_x
, s
->end_mb_y
, s
->mb_width
, s
->mb_height
);
429 f
= s
->current_picture
.f
;
431 if (v
->respic
== 3) {
432 ctx
->dsp
.upsample_plane(f
->data
[0], f
->linesize
[0], w
, h
);
433 ctx
->dsp
.upsample_plane(f
->data
[1], f
->linesize
[1], w
>> 1, h
>> 1);
434 ctx
->dsp
.upsample_plane(f
->data
[2], f
->linesize
[2], w
>> 1, h
>> 1);
435 } else if (v
->respic
)
436 avpriv_request_sample(v
->s
.avctx
,
437 "Asymmetric WMV9 rectangle subsampling");
439 av_assert0(f
->linesize
[1] == f
->linesize
[2]);
442 ctx
->dsp
.mss2_blit_wmv9_masked(c
->rgb_pic
+ y
* c
->rgb_stride
+ x
* 3,
443 c
->rgb_stride
, wmv9_mask
,
444 c
->pal_pic
+ y
* c
->pal_stride
+ x
,
446 f
->data
[0], f
->linesize
[0],
447 f
->data
[1], f
->data
[2], f
->linesize
[1],
450 ctx
->dsp
.mss2_blit_wmv9(c
->rgb_pic
+ y
* c
->rgb_stride
+ x
* 3,
452 f
->data
[0], f
->linesize
[0],
453 f
->data
[1], f
->data
[2], f
->linesize
[1],
456 avctx
->pix_fmt
= AV_PIX_FMT_RGB24
;
461 typedef struct Rectangle
{
462 int coded
, x
, y
, w
, h
;
465 #define MAX_WMV9_RECTANGLES 20
466 #define ARITH2_PADDING 2
468 static int mss2_decode_frame(AVCodecContext
*avctx
, void *data
, int *got_frame
,
471 const uint8_t *buf
= avpkt
->data
;
472 int buf_size
= avpkt
->size
;
473 MSS2Context
*ctx
= avctx
->priv_data
;
474 MSS12Context
*c
= &ctx
->c
;
475 AVFrame
*frame
= data
;
480 int keyframe
, has_wmv9
, has_mv
, is_rle
, is_555
, ret
;
482 Rectangle wmv9rects
[MAX_WMV9_RECTANGLES
], *r
;
483 int used_rects
= 0, i
, implicit_rect
= 0, av_uninit(wmv9_mask
);
485 init_get_bits(&gb
, buf
, buf_size
* 8);
487 if (keyframe
= get_bits1(&gb
))
489 has_wmv9
= get_bits1(&gb
);
490 has_mv
= keyframe
? 0 : get_bits1(&gb
);
491 is_rle
= get_bits1(&gb
);
492 is_555
= is_rle
&& get_bits1(&gb
);
493 if (c
->slice_split
> 0)
494 ctx
->split_position
= c
->slice_split
;
495 else if (c
->slice_split
< 0) {
496 if (get_bits1(&gb
)) {
497 if (get_bits1(&gb
)) {
499 ctx
->split_position
= get_bits(&gb
, 16);
501 ctx
->split_position
= get_bits(&gb
, 12);
503 ctx
->split_position
= get_bits(&gb
, 8) << 4;
506 ctx
->split_position
= avctx
->height
/ 2;
509 ctx
->split_position
= avctx
->height
;
511 if (c
->slice_split
&& (ctx
->split_position
< 1 - is_555
||
512 ctx
->split_position
> avctx
->height
- 1))
513 return AVERROR_INVALIDDATA
;
516 buf
+= get_bits_count(&gb
) >> 3;
517 buf_size
-= get_bits_count(&gb
) >> 3;
520 return AVERROR_INVALIDDATA
;
522 if (is_555
&& (has_wmv9
|| has_mv
|| c
->slice_split
&& ctx
->split_position
))
523 return AVERROR_INVALIDDATA
;
525 avctx
->pix_fmt
= is_555
? AV_PIX_FMT_RGB555
: AV_PIX_FMT_RGB24
;
526 if (ctx
->last_pic
->format
!= avctx
->pix_fmt
)
527 av_frame_unref(ctx
->last_pic
);
530 bytestream2_init(&gB
, buf
, buf_size
+ ARITH2_PADDING
);
531 arith2_init(&acoder
, &gB
);
533 implicit_rect
= !arith2_get_bit(&acoder
);
535 while (arith2_get_bit(&acoder
)) {
536 if (used_rects
== MAX_WMV9_RECTANGLES
)
537 return AVERROR_INVALIDDATA
;
538 r
= &wmv9rects
[used_rects
];
540 r
->x
= arith2_get_number(&acoder
, avctx
->width
);
542 r
->x
= arith2_get_number(&acoder
, avctx
->width
-
543 wmv9rects
[used_rects
- 1].x
) +
544 wmv9rects
[used_rects
- 1].x
;
545 r
->y
= arith2_get_number(&acoder
, avctx
->height
);
546 r
->w
= arith2_get_number(&acoder
, avctx
->width
- r
->x
) + 1;
547 r
->h
= arith2_get_number(&acoder
, avctx
->height
- r
->y
) + 1;
551 if (implicit_rect
&& used_rects
) {
552 av_log(avctx
, AV_LOG_ERROR
, "implicit_rect && used_rects > 0\n");
553 return AVERROR_INVALIDDATA
;
559 wmv9rects
[0].w
= avctx
->width
;
560 wmv9rects
[0].h
= avctx
->height
;
564 for (i
= 0; i
< used_rects
; i
++) {
565 if (!implicit_rect
&& arith2_get_bit(&acoder
)) {
566 av_log(avctx
, AV_LOG_ERROR
, "Unexpected grandchildren\n");
567 return AVERROR_INVALIDDATA
;
570 wmv9_mask
= arith2_get_bit(&acoder
) - 1;
572 wmv9_mask
= arith2_get_number(&acoder
, 256);
574 wmv9rects
[i
].coded
= arith2_get_number(&acoder
, 2);
577 buf
+= arith2_get_consumed_bytes(&acoder
);
578 buf_size
-= arith2_get_consumed_bytes(&acoder
);
580 return AVERROR_INVALIDDATA
;
584 if (keyframe
&& !is_555
) {
585 if ((i
= decode_pal_v2(c
, buf
, buf_size
)) < 0)
586 return AVERROR_INVALIDDATA
;
593 return AVERROR_INVALIDDATA
;
594 c
->mvX
= AV_RB16(buf
- 4) - avctx
->width
;
595 c
->mvY
= AV_RB16(buf
- 2) - avctx
->height
;
598 if (c
->mvX
< 0 || c
->mvY
< 0) {
599 FFSWAP(uint8_t *, c
->pal_pic
, c
->last_pal_pic
);
601 if ((ret
= ff_get_buffer(avctx
, frame
, AV_GET_BUFFER_FLAG_REF
)) < 0) {
602 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
606 if (ctx
->last_pic
->data
[0]) {
607 av_assert0(frame
->linesize
[0] == ctx
->last_pic
->linesize
[0]);
608 c
->last_rgb_pic
= ctx
->last_pic
->data
[0] +
609 ctx
->last_pic
->linesize
[0] * (avctx
->height
- 1);
611 av_log(avctx
, AV_LOG_ERROR
, "Missing keyframe\n");
612 return AVERROR_INVALIDDATA
;
615 if ((ret
= ff_reget_buffer(avctx
, ctx
->last_pic
)) < 0) {
616 av_log(avctx
, AV_LOG_ERROR
, "reget_buffer() failed\n");
619 if ((ret
= av_frame_ref(frame
, ctx
->last_pic
)) < 0)
622 c
->last_rgb_pic
= NULL
;
624 c
->rgb_pic
= frame
->data
[0] +
625 frame
->linesize
[0] * (avctx
->height
- 1);
626 c
->rgb_stride
= -frame
->linesize
[0];
628 frame
->key_frame
= keyframe
;
629 frame
->pict_type
= keyframe
? AV_PICTURE_TYPE_I
: AV_PICTURE_TYPE_P
;
632 bytestream2_init(&gB
, buf
, buf_size
);
634 if (decode_555(&gB
, (uint16_t *)c
->rgb_pic
, c
->rgb_stride
>> 1,
635 keyframe
, avctx
->width
, avctx
->height
))
636 return AVERROR_INVALIDDATA
;
638 buf_size
-= bytestream2_tell(&gB
);
642 ff_mss12_slicecontext_reset(&ctx
->sc
[0]);
644 ff_mss12_slicecontext_reset(&ctx
->sc
[1]);
647 init_get_bits(&gb
, buf
, buf_size
* 8);
648 if (ret
= decode_rle(&gb
, c
->pal_pic
, c
->pal_stride
,
649 c
->rgb_pic
, c
->rgb_stride
, c
->pal
, keyframe
,
650 ctx
->split_position
, 0,
651 avctx
->width
, avctx
->height
))
656 if (ret
= decode_rle(&gb
, c
->pal_pic
, c
->pal_stride
,
657 c
->rgb_pic
, c
->rgb_stride
, c
->pal
, keyframe
,
658 ctx
->split_position
, 1,
659 avctx
->width
, avctx
->height
))
663 buf
+= get_bits_count(&gb
) >> 3;
664 buf_size
-= get_bits_count(&gb
) >> 3;
665 } else if (!implicit_rect
|| wmv9_mask
!= -1) {
667 return AVERROR_INVALIDDATA
;
668 bytestream2_init(&gB
, buf
, buf_size
+ ARITH2_PADDING
);
669 arith2_init(&acoder
, &gB
);
670 c
->keyframe
= keyframe
;
671 if (c
->corrupted
= ff_mss12_decode_rect(&ctx
->sc
[0], &acoder
, 0, 0,
673 ctx
->split_position
))
674 return AVERROR_INVALIDDATA
;
676 buf
+= arith2_get_consumed_bytes(&acoder
);
677 buf_size
-= arith2_get_consumed_bytes(&acoder
);
678 if (c
->slice_split
) {
680 return AVERROR_INVALIDDATA
;
681 bytestream2_init(&gB
, buf
, buf_size
+ ARITH2_PADDING
);
682 arith2_init(&acoder
, &gB
);
683 if (c
->corrupted
= ff_mss12_decode_rect(&ctx
->sc
[1], &acoder
, 0,
686 avctx
->height
- ctx
->split_position
))
687 return AVERROR_INVALIDDATA
;
689 buf
+= arith2_get_consumed_bytes(&acoder
);
690 buf_size
-= arith2_get_consumed_bytes(&acoder
);
693 memset(c
->pal_pic
, 0, c
->pal_stride
* avctx
->height
);
697 for (i
= 0; i
< used_rects
; i
++) {
698 int x
= wmv9rects
[i
].x
;
699 int y
= wmv9rects
[i
].y
;
700 int w
= wmv9rects
[i
].w
;
701 int h
= wmv9rects
[i
].h
;
702 if (wmv9rects
[i
].coded
) {
703 int WMV9codedFrameSize
;
704 if (buf_size
< 4 || !(WMV9codedFrameSize
= AV_RL24(buf
)))
705 return AVERROR_INVALIDDATA
;
706 if (ret
= decode_wmv9(avctx
, buf
+ 3, buf_size
- 3,
707 x
, y
, w
, h
, wmv9_mask
))
709 buf
+= WMV9codedFrameSize
+ 3;
710 buf_size
-= WMV9codedFrameSize
+ 3;
712 uint8_t *dst
= c
->rgb_pic
+ y
* c
->rgb_stride
+ x
* 3;
713 if (wmv9_mask
!= -1) {
714 ctx
->dsp
.mss2_gray_fill_masked(dst
, c
->rgb_stride
,
716 c
->pal_pic
+ y
* c
->pal_stride
+ x
,
721 memset(dst
, 0x80, w
* 3);
722 dst
+= c
->rgb_stride
;
730 av_log(avctx
, AV_LOG_WARNING
, "buffer not fully consumed\n");
732 if (c
->mvX
< 0 || c
->mvY
< 0) {
733 av_frame_unref(ctx
->last_pic
);
734 ret
= av_frame_ref(ctx
->last_pic
, frame
);
744 static av_cold
int wmv9_init(AVCodecContext
*avctx
)
746 VC1Context
*v
= avctx
->priv_data
;
751 if ((ret
= ff_vc1_init_common(v
)) < 0)
753 ff_vc1dsp_init(&v
->vc1dsp
);
755 v
->profile
= PROFILE_MAIN
;
757 v
->zz_8x4
= ff_wmv2_scantableA
;
758 v
->zz_4x8
= ff_wmv2_scantableB
;
762 v
->frmrtq_postproc
= 7;
763 v
->bitrtq_postproc
= 31;
780 v
->resync_marker
= 0;
783 v
->s
.max_b_frames
= avctx
->max_b_frames
= 0;
784 v
->quantizer_mode
= 0;
790 ff_vc1_init_transposed_scantables(v
);
792 if ((ret
= ff_msmpeg4_decode_init(avctx
)) < 0 ||
793 (ret
= ff_vc1_decode_init_alloc_tables(v
)) < 0)
796 /* error concealment */
797 v
->s
.me
.qpel_put
= v
->s
.qdsp
.put_qpel_pixels_tab
;
798 v
->s
.me
.qpel_avg
= v
->s
.qdsp
.avg_qpel_pixels_tab
;
803 static av_cold
int mss2_decode_end(AVCodecContext
*avctx
)
805 MSS2Context
*const ctx
= avctx
->priv_data
;
807 av_frame_free(&ctx
->last_pic
);
809 ff_mss12_decode_end(&ctx
->c
);
810 av_freep(&ctx
->c
.pal_pic
);
811 av_freep(&ctx
->c
.last_pal_pic
);
812 ff_vc1_decode_end(avctx
);
817 static av_cold
int mss2_decode_init(AVCodecContext
*avctx
)
819 MSS2Context
* const ctx
= avctx
->priv_data
;
820 MSS12Context
*c
= &ctx
->c
;
823 if (ret
= ff_mss12_decode_init(c
, 1, &ctx
->sc
[0], &ctx
->sc
[1]))
825 c
->pal_stride
= c
->mask_stride
;
826 c
->pal_pic
= av_mallocz(c
->pal_stride
* avctx
->height
);
827 c
->last_pal_pic
= av_mallocz(c
->pal_stride
* avctx
->height
);
828 if (!c
->pal_pic
|| !c
->last_pal_pic
) {
829 mss2_decode_end(avctx
);
830 return AVERROR(ENOMEM
);
832 if (ret
= wmv9_init(avctx
)) {
833 mss2_decode_end(avctx
);
836 ff_mss2dsp_init(&ctx
->dsp
);
837 ff_qpeldsp_init(&ctx
->qdsp
);
839 avctx
->pix_fmt
= c
->free_colours
== 127 ? AV_PIX_FMT_RGB555
842 ctx
->last_pic
= av_frame_alloc();
843 if (!ctx
->last_pic
) {
844 mss2_decode_end(avctx
);
845 return AVERROR(ENOMEM
);
851 AVCodec ff_mss2_decoder
= {
853 .long_name
= NULL_IF_CONFIG_SMALL("MS Windows Media Video V9 Screen"),
854 .type
= AVMEDIA_TYPE_VIDEO
,
855 .id
= AV_CODEC_ID_MSS2
,
856 .priv_data_size
= sizeof(MSS2Context
),
857 .init
= mss2_decode_init
,
858 .close
= mss2_decode_end
,
859 .decode
= mss2_decode_frame
,
860 .capabilities
= AV_CODEC_CAP_DR1
,