package org.kevoree.library.javase.vlc;
/*import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import org.kevoree.annotation.*;
import org.kevoree.extra.vlcj.VLCNativeLibraryLoader;
import org.kevoree.framework.AbstractComponentType;
import org.kevoree.framework.MessagePort;
import uk.co.caprica.vlcj.binding.LibVlc;
import uk.co.caprica.vlcj.player.MediaPlayerFactory;
import uk.co.caprica.vlcj.player.direct.DirectMediaPlayer;
import uk.co.caprica.vlcj.player.direct.RenderCallbackAdapter;
import java.awt.*;
import java.awt.image.BufferedImage;*/
import com.sun.jna.Memory;
import org.kevoree.annotation.*;
import org.kevoree.framework.AbstractComponentType;
import org.kevoree.framework.MessagePort;
import org.kevoree.framework.message.StdKevoreeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.co.caprica.vlcj.player.direct.DirectMediaPlayer;
import uk.co.caprica.vlcj.player.direct.RenderCallback;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* User: Erwan Daubert - erwan.daubert@gmail.com
* Date: 03/10/11
* Time: 07:53
*
* @author Erwan Daubert
* @version 1.0
*/
@MessageTypes({
@MessageType(name = "BufferedImage", elems = {@MsgElem(name = "image", className = BufferedImage.class)}),
@MessageType(name = "bytes", elems =
{@MsgElem(name = "bytes", className = byte[].class),
@MsgElem(name = "width", className = Integer.class),
@MsgElem(name = "height", className = Integer.class),
@MsgElem(name = "chroma", className = String.class),
@MsgElem(name = "fps", className = Integer.class)}
)
})
@Requires({
@RequiredPort(name = "image", type = PortType.MESSAGE, optional = true, messageType = "BufferedImage"),
@RequiredPort(name = "image_bytes", type = PortType.MESSAGE, optional = true, messageType = "bytes")
})
@DictionaryType({
@DictionaryAttribute(name = "DEVICE", defaultValue = "v4l2:///dev/video0",
vals = {"v4l2:///dev/video0", "qtcapture://", "dshow://"}),
@DictionaryAttribute(name = "LOG", defaultValue = "NONE", vals = {"NONE", "DEBUG"}, optional = false),
@DictionaryAttribute(name = "FORMAT", defaultValue = "800x600",
vals = {"1280x1024", "1024x768", "800x600", "640x480", "400x300", "200x150"})
})
@Library(name = "JavaSE")
@ComponentType
public class Webcam extends AbstractComponentType {
private static final Logger logger = LoggerFactory.getLogger(Webcam.class);
private DirectMediaPlayer mediaPlayer;
@Start
public void start () throws Exception {
System.setProperty("vlcj.log", (String) this.getDictionary().get("LOG"));
String device = (String) this.getDictionary().get("DEVICE");
mediaPlayer = MediaPlayerHelper.getInstance().getFactory(this.getName())
.newDirectMediaPlayer(getWidth(), getHeight(), new OwnRenderCallback(getWidth(), getHeight()));
mediaPlayer.playMedia(device);
}
@Stop
public void stop () {
mediaPlayer.stop();
MediaPlayerHelper.getInstance().releaseKey(this.getName());
}
@Update
public void update () throws Exception {
stop();
start();
}
private int getHeight () {
try {
String format = (String) this.getDictionary().get("FORMAT");
String[] values = format.split("x");
return Integer.parseInt(values[1]);
} catch (Exception e) {
logger.warn("invalid format value");
return 600;
}
}
private int getWidth () {
try {
String format = (String) this.getDictionary().get("FORMAT");
String[] values = format.split("x");
return Integer.parseInt(values[0]);
} catch (Exception e) {
logger.warn("invalid format value");
return 800;
}
}
private final class OwnRenderCallback implements RenderCallback {
private final BufferedImage image;
private int width;
private int height;
byte[] bytes;
int[] ints;
public OwnRenderCallback (int width, int height) {
// super(new int[width * height]);
image = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration()
.createCompatibleImage(width, height);
this.width = width;
this.height = height;
bytes = new byte[width * height * 4];
ints = new int[width * height];
}
// @Override
/*public void onDisplay (int[] data) {
// The image data could be manipulated here...
if (isPortBinded("image")) {
image.setRGB(0, 0, width, height, data, 0, width);
getPortByName("image", MessagePort.class).process(image);
System.out.println("send");
}
if (isPortBinded("image_bytes")) {
StdKevoreeMessage msg = new StdKevoreeMessage();
msg.putValue("bytes", data);
msg.putValue("height", data);
msg.putValue("width", data);
msg.putValue("chroma", data);
msg.putValue("fps", data);
int[] newData = new int[data.length + 2];
newData[0] = width;
newData[1] = height;
System.arraycopy(data, 0, newData, 2, data.length);
getPortByName("image_bytes", MessagePort.class).process(msg);
}
}*/
@Override
public void display (Memory memory) {
if (isPortBinded("image_bytes")) {
StdKevoreeMessage msg = new StdKevoreeMessage();
memory.read(0, bytes, 0, width * height * 4);
msg.putValue("bytes", bytes);
msg.putValue("height", height);
msg.putValue("width", width);
msg.putValue("chroma", "RV32");
msg.putValue("fps", "30");
getPortByName("image_bytes", MessagePort.class).process(msg);
}
if (isPortBinded("image")) {
StdKevoreeMessage msg = new StdKevoreeMessage();
memory.read(0, ints, 0, width * height);
image.setRGB(0, 0, width, height, ints, 0, width);
msg.putValue("image", image);
getPortByName("image", MessagePort.class).process(msg);
}
}
}
}