mediaServer/DynamicRTSPServer.cpp File Reference

#include "DynamicRTSPServer.hh"
#include <liveMedia.hh>
#include <string.h>

Include dependency graph for DynamicRTSPServer.cpp:

Go to the source code of this file.

Defines

#define NEW_SMS(description)

Functions

static ServerMediaSessioncreateNewSMS (UsageEnvironment &env, char const *fileName, FILE *fid)
static void onMatroskaDemuxCreation (MatroskaFileServerDemux *newDemux, void *)

Variables

static char newMatroskaDemuxWatchVariable
static MatroskaFileServerDemuxdemux


Define Documentation

#define NEW_SMS ( description   ) 

Value:

do {\
char const* descStr = description\
    ", streamed by the LIVE555 Media Server";\
sms = ServerMediaSession::createNew(env, fileName, fileName, descStr);\
} while(0)

Definition at line 84 of file DynamicRTSPServer.cpp.

Referenced by createNewSMS().


Function Documentation

static ServerMediaSession * createNewSMS ( UsageEnvironment env,
char const *  fileName,
FILE *  fid 
) [static]

Definition at line 90 of file DynamicRTSPServer.cpp.

References ServerMediaSession::addSubsession(), MatroskaFileServerDemux::createNew(), DVVideoFileServerMediaSubsession::createNew(), WAVAudioFileServerMediaSubsession::createNew(), MPEG2TransportFileServerMediaSubsession::createNew(), MPEG1or2FileServerDemux::createNew(), MP3AudioFileServerMediaSubsession::createNew(), H264VideoFileServerMediaSubsession::createNew(), MPEG4VideoFileServerMediaSubsession::createNew(), AC3AudioFileServerMediaSubsession::createNew(), AMRAudioFileServerMediaSubsession::createNew(), ADTSAudioFileServerMediaSubsession::createNew(), demux, TaskScheduler::doEventLoop(), env, False, OutPacketBuffer::maxSize, NEW_SMS, newMatroskaDemuxWatchVariable, MatroskaFileServerDemux::newServerMediaSubsession(), NULL, onMatroskaDemuxCreation(), UsageEnvironment::taskScheduler(), and True.

Referenced by DynamicRTSPServer::lookupServerMediaSession().

00091                                                                              {
00092   // Use the file name extension to determine the type of "ServerMediaSession":
00093   char const* extension = strrchr(fileName, '.');
00094   if (extension == NULL) return NULL;
00095 
00096   ServerMediaSession* sms = NULL;
00097   Boolean const reuseSource = False;
00098   if (strcmp(extension, ".aac") == 0) {
00099     // Assumed to be an AAC Audio (ADTS format) file:
00100     NEW_SMS("AAC Audio");
00101     sms->addSubsession(ADTSAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource));
00102   } else if (strcmp(extension, ".amr") == 0) {
00103     // Assumed to be an AMR Audio file:
00104     NEW_SMS("AMR Audio");
00105     sms->addSubsession(AMRAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource));
00106   } else if (strcmp(extension, ".ac3") == 0) {
00107     // Assumed to be an AC-3 Audio file:
00108     NEW_SMS("AC-3 Audio");
00109     sms->addSubsession(AC3AudioFileServerMediaSubsession::createNew(env, fileName, reuseSource));
00110   } else if (strcmp(extension, ".m4e") == 0) {
00111     // Assumed to be a MPEG-4 Video Elementary Stream file:
00112     NEW_SMS("MPEG-4 Video");
00113     sms->addSubsession(MPEG4VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
00114   } else if (strcmp(extension, ".264") == 0) {
00115     // Assumed to be a H.264 Video Elementary Stream file:
00116     NEW_SMS("H.264 Video");
00117     OutPacketBuffer::maxSize = 100000; // allow for some possibly large H.264 frames
00118     sms->addSubsession(H264VideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
00119   } else if (strcmp(extension, ".mp3") == 0) {
00120     // Assumed to be a MPEG-1 or 2 Audio file:
00121     NEW_SMS("MPEG-1 or 2 Audio");
00122     // To stream using 'ADUs' rather than raw MP3 frames, uncomment the following:
00123 //#define STREAM_USING_ADUS 1
00124     // To also reorder ADUs before streaming, uncomment the following:
00125 //#define INTERLEAVE_ADUS 1
00126     // (For more information about ADUs and interleaving,
00127     //  see <http://www.live555.com/rtp-mp3/>)
00128     Boolean useADUs = False;
00129     Interleaving* interleaving = NULL;
00130 #ifdef STREAM_USING_ADUS
00131     useADUs = True;
00132 #ifdef INTERLEAVE_ADUS
00133     unsigned char interleaveCycle[] = {0,2,1,3}; // or choose your own...
00134     unsigned const interleaveCycleSize
00135       = (sizeof interleaveCycle)/(sizeof (unsigned char));
00136     interleaving = new Interleaving(interleaveCycleSize, interleaveCycle);
00137 #endif
00138 #endif
00139     sms->addSubsession(MP3AudioFileServerMediaSubsession::createNew(env, fileName, reuseSource, useADUs, interleaving));
00140   } else if (strcmp(extension, ".mpg") == 0) {
00141     // Assumed to be a MPEG-1 or 2 Program Stream (audio+video) file:
00142     NEW_SMS("MPEG-1 or 2 Program Stream");
00143     MPEG1or2FileServerDemux* demux
00144       = MPEG1or2FileServerDemux::createNew(env, fileName, reuseSource);
00145     sms->addSubsession(demux->newVideoServerMediaSubsession());
00146     sms->addSubsession(demux->newAudioServerMediaSubsession());
00147   } else if (strcmp(extension, ".ts") == 0) {
00148     // Assumed to be a MPEG Transport Stream file:
00149     // Use an index file name that's the same as the TS file name, except with ".tsx":
00150     unsigned indexFileNameLen = strlen(fileName) + 2; // allow for trailing "x\0"
00151     char* indexFileName = new char[indexFileNameLen];
00152     sprintf(indexFileName, "%sx", fileName);
00153     NEW_SMS("MPEG Transport Stream");
00154     sms->addSubsession(MPEG2TransportFileServerMediaSubsession::createNew(env, fileName, indexFileName, reuseSource));
00155     delete[] indexFileName;
00156   } else if (strcmp(extension, ".wav") == 0) {
00157     // Assumed to be a WAV Audio file:
00158     NEW_SMS("WAV Audio Stream");
00159     // To convert 16-bit PCM data to 8-bit u-law, prior to streaming,
00160     // change the following to True:
00161     Boolean convertToULaw = False;
00162     sms->addSubsession(WAVAudioFileServerMediaSubsession::createNew(env, fileName, reuseSource, convertToULaw));
00163   } else if (strcmp(extension, ".dv") == 0) {
00164     // Assumed to be a DV Video file
00165     // First, make sure that the RTPSinks' buffers will be large enough to handle the huge size of DV frames (as big as 288000).
00166     OutPacketBuffer::maxSize = 300000;
00167 
00168     NEW_SMS("DV Video");
00169     sms->addSubsession(DVVideoFileServerMediaSubsession::createNew(env, fileName, reuseSource));
00170   } else if (strcmp(extension, ".mkv") == 0 || strcmp(extension, ".webm") == 0) {
00171     // Assumed to be a Matroska file (note that WebM ('.webm') files are also Matroska files)
00172     NEW_SMS("Matroska video+audio+(optional)subtitles");
00173 
00174     // Create a Matroska file server demultiplexor for the specified file.  (We enter the event loop to wait for this to complete.)
00175     newMatroskaDemuxWatchVariable = 0;
00176     MatroskaFileServerDemux::createNew(env, fileName, onMatroskaDemuxCreation, NULL);
00177     env.taskScheduler().doEventLoop(&newMatroskaDemuxWatchVariable);
00178 
00179     ServerMediaSubsession* smss;
00180     while ((smss = demux->newServerMediaSubsession()) != NULL) {
00181       sms->addSubsession(smss);
00182     }
00183   }
00184 
00185   return sms;
00186 }

static void onMatroskaDemuxCreation ( MatroskaFileServerDemux newDemux,
void *   
) [static]

Definition at line 78 of file DynamicRTSPServer.cpp.

References demux, and newMatroskaDemuxWatchVariable.

00078                                                                                              {
00079   demux = newDemux;
00080   newMatroskaDemuxWatchVariable = 1;
00081 }


Variable Documentation

MatroskaFileServerDemux* demux [static]

Definition at line 77 of file DynamicRTSPServer.cpp.

char newMatroskaDemuxWatchVariable [static]

Definition at line 76 of file DynamicRTSPServer.cpp.


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