/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.exporter.vloopback; import java.awt.image.BufferedImage; import webcamstudio.InfoListener; import webcamstudio.sources.effects.FlipVertical; /** * * @author lgs */ abstract public class VideoOutput{ protected static String devicePath = "/dev/video2"; final public static int RGB24 = 1; final public static int UYVY = 2; final public static int BGR24 = 3; protected static int pixFormat = 2; protected static boolean flipImage = false; public static void setFlipImage(boolean flip) { flipImage = flip; } public static int getPixFormat() { return pixFormat; } public static String getDevice() { return devicePath; } protected int devFD = 0; protected int w = 320; protected int h = 240; protected FlipVertical flipper = new FlipVertical(); protected InfoListener listener = null; protected byte[] rgbs = null; protected byte[] img2rgb24(int[] data) { if (rgbs == null || rgbs.length != data.length * 3) { rgbs = new byte[data.length * 3]; } int index = 0; for (int i = 0; i < data.length; i++) { rgbs[index++] = (byte) (data[i] >> 16 & 0xFF); rgbs[index++] = (byte) (data[i] >> 8 & 0xFF); rgbs[index++] = (byte) (data[i] & 0xFF); } return rgbs; } protected byte[] img2bgr24(int[] data) { if (rgbs == null || rgbs.length != data.length * 3) { rgbs = new byte[data.length * 3]; } int index = 0; for (int i = 0; i < data.length; i++) { rgbs[index++] = (byte) (data[i] & 0xFF); rgbs[index++] = (byte) (data[i] >> 8 & 0xFF); rgbs[index++] = (byte) (data[i] >> 16 & 0xFF); } return rgbs; } protected byte[] img2yuv420(BufferedImage bi) { h = bi.getHeight(); w = bi.getWidth(); byte[] yuvs = new byte[(int) ((w * h) * 1.5f)]; try { boolean s = false; for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { int color = bi.getRGB(i, j); // int alpha = color >> 24 & 0xff; int R = color >> 16 & 0xff; int G = color >> 8 & 0xff; int B = color & 0xff; int Y = (int) (R * .299000 + G * .587000 + B * 0.114000); int U = (int) (R * -.168736 + G * -.331264 + B * 0.500000 + 128); int V = (int) (R * .500000 + G * -.418688 + B * -0.081312 + 128); int arraySize = w * h; int yLoc = j * w + i; int uLoc = (j / 2) * (w / 2) + i / 2 + arraySize; int vLoc = (j / 2) * (w / 2) + i / 2 + arraySize + arraySize / 4; yuvs[yLoc] = (byte) Y; yuvs[uLoc] = (byte) U; yuvs[vLoc] = (byte) V; s = !s; } } } catch (Exception e) { e.printStackTrace(); } return yuvs; } protected byte[] img2uyvy(int[] data) { // int nbOfPixels = data.length; byte[] yuvs = new byte[data.length * 2]; int index = data.length - 1; int yuvIndex = yuvs.length - 1; byte y1 = 0; byte u = 0; byte v = 0; byte y0 = 0; try { while (index > 0) { int alpha = data[index] >> 24 & 0xff; int R = data[index] >> 16 & 0xff; int G = data[index] >> 8 & 0xff; int B = data[index] & 0xff; y1 = (byte) (R * .299000 + G * .587000 + B * 0.114000); u = (byte) (R * -.168736 + G * -.331264 + B * 0.500000 + 128); v = (byte) (R * .500000 + G * -.418688 + B * -0.081312 + 128); index--; alpha = data[index] >> 24 & 0xff; R = data[index] >> 16 & 0xff; G = data[index] >> 8 & 0xff; B = data[index] & 0xff; y0 = (byte) (R * .299000 + G * .587000 + B * 0.114000); yuvs[yuvIndex--] = y1; yuvs[yuvIndex--] = v; yuvs[yuvIndex--] = y0; yuvs[yuvIndex--] = u; index--; } } catch (Exception e) { e.printStackTrace(); } return yuvs; } public abstract void open(String path, int w, int h, int pixFormat); public abstract void close(); public abstract void write(int[] data); }