/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net.rtp; import java.net.InetAddress; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.SocketException; /** * RtpStream represents the base class of streams which send and receive network * packets with media payloads over Real-time Transport Protocol (RTP). * *

Using this class requires * {@link android.Manifest.permission#INTERNET} permission.

*/ public class RtpStream { /** * This mode indicates that the stream sends and receives packets at the * same time. This is the initial mode for new streams. */ public static final int MODE_NORMAL = 0; /** * This mode indicates that the stream only sends packets. */ public static final int MODE_SEND_ONLY = 1; /** * This mode indicates that the stream only receives packets. */ public static final int MODE_RECEIVE_ONLY = 2; private static final int MODE_LAST = 2; private final InetAddress mLocalAddress; private final int mLocalPort; private InetAddress mRemoteAddress; private int mRemotePort = -1; private int mMode = MODE_NORMAL; private int mSocket = -1; static { System.loadLibrary("rtp_jni"); } /** * Creates a RtpStream on the given local address. Note that the local * port is assigned automatically to conform with RFC 3550. * * @param address The network address of the local host to bind to. * @throws SocketException if the address cannot be bound or a problem * occurs during binding. */ RtpStream(InetAddress address) throws SocketException { mLocalPort = create(address.getHostAddress()); mLocalAddress = address; } private native int create(String address) throws SocketException; /** * Returns the network address of the local host. */ public InetAddress getLocalAddress() { return mLocalAddress; } /** * Returns the network port of the local host. */ public int getLocalPort() { return mLocalPort; } /** * Returns the network address of the remote host or {@code null} if the * stream is not associated. */ public InetAddress getRemoteAddress() { return mRemoteAddress; } /** * Returns the network port of the remote host or {@code -1} if the stream * is not associated. */ public int getRemotePort() { return mRemotePort; } /** * Returns {@code true} if the stream is busy. In this case most of the * setter methods are disabled. This method is intended to be overridden * by subclasses. */ public boolean isBusy() { return false; } /** * Returns the current mode. */ public int getMode() { return mMode; } /** * Changes the current mode. It must be one of {@link #MODE_NORMAL}, * {@link #MODE_SEND_ONLY}, and {@link #MODE_RECEIVE_ONLY}. * * @param mode The mode to change to. * @throws IllegalArgumentException if the mode is invalid. * @throws IllegalStateException if the stream is busy. * @see #isBusy() */ public void setMode(int mode) { if (isBusy()) { throw new IllegalStateException("Busy"); } if (mode < 0 || mode > MODE_LAST) { throw new IllegalArgumentException("Invalid mode"); } mMode = mode; } /** * Associates with a remote host. This defines the destination of the * outgoing packets. * * @param address The network address of the remote host. * @param port The network port of the remote host. * @throws IllegalArgumentException if the address is not supported or the * port is invalid. * @throws IllegalStateException if the stream is busy. * @see #isBusy() */ public void associate(InetAddress address, int port) { if (isBusy()) { throw new IllegalStateException("Busy"); } if (!(address instanceof Inet4Address && mLocalAddress instanceof Inet4Address) && !(address instanceof Inet6Address && mLocalAddress instanceof Inet6Address)) { throw new IllegalArgumentException("Unsupported address"); } if (port < 0 || port > 65535) { throw new IllegalArgumentException("Invalid port"); } mRemoteAddress = address; mRemotePort = port; } int getSocket() { return mSocket; } /** * Releases allocated resources. The stream becomes inoperable after calling * this method. * * @throws IllegalStateException if the stream is busy. * @see #isBusy() */ public void release() { synchronized (this) { if (isBusy()) { throw new IllegalStateException("Busy"); } close(); } } private native void close(); @Override protected void finalize() throws Throwable { close(); super.finalize(); } }