/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package webcamstudio.media.renderer;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.logging.Level;
import java.util.logging.Logger;
import static webcamstudio.WebcamStudio.audioFreq;
import webcamstudio.mixers.Frame;
import webcamstudio.mixers.WSImage;
import webcamstudio.streams.Stream;
import webcamstudio.util.Tools;
/**
*
* @author patrick (modified by karl)
*/
public class CapturerC {
private final int vport = 0;
private final int aport = 0;
private boolean stopMe = false;
private Stream stream;
private final ServerSocket videoServer = null;
private final ServerSocket audioServer = null;
private WSImage image = null;
private byte[] audio = null;
private Frame frame = null;
private DataInputStream videoIn = null;
private DataInputStream audioIn = null;
private DataInputStream fakeVideoIn = null;
private DataInputStream fakeAudioIn = null;
private boolean noVideoPres = true;
private boolean noAudioPres = true;
private boolean vPauseFlag = false;
private boolean aPauseFlag = false;
private Process prAudio = null;
private Process prVideo = null;
public CapturerC(Stream s, Process prV, Process prA) {
stream = s;
prAudio = prA;
prVideo = prV;
frame = new Frame(stream.getCaptureWidth(), stream.getCaptureHeight(), stream.getRate());
image = new WSImage(stream.getCaptureWidth(), stream.getCaptureHeight(), BufferedImage.TYPE_INT_RGB);
audio = new byte[(audioFreq * 2 * 2) / stream.getRate()];
frame.setID(stream.getID());
if (!stream.isOnlyAudio()) {
Thread vCapture = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(stream.getName() + " Video accepted...");
if (stream.hasFakeVideo()) {
fakeVideoIn = new DataInputStream(new BufferedInputStream(prVideo.getInputStream(), 4096));
}
do {
Tools.sleep(20);
if (fakeAudioIn != null) {
if (fakeAudioIn.available() != 0) {
noVideoPres=false;
Tools.sleep(stream.getVDelay());
videoIn = fakeVideoIn;
System.out.println("Start Video ...");
}
} else if (stream.getName().contains("Desktop")) {
noVideoPres=false;
Tools.sleep(stream.getVDelay());
videoIn = new DataInputStream(new BufferedInputStream(prVideo.getInputStream(), 4096));
System.out.println("Start Video ...");
} else if (stream.getClass().getName().contains("SourceWebcam")) {
noVideoPres=false;
Tools.sleep(stream.getVDelay());
videoIn = new DataInputStream(new BufferedInputStream(prVideo.getInputStream(), 4096));
System.out.println("Start Video ...");
} else if (!stream.hasAudio()) {
noVideoPres=false;
Tools.sleep(stream.getVDelay());
videoIn = fakeVideoIn;
System.out.println("Start Video ...");
}
} while (noVideoPres);
} catch (IOException ex) {
Logger.getLogger(Capturer.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
vCapture.setPriority(Thread.MIN_PRIORITY);
vCapture.start();
}
if (stream.hasAudio()) {
Thread aCapture = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(stream.getName() + " Audio accepted...");
if (stream.hasFakeAudio()) {
fakeAudioIn = new DataInputStream(new BufferedInputStream(prAudio.getInputStream(), 4096));
}
do {
Tools.sleep(20);
if (fakeVideoIn != null) {
if (fakeVideoIn.available() != 0) {
noAudioPres = false;
Tools.sleep(stream.getADelay());
audioIn = fakeAudioIn;
System.out.println("Start Audio ...");
}
} else if (stream.getName().endsWith(".mp3") || !stream.hasVideo() ) {
noAudioPres = false;
Tools.sleep(stream.getADelay());
audioIn = new DataInputStream(new BufferedInputStream(prAudio.getInputStream(), 4096));
System.out.println("Start Audio ...");
}
} while (noAudioPres);
} catch (IOException ex) {
Logger.getLogger(Capturer.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
aCapture.setPriority(Thread.MIN_PRIORITY);
aCapture.start();
}
}
public void abort() {
stopMe = true;
try {
if (videoIn != null) {
videoIn.close();
videoIn = null;
fakeVideoIn.close();
fakeVideoIn = null;
}
if (audioIn != null) {
audioIn.close();
audioIn = null;
fakeAudioIn.close();
fakeAudioIn = null;
}
} catch (IOException ex) {
Logger.getLogger(Capturer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void vPause() {
vPauseFlag = true;
// System.out.println("VideoCapture Paused ...");
}
public void aPause() {
aPauseFlag = true;
// System.out.println("AudioCapture Paused ...");
}
public void vPlay() {
vPauseFlag = false;
// System.out.println("VideoCapture Resumed ...");
}
public void aPlay() {
aPauseFlag = false;
// System.out.println("AudioCapture Resumed ...");
}
public int getVideoPort() {
return vport;
}
public int getAudioPort() {
return aport;
}
private WSImage getNextImage() throws IOException {
if (videoIn != null && !vPauseFlag) { //
image.readFully(videoIn);
return image;
} else {
return null;
}
}
private byte[] getNextAudio() throws IOException {
if (audioIn != null && audioIn.available()>0 && !aPauseFlag) { //
audioIn.readFully(audio);
return audio;
} else {
return null;
}
}
private BufferedImage toCompatibleImage(BufferedImage image) {
GraphicsConfiguration gfx_config = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
if (image.getColorModel().equals(gfx_config.getColorModel())) {
return image;
}
BufferedImage new_image = gfx_config.createCompatibleImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) new_image.getGraphics();
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return new_image;
}
public Frame getFrame() {
BufferedImage nextImage = null;
byte[] nextAudio = null;
try {
if (stream.hasVideo()) {
// System.out.println("getFrame");
BufferedImage quantumImage = getNextImage();
if (quantumImage != null){
nextImage = toCompatibleImage(quantumImage);
}
}
if (stream.hasAudio()) {
nextAudio = getNextAudio();
}
frame.setAudio(nextAudio);
frame.setImage(nextImage);
frame.setOutputFormat(stream.getX(), stream.getY(), stream.getWidth(), stream.getHeight(), stream.getOpacity(), stream.getVolume());
frame.setZOrder(stream.getZOrder());
} catch (IOException ioe) {
stream.stop();
stream.updateStatus();
// Logger.getLogger(Capturer.class.getName()).log(Level.SEVERE, null, ioe);
}
return frame;
}
}