00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "liveMedia.hh"
00022 #include "BasicUsageEnvironment.hh"
00023
00024 UsageEnvironment* env;
00025
00026
00027
00028
00029 Boolean reuseFirstSource = False;
00030
00031
00032
00033
00034 Boolean iFramesOnly = False;
00035
00036 static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
00037 char const* streamName, char const* inputFileName);
00038
00039 int main(int argc, char** argv) {
00040
00041 TaskScheduler* scheduler = BasicTaskScheduler::createNew();
00042 env = BasicUsageEnvironment::createNew(*scheduler);
00043
00044 UserAuthenticationDatabase* authDB = NULL;
00045 #ifdef ACCESS_CONTROL
00046
00047 authDB = new UserAuthenticationDatabase;
00048 authDB->addUserRecord("username1", "password1");
00049
00050
00051 #endif
00052
00053
00054 RTSPServer* rtspServer = RTSPServer::createNew(*env, 8554, authDB, 45);
00055 if (rtspServer == NULL) {
00056 *env << "Failed to create RTSP server: " << env->getResultMsg() << "\n";
00057 exit(1);
00058 }
00059
00060 char const* descriptionString
00061 = "Session streamed by \"testOnDemandRTSPServer\"";
00062
00063
00064
00065
00066
00067
00068
00069 {
00070 char const* streamName = "mpeg4ESVideoTest";
00071 char const* inputFileName = "test.m4e";
00072 ServerMediaSession* sms
00073 = ServerMediaSession::createNew(*env, streamName, streamName,
00074 descriptionString);
00075 sms->addSubsession(MPEG4VideoFileServerMediaSubsession
00076 ::createNew(*env, inputFileName, reuseFirstSource));
00077 rtspServer->addServerMediaSession(sms);
00078
00079 announceStream(rtspServer, sms, streamName, inputFileName);
00080 }
00081
00082
00083 {
00084 char const* streamName = "mpeg1or2AudioVideoTest";
00085 char const* inputFileName = "test.mpg";
00086
00087 ServerMediaSession* sms
00088 = ServerMediaSession::createNew(*env, streamName, streamName,
00089 descriptionString);
00090 MPEG1or2FileServerDemux* demux
00091 = MPEG1or2FileServerDemux::createNew(*env, inputFileName, reuseFirstSource);
00092 sms->addSubsession(demux->newVideoServerMediaSubsession(iFramesOnly));
00093 sms->addSubsession(demux->newAudioServerMediaSubsession());
00094 rtspServer->addServerMediaSession(sms);
00095
00096 announceStream(rtspServer, sms, streamName, inputFileName);
00097 }
00098
00099
00100 {
00101 char const* streamName = "mpeg1or2ESVideoTest";
00102 char const* inputFileName = "testv.mpg";
00103
00104 ServerMediaSession* sms
00105 = ServerMediaSession::createNew(*env, streamName, streamName,
00106 descriptionString);
00107 sms->addSubsession(MPEG1or2VideoFileServerMediaSubsession
00108 ::createNew(*env, inputFileName, reuseFirstSource, iFramesOnly));
00109 rtspServer->addServerMediaSession(sms);
00110
00111 announceStream(rtspServer, sms, streamName, inputFileName);
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121 {
00122 char const* streamName = "mp3AudioTest";
00123 char const* inputFileName = "test.mp3";
00124 ServerMediaSession* sms
00125 = ServerMediaSession::createNew(*env, streamName, streamName,
00126 descriptionString);
00127 Boolean useADUs = False;
00128 Interleaving* interleaving = NULL;
00129 #ifdef STREAM_USING_ADUS
00130 useADUs = True;
00131 #ifdef INTERLEAVE_ADUS
00132 unsigned char interleaveCycle[] = {0,2,1,3};
00133 unsigned const interleaveCycleSize
00134 = (sizeof interleaveCycle)/(sizeof (unsigned char));
00135 interleaving = new Interleaving(interleaveCycleSize, interleaveCycle);
00136 #endif
00137 #endif
00138 sms->addSubsession(MP3AudioFileServerMediaSubsession
00139 ::createNew(*env, inputFileName, reuseFirstSource,
00140 useADUs, interleaving));
00141 rtspServer->addServerMediaSession(sms);
00142
00143 announceStream(rtspServer, sms, streamName, inputFileName);
00144 }
00145
00146
00147 {
00148 char const* streamName = "wavAudioTest";
00149 char const* inputFileName = "test.wav";
00150 ServerMediaSession* sms
00151 = ServerMediaSession::createNew(*env, streamName, streamName,
00152 descriptionString);
00153
00154
00155 Boolean convertToULaw = False;
00156 sms->addSubsession(WAVAudioFileServerMediaSubsession
00157 ::createNew(*env, inputFileName, reuseFirstSource, convertToULaw));
00158 rtspServer->addServerMediaSession(sms);
00159
00160 announceStream(rtspServer, sms, streamName, inputFileName);
00161 }
00162
00163
00164 {
00165 char const* streamName = "amrAudioTest";
00166 char const* inputFileName = "test.amr";
00167 ServerMediaSession* sms
00168 = ServerMediaSession::createNew(*env, streamName, streamName,
00169 descriptionString);
00170 sms->addSubsession(AMRAudioFileServerMediaSubsession
00171 ::createNew(*env, inputFileName, reuseFirstSource));
00172 rtspServer->addServerMediaSession(sms);
00173
00174 announceStream(rtspServer, sms, streamName, inputFileName);
00175 }
00176
00177
00178 {
00179 char const* streamName = "vobTest";
00180 char const* inputFileName = "test.vob";
00181 ServerMediaSession* sms
00182 = ServerMediaSession::createNew(*env, streamName, streamName,
00183 descriptionString);
00184
00185 MPEG1or2FileServerDemux* demux
00186 = MPEG1or2FileServerDemux::createNew(*env, inputFileName, reuseFirstSource);
00187 sms->addSubsession(demux->newVideoServerMediaSubsession(iFramesOnly));
00188 sms->addSubsession(demux->newAC3AudioServerMediaSubsession());
00189 rtspServer->addServerMediaSession(sms);
00190
00191 announceStream(rtspServer, sms, streamName, inputFileName);
00192 }
00193
00194
00195 {
00196 char const* streamName = "mpeg2TransportStreamTest";
00197 char const* inputFileName = "test.ts";
00198 char const* indexFileName = "test.tsx";
00199 ServerMediaSession* sms
00200 = ServerMediaSession::createNew(*env, streamName, streamName,
00201 descriptionString);
00202 sms->addSubsession(MPEG2TransportFileServerMediaSubsession
00203 ::createNew(*env, inputFileName, indexFileName, reuseFirstSource));
00204 rtspServer->addServerMediaSession(sms);
00205
00206 announceStream(rtspServer, sms, streamName, inputFileName);
00207 }
00208
00209
00210 {
00211 char const* streamName = "aacAudioTest";
00212 char const* inputFileName = "test.aac";
00213 ServerMediaSession* sms
00214 = ServerMediaSession::createNew(*env, streamName, streamName,
00215 descriptionString);
00216 sms->addSubsession(ADTSAudioFileServerMediaSubsession
00217 ::createNew(*env, inputFileName, reuseFirstSource));
00218 rtspServer->addServerMediaSession(sms);
00219
00220 announceStream(rtspServer, sms, streamName, inputFileName);
00221 }
00222
00223 env->taskScheduler().doEventLoop();
00224
00225 return 0;
00226 }
00227
00228 static void announceStream(RTSPServer* rtspServer, ServerMediaSession* sms,
00229 char const* streamName, char const* inputFileName) {
00230 char* url = rtspServer->rtspURL(sms);
00231 UsageEnvironment& env = rtspServer->envir();
00232 env << "\n\"" << streamName << "\" stream, from the file \""
00233 << inputFileName << "\"\n";
00234 env << "Play this stream using the URL \"" << url << "\"\n";
00235 delete[] url;
00236 }