#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 ServerMediaSession * | createNewSMS (UsageEnvironment &env, char const *fileName, FILE *fid) |
| static void | onMatroskaDemuxCreation (MatroskaFileServerDemux *newDemux, void *) |
Variables | |
| static char | newMatroskaDemuxWatchVariable |
| static MatroskaFileServerDemux * | demux |
| #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().
| 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 }
MatroskaFileServerDemux* demux [static] |
Definition at line 77 of file DynamicRTSPServer.cpp.
char newMatroskaDemuxWatchVariable [static] |
Definition at line 76 of file DynamicRTSPServer.cpp.
1.5.2