package pl.aadamczyk.webcamera; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.ImageFormat; import android.graphics.Rect; import android.graphics.YuvImage; import android.hardware.Camera; import android.hardware.Camera.PreviewCallback; import android.hardware.Camera.Size; import android.os.Environment; import android.view.SurfaceHolder; import android.view.SurfaceView; class Preview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; private ServerSocket socket; private Socket client; private ByteArrayOutputStream mJpegCompressionBuffer = new ByteArrayOutputStream(); private ObjectOutputStream oos; private ObjectInputStream ois; private long time; private boolean sending; public Preview(Context context) { super(context); time = System.currentTimeMillis(); sending = false; // Creating socket try { //socket = new Socket("192.168.1.100", 4567); //oos = new ObjectOutputStream(socket.getOutputStream()); //ois = new ObjectInputStream(socket.getInputStream()); socket = new ServerSocket(4567); System.out.println("Waiting for connection,,"); // showing client = socket.accept(); System.out.println("Connected"); //showing ois = new ObjectInputStream(client.getInputStream()); oos = new ObjectOutputStream(client.getOutputStream()); System.out.println("Streams opened"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // Install a SurfaceHolder.Callback so we get notified when the // underlying surface is created and destroyed. mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder) { // The Surface has been created, acquire the camera and tell it where // to draw. mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); } catch (IOException exception) { mCamera.release(); mCamera = null; // TODO: add more exception handling logic here } mCamera.setPreviewCallback(new PreCallback()); } public void surfaceDestroyed(SurfaceHolder holder) { // Surface will be destroyed when we return, so stop the preview. // Because the CameraDevice object is not a shared resource, it's very // important to release it when the activity is paused. mCamera.stopPreview(); mCamera.release(); mCamera = null; } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // Now that the size is known, set up the camera parameters and begin // the preview. Camera.Parameters parameters = mCamera.getParameters(); parameters.setPreviewSize(w, h); mCamera.setParameters(parameters); mCamera.startPreview(); } public class PreCallback implements PreviewCallback { @Override public void onPreviewFrame(byte[] data, Camera camera) { try { if (!sending) { sending = true; time = System.currentTimeMillis(); byte[] mJpegData = compressYuvToJpeg(data, camera); System.out.println("Compress: " + (System.currentTimeMillis()-time) + "ms"); time = System.currentTimeMillis(); System.out.println("Sending object.."); Packet p = new Packet(mJpegData); System.out.println(p); System.out.println(oos); oos.writeObject(p); System.out.println("Transfer: " + (System.currentTimeMillis()-time) + "ms"); time = System.currentTimeMillis(); Packet packet; while (true) { packet = (Packet)ois.readObject(); if (packet.isEOF()) break; } System.out.println("Callback: " + (System.currentTimeMillis()-time) + "ms"); sending = false; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private byte[] compressYuvToJpeg(final byte[] yuvData, Camera camera) { Camera.Parameters parameters = camera.getParameters(); Size size = parameters.getPreviewSize(); mJpegCompressionBuffer.reset(); YuvImage yuvImage = new YuvImage(yuvData, ImageFormat.NV21, size.width, size.height, null); yuvImage.compressToJpeg(new Rect(0, 0, size.width, size.height), 50, mJpegCompressionBuffer); return mJpegCompressionBuffer.toByteArray(); } } }