001    package com.github.sarxos.webcam.ds.vlcj;
002    
003    import java.util.ArrayList;
004    import java.util.List;
005    
006    import uk.co.caprica.vlcj.binding.LibVlc;
007    import uk.co.caprica.vlcj.medialist.MediaList;
008    import uk.co.caprica.vlcj.medialist.MediaListItem;
009    import uk.co.caprica.vlcj.player.MediaPlayerFactory;
010    import uk.co.caprica.vlcj.player.discoverer.MediaDiscoverer;
011    import uk.co.caprica.vlcj.runtime.RuntimeUtil;
012    
013    import com.github.sarxos.webcam.WebcamDevice;
014    import com.github.sarxos.webcam.WebcamDriver;
015    import com.sun.jna.Native;
016    
017    
018    /**
019     * NOT STABLE, EXPERIMENTAL STUFF!!!
020     * 
021     * Vlcj service discovery works only on Linux, so there is no way (at least for
022     * now) to list capture devices on Windows.
023     * 
024     * For Windows dsj library could be used (http://www.humatic.de/htools/dsj.htm)
025     * listing DirectShow filters for all capture devices in system.
026     * 
027     * There is service discovery for Linux, but in any case this one could be used
028     * (http://code.google.com/p/v4l4j/) to access the Video4Linux devices.
029     * 
030     * MAC OS X can reuse Rococoa (http://code.google.com/p/rococoa/), a Java
031     * binding to the Mac Objective-C object system, could read device details via
032     * the Mac's QTKit library.
033     * 
034     * @author Bartosz Firyn (SarXos)
035     */
036    public class VlcjDriver implements WebcamDriver {
037    
038            static {
039                    Native.loadLibrary(RuntimeUtil.getLibVlcLibraryName(), LibVlc.class);
040            }
041    
042            public VlcjDriver() {
043                    if (OS.getOS() == OS.WIN) {
044                            System.err.println(String.format("WARNING: %s does not support Windows platform", getClass().getSimpleName()));
045                    }
046            }
047    
048            @Override
049            public List<WebcamDevice> getDevices() {
050    
051                    MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory();
052                    MediaDiscoverer videoMediaDiscoverer = mediaPlayerFactory.newVideoMediaDiscoverer();
053                    MediaList videoDeviceList = videoMediaDiscoverer.getMediaList();
054    
055                    List<WebcamDevice> devices = new ArrayList<WebcamDevice>();
056    
057                    List<MediaListItem> videoDevices = videoDeviceList.items();
058                    for (MediaListItem item : videoDevices) {
059                            devices.add(new VlcjDevice(item));
060                    }
061    
062                    videoDeviceList.release();
063                    videoMediaDiscoverer.release();
064                    mediaPlayerFactory.release();
065    
066                    return devices;
067            }
068    
069            @Override
070            public boolean isThreadSafe() {
071                    return false;
072            }
073    
074            @Override
075            public String toString() {
076                    return getClass().getSimpleName();
077            }
078    }