liveMedia/RTPInterface.cpp File Reference

#include "RTPInterface.hh"
#include <GroupsockHelper.hh>
#include <stdio.h>

Include dependency graph for RTPInterface.cpp:

Go to the source code of this file.

Data Structures

class  SocketDescriptor

Functions

static Boolean sendRTPOverTCP (unsigned char *packet, unsigned packetSize, int socketNum, unsigned char streamChannelId)
static HashTablesocketHashTable (UsageEnvironment &env, Boolean createIfNotPresent=True)
static SocketDescriptorlookupSocketDescriptor (UsageEnvironment &env, int sockNum, Boolean createIfNotFound=True)
static void removeSocketDescription (UsageEnvironment &env, int sockNum)
static void deregisterSocket (UsageEnvironment &env, int sockNum, unsigned char streamChannelId)


Function Documentation

static void deregisterSocket ( UsageEnvironment env,
int  sockNum,
unsigned char  streamChannelId 
) [static]

Definition at line 154 of file RTPInterface.cpp.

References SocketDescriptor::deregisterRTPInterface(), env, False, lookupSocketDescriptor(), and NULL.

Referenced by RTPInterface::removeStreamSocket(), and RTPInterface::stopNetworkReading().

00154                                                                                                 {
00155   SocketDescriptor* socketDescriptor = lookupSocketDescriptor(env, sockNum, False);
00156   if (socketDescriptor != NULL) {
00157     socketDescriptor->deregisterRTPInterface(streamChannelId);
00158         // Note: This may delete "socketDescriptor",
00159         // if no more interfaces are using this socket
00160   }
00161 }

static SocketDescriptor* lookupSocketDescriptor ( UsageEnvironment env,
int  sockNum,
Boolean  createIfNotFound = True 
) [static]

Definition at line 80 of file RTPInterface.cpp.

References HashTable::Add(), env, HashTable::Lookup(), NULL, and socketHashTable().

Referenced by deregisterSocket(), RTPInterface::setServerRequestAlternativeByteHandler(), and RTPInterface::startNetworkReading().

00080                                                                                                                      {
00081   HashTable* table = socketHashTable(env, createIfNotFound);
00082   if (table == NULL) return NULL;
00083 
00084   char const* key = (char const*)(long)sockNum;
00085   SocketDescriptor* socketDescriptor = (SocketDescriptor*)(table->Lookup(key));
00086   if (socketDescriptor == NULL && createIfNotFound) {
00087     socketDescriptor = new SocketDescriptor(env, sockNum);
00088     table->Add((char const*)(long)(sockNum), socketDescriptor);
00089   }
00090 
00091   return socketDescriptor;
00092 }

static void removeSocketDescription ( UsageEnvironment env,
int  sockNum 
) [static]

Definition at line 94 of file RTPInterface.cpp.

References env, _Tables::getOurTables(), HashTable::IsEmpty(), NULL, HashTable::Remove(), and socketHashTable().

Referenced by SocketDescriptor::deregisterRTPInterface().

00094                                                                         {
00095   char const* key = (char const*)(long)sockNum;
00096   HashTable* table = socketHashTable(env);
00097   table->Remove(key);
00098 
00099   if (table->IsEmpty()) {
00100     // We can also delete the table (to reclaim space):
00101     _Tables* ourTables = _Tables::getOurTables(env);
00102     delete table;
00103     ourTables->socketTable = NULL;
00104     ourTables->reclaimIfPossible();
00105   }
00106 }

Boolean sendRTPOverTCP ( unsigned char *  packet,
unsigned  packetSize,
int  socketNum,
unsigned char  streamChannelId 
) [static]

Definition at line 280 of file RTPInterface.cpp.

References False, and True.

Referenced by RTPInterface::sendPacket().

00281                                                                   {
00282 #ifdef DEBUG
00283   fprintf(stderr, "sendRTPOverTCP: %d bytes over channel %d (socket %d)\n",
00284           packetSize, streamChannelId, socketNum); fflush(stderr);
00285 #endif
00286   // Send RTP over TCP, using the encoding defined in
00287   // RFC 2326, section 10.12:
00288   do {
00289     char const dollar = '$';
00290     if (send(socketNum, &dollar, 1, 0) != 1) break;
00291     if (send(socketNum, (char*)&streamChannelId, 1, 0) != 1) break;
00292 
00293     char netPacketSize[2];
00294     netPacketSize[0] = (char) ((packetSize&0xFF00)>>8);
00295     netPacketSize[1] = (char) (packetSize&0xFF);
00296     if (send(socketNum, netPacketSize, 2, 0) != 2) break;
00297 
00298     if (send(socketNum, (char*)packet, packetSize, 0) != (int)packetSize) break;
00299 
00300 #ifdef DEBUG
00301     fprintf(stderr, "sendRTPOverTCP: completed\n"); fflush(stderr);
00302 #endif
00303 
00304     return True;
00305   } while (0);
00306 
00307 #ifdef DEBUG
00308   fprintf(stderr, "sendRTPOverTCP: failed!\n"); fflush(stderr);
00309 #endif
00310   return False;
00311 }

static HashTable* socketHashTable ( UsageEnvironment env,
Boolean  createIfNotPresent = True 
) [static]

Definition at line 40 of file RTPInterface.cpp.

References HashTable::create(), env, _Tables::getOurTables(), NULL, ONE_WORD_HASH_KEYS, and _Tables::socketTable.

Referenced by MediaSubsession::initiate(), lookupSocketDescriptor(), and removeSocketDescription().

00040                                                                                             {
00041   _Tables* ourTables = _Tables::getOurTables(env, createIfNotPresent);
00042   if (ourTables == NULL) return NULL;
00043 
00044   if (ourTables->socketTable == NULL) {
00045     // Create a new socket number -> SocketDescriptor mapping table:
00046     ourTables->socketTable = HashTable::create(ONE_WORD_HASH_KEYS);
00047   }
00048   return (HashTable*)(ourTables->socketTable);
00049 }


Generated on Thu May 17 07:14:20 2012 for live by  doxygen 1.5.2