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
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
81 typedef struct SpriteData {
82 /**
83 * Transform coefficients for both sprites in 16.16 fixed point format,
84 * in the order they appear in the bitstream:
85 * x scale
86 * rotation 1 (unused)
87 * x offset
88 * rotation 2 (unused)
89 * y scale
90 * y offset
91 * alpha
92 */
93 int coefs[2][7];
94
95 int effect_type, effect_flag;
96 int effect_pcount1, effect_pcount2; ///< amount of effect parameters stored in effect_params
97 int effect_params1[15], effect_params2[10]; ///< effect parameters in 16.16 fixed point format
98 } SpriteData;
99
101 {
103 }
104
105 static void vc1_sprite_parse_transform(
GetBitContext* gb,
int c[7])
106 {
108
110 case 0:
112 c[2] = get_fp_val(gb);
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);
134 c[6] = get_fp_val(gb);
135 else
137 }
138
140 {
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])
149 for (
i = 0;
i < 7;
i++)
151 sd->coefs[sprite][
i] / (1<<16),
152 (
abs(sd->coefs[sprite][
i]) & 0xFFFF) * 1000 / (1 << 16));
154 }
155
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
173 for (
i = 0;
i < sd->effect_pcount1;
i++)
175 sd->effect_params1[
i] / (1 << 16),
176 (
abs(sd->effect_params1[
i]) & 0xFFFF) * 1000 / (1 << 16));
178 }
179
180 sd->effect_pcount2 =
get_bits(gb, 16);
181 if (sd->effect_pcount2 > 10) {
184 } else if (sd->effect_pcount2) {
187 while (++i < sd->effect_pcount2) {
188 sd->effect_params2[
i] = get_fp_val(gb);
190 sd->effect_params2[
i] / (1 << 16),
191 (
abs(sd->effect_params2[
i]) & 0xFFFF) * 1000 / (1 << 16));
192 }
194 }
195 }
198
203 }
206
207 return 0;
208 }
209
210 static void vc1_draw_sprites(
VC1Context *v, SpriteData* sd)
211 {
212 int i, plane, row, sprite;
213 int sr_cache[2][2] = { { -1, -1 }, { -1, -1 } };
214 const uint8_t *src_h[2][2];
215 int xoff[2], xadv[2], yoff[2], yadv[2],
alpha;
216 int ysub[2];
218
221 xadv[
i] = sd->coefs[
i][0];
224
227 }
229
230 for (plane = 0; plane < (CONFIG_GRAY &&
s->avctx->flags &
AV_CODEC_FLAG_GRAY ? 1 : 3); plane++) {
232
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 }
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) {
257 FFSWAP(
int, sr_cache[sprite][0], sr_cache[sprite][1]);
258 } else {
260 sr_cache[sprite][0] = yline;
261 }
262 }
263 if (ysub[sprite] && sr_cache[sprite][1] != yline + 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
275 if (ysub[0]) {
277 } else {
279 }
280 } else {
281 if (ysub[0] && ysub[1]) {
283 src_h[1][0], src_h[1][1], ysub[1],
alpha,
width);
284 } else if (ysub[0]) {
287 } else if (ysub[1]) {
290 } else {
292 }
293 }
294 }
295
296 if (!plane) {
300 }
301 }
302
303 }
304 }
305
306
308 {
312 SpriteData sd;
313
314 memset(&sd, 0, sizeof(sd));
315
316 ret = vc1_parse_sprites(v, gb, &sd);
319
320 if (!
s->cur_pic.data[0]) {
323 }
324
325 if (v->
two_sprites && (!
s->last_pic.ptr || !
s->last_pic.data[0])) {
328 }
329
333
334 vc1_draw_sprites(v, &sd);
335
336 return 0;
337 }
338
340 {
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
351 for (plane = 0; plane < (CONFIG_GRAY &&
s->avctx->flags &
AV_CODEC_FLAG_GRAY ? 1 : 3); plane++)
353 memset(
f->data[plane] +
i *
f->linesize[plane],
354 plane ? 128 : 0,
f->linesize[plane]);
355 }
356
357 #endif
358
360 {
363 int mb_height =
FFALIGN(
s->mb_height, 2);
364
365 /* Allocate mb bitplanes */
375
394
395 /* allocate block type info in that way so it could be used with s->block_index[] */
402
403 /* allocate memory to store block level MV info */
408 v->
mv_f_base =
av_mallocz(2 * (
s->b8_stride * (mb_height * 2 + 1) +
s->mb_stride * (mb_height + 1) * 2));
412 v->
mv_f[1] = v->
mv_f[0] + (
s->b8_stride * (mb_height * 2 + 1) +
s->mb_stride * (mb_height + 1) * 2);
417 v->
mv_f_next[1] = v->
mv_f_next[0] + (
s->b8_stride * (mb_height * 2 + 1) +
s->mb_stride * (mb_height + 1) * 2);
418
420 for (
i = 0;
i < 4;
i++)
423 }
424
426 s->block,
s->block_last_index,
427 s->mb_width,
s->mb_height);
430
431 return 0;
432 }
433
435 {
438
443 }
444
448
450 }
451
453
455 {
459
463
467
469
473
476
481
486 }
487 return 0;
488 }
489
491 {
493 for (
i = 0;
i < 64;
i++) {
494 #define transpose(x) (((x) >> 3) | (((x) & 7) << 3))
500 }
503 }
504
506 {
507 static VLCElem vlc_table[32372];
509
519 for (
int i = 0;
i < 3;
i++) {
532 }
533 for (
int i = 0;
i < 4;
i++) {
546 /* initialize 4MV MBMODE VLC tables for interlaced frame P picture */
551 /* initialize NON-4MV MBMODE VLC tables for the same */
556 /* initialize interlaced MVDATA tables (1-Ref) */
561 /* Initialize 2MV Block pattern VLC tables */
566 }
567 for (
int i = 0;
i < 8;
i++) {
572 /* initialize interlaced MVDATA tables (2-Ref) */
577 /* Initialize interlaced CBPCY VLC tables (Table 124 - Table 131) */
582 /* Initialize interlaced field picture MBMODE VLC tables */
591 }
593 }
594
595 /**
596 * Init VC-1 specific tables and VC1Context members
597 * @param v The VC1Context to initialize
598 * @return Status
599 */
601 {
604
605 /* defaults */
607 v->
mvrange = 0;
/* 7.1.1.18, p80 */
608
611
613 s->msmpeg4_version = MSMP4_VC1;
614
616
617 /* For error resilience */
619
620 /* VLC tables */
622 }
623
624 /** Initialize a VC1/WMV3 decoder
625 * @todo TODO: Handle VC-1 IDUs (Transport level?)
626 * @todo TODO: Decipher remaining bits in extra_data
627 */
629 {
634
635 /* save the container output size for WMImage */
638
642
644
646 int count = 0;
647
648 // looks like WMV3 has a sequence header stored in the extradata
649 // advanced sequence header may be before the first frame
650 // the last byte of the extradata is a version number, 1 for the
651 // samples we can decode
652
656
659
663 }
664
666 if (count > 0) {
669 } else if (count < 0) {
671 }
672 } else { // VC1/WVC1/WVP2
675 const uint8_t *next;
677 uint8_t *buf2 =
NULL;
678 int seq_initialized = 0, ep_initialized = 0;
679
683 }
684
686 if (!buf2)
688
689 start =
find_next_marker(start, end);
// in WVC1 extradata first byte is its size, but can be 0 in mkv
690 next = start;
691 for (; next < end; start = next) {
693 size = next - start - 4;
695 continue;
703 }
704 seq_initialized = 1;
705 break;
710 }
711 ep_initialized = 1;
712 break;
713 }
714 }
716 if (!seq_initialized || !ep_initialized) {
719 }
721 }
722
726
729
731
738
741
744 } else {
756 }
757
761
764
765 // prevent 16.16 overflows
771 }
772
776 }
777 }
778 return 0;
779 }
780
782 {
785
787
788 for (
i = 0;
i < 4;
i++)
808 }
809
810 /**
811 * Close a MSS2/VC1/WMV3 decoder
812 */
814 {
817 }
818
819 /** Decode a VC1/WMV3 frame
820 * @todo TODO: Handle VC-1 IDUs (Transport level?)
821 */
824 {
825 const uint8_t *buf = avpkt->
data;
826 int buf_size = avpkt->
size, n_slices = 0,
i,
ret;
829 uint8_t *buf2 =
NULL;
830 const uint8_t *buf_start = buf, *buf_start_second_field =
NULL;
831 int mb_height, n_slices1=-1;
832 struct {
833 uint8_t *buf;
835 int mby_start;
836 const uint8_t *rawbuf;
837 int raw_size;
839 unsigned slices_allocated = 0;
840
842
845
846 /* no supplementary picture */
848 /* special case for last picture */
849 if (
s->low_delay == 0 &&
s->next_pic.ptr) {
853
854 *got_frame = 1;
855 }
856
857 return buf_size;
858 }
859
860 //for advanced profile we may need to parse and unescape data
862 int buf_size2 = 0;
863 size_t next_allocated = 0;
865 if (!buf2)
867
868 if (
IS_MARKER(
AV_RB32(buf))) {
/* frame starts with marker and needs to be parsed */
869 const uint8_t *start, *end, *next;
871
872 next = buf;
873 for (start = buf, end = buf + buf_size; next < end; start = next) {
875 size = next - start - 4;
876 if (
size <= 0)
continue;
879 buf_start = start;
881 break;
883 int buf_size3;
884 buf_start_second_field = start;
885 av_size_mult(
sizeof(*slices), n_slices+1, &next_allocated);
889 goto err;
890 }
893 if (!slices[n_slices].buf) {
895 goto err;
896 }
898 slices[n_slices].buf);
900 buf_size3 << 3);
901 slices[n_slices].mby_start = avctx->
coded_height + 31 >> 5;
902 slices[n_slices].rawbuf = start;
903 slices[n_slices].raw_size =
size + 4;
904 n_slices1 = n_slices - 1; // index of the last slice of the first field
905 n_slices++;
906 break;
907 }
912 break;
914 int buf_size3;
915 av_size_mult(
sizeof(*slices), n_slices+1, &next_allocated);
919 goto err;
920 }
923 if (!slices[n_slices].buf) {
925 goto err;
926 }
928 slices[n_slices].buf);
930 buf_size3 << 3);
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
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);
954 goto err;
955 }
958 if (!slices[n_slices].buf) {
960 goto err;
961 }
964 buf_size3 << 3);
965 slices[n_slices].mby_start =
s->mb_height + 1 >> 1;
966 slices[n_slices].rawbuf = divider;
967 slices[n_slices].raw_size = buf + buf_size - divider;
968 n_slices1 = n_slices - 1;
969 n_slices++;
970 }
972 } else {
974 }
976 } else{
980 }
981
985 /* res_sprite means a Windows Media Image stream, AV_CODEC_ID_*IMAGE means
986 we're using the sprite compositor. These are intentionally kept separate
987 so you can get the raw sprites by using the wmv3 decoder for WMVP or
988 the vc1 one for WVP2 */
991 // switch AVCodecContext parameters to those of the sprites
994 } else {
995 goto image;
996 }
997 }
998 }
999
1000 if (
s->context_initialized &&
1004 }
1005
1006 if (!
s->context_initialized) {
1009 goto err;
1010
1012
1016 goto err;
1017 }
1020 }
1021 }
1022
1023 // do parse frame header
1028 goto err;
1029 }
1030 } else {
1032 goto err;
1033 }
1034 }
1036
1039
1044 goto err;
1045 }
1050 goto err;
1051 }
1055 goto err;
1056 }
1057
1058 /* skip B-frames if we don't have reference frames */
1061 goto end;
1062 }
1066 goto end;
1067 }
1068
1070 goto err;
1071 }
1072
1078
1079 // process pulldown flags
1080 s->cur_pic.ptr->f->repeat_pict = 0;
1081 // Pulldown flags are only valid when 'broadcast' has been set.
1083 // repeat field
1084 s->cur_pic.ptr->f->repeat_pict = 1;
1086 // repeat frames
1087 s->cur_pic.ptr->f->repeat_pict = v->
rptfrm * 2;
1088 }
1089
1093 if (v->
field_mode && buf_start_second_field) {
1094 // decode first field
1097 buf_start_second_field - buf_start);
1099 goto err;
1100
1101 if (n_slices1 == -1) {
1102 // no slices, decode the field as-is
1103 ret =
hwaccel->decode_slice(avctx, buf_start,
1104 buf_start_second_field - buf_start);
1106 goto err;
1107 } else {
1108 ret =
hwaccel->decode_slice(avctx, buf_start,
1109 slices[0].rawbuf - buf_start);
1111 goto err;
1112
1113 for (
i = 0 ;
i < n_slices1 + 1;
i++) {
1114 s->gb = slices[
i].gb;
1115 s->mb_y = slices[
i].mby_start;
1116
1123 goto err;
1124 continue;
1125 }
1126 }
1127
1128 ret =
hwaccel->decode_slice(avctx, slices[
i].rawbuf,
1129 slices[
i].raw_size);
1131 goto err;
1132 }
1133 }
1134
1136 goto err;
1137
1138 // decode second field
1139 s->gb = slices[n_slices1 + 1].gb;
1140 s->mb_y = slices[n_slices1 + 1].mby_start;
1147 goto err;
1148 }
1150
1151 ret =
hwaccel->start_frame(avctx, buf_start_second_field,
1152 (buf + buf_size) - buf_start_second_field);
1154 goto err;
1155
1156 if (n_slices - n_slices1 == 2) {
1157 // no slices, decode the field as-is
1158 ret =
hwaccel->decode_slice(avctx, buf_start_second_field,
1159 (buf + buf_size) - buf_start_second_field);
1161 goto err;
1162 } else {
1163 ret =
hwaccel->decode_slice(avctx, buf_start_second_field,
1164 slices[n_slices1 + 2].rawbuf - buf_start_second_field);
1166 goto err;
1167
1168 for (
i = n_slices1 + 2;
i < n_slices;
i++) {
1169 s->gb = slices[
i].gb;
1170 s->mb_y = slices[
i].mby_start;
1171
1178 goto err;
1179 continue;
1180 }
1181 }
1182
1183 ret =
hwaccel->decode_slice(avctx, slices[
i].rawbuf,
1184 slices[
i].raw_size);
1186 goto err;
1187 }
1188 }
1189
1191 goto err;
1192 } else {
1195 (buf + buf_size) - buf_start);
1197 goto err;
1198
1199 if (n_slices == 0) {
1200 // no slices, decode the frame as-is
1201 ret =
hwaccel->decode_slice(avctx, buf_start,
1202 (buf + buf_size) - buf_start);
1204 goto err;
1205 } else {
1206 // decode the frame part as the first slice
1207 ret =
hwaccel->decode_slice(avctx, buf_start,
1208 slices[0].rawbuf - buf_start);
1210 goto err;
1211
1212 // and process the slices as additional slices afterwards
1213 for (
i = 0 ;
i < n_slices;
i++) {
1214 s->gb = slices[
i].gb;
1215 s->mb_y = slices[
i].mby_start;
1216
1223 goto err;
1224 continue;
1225 }
1226 }
1227
1228 ret =
hwaccel->decode_slice(avctx, slices[
i].rawbuf,
1229 slices[
i].raw_size);
1231 goto err;
1232 }
1233 }
1235 goto err;
1236 }
1237 } else {
1238 int header_ret = 0;
1239
1241
1244 s->cur_pic.linesize[0] <<= 1;
1245 s->cur_pic.linesize[1] <<= 1;
1246 s->cur_pic.linesize[2] <<= 1;
1248 s->uvlinesize <<= 1;
1249 }
1251
1253
1254 for (
i = 0;
i <= n_slices;
i++) {
1255 if (
i > 0 && slices[
i - 1].mby_start >= mb_height) {
1258 "picture boundary (%d >= %d)\n",
i,
1259 slices[
i - 1].mby_start, mb_height);
1260 continue;
1261 }
1265 v->
mb_off =
s->mb_stride *
s->mb_height >> 1;
1266 } else {
1270 }
1278 goto err;
1279 continue;
1280 }
1287 goto err;
1288 continue;
1289 }
1290 }
1291 }
1292 if (header_ret < 0)
1293 continue;
1294 s->start_mb_y = (
i == 0) ? 0 :
FFMAX(0, slices[
i-1].mby_start % mb_height);
1296 s->end_mb_y = (
i == n_slices ) ? mb_height :
FFMIN(mb_height, slices[
i].mby_start % mb_height);
1297 else {
1298 if (
i >= n_slices) {
1300 continue;
1301 }
1302 s->end_mb_y = (
i == n_slices1 + 1) ? mb_height :
FFMIN(mb_height, slices[
i].mby_start % mb_height);
1303 }
1304 if (
s->end_mb_y <=
s->start_mb_y) {
1306 continue;
1307 }
1312 continue;
1313 }
1315 if (
i != n_slices) {
1316 s->gb = slices[
i].gb;
1317 }
1318 }
1321 s->cur_pic.linesize[0] >>= 1;
1322 s->cur_pic.linesize[1] >>= 1;
1323 s->cur_pic.linesize[2] >>= 1;
1325 s->uvlinesize >>= 1;
1329 }
1330 }
1331 ff_dlog(
s->avctx,
"Consumed %i/%i bits\n",
1333 // if (get_bits_count(&s->gb) > buf_size * 8)
1334 // return -1;
1337 goto err;
1338 }
1343 }
1344
1346
1348 image:
1352 goto end;
1356 goto err;
1357 }
1358 #if CONFIG_WMV3IMAGE_DECODER || CONFIG_VC1IMAGE_DECODER
1359 if ((
ret = vc1_decode_sprites(v, &
s->gb)) < 0)
1360 goto err;
1361 #endif
1363 goto err;
1364 *got_frame = 1;
1365 } else {
1368 goto err;
1371 *got_frame = 1;
1372 }
else if (
s->last_pic.ptr) {
1374 goto err;
1377 *got_frame = 1;
1378 }
1379 }
1380
1381 end:
1383 for (
i = 0;
i < n_slices;
i++)
1386 return buf_size;
1387
1388 err:
1390 for (
i = 0;
i < n_slices;
i++)
1394 }
1395
1396
1409 #if CONFIG_VC1_DXVA2_HWACCEL
1411 #endif
1412 #if CONFIG_VC1_D3D11VA_HWACCEL
1414 #endif
1415 #if CONFIG_VC1_D3D11VA2_HWACCEL
1417 #endif
1418 #if CONFIG_VC1_D3D12VA_HWACCEL
1420 #endif
1421 #if CONFIG_VC1_NVDEC_HWACCEL
1423 #endif
1424 #if CONFIG_VC1_VAAPI_HWACCEL
1426 #endif
1427 #if CONFIG_VC1_VDPAU_HWACCEL
1429 #endif
1431 },
1433 };
1434
1435 #if CONFIG_WMV3_DECODER
1448 #if CONFIG_WMV3_DXVA2_HWACCEL
1450 #endif
1451 #if CONFIG_WMV3_D3D11VA_HWACCEL
1453 #endif
1454 #if CONFIG_WMV3_D3D11VA2_HWACCEL
1456 #endif
1457 #if CONFIG_WMV3_D3D12VA_HWACCEL
1459 #endif
1460 #if CONFIG_WMV3_NVDEC_HWACCEL
1462 #endif
1463 #if CONFIG_WMV3_VAAPI_HWACCEL
1465 #endif
1466 #if CONFIG_WMV3_VDPAU_HWACCEL
1468 #endif
1470 },
1472 };
1473 #endif
1474
1475 #if CONFIG_WMV3IMAGE_DECODER
1477 .
p.
name =
"wmv3image",
1486 .flush = vc1_sprite_flush,
1487 };
1488 #endif
1489
1490 #if CONFIG_VC1IMAGE_DECODER
1492 .
p.
name =
"vc1image",
1501 .flush = vc1_sprite_flush,
1502 };
1503 #endif