[vlc-devel] Re: How to embed VLC in my C application
Tony Anecito
adanecito at yahoo.com
Wed Jun 13 06:09:27 CEST 2007
Hi Sherman,
Yes I can do that. There is a set of java classes (JVLC.class, input.class, vlm.class, video.class, playlist.class) that I use. The main thing as was mentioned by Remi was not to try to reuse the same instance. What I do is the JVLC.class makes a call the the libvlc.dll through a wrapper class jvlc.dll to create an instance. when creating an instance the libvlc.dll can be passed a window handle to an existing window which is created for a canvas class. In return a instance handle (integer) is passed back to the jvlc.class for use in makeing calls by video, input, playlist audio, vlm classes.
You can look at the class source to see how they in turn make calls to the dll(s) which will help. But the main thing is to never ever try to reuse the same instance for another video when you want two videos running at the same time. Also I discovered for java at least there are times when the window tied to a canvas class get destroyed by the java runtime engine (jre) such as repainting when moving a window to the top of the zorder. When that happens you need to destroy the instance of vlc tied to the java canvas otherwise you get segment faults. The same thing also happens where the window gets destroyed when a window get turned into an icon.
This required destroying of a window may even effect a C application because I discovered there was a windows call used by the jre to restack the windows during a zorder call which may also happen in C but the instance was destroyed by the jre. If I overode the method to destroy the window handle vlc crashed.
There might be other things I ran into but the very interesting thing I discovered is you need to specify when doing an install the path to the vlc dlls because if you do not do that vlc may not find them in the default directory structure it hopes to find. There is an option to do this which I have to use since the java deployment method (java web start) I use puts the jars containing the main method and the dlls are in a jar that can end up in any folder in the cache folder structure but may not end up in the same folder together. So I had to write code to get the dlls out of the jar and put them into a folder where I can pass to the vlc instance the folder location.
I have been able to get the reading of video files on the disk to work but the streaming is intermittantly working on different PC's running Windows XP. I am hoping it is a dll issue or a config issue where the options need to be just so in order for me to use the dlls. The vlc.exe sets certain options by default and sometimes it is really important to understand them.
A lot of effort but I believe I am the only one who has gotten this far with the java bindings. I still need to work with the registration for event notification which is very new but resolves things like notification of a video finishing without the dreaded polling in a separate thread.
I know this may not be the answer you are looking for but maybe it gives you a starting point at least.
Regards,
Tony Anecito
Founder,
MyUniPortal
http://www.myuniportal.com
Herman Schultz <herman.schultz at gmail.com> wrote:
Can you please share how you run vlc using the vlc libraries? I can't see to get that to work.
On 6/12/07, Tony Anecito < adanecito at yahoo.com> wrote: Actually I am trying to get multiple child windows running videos using the vlc libraries right now. I am using the latest builds and the jvlc bindings. I am trying to work through understanding how to get the right options setup like for streaming (I left and email for the vlc team today) but otherwise it appears to work fine but I need to get streaming working so I and my testers can get back to testing vlc.
Regards,
-Tony Anecito
Founder,
MyUniportal
http://www.myuniportal.com
Rémi Denis-Courmont <rem at videolan.org > wrote:
Hello,
Le mardi 12 juin 2007, Herman Schultz a écrit :
> I am trying to embed&invoke VLC in my c application.
>
> I invoke VLC like this:
> // i_argc is an int
> // ppsz_argv2 is char* ppsz_argv2[]
>
> int i_ret = VLC_Create();
> i_ret = VLC_Init( 0, i_argc, ppsz_argv2 );
> i_ret = VLC_AddIntf( 0, NULL, VLC_TRUE, VLC_TRUE );
>
> It works the first time when I do this.
> But when I do that the same i_argc, ppsz_arg2[] the second time, I
> get an segmentation inside VLC_Init().
>
> Can you please tell me why is there? Or if that is the right way to
> embed/invoke VLC in my own application.
There are two reasons why they crashes:
The bad reason is that VLC 0.8.6 is not quite multi-instance-safe yet;
we are trying to solve this in upcoming version 0.9.0 but we would need
people to test this seriously.
The good reason is that the "VLC" API (as used in src/vlc.c) uses main
VLC object number "0". Given object numbers are shared across a
process, there cannot be two VLC instance using object number 0. In
other word, without some changes, the "VLC" API cannot be used to spawn
more than one instance at a time.
*However*, as Pierre pointed out, the newer LibVLC media control API
should work fine.
--
Rémi Denis-Courmont
http://www.remlab.net/
---------------------------------
Luggage? GPS? Comic books?
Check out fitting gifts for grads at Yahoo! Search.
---------------------------------
Yahoo! oneSearch: Finally, mobile search that gives answers, not web links.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20070612/a1126c78/attachment.html>
More information about the vlc-devel
mailing list