📄 rtppresenting.html
字号:
<a name="113167"> </a>
<a name="113168"> </a> // method used by inner class UDPHandler to open a datagram or
<a name="113169"> </a> // multicast socket as the case maybe
<a name="113170"> </a>
<a name="113171"> </a> private DatagramSocket InitSocket(String sockaddress,
<a name="113172"> </a> int sockport)
<a name="113173"> </a> {
<a name="113174"> </a> InetAddress addr = null;
<a name="113175"> </a> DatagramSocket sock = null;
<a name="113176"> </a>
<a name="113177"> </a> try {
<a name="113178"> </a> addr = InetAddress.getByName(sockaddress);
<a name="113179"> </a>
<a name="113180"> </a> if (addr.isMulticastAddress()) {
<a name="113181"> </a> MulticastSocket msock;
<a name="113182"> </a>
<a name="113183"> </a> msock = new MulticastSocket(sockport);
<a name="113184"> </a>
<a name="113185"> </a> msock.joinGroup(addr);
<a name="113186"> </a>
<a name="113187"> </a> sock = (DatagramSocket)msock;
<a name="113188"> </a> }
<a name="113189"> </a> else {
<a name="113190"> </a> sock = new DatagramSocket(sockport,addr);
<a name="113191"> </a> }
<a name="113192"> </a>
<a name="113193"> </a> return sock;
<a name="113194"> </a> }
<a name="113195"> </a> catch (SocketException e) {
<a name="113196"> </a> e.printStackTrace();
<a name="113197"> </a> return null;
<a name="113198"> </a> }
<a name="113199"> </a> catch (UnknownHostException e) {
<a name="113200"> </a> e.printStackTrace();
<a name="113201"> </a> return null;
<a name="113202"> </a> }
<a name="113203"> </a> catch (IOException e) {
<a name="113204"> </a> e.printStackTrace();
<a name="113205"> </a> return null;
<a name="113206"> </a> }
<a name="113207"> </a> }
<a name="111302"> </a>
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="113214"> </a> // INNER CLASS UDP Handler which will receive UDP RTP Packets and
<a name="113215"> </a> // stream them to the handler of the sources stream. IN case of
<a name="113216"> </a> // RTCP, it will also accept RTCP packets and send them on the
<a name="113217"> </a> // underlying network.
<a name="113218"> </a>
<a name="113219"> </a> public class UDPHandler extends Thread implements PushSourceStream,
<a name="113220"> </a> OutputDataStream
<a name="113221"> </a> {
<a name="113222"> </a> DatagramSocket mysock;
<a name="113223"> </a> DatagramPacket dp;
<a name="113224"> </a> SourceTransferHandler outputHandler;
<a name="113225"> </a> String myAddress;
<a name="113226"> </a> int myport;
<a name="113227"> </a> boolean closed = false;
<a name="113228"> </a>
<a name="113229"> </a>
<a name="113230"> </a> // in the constructor we open the socket and create the main
<a name="113231"> </a> // UDPHandler thread.
<a name="113232"> </a>
<a name="113233"> </a> public UDPHandler(String haddress, int hport) {
<a name="113234"> </a> myAddress = haddress;
<a name="113235"> </a> myport = hport;
<a name="113236"> </a> mysock = InitSocket(myAddress,myport);
<a name="113237"> </a> setDaemon(true);
<a name="113238"> </a> start();
<a name="113239"> </a> }
<a name="113240"> </a>
<a name="113241"> </a> // the main thread receives RTP data packets from the
<a name="113242"> </a> // network and transfer's this data to the output handler of
<a name="113243"> </a> // this stream.
<a name="113244"> </a>
<a name="113245"> </a> public void run() {
<a name="113246"> </a> int len;
<a name="113247"> </a>
<a name="113248"> </a> while(true) {
<a name="113249"> </a> if (closed) {
<a name="113250"> </a> cleanup();
<a name="113251"> </a> return;
<a name="113252"> </a> }
<a name="113253"> </a> try {
<a name="113254"> </a> do {
<a name="113255"> </a> dp = new DatagramPacket( new byte[maxsize],
<a name="113256"> </a> maxsize);
<a name="113257"> </a>
<a name="113258"> </a> mysock.receive(dp);
<a name="113259"> </a>
<a name="113260"> </a> if (closed){
<a name="113261"> </a> cleanup();
<a name="113262"> </a> return;
<a name="113263"> </a> }
<a name="113264"> </a>
<a name="113265"> </a> len = dp.getLength();
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="113274"> </a> if (len > (maxsize >> 1)) maxsize = len << 1;
<a name="113275"> </a> }
<a name="113276"> </a> while (len >= dp.getData().length);
<a name="113277"> </a> }catch (Exception e){
<a name="113278"> </a> cleanup();
<a name="113279"> </a> return;
<a name="113280"> </a> }
<a name="113281"> </a>
<a name="113282"> </a> if (outputHandler != null) {
<a name="113283"> </a> outputHandler.transferData(this);
<a name="113284"> </a> }
<a name="113285"> </a> }
<a name="113286"> </a> }
<a name="113287"> </a>
<a name="113288"> </a> public void close() {
<a name="113289"> </a> closed = true;
<a name="113290"> </a> }
<a name="113291"> </a>
<a name="113292"> </a> private void cleanup() {
<a name="113293"> </a> mysock.close();
<a name="113294"> </a> stop();
<a name="113295"> </a> }
<a name="113296"> </a>
<a name="113297"> </a> // methods of PushSourceStream
<a name="113298"> </a> public Object[] getControls() {
<a name="113299"> </a> return new Object[0];
<a name="113300"> </a> }
<a name="113301"> </a>
<a name="113302"> </a> public Object getControl(String controlName) {
<a name="113303"> </a> return null;
<a name="113304"> </a> }
<a name="113305"> </a>
<a name="113306"> </a> public ContentDescriptor getContentDescriptor() {
<a name="113307"> </a> return null;
<a name="113308"> </a> }
<a name="113309"> </a>
<a name="113310"> </a> public long getContentLength() {
<a name="113311"> </a> return SourceStream.LENGTH_UNKNOWN;
<a name="113312"> </a> }
<a name="113313"> </a>
<a name="113314"> </a> public boolean endOfStream() {
<a name="113315"> </a> return false;
<a name="113316"> </a> }
<a name="113317"> </a>
<a name="113318"> </a> // method by which data is transferred from the underlying
<a name="113319"> </a> // network to the session manager.
<a name="113320"> </a>
<a name="113321"> </a> public int read(byte buffer[],
<a name="113322"> </a> int offset,
<a name="113323"> </a> int length)
<a name="113324"> </a> {
</pre>
</font></td>
</tr>
<tr>
<td><font face="Palatino, Times New Roman, Times, serif"><pre>
<a name="113333"> </a> System.arraycopy(dp.getData(),
<a name="113334"> </a> 0,
<a name="113335"> </a> buffer,
<a name="113336"> </a> offset,
<a name="113337"> </a> dp.getLength());
<a name="113338"> </a>
<a name="113339"> </a> return dp.getData().length;
<a name="113340"> </a> }
<a name="113341"> </a>
<a name="113342"> </a> public int getMinimumTransferSize(){
<a name="113343"> </a> return dp.getLength();
<a name="113344"> </a> }
<a name="113345"> </a>
<a name="113346"> </a> public void setTransferHandler(SourceTransferHandler
<a name="113347"> </a> transferHandler)
<a name="113348"> </a> {
<a name="113349"> </a> this.outputHandler = transferHandler;
<a name="113350"> </a> }
<a name="113351"> </a>
<a name="113352"> </a> // methods of OutputDataStream used by the session manager to
<a name="113353"> </a> // transfer data to the underlying network.
<a name="113354"> </a>
<a name="113355"> </a> public int write(byte[] buffer,
<a name="113356"> </a> int offset,
<a name="113357"> </a> int length)
<a name="113358"> </a> {
<a name="113359"> </a> InetAddress addr = null;
<a name="113360"> </a>
<a name="113361"> </a> try {
<a name="113362"> </a> addr = InetAddress.getByName(myAddress);
<a name="113363"> </a> } catch (UnknownHostException e) {
<a name="113364"> </a> e.printStackTrace();
<a name="113365"> </a> }
<a name="113366"> </a>
<a name="113367"> </a> DatagramPacket dp = new DatagramPacket( buffer,
<a name="113368"> </a> length,
<a name="113369"> </a> addr,
<a name="113370"> </a> myport);
<a name="113371"> </a> try {
<a name="113372"> </a> mysock.send(dp);
<a name="113373"> </a> } catch (IOException e){
<a name="113374"> </a> e.printStackTrace();
<a name="113375"> </a> }
<a name="113376"> </a>
<a name="113377"> </a> return dp.getLength();
<a name="113378"> </a> }
<a name="113379"> </a> }
<a name="113380"> </a>
<a name="113381"> </a> public static void main(String[] args) {
<a name="113382"> </a> new RTPSocketPlayer();
<a name="113383"> </a> }
<a name="111614"> </a>}
</pre>
</font></td>
</tr>
</table>
<br></font>
</blockquote>
<br clear="all">
<hr>
<a href="JMFTOC.html">CONTENTS</a> |
<a href="RTPArchitecture.html">PREV </a> |
<a href="RTPSending.html">NEXT</a> |
<a href="JMFIX.html">INDEX</a></td>
<br>
<hr>
<em>
<a href="copyright.html">Copyright</a> ©
1998-1999 Sun Microsystems, Inc. All Rights Reserved.
</em>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -