[vlc-devel] Win32 implementation of mdate breaks for large values returned by QueryPerformanceCounter (suspected due to a buggy gcc optimization), causing video stream playback to fail on Windows systems with a large uptime
Skywing
skywing at valhallalegends.com
Tue Jan 9 05:30:22 CET 2007
Hi,
There's sign extension & data loss bug in the Win32 implementation of
mdate (src\misc\mtime.c) that appears to be introduced by aggressive gcc
optimizations. I don't have a cygwin build environment installed, so I
am just dropping a mail to explain the problem and what likely needs to
be done to fix it.
Specifically, there is a problem with the path of mdate that uses
QueryPerformanceCounter for high precision timing (around line 152 for
the vlc 0.8.6 source tree posted for download at videolan.org).
Specifically, the following lines trip up the optimizer, causing it to
generate bad code:
LARGE_INTEGER counter;
QueryPerformanceCounter (&counter);
/* Convert to from (1/freq) to microsecond resolution */
/* We need to split the division to avoid 63-bits overflow */
lldiv_t d = lldiv (counter.QuadPart, freq);
return (d.quot * 1000000)
+ ((d.rem * 1000000) / freq);
While this may look okay at first glance, it seems that gcc attempts to
be clever here and reorder the multiplications in the return statement
to occur before the lldiv call (and instead pass the result of the
multiplications and addition to lldiv). In effect, gcc rewrites the
above code to the following:
LARGE_INTEGER counter, tmp;
QueryPerformanceCounter(&counter);
tmp.LowPart = Counter.LowPart * 1000000;
tmp.HighPart = Counter.HighPart * 1000000 + (((unsigned long
long)counter.LowPart * 1000000) >> 32);
d = lldiv(tmp.QuadPart, freq);
return d.quot;
While this appears to work *most of the time*, there is actually a bug
here. Specifically, gcc's optimization only works correctly for "small"
values of counter. Once the performance counter value grows too large,
the "optimized" version starts introducing errors into the calculation.
For example, on one of my systems, I observed this happening with a
"freq" value of 0x00369e99, and a "counter" value of 0x00000e055d29c231.
In this particular case, the compiler optimization causes the value
returned by mdate() to be completely bogus (a large negative quantity).
This subsequently breaks MPEG over UDP streaming playback after the
system that was hosting VLC had been running for a large time (~49 days,
with a 2.4GHz P4); when I try to play a stream, I get a blank black out,
output, no audio, and a log full of messages stating that frames have
been dropped because they are in the future.
The buggy assembler code emitted by gcc for the relevant C source
snippet is as follows:
libvlc!mdate+0xe0:
62e20aa0 8d442428 lea eax,[esp+0x28]
62e20aa4 890424 mov [esp],eax
;
; QueryPerformanceCounter(&counter)
;
62e20aa7 e874640800 call libvlc!vlc_entry__quicktime+0x1600
(62ea6f20)
62e20aac 83ec04 sub esp,0x4
62e20aaf b940420f00 mov ecx,0xf4240
62e20ab4 8b742428 mov esi,[esp+0x28]
62e20ab8 8b7c242c mov edi,[esp+0x2c]
62e20abc 89f0 mov eax,esi
62e20abe f7e1 mul ecx
62e20ac0 89c1 mov ecx,eax
62e20ac2 69c740420f00 imul eax,edi,0xf4240
62e20ac8 890c24 mov [esp],ecx
62e20acb 8b3dcc7a2763 mov edi,[libvlc!ZnwjPv+0x468c (63277acc)]
62e20ad1 8d3402 lea esi,[edx+eax]
62e20ad4 897c240c mov [esp+0xc],edi
62e20ad8 8b15c87a2763 mov edx,[libvlc!ZnwjPv+0x4688 (63277ac8)]
62e20ade 89742404 mov [esp+0x4],esi
62e20ae2 89542408 mov [esp+0x8],edx
;
; lldiv(...)
;
62e20ae6 e815983e00 call libvlc!VBR_noise_shaping+0xc247
(6320a300)
62e20aeb 8b5c2430 mov ebx,[esp+0x30]
62e20aef 8b742434 mov esi,[esp+0x34]
62e20af3 8b7c2438 mov edi,[esp+0x38]
62e20af7 83c43c add esp,0x3c
62e20afa c3 ret
To prove that this is a problem with the way the gcc optimizer rewrote
the above code, I translated the instructions omitted by gcc back into C
and compiled both with the Microsoft C/C++ compiler (VS2005; x64).
int
__cdecl
wmain(
int ac,
wchar_t** av
)
{
LARGE_INTEGER counter, tmp;
unsigned __int64 freq;
lldiv_t d;
//
// First, let's show that it breaks as vlc does:
//
freq = 0x00369e99;
counter.QuadPart = 0x00000e055d29c231;
d = lldiv(counter.QuadPart, freq);
// 00003eabe396516
wprintf(L"%I64x\n", (d.quot * 1000000) + ((d.rem * 1000000) /
freq));
tmp.LowPart = counter.LowPart * 1000000;
tmp.HighPart = counter.HighPart * 1000000 + (((unsigned
__int64)counter.LowPart * 1000000) >> 32);
// d5f158ce6f602e40
wprintf(L"%I64x\n", tmp.QuadPart);
d = lldiv(tmp.QuadPart, freq);
// ffffff3ae1083396
wprintf(L"%I64x\n", d.quot);
//
// Next, let's show that it works for "small" values of counter:
//
counter.QuadPart = 0x00000000aaaaaaaa;
d = lldiv(counter.QuadPart, freq);
// 2fada5ea
wprintf(L"%I64x\n", (d.quot * 1000000) + ((d.rem * 1000000) /
freq));
tmp.LowPart = counter.LowPart * 1000000;
tmp.HighPart = counter.HighPart * 1000000 + (((unsigned
__int64)counter.LowPart * 1000000) >> 32);
// a2c2aaaa07e80
wprintf(L"%I64x\n", tmp.QuadPart);
d = lldiv(tmp.QuadPart, freq);
// 2fada5ea
wprintf(L"%I64x\n", d.quot);
return 0;
}
The output of the test program is included in comments, but suffice to
say, the gcc "optimization" introduces significant calculation errors
when the performance counter grows large (in my case, gcc's optimized
mdate() returns 0xffffff3ae1083396 instead of the expected
0x00003eabe396516 value, for the given performance counter and frequency
values).
Since this appears to be an optimizer problem with gcc, one thing that
you might try in order to fix this problem is to turn down the
optimization level. You might also try rewriting the affected code a
bit in order to see if you can coax gcc's optimizer to not introduce
calculation errors (from disassembling the output, it should be pretty
clear whether gcc is doing the right thing or not; in this case, it is
*not* safe for gcc to move the mul's and add operations *before* the
lldiv, so if you see that in the output, it's a good indication that
gcc's optimizer is playing dirty). You might try upgrading gcc as well
(I don't know which gcc version was used to build the 0.8.6 and 0.8.5
vlc-win32 binaries).
BTW, I would also be a bit interested to know if this problem repros for
the latest gcc available (and which gcc release, exactly, was used to
build the 0.8.6 and 0.8.5 vlc-win32 binaries). If it does repro with
the latest gcc version, then this particular problem is probably
something that should be brought to the attention of the gcc team so
that they can fix it.
I am also including debugger trace logs from stepping through vlc's
implementation of mdate on my test system (I have verified that the
problem is present in vlc 0.8.6 and 0.8.5):
eax=d5ebcb40 ebx=00369e99 ecx=13894400 edx=00369e99 esi=d5ed6fe6
edi=00000000
eip=62e20ae6 esp=032afeac ebp=00000000 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x126:
62e20ae6 e815983e00 call libvlc!VBR_noise_shaping+0xc247
(6320a300)
0:011>
eax=ceb4fa7f ebx=00369e99 ecx=ffffffff edx=ffffff3a esi=d5ed6fe6
edi=00000000
eip=62e20aeb esp=032afeac ebp=00000000 iopl=0 nv up ei pl nz na
pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000202
libvlc!mdate+0x12b:
62e20aeb 8b5c2430 mov ebx,[esp+0x30]
ss:0023:032afedc=00000000
0:011> g
Breakpoint 1 hit
eax=00b53e20 ebx=00000000 ecx=00000004 edx=00000123 esi=00b73068
edi=00000000
eip=62e209c0 esp=01d0fc38 ebp=00b73068 iopl=0 nv up ei pl zr na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000246
libvlc!mdate:
62e209c0 83ec3c sub esp,0x3c
0:007> p
eax=00b53e20 ebx=00000000 ecx=00000004 edx=00000123 esi=00b73068
edi=00000000
eip=62e209c3 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0x3:
62e209c3 8b15c87a2763 mov edx,[libvlc!ZnwjPv+0x4688 (63277ac8)]
ds:0023:63277ac8=00369e99
0:007>
eax=00b53e20 ebx=00000000 ecx=00000004 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209c9 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0x9:
62e209c9 895c2430 mov [esp+0x30],ebx
ss:0023:01d0fc2c=ffffffff
0:007>
eax=00b53e20 ebx=00000000 ecx=00000004 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209cd esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0xd:
62e209cd 8b0dcc7a2763 mov ecx,[libvlc!ZnwjPv+0x468c (63277acc)]
ds:0023:63277acc=00000000
0:007>
eax=00b53e20 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209d3 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0x13:
62e209d3 89742434 mov [esp+0x34],esi
ss:0023:01d0fc30=00000000
0:007>
eax=00b53e20 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209d7 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0x17:
62e209d7 89d0 mov eax,edx
0:007>
eax=00369e99 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209d9 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0x19:
62e209d9 21c8 and eax,ecx
0:007>
eax=00000000 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209db esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl zr na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000246
libvlc!mdate+0x1b:
62e209db 897c2438 mov [esp+0x38],edi
ss:0023:01d0fc34=00000001
0:007>
eax=00000000 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209df esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl zr na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000246
libvlc!mdate+0x1f:
62e209df 40 inc eax
0:007>
eax=00000001 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209e0 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000202
libvlc!mdate+0x20:
62e209e0 0f841a010000 je libvlc!mdate+0x140 (62e20b00)
[br=0]
0:007>
eax=00000001 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209e6 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000202
libvlc!mdate+0x26:
62e209e6 89cb mov ebx,ecx
0:007>
eax=00000001 ebx=00000000 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209e8 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000202
libvlc!mdate+0x28:
62e209e8 09d3 or ebx,edx
0:007>
eax=00000001 ebx=00369e99 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e209ea esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000206
libvlc!mdate+0x2a:
62e209ea 0f85b0000000 jne libvlc!mdate+0xe0 (62e20aa0)
[br=1]
0:007>
eax=00000001 ebx=00369e99 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e20aa0 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000206
libvlc!mdate+0xe0:
62e20aa0 8d442428 lea eax,[esp+0x28]
ss:0023:01d0fc24=77e6ba42
0:007>
eax=01d0fc24 ebx=00369e99 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e20aa4 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000206
libvlc!mdate+0xe4:
62e20aa4 890424 mov [esp],eax
ss:0023:01d0fbfc=7ffd5000
0:007>
eax=01d0fc24 ebx=00369e99 ecx=00000000 edx=00369e99 esi=00b73068
edi=00000000
eip=62e20aa7 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000206
libvlc!mdate+0xe7:
62e20aa7 e874640800 call libvlc!vlc_entry__quicktime+0x1600
(62ea6f20)
0:007>
eax=00000001 ebx=00369e99 ecx=01d0fbdc edx=7c82ed54 esi=00b73068
edi=00000000
eip=62e20aac esp=01d0fc00 ebp=00b73068 iopl=0 nv up ei pl nz na
pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000202
libvlc!mdate+0xec:
62e20aac 83ec04 sub esp,0x4
0:007>
eax=00000001 ebx=00369e99 ecx=01d0fbdc edx=7c82ed54 esi=00b73068
edi=00000000
eip=62e20aaf esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0xef:
62e20aaf b940420f00 mov ecx,0xf4240
0:007>
eax=00000001 ebx=00369e99 ecx=000f4240 edx=7c82ed54 esi=00b73068
edi=00000000
eip=62e20ab4 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0xf4:
62e20ab4 8b742428 mov esi,[esp+0x28]
ss:0023:01d0fc24=5d29c231
0:007>
eax=00000001 ebx=00369e99 ecx=000f4240 edx=7c82ed54 esi=5d29c231
edi=00000000
eip=62e20ab8 esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0xf8:
62e20ab8 8b7c242c mov edi,[esp+0x2c]
ss:0023:01d0fc28=00000e05
0:007>
eax=00000001 ebx=00369e99 ecx=000f4240 edx=7c82ed54 esi=5d29c231
edi=00000e05
eip=62e20abc esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0xfc:
62e20abc 89f0 mov eax,esi
0:007>
eax=5d29c231 ebx=00369e99 ecx=000f4240 edx=7c82ed54 esi=5d29c231
edi=00000e05
eip=62e20abe esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz ac
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000216
libvlc!mdate+0xfe:
62e20abe f7e1 mul ecx
0:007>
eax=6f602e40 ebx=00369e99 ecx=000f4240 edx=00058d8e esi=5d29c231
edi=00000e05
eip=62e20ac0 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei pl nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a03
libvlc!mdate+0x100:
62e20ac0 89c1 mov ecx,eax
0:007>
eax=6f602e40 ebx=00369e99 ecx=6f602e40 edx=00058d8e esi=5d29c231
edi=00000e05
eip=62e20ac2 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei pl nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a03
libvlc!mdate+0x102:
62e20ac2 69c740420f00 imul eax,edi,0xf4240
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00058d8e esi=5d29c231
edi=00000e05
eip=62e20ac8 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x108:
62e20ac8 890c24 mov [esp],ecx
ss:0023:01d0fbfc=01d0fc24
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00058d8e esi=5d29c231
edi=00000e05
eip=62e20acb esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x10b:
62e20acb 8b3dcc7a2763 mov edi,[libvlc!ZnwjPv+0x468c (63277acc)]
ds:0023:63277acc=00000000
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00058d8e esi=5d29c231
edi=00000000
eip=62e20ad1 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x111:
62e20ad1 8d3402 lea esi,[edx+eax]
ds:0023:d5f158ce=????????
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00058d8e esi=d5f158ce
edi=00000000
eip=62e20ad4 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x114:
62e20ad4 897c240c mov [esp+0xc],edi
ss:0023:01d0fc08=01d0fbc4
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00058d8e esi=d5f158ce
edi=00000000
eip=62e20ad8 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x118:
62e20ad8 8b15c87a2763 mov edx,[libvlc!ZnwjPv+0x4688 (63277ac8)]
ds:0023:63277ac8=00369e99
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00369e99 esi=d5f158ce
edi=00000000
eip=62e20ade esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x11e:
62e20ade 89742404 mov [esp+0x4],esi
ss:0023:01d0fc00=00000000
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00369e99 esi=d5f158ce
edi=00000000
eip=62e20ae2 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x122:
62e20ae2 89542408 mov [esp+0x8],edx
ss:0023:01d0fc04=00000000
0:007>
eax=d5ebcb40 ebx=00369e99 ecx=6f602e40 edx=00369e99 esi=d5f158ce
edi=00000000
eip=62e20ae6 esp=01d0fbfc ebp=00b73068 iopl=0 ov up ei ng nz na
pe cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000a83
libvlc!mdate+0x126:
62e20ae6 e815983e00 call libvlc!VBR_noise_shaping+0xc247
(6320a300)
0:007> dd @esp
01d0fbfc 6f602e40 d5f158ce 00369e99 00000000
01d0fc0c 00000060 01d0ffa8 77e6b7d0 77e6bb00
01d0fc1c ffffffff 77e6bafd 5d29c231 00000e05
01d0fc2c 00000000 00b73068 00000000 62e2a544
01d0fc3c 00000f08 ffffffff 01d0fd50 00b72fd8
01d0fc4c 03acc670 00a49530 01d0fd50 6b941bd2
01d0fc5c 00a49530 00000f30 00000000 00000003
01d0fc6c 00b24130 00b53e20 0000000f 00b244a8
0:007> p
eax=e1083396 ebx=00369e99 ecx=ffffffff edx=ffffff3a esi=d5f158ce
edi=00000000
eip=62e20aeb esp=01d0fbfc ebp=00b73068 iopl=0 nv up ei pl nz na
po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
efl=00000206
libvlc!mdate+0x12b:
62e20aeb 8b5c2430 mov ebx,[esp+0x30]
ss:0023:01d0fc2c=00000000
Note the bogus value returned in edx:eax (ffffff3a:e1083396).
Let me know if you need anything else in order to understand this
problem.
- Ken Johnson (Skywing)
http://www.nynaeve.net
--
This is the vlc-devel mailing-list, see http://www.videolan.org/vlc/
To unsubscribe, please read http://developers.videolan.org/lists.html
More information about the vlc-devel
mailing list