FileDocCategorySizeDatePackage
SunVideoAuto.javaAPI DocJMF 2.1.1e4202Mon May 12 12:20:34 BST 2003None

SunVideoAuto

public class SunVideoAuto extends Object

Fields Summary
private static String
DEVICE_PREFIX
private static String
PROTOCOL
private static String
LOCATOR_PREFIX
CaptureDeviceInfo[]
devices
int
currentID
XILCapture
xilCap
Vector
formats
int[]
ports
int[]
scales
Constructors Summary
public SunVideoAuto()

	// supported scales / sizes


      
        Vector devices = (Vector) CaptureDeviceManager.getDeviceList(null).clone();
	Enumeration enum = devices.elements();
	while (enum.hasMoreElements()) {
	    CaptureDeviceInfo cdi = (CaptureDeviceInfo) enum.nextElement();
	    String devName = cdi.getLocator().getProtocol();
	    if (devName.equals(PROTOCOL))
		CaptureDeviceManager.removeDevice(cdi);
	}
	
	int nDevices = 0;
	for (int i = 0; i < 7; i++) {
	    File fl = new File(DEVICE_PREFIX + i);
	    if (fl.exists()) {
		doDevice(i);
		nDevices++;
	    }
	}
	try {
	    CaptureDeviceManager.commit();
	    System.err.println("SunVideoAuto: Committed ok");
	} catch (java.io.IOException ioe) {
	    System.err.println("SunVideoAuto: error committing cdm");
	}
    
Methods Summary
private voidaddDevice(int index)


	String name = "SunVideo device " + index;
	String locator = LOCATOR_PREFIX + index;

	Format [] farray = new Format[formats.size()];
	Enumeration enum = formats.elements();

	int i = 0;
	while (enum.hasMoreElements()) {
	    Format f = (Format) enum.nextElement();
	    farray[i++] = f;
	}
	
	CaptureDeviceInfo cdi = new CaptureDeviceInfo(name,
					new MediaLocator(locator), farray);
	CaptureDeviceManager.addDevice(cdi);
    
private voidaddFormat(javax.media.Format fin)

	Enumeration enum = formats.elements();
	while (enum.hasMoreElements()) {
	    Format f = (Format) enum.nextElement();
	    if (f.equals(fin))
		return;
	}

	//System.err.println("New format = " + fin);
	formats.addElement(fin);
    
private voiddoDevice(int index)


	xilCap = new XILCapture(null);
	VideoFormat vf;
	formats = new Vector();
	boolean gotPort = false;

	if (!xilCap.connect(index)) {
	    dummyDevice(index);
	    return;
	}
	
	
	for (int i = 0; i < ports.length; i++) {
	    if (xilCap.setPort(ports[i])) {
		getJpegFormats(i);
		getRGBFormats(i);
	    }
	}
	xilCap.disconnect();

	if (formats.size() > 0)
	    addDevice(index);
	else
	    dummyDevice(index);
    
private voiddummyDevice(int index)

	// Can't get to the device, use the barest formats
	addFormat(new VideoFormat(VideoFormat.JPEG));
	addFormat(new RGBFormat());
	addDevice(index);
    
private voidgetJpegFormats(int index)

	if (!xilCap.setCompress("Jpeg"))
	    return;
	for (int i = 0; i < scales.length; i++) {
	    xilCap.setScale(scales[i]);
	    // To get the real values, start the device
	    if (xilCap.start()) {
		Dimension size = new Dimension(xilCap.getWidth(),
						xilCap.getHeight());
		// approximate the max for high quality
		int maxbuf = 3 * size.width * size.height;
		addFormat(new VideoFormat(VideoFormat.JPEG, size, maxbuf,
				byte[].class, 15f));
	    }
	    xilCap.stop();
	}
    
private voidgetRGBFormats(int index)

	if (!xilCap.setCompress("RGB"))
	    return;
	for (int i = 0; i < scales.length; i++) {
	    xilCap.setScale(scales[i]);
	    // To get the real values, start the device
	    if (xilCap.start()) {
		Dimension size = new Dimension(xilCap.getWidth(),
						xilCap.getHeight());
		int stride = xilCap.getLineStride();
		int maxbuf = stride * size.width;
		addFormat(new RGBFormat(size, maxbuf, byte[].class,
					15f,
					24,
					3, 2, 1, 3, stride,
					Format.FALSE,
					Format.NOT_SPECIFIED));
	    }
	    xilCap.stop();
	}
    
public static voidmain(java.lang.String[] args)

	SunVideoAuto a = new SunVideoAuto();
	System.exit(0);