Mercurial > libavcodec.hg
annotate wnv1.c @ 2841:bceeca1bb30f libavcodec
vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
with changes by me
int->float as video uses float too
remove silent cliping to some per codec range, this should result in an error instead
remove change to utils.c as its inconsistant with video
author | michael |
---|---|
date | Sun, 21 Aug 2005 20:27:00 +0000 |
parents | e027765cf410 |
children | ef2149182f1c |
rev | line source |
---|---|
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
1 /* |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
2 * Winnov WNV1 codec |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
3 * Copyright (c) 2005 Konstantin Shishkov |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
4 * |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
8 * version 2 of the License, or (at your option) any later version. |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
9 * |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
14 * |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
18 * |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
19 */ |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
20 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
21 /** |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
22 * @file wnv1.c |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
23 * Winnov WNV1 codec. |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
24 */ |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
25 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
26 #include "avcodec.h" |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
27 #include "common.h" |
2579
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
28 #include "bitstream.h" |
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
29 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
30 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
31 typedef struct WNV1Context{ |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
32 AVCodecContext *avctx; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
33 AVFrame pic; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
34 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
35 int shift; |
2579
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
36 GetBitContext gb; |
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
37 } WNV1Context; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
38 |
2579
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
39 static uint16_t code_tab[16][2]={ |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
40 {0x1FD,9}, {0xFD,8}, {0x7D,7}, {0x3D,6}, {0x1D,5}, {0x0D,4}, {0x005,3}, |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
41 {0x000,1}, |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
42 {0x004,3}, {0x0C,4}, {0x1C,5}, {0x3C,6}, {0x7C,7}, {0xFC,8}, {0x1FC,9}, {0xFF,8} |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
43 }; |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
44 |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
45 #define CODE_VLC_BITS 9 |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
46 static VLC code_vlc; |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
47 |
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
48 /* returns modified base_value */ |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
49 static inline int wnv1_get_code(WNV1Context *w, int base_value) |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
50 { |
2579
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
51 int v = get_vlc2(&w->gb, code_vlc.table, CODE_VLC_BITS, 1); |
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
52 |
2579
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
53 if(v==15) |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
54 return ff_reverse[ get_bits(&w->gb, 8 - w->shift) ]; |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
55 else |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
56 return base_value + ((v - 7)<<w->shift); |
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
57 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
58 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
59 static int decode_frame(AVCodecContext *avctx, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
60 void *data, int *data_size, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
61 uint8_t *buf, int buf_size) |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
62 { |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
63 WNV1Context * const l = avctx->priv_data; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
64 AVFrame * const p= (AVFrame*)&l->pic; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
65 unsigned char *Y,*U,*V; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
66 int i, j; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
67 int prev_y = 0, prev_u = 0, prev_v = 0; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
68 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
69 if(p->data[0]) |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
70 avctx->release_buffer(avctx, p); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
71 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
72 p->reference = 0; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
73 if(avctx->get_buffer(avctx, p) < 0){ |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
74 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
75 return -1; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
76 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
77 p->key_frame = 1; |
2579
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
78 |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
79 for(i=8; i<buf_size; i++) |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
80 buf[i]= ff_reverse[ buf[i] ]; //FIXME ensure that the buffer is modifyable or use a temp one |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
81 init_get_bits(&l->gb, buf+8, (buf_size-8)*8); |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
82 |
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
83 if (buf[2] >> 4 == 6) |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
84 l->shift = 2; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
85 else { |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
86 l->shift = 8 - (buf[2] >> 4); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
87 if (l->shift > 4) { |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
88 av_log(avctx, AV_LOG_ERROR, "Unknown WNV1 frame header value %i, please upload file for study\n", buf[2] >> 4); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
89 l->shift = 4; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
90 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
91 if (l->shift < 1) { |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
92 av_log(avctx, AV_LOG_ERROR, "Unknown WNV1 frame header value %i, please upload file for study\n", buf[2] >> 4); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
93 l->shift = 1; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
94 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
95 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
96 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
97 Y = p->data[0]; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
98 U = p->data[1]; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
99 V = p->data[2]; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
100 for (j = 0; j < avctx->height; j++) { |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
101 for (i = 0; i < avctx->width / 2; i++) { |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
102 Y[i * 2] = wnv1_get_code(l, prev_y); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
103 prev_u = U[i] = wnv1_get_code(l, prev_u); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
104 prev_y = Y[(i * 2) + 1] = wnv1_get_code(l, Y[i * 2]); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
105 prev_v = V[i] = wnv1_get_code(l, prev_v); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
106 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
107 Y += p->linesize[0]; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
108 U += p->linesize[1]; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
109 V += p->linesize[2]; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
110 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
111 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
112 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
113 *data_size = sizeof(AVFrame); |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
114 *(AVFrame*)data = l->pic; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
115 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
116 return buf_size; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
117 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
118 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
119 static int decode_init(AVCodecContext *avctx){ |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
120 WNV1Context * const l = avctx->priv_data; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
121 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
122 l->avctx = avctx; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
123 avctx->pix_fmt = PIX_FMT_YUV422P; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
124 |
2579
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
125 if(!code_vlc.table){ |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
126 init_vlc(&code_vlc, CODE_VLC_BITS, 16, |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
127 &code_tab[0][1], 4, 2, |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
128 &code_tab[0][0], 4, 2, 1); |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
129 } |
e027765cf410
replace custom bitstream reader with get_bits/vlc()
michael
parents:
2577
diff
changeset
|
130 |
2577
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
131 return 0; |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
132 } |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
133 |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
134 AVCodec wnv1_decoder = { |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
135 "wnv1", |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
136 CODEC_TYPE_VIDEO, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
137 CODEC_ID_WNV1, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
138 sizeof(WNV1Context), |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
139 decode_init, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
140 NULL, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
141 NULL, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
142 decode_frame, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
143 CODEC_CAP_DR1, |
7d9997a69158
Winnov WNV1 video decoder, courtesy of Konstantin Shishkov
melanson
parents:
diff
changeset
|
144 }; |