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 void afterPlaying(void* clientData);
00030
00031
00032
00033 struct sessionState_t {
00034 RTPSource* source;
00035 MediaSink* sink;
00036 RTCPInstance* rtcpInstance;
00037 } sessionState;
00038
00039 UsageEnvironment* env;
00040
00041 int main(int argc, char** argv) {
00042
00043 TaskScheduler* scheduler = BasicTaskScheduler::createNew();
00044 env = BasicUsageEnvironment::createNew(*scheduler);
00045
00046
00047 sessionState.sink = FileSink::createNew(*env, "stdout");
00048
00049
00050
00051
00052 char const* sessionAddressStr
00053 #ifdef USE_SSM
00054 = "232.255.42.42";
00055 #else
00056 = "239.255.42.42";
00057
00058
00059 #endif
00060 const unsigned short rtpPortNum = 1234;
00061 const unsigned short rtcpPortNum = rtpPortNum+1;
00062 #ifndef USE_SSM
00063 const unsigned char ttl = 1;
00064 #endif
00065
00066 struct in_addr sessionAddress;
00067 sessionAddress.s_addr = our_inet_addr(sessionAddressStr);
00068 const Port rtpPort(rtpPortNum);
00069 const Port rtcpPort(rtcpPortNum);
00070
00071 #ifdef USE_SSM
00072 char* sourceAddressStr = "aaa.bbb.ccc.ddd";
00073
00074 struct in_addr sourceFilterAddress;
00075 sourceFilterAddress.s_addr = our_inet_addr(sourceAddressStr);
00076
00077 Groupsock rtpGroupsock(*env, sessionAddress, sourceFilterAddress, rtpPort);
00078 Groupsock rtcpGroupsock(*env, sessionAddress, sourceFilterAddress, rtcpPort);
00079 rtcpGroupsock.changeDestinationParameters(sourceFilterAddress,0,~0);
00080
00081 #else
00082 Groupsock rtpGroupsock(*env, sessionAddress, rtpPort, ttl);
00083 Groupsock rtcpGroupsock(*env, sessionAddress, rtcpPort, ttl);
00084 #endif
00085
00086
00087 sessionState.source = SimpleRTPSource::createNew(*env, &rtpGroupsock, 33, 90000, "video/MP2T", 0, False );
00088
00089
00090 const unsigned estimatedSessionBandwidth = 160;
00091 const unsigned maxCNAMElen = 100;
00092 unsigned char CNAME[maxCNAMElen+1];
00093 gethostname((char*)CNAME, maxCNAMElen);
00094 CNAME[maxCNAMElen] = '\0';
00095 sessionState.rtcpInstance
00096 = RTCPInstance::createNew(*env, &rtcpGroupsock,
00097 estimatedSessionBandwidth, CNAME,
00098 NULL , sessionState.source);
00099
00100
00101
00102 *env << "Beginning receiving multicast stream...\n";
00103 sessionState.sink->startPlaying(*sessionState.source, afterPlaying, NULL);
00104
00105 env->taskScheduler().doEventLoop();
00106
00107 return 0;
00108 }
00109
00110
00111 void afterPlaying(void* ) {
00112 *env << "...done receiving\n";
00113
00114
00115 Medium::close(sessionState.rtcpInstance);
00116 Medium::close(sessionState.sink);
00117 Medium::close(sessionState.source);
00118 }