Package com.benkyou.client.network

Source Code of com.benkyou.client.network.WebcamListener

/*
* Project Beknyou
* Copyright (c) 2010-2011 Saint Paul College, All Rights Reserved
* Redistributions in source code form must reproduce the above
* Copyright and this condition.
* The contents of this file are subject to the GNU General Public
* License, Version 2 (the "License"); you may not use this file
* except in compliance with the License. A copy of the License is
* available at http://www.opensource.org/licenses/gpl-license.php.
*/
package com.benkyou.client.network;

import com.jme3.network.Client;
import com.jme3.network.Message;
import com.jme3.network.MessageListener;
import com.benkyou.client.GameClient;
import com.benkyou.client.systems.ImagingSystem;
import com.benkyou.common.messages.VNCMessage;
import com.benkyou.common.messages.WebcamMessage;
import com.benkyou.util.ByteArrayList;
import com.jme3.texture.Image;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;
import jme3tools.converters.ImageToAwt;

/**
*
* @author Austin Allman
*/
public class WebcamListener implements MessageListener<Client> {

    private static BufferedImage decodedImage;
    private GameClient gameClient;
    private ByteArrayList bal;
    private int currentImage;
    private int numberOfParts;
    private int lastReadImage;
    private ByteBuffer byteBuffer;
    private BufferedImage webcamImage;
    private boolean firstRun = true;
    private BufferedImage desktopImage;

    /**
     *
     * @param gameClient
     */
    public WebcamListener(GameClient gameClient) {

        this.gameClient = gameClient;
        currentImage = -1;
        numberOfParts = -1;
        bal = new ByteArrayList();
    }

    /**
     *
     */
    public void clearImage() {
        currentImage = -1;
        numberOfParts = -1;
        lastReadImage = -1;
        bal.clearArrayList();
    }
    int counter = 0;

    /**
     *
     * @param source
     * @param m
     */
    public void messageReceived(Client source, Message m) {
        if (m instanceof WebcamMessage) {
            WebcamMessage webcamMessage = (WebcamMessage) m;
            if (gameClient.isUp()) {
                if (webcamMessage.getNumberOfParts() > 0) {
                    processImages(webcamMessage);
                } else {
                    processSingleImage(webcamMessage);
                }
            }
        }
    }

    private Image convertToJme(BufferedImage desktopImage) {
        if (firstRun) {
            byteBuffer = ByteBuffer.allocateDirect((desktopImage.getHeight() * desktopImage.getWidth() * 4));
            firstRun = false;
        }
        byteBuffer.clear();
        ImageToAwt.convert(desktopImage, ImagingSystem.jmeformat, byteBuffer);
        Image im = new Image(ImagingSystem.jmeformat, desktopImage.getWidth(), desktopImage.getHeight(), byteBuffer.duplicate(), null);
        return im;
    }

    /**
     *
     * @param argsp
     */
    public static void main(String argsp[]) {
    }

    /**
     *
     * @param bytesToDecode
     * @return
     * @throws IOException
     */
    public BufferedImage decodeStream(byte[] bytesToDecode) throws IOException {
        ByteArrayInputStream is = new ByteArrayInputStream(bytesToDecode);
        JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(is);
        decodedImage = decoder.decodeAsBufferedImage();
        return decodedImage;
    }

    private void processImages(WebcamMessage webcamMessage) {
        try {
            if (webcamMessage.getImageNumber() == 0 && currentImage == -1) {
                currentImage = webcamMessage.getImageID();
                numberOfParts = webcamMessage.getNumberOfParts() - 1;
                lastReadImage = webcamMessage.getImageNumber();
                bal.addBytes(webcamMessage.getImageData());
            } else if (webcamMessage.getImageID() == currentImage) {
                lastReadImage++;
                if (webcamMessage.getImageNumber() != lastReadImage) {
                    clearImage();
                } else if (webcamMessage.getImageNumber() == numberOfParts) {
                    bal.addBytes(webcamMessage.getImageData());
                    try {
                        webcamImage = decodeStream(bal.getByteArray());
                        Image jmeImage = convertToJme(webcamImage);//getImagingSystemByType("vnc").getImageToProject());//.setImage(convertToJme(desktopImage));
                        gameClient.getWebcamImagingSystem().getImageToProject().setImage(jmeImage);
                    } catch (IOException ex) {
                        //Logger.getLogger(VNCListener.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    clearImage();
                } else {
                    bal.addBytes(webcamMessage.getImageData());
                }
            } else {
                clearImage();
            }

        } catch (Exception ex) {
            Logger.getLogger(WebcamListener.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void processSingleImage(WebcamMessage webcamMessage) {

        try {
            webcamImage = decodeStream(webcamMessage.getImageData());
            Image jmeImage = convertToJme(webcamImage);
            gameClient.getWebcamImagingSystem().getImageToProject().setImage(jmeImage);
        } catch (IOException ex) {
        } catch (Exception e) {
            e.printStackTrace();
        }
        clearImage();
    }

    private void processImages(VNCMessage vncMessage) {
        if (vncMessage.getImageNumber() == 0 && currentImage == -1) {
            currentImage = vncMessage.getImageID();
            numberOfParts = vncMessage.getNumberOfParts() - 1;
            lastReadImage = vncMessage.getImageNumber();
            bal.addBytes(vncMessage.getImageData());
        } else if (vncMessage.getImageID() == currentImage) {
            lastReadImage++;
            if (vncMessage.getImageNumber() != lastReadImage) {
                clearImage();
            } else if (vncMessage.getImageNumber() == numberOfParts) {
                bal.addBytes(vncMessage.getImageData());
                try {
                    // implement the decode method desktopImage =  TightVNCImageByteStream.decodeStream(bal.getByteArray());
                    desktopImage = decodeStream(bal.getByteArray());
                    Image jmeImage = convertToJme(desktopImage);//getImagingSystemByType("vnc").getImageToProject());//.setImage(convertToJme(desktopImage));
                    gameClient.getVNCImagingSystem().getImageToProject().setImage(jmeImage);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                clearImage();
            } else {
                bal.addBytes(vncMessage.getImageData());
            }
        } else {
            clearImage();
        }
    }
}
TOP

Related Classes of com.benkyou.client.network.WebcamListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.