/* * Copyright (C) 2005 Luca Veltri - University of Parma - Italy * * This source code is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This source code is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this source code; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author(s): * Luca Veltri (luca.veltri@unipr.it) */ package local.media; import org.zoolu.net.UdpPacket; import org.zoolu.net.UdpSocket; import org.zoolu.net.IpAddress; import java.io.*; /** UdpStreamReceiver is a generic stream receiver. * It receives packets from UDP and writes them into an OutputStream. */ public class UdpStreamReceiver extends Thread { /** Whether debug mode */ private static final boolean DEBUG=true; /** Size of the read buffer */ private static final int BUFFER_SIZE=32768; /** Maximum blocking time, spent waiting for reading new bytes [milliseconds] */ private static final int SO_TIMEOUT=200; /** The OutputStream */ OutputStream output_stream=null; /** The UdpSocket */ UdpSocket udp_socket=null; /** Whether the socket has been created here */ boolean socket_is_local=false; /** Whether it is running */ boolean running=false; /** Constructs a UdpStreamReceiver. * @param output_stream the stream sink * @param local_port the local receiver port */ public UdpStreamReceiver(OutputStream output_stream, int local_port) { try { UdpSocket socket=new UdpSocket(local_port); socket_is_local=true; init(output_stream,socket); } catch (Exception e) { e.printStackTrace(); } } /** Constructs a UdpStreamReceiver. * @param output_stream the stream sink * @param socket the local receiver UdpSocket */ public UdpStreamReceiver(OutputStream output_stream, UdpSocket socket) { init(output_stream,socket); } /** Inits the UdpStreamReceiver */ private void init(OutputStream output_stream, UdpSocket socket) { this.output_stream=output_stream; if (socket!=null) udp_socket=socket; } /** Whether is running */ public boolean isRunning() { return running; } /** Stops running */ public void halt() { running=false; } /** Runs it in a new Thread. */ public void run() { if (udp_socket==null) { if (DEBUG) println("ERROR: RTP socket is null"); return; } //else byte[] buffer=new byte[BUFFER_SIZE]; UdpPacket udp_packet=new UdpPacket(buffer,0); if (DEBUG) println("Reading blocks of max "+buffer.length+" bytes"); //byte[] aux=new byte[BUFFER_SIZE]; running=true; try { udp_socket.setSoTimeout(SO_TIMEOUT); while (running) { try { // read a block of data from the rtp socket udp_socket.receive(udp_packet); //if (DEBUG) System.out.print("."); // write this block to the output_stream (only if still running..) if (running) output_stream.write(udp_packet.getData(), udp_packet.getOffset(), udp_packet.getLength()); } catch (java.io.InterruptedIOException e) { } } } catch (Exception e) { running=false; e.printStackTrace(); } // close UdpSocket if (socket_is_local && udp_socket!=null) udp_socket.close(); // free all output_stream=null; udp_socket=null; if (DEBUG) println("udp receiver terminated"); } /** Debug output */ private static void println(String str) { System.out.println("UdpStreamReceiver: "+str); } }