- copy deskshare applet to trunk
git-svn-id: http://bigbluebutton.googlecode.com/svn/trunk@1764 af16638f-c34d-0410-8cfa-b39d5352b314
This commit is contained in:
parent
c7acddd129
commit
457ad87938
6
deskshare-applet/.classpath
Normal file
6
deskshare-applet/.classpath
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
17
deskshare-applet/.project
Normal file
17
deskshare-applet/.project
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>deskShareClient</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
12
deskshare-applet/.settings/org.eclipse.jdt.core.prefs
Normal file
12
deskshare-applet/.settings/org.eclipse.jdt.core.prefs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#Thu Jun 11 14:39:57 EDT 2009
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.6
|
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.4
|
BIN
deskshare-applet/deskShare.jar
Normal file
BIN
deskshare-applet/deskShare.jar
Normal file
Binary file not shown.
23
deskshare-applet/src/converter/EightBitConverter.java
Normal file
23
deskshare-applet/src/converter/EightBitConverter.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package converter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The EightBit converter converts a 32 bit Image to an 8 bit Image
|
||||||
|
* The Conversion takes the following form:
|
||||||
|
* - The 32bit representation is decomosed into alpha, red, green, and blue values (8 bit each)
|
||||||
|
* - Alpha values are discarded
|
||||||
|
* - 3 most significant bits of the red value are kept
|
||||||
|
* - 3 most significant bits of the green value are kept
|
||||||
|
* - 2 most significant bits of the blue value are kept
|
||||||
|
* - Floyd-Steinberg Dithering is applied to create a more proper image
|
||||||
|
* @author Snap
|
||||||
|
* @unimplemented
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class EightBitConverter {
|
||||||
|
|
||||||
|
public EightBitConverter(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
150
deskshare-applet/src/screenshot/Capture.java
Normal file
150
deskshare-applet/src/screenshot/Capture.java
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
package screenshot;
|
||||||
|
|
||||||
|
import java.awt.AWTException;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.Robot;
|
||||||
|
import java.awt.Toolkit;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Capture class uses the java Robot class to capture the screen
|
||||||
|
* The image captured is scaled down. This is done because of bandwidth issues and because it
|
||||||
|
* is unnecessary for the Flex Client to be able to see the full screen, in fact it is undesirable
|
||||||
|
* to do so.
|
||||||
|
* The image can then be sent for further processing
|
||||||
|
* @author Snap
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Capture {
|
||||||
|
|
||||||
|
private Robot robot;
|
||||||
|
private Toolkit toolkit;
|
||||||
|
private Rectangle screenBounds;
|
||||||
|
|
||||||
|
private int width, height, x,y;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The default constructor. Performs initialisation work
|
||||||
|
*/
|
||||||
|
public Capture(int x, int y, int screenWidth, int screenHeight){
|
||||||
|
this.width = screenWidth;
|
||||||
|
this.height = screenHeight;
|
||||||
|
try{
|
||||||
|
robot = new Robot();
|
||||||
|
}catch (AWTException e){
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
this.toolkit = Toolkit.getDefaultToolkit();
|
||||||
|
this.screenBounds = new Rectangle(x, y, this.width, this.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BufferedImage takeSingleSnapshot(){
|
||||||
|
return robot.createScreenCapture(this.screenBounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getScreenshotWidth(){
|
||||||
|
return toolkit.getScreenSize().width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getScreenshotHeight(){
|
||||||
|
return toolkit.getScreenSize().height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWidth(int width){
|
||||||
|
int screenWidth = toolkit.getScreenSize().width;
|
||||||
|
if (width > screenWidth) this.width = screenWidth;
|
||||||
|
else this.width = width;
|
||||||
|
updateBounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeight(int height){
|
||||||
|
int screenHeight = toolkit.getScreenSize().height;
|
||||||
|
if (height > screenHeight) this.height = screenHeight;
|
||||||
|
else this.height = height;
|
||||||
|
updateBounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setX(int x){
|
||||||
|
/*int screenWidth = toolkit.getScreenSize().width;
|
||||||
|
if ((screenWidth < this.width + x) ){
|
||||||
|
this.x = screenWidth - this.width;
|
||||||
|
} else if (x - this.width < 0){
|
||||||
|
this.x = 0;
|
||||||
|
} else this.x = x;*/
|
||||||
|
this.x = x;
|
||||||
|
updateBounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setY(int y){
|
||||||
|
/*int screenHeight = toolkit.getScreenSize().height;
|
||||||
|
if (screenHeight < (this.height + y) ){
|
||||||
|
this.y = screenHeight - this.height;
|
||||||
|
} else if (y - this.height < 0) {
|
||||||
|
this.y = 0;
|
||||||
|
} else this.y = y;*/
|
||||||
|
this.y = y;
|
||||||
|
updateBounds();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateBounds(){
|
||||||
|
this.screenBounds = new Rectangle(x,y,width,height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a {@link BufferedImage} of any type, to {@link
|
||||||
|
* BufferedImage} of a specified type. If the source image is the
|
||||||
|
* same type as the target type, then original image is returned,
|
||||||
|
* otherwise new image of the correct type is created and the content
|
||||||
|
* of the source image is copied into the new image.
|
||||||
|
*
|
||||||
|
* @param sourceImage the image to be converted
|
||||||
|
* @param targetType the desired BufferedImage type
|
||||||
|
*
|
||||||
|
* @return a BufferedImage of the specifed target type.
|
||||||
|
*
|
||||||
|
* @see BufferedImage
|
||||||
|
*
|
||||||
|
* @author Robert Harris
|
||||||
|
*/
|
||||||
|
|
||||||
|
public BufferedImage convertToType(BufferedImage sourceImage,
|
||||||
|
int targetType)
|
||||||
|
{
|
||||||
|
BufferedImage image;
|
||||||
|
|
||||||
|
// if the source image is already the target type, return the source image
|
||||||
|
|
||||||
|
if (sourceImage.getType() == targetType)
|
||||||
|
image = sourceImage;
|
||||||
|
|
||||||
|
// otherwise create a new image of the target type and draw the new
|
||||||
|
// image
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
image = new BufferedImage(sourceImage.getWidth(), sourceImage.getHeight(),
|
||||||
|
targetType);
|
||||||
|
image.getGraphics().drawImage(sourceImage, 0, 0, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWidth(){
|
||||||
|
return this.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getHeight(){
|
||||||
|
return this.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getProperFrameRate(){
|
||||||
|
long area = width*height;
|
||||||
|
if (area > 1000000) return 1;
|
||||||
|
else if (area > 600000) return 2;
|
||||||
|
else if (area > 300000) return 4;
|
||||||
|
else if (area > 150000) return 8;
|
||||||
|
else return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
75
deskshare-applet/src/screenshot/CaptureThread.java
Normal file
75
deskshare-applet/src/screenshot/CaptureThread.java
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
package screenshot;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.DataOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
public class CaptureThread implements Runnable {
|
||||||
|
|
||||||
|
private static final int PORT = 1026;
|
||||||
|
//private static final String IP = "192.168.0.120";
|
||||||
|
|
||||||
|
private Socket socket = null;
|
||||||
|
public Capture capture;
|
||||||
|
private String roomNumber;
|
||||||
|
private String IP;
|
||||||
|
private int timeBase;
|
||||||
|
|
||||||
|
public CaptureThread(Capture capture, String IP, String room){
|
||||||
|
this.capture = capture;
|
||||||
|
this.roomNumber = room;
|
||||||
|
this.IP = IP;
|
||||||
|
this.timeBase = 1000 / capture.getProperFrameRate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(){
|
||||||
|
DataOutputStream outStream = null;
|
||||||
|
try{
|
||||||
|
socket = new Socket(IP, PORT);
|
||||||
|
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
|
||||||
|
out.println(roomNumber);
|
||||||
|
out.println(Integer.toString(capture.getWidth())
|
||||||
|
+ "x" + Integer.toString(capture.getHeight())
|
||||||
|
+ "x" + Integer.toString(capture.getProperFrameRate()));
|
||||||
|
outStream = new DataOutputStream(socket.getOutputStream());
|
||||||
|
} catch(Exception e){
|
||||||
|
e.printStackTrace(System.out);
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true){
|
||||||
|
BufferedImage image = capture.takeSingleSnapshot();
|
||||||
|
|
||||||
|
try{
|
||||||
|
ByteArrayOutputStream byteConvert = new ByteArrayOutputStream();
|
||||||
|
ImageIO.write(image, "jpeg", byteConvert);
|
||||||
|
byte[] imageData = byteConvert.toByteArray();
|
||||||
|
outStream.writeLong(imageData.length);
|
||||||
|
outStream.write(imageData);
|
||||||
|
System.out.println("Sent: "+ imageData.length);
|
||||||
|
} catch(Exception e){
|
||||||
|
e.printStackTrace(System.out);
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
Thread.sleep(timeBase);
|
||||||
|
} catch (Exception e){
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void closeConnection(){
|
||||||
|
try{
|
||||||
|
socket.close();
|
||||||
|
} catch(IOException e){
|
||||||
|
e.printStackTrace(System.out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
42
deskshare-applet/src/test/Runner.java
Normal file
42
deskshare-applet/src/test/Runner.java
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import screenshot.Capture;
|
||||||
|
|
||||||
|
public class Runner {
|
||||||
|
|
||||||
|
private static int index = 0;
|
||||||
|
/**
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
System.out.println("Starting");
|
||||||
|
Capture capture = new Capture(0, 0, 800, 600);
|
||||||
|
|
||||||
|
while (index < 20){
|
||||||
|
BufferedImage image = capture.takeSingleSnapshot();
|
||||||
|
|
||||||
|
try{
|
||||||
|
//ByteArrayOutputStream byteConvert = new ByteArrayOutputStream();
|
||||||
|
ImageIO.write(image, "jpeg", new File(Integer.toString(index) + ".jpeg"));
|
||||||
|
index++;
|
||||||
|
//byte[] imageData = byteConvert.toByteArray();
|
||||||
|
System.out.println(index);
|
||||||
|
} catch(Exception e){
|
||||||
|
e.printStackTrace(System.out);
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
Thread.sleep(200);
|
||||||
|
} catch (Exception e){
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
deskshare-applet/src/test/RunnerApplet.java
Normal file
46
deskshare-applet/src/test/RunnerApplet.java
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package test;
|
||||||
|
import javax.swing.JApplet;
|
||||||
|
|
||||||
|
import screenshot.Capture;
|
||||||
|
import screenshot.CaptureThread;
|
||||||
|
|
||||||
|
public class RunnerApplet extends JApplet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
CaptureThread capThread;
|
||||||
|
|
||||||
|
public void init(){
|
||||||
|
int screenWidth = Integer.parseInt(getParameter("CAPTURE_WIDTH"));
|
||||||
|
int screenHeight = Integer.parseInt(getParameter("CAPTURE_HEIGHT"));
|
||||||
|
int x = Integer.parseInt(getParameter("X"));
|
||||||
|
int y = Integer.parseInt(getParameter("Y"));
|
||||||
|
Capture capture = new Capture(x, y, screenWidth, screenHeight);
|
||||||
|
String roomNumber = getParameter("ROOM");
|
||||||
|
String IP = getParameter("IP");
|
||||||
|
capThread = new CaptureThread(capture, IP, roomNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop(){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start(){
|
||||||
|
Thread thread = new Thread(capThread);
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is called when the user closes the browser window containing the applet
|
||||||
|
*/
|
||||||
|
public void destroy(){
|
||||||
|
capThread.closeConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScreenCoordinates(int x, int y){
|
||||||
|
capThread.capture.setX(x);
|
||||||
|
capThread.capture.setY(y);
|
||||||
|
}
|
||||||
|
}
|
BIN
deskshare-applet/tstcert.crt
Normal file
BIN
deskshare-applet/tstcert.crt
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user