/* * @(#)Handler.java 1.6 02/08/21 * * Copyright (c) 1996-2002 Sun Microsystems, Inc. All rights reserved. */ package com.sun.media.datasink.rtp; import java.net.MalformedURLException; import com.sun.media.rtp.*; import com.sun.media.datasink.*; import javax.media.*; import javax.media.rtp.*; import javax.media.rtp.rtcp.*; import javax.media.protocol.*; import java.io.IOException; import java.awt.Component; import java.net.InetAddress; public class Handler extends BasicDataSink { private RTPMediaLocator rtpmrl = null; RTPManager rtpmanager = null; PushBufferDataSource source = null; SendStream rtpsendstream = null; public Object getControl(String controlType) { return null; } public Object[] getControls() { return new Object[0]; } public Component getControlComponent() { return null; } public void setSource(DataSource source) throws IOException, IncompatibleSourceException { if ( ! (source instanceof PushBufferDataSource) ) { throw new IncompatibleSourceException("Only supports PushBufferDataSource"); } this.source = (PushBufferDataSource) source; PushBufferStream [] streams = this.source.getStreams(); int numStreams = streams.length; System.out.println("streams is " + streams + " : " + numStreams); if ( (streams == null) || (numStreams <= 0) ) throw new IOException("source " + source + " doesn't have any streams"); } /** * Set the output <code>MediaLocator</code>. * This method should only be called once; an error is thrown if * the locator has already been set. * @param output <code>MediaLocator</code> that describes where * the output goes. */ public void setOutputLocator(MediaLocator output) { if (rtpmrl == null) { System.out.println("sink: setOutputLocator " + output); // need to validate the RTPMedialocator try{ rtpmrl = new RTPMediaLocator(output.toString()); }catch (MalformedURLException e){ rtpmrl = null; } } else { throw new Error("setOutputLocator cannot be called more than once"); } } /** * Get the output <code>MediaLocator</code> that describes where * the output of this DataSink goes. * @return the output <code>MediaLocator</code> for this * <code>DataSink</code>. */ public MediaLocator getOutputLocator() { return rtpmrl; } /** * Initiate data-transfer. * You must call open before calling start * * @exception IOException Thrown if there are IO problems with the source * when start is called. */ public void start() throws IOException { rtpsendstream.start(); } /** * Stop the data-transfer. * If the source has not been connected and started, * <CODE>stop</CODE> does nothing. */ public void stop() throws IOException { rtpsendstream.stop(); } /** * Open a connection to the destination described by * the output MediaLocator. * <p> * * The open method establishes a channel with the destination as described in the medialocator. * * @exception IOException Thrown if there are IO problems * when open is called. * @exception SecurityException thrown if there is any security * violation while attempting to access the destination as described * by the medialocator */ public void open() throws IOException, SecurityException { // create, initialise and start the session manager here if (rtpmrl == null) throw new IOException ("No Valid RTP MediaLocator"); try { String address = rtpmrl.getSessionAddress(); int port = rtpmrl.getSessionPort(); int ttl = rtpmrl.getTTL(); rtpmanager = RTPManager.newInstance(); // create our local Session Address SessionAddress localaddr = new SessionAddress(); InetAddress destaddr = InetAddress.getByName(address); SessionAddress sessaddr = new SessionAddress(destaddr, port, ttl); rtpmanager.initialize(localaddr); rtpmanager.addTarget(sessaddr); rtpsendstream = rtpmanager.createSendStream(source,0); } catch (Exception e) { throw new IOException (e.getMessage()); } } /** * Close the connection to the source described by the locator. * <p> * The close method frees resources used to maintain a * connection to the destination described in the medialocator. * If no resources are in use, close is ignored. * If stop hasn't already been called, * calling close implies a stop. * The DataSink may no longer be used after being closed. */ public void close() { if (rtpmanager != null) { rtpmanager.removeTargets("DataSink closed"); rtpmanager.dispose(); } } /** * Get a string that describes the content-type of the media * that the datasink is consuming. * @return The name that describes the media content. */ public String getContentType() { return "RTP"; } }