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 "GroupsockHelper.hh"
00023
00024 #include "BasicUsageEnvironment.hh"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 void afterPlaying(void* clientData);
00035
00036
00037
00038 struct sessionState_t {
00039 FramedSource* source;
00040 FileSink* sink;
00041 RTCPInstance* rtcpInstance;
00042 } sessionState;
00043
00044 UsageEnvironment* env;
00045
00046 int main(int argc, char** argv) {
00047
00048 TaskScheduler* scheduler = BasicTaskScheduler::createNew();
00049 env = BasicUsageEnvironment::createNew(*scheduler);
00050
00051
00052 sessionState.sink = FileSink::createNew(*env, "stdout");
00053
00054
00055
00056
00057 char const* sessionAddressStr
00058 #ifdef USE_SSM
00059 = "232.255.42.42";
00060 #else
00061 = "239.255.42.42";
00062
00063
00064 #endif
00065 const unsigned short rtpPortNum = 6666;
00066 const unsigned short rtcpPortNum = rtpPortNum+1;
00067 #ifndef USE_SSM
00068 const unsigned char ttl = 1;
00069 #endif
00070
00071 struct in_addr sessionAddress;
00072 sessionAddress.s_addr = our_inet_addr(sessionAddressStr);
00073 const Port rtpPort(rtpPortNum);
00074 const Port rtcpPort(rtcpPortNum);
00075
00076 #ifdef USE_SSM
00077 char* sourceAddressStr = "aaa.bbb.ccc.ddd";
00078
00079 struct in_addr sourceFilterAddress;
00080 sourceFilterAddress.s_addr = our_inet_addr(sourceAddressStr);
00081
00082 Groupsock rtpGroupsock(*env, sessionAddress, sourceFilterAddress, rtpPort);
00083 Groupsock rtcpGroupsock(*env, sessionAddress, sourceFilterAddress, rtcpPort);
00084 rtcpGroupsock.changeDestinationParameters(sourceFilterAddress,0,~0);
00085
00086 #else
00087 Groupsock rtpGroupsock(*env, sessionAddress, rtpPort, ttl);
00088 Groupsock rtcpGroupsock(*env, sessionAddress, rtcpPort, ttl);
00089 #endif
00090
00091 RTPSource* rtpSource;
00092 #ifndef STREAM_USING_ADUS
00093
00094 rtpSource = MPEG1or2AudioRTPSource::createNew(*env, &rtpGroupsock);
00095 #else
00096
00097 unsigned char rtpPayloadFormat = 96;
00098 rtpSource
00099 = MP3ADURTPSource::createNew(*env, &rtpGroupsock, rtpPayloadFormat);
00100 #endif
00101
00102
00103 const unsigned estimatedSessionBandwidth = 160;
00104 const unsigned maxCNAMElen = 100;
00105 unsigned char CNAME[maxCNAMElen+1];
00106 gethostname((char*)CNAME, maxCNAMElen);
00107 CNAME[maxCNAMElen] = '\0';
00108 sessionState.rtcpInstance
00109 = RTCPInstance::createNew(*env, &rtcpGroupsock,
00110 estimatedSessionBandwidth, CNAME,
00111 NULL , rtpSource);
00112
00113
00114 sessionState.source = rtpSource;
00115 #ifdef STREAM_USING_ADUS
00116
00117 sessionState.source
00118 = MP3ADUdeinterleaver::createNew(*env, sessionState.source);
00119 if (sessionState.source == NULL) {
00120 *env << "Unable to create an ADU deinterleaving filter for the source\n";
00121 exit(1);
00122 }
00123
00124
00125 sessionState.source
00126 = MP3FromADUSource::createNew(*env, sessionState.source);
00127 if (sessionState.source == NULL) {
00128 *env << "Unable to create an ADU->MP3 filter for the source\n";
00129 exit(1);
00130 }
00131 #endif
00132
00133
00134 *env << "Beginning receiving multicast stream...\n";
00135 sessionState.sink->startPlaying(*sessionState.source, afterPlaying, NULL);
00136
00137 env->taskScheduler().doEventLoop();
00138
00139 return 0;
00140 }
00141
00142
00143 void afterPlaying(void* ) {
00144 *env << "...done receiving\n";
00145
00146
00147 Medium::close(sessionState.rtcpInstance);
00148 Medium::close(sessionState.sink);
00149 Medium::close(sessionState.source);
00150 }