/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package webcamstudio.exporter.vloopback;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import webcamstudio.InfoListener;
/**
*
* @author patrick
*/
public class V4L2Loopback extends VideoOutput {
int width = 0;
int height = 0;
public V4L2Loopback(InfoListener l) {
listener = l;
}
@Override
public void open(String path, int w, int h, int pixFormat) {
width = w;
height = h;
devicePath = path;
V4L2Loopback.pixFormat = pixFormat;
devFD = CV4l2.INSTANCE.open_device(devicePath, w, h, pixFormat);
if (devFD <= 0) {
System.out.println("Error Opening Device");
}
}
@Override
public void close() {
CV4l2.INSTANCE.close_device(devFD);
}
@Override
public void write(int[] data) {
if (flipImage) {
int[] buffer = new int[data.length];
for (int y = 0; y < data.length; y += width) {
for (int x = w-1 ; x >=0 ; x-=1) {
buffer[y+x] = data[y+width-1-x];
}
}
data = buffer;
}
if (devFD != 0) {
byte[] buffer = null;
switch (pixFormat) {
case RGB24:
buffer = img2rgb24(data);
break;
case UYVY:
buffer = img2uyvy(data);
break;
case BGR24:
buffer = img2bgr24(data);
break;
}
int countWritten = 0;
countWritten = CV4l2.INSTANCE.writeData(devFD, buffer, buffer.length);
if (countWritten != buffer.length) {
System.out.println("Error Writing Data - " + countWritten);
}
}
}
public interface CV4l2 extends Library {
CV4l2 INSTANCE = (CV4l2) Native.loadLibrary((Platform.isWindows() ? "webcamstudio" : "webcamstudio"),
CV4l2.class);
int close_device(int device);
int open_device(String path, int w, int h, int pixFormat);
int writeData(int device, byte[] buffer, int length);
}
}