00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "MPEG2TransportUDPServerMediaSubsession.hh"
00023 #include "BasicUDPSource.hh"
00024 #include "SimpleRTPSource.hh"
00025 #include "MPEG2TransportStreamFramer.hh"
00026 #include "SimpleRTPSink.hh"
00027 #include "GroupsockHelper.hh"
00028
00029
00030 MPEG2TransportUDPServerMediaSubsession*
00031 MPEG2TransportUDPServerMediaSubsession::createNew(UsageEnvironment& env,
00032 char const* inputAddressStr, Port const& inputPort, Boolean inputStreamIsRawUDP) {
00033 return new MPEG2TransportUDPServerMediaSubsession(env, inputAddressStr, inputPort, inputStreamIsRawUDP);
00034 }
00035
00036 MPEG2TransportUDPServerMediaSubsession
00037 ::MPEG2TransportUDPServerMediaSubsession(UsageEnvironment& env,
00038 char const* inputAddressStr, Port const& inputPort, Boolean inputStreamIsRawUDP)
00039 : OnDemandServerMediaSubsession(env, True),
00040 fInputPort(inputPort), fInputGroupsock(NULL), fInputStreamIsRawUDP(inputStreamIsRawUDP) {
00041 fInputAddressStr = strDup(inputAddressStr);
00042 }
00043
00044 MPEG2TransportUDPServerMediaSubsession::
00045 ~MPEG2TransportUDPServerMediaSubsession() {
00046 delete fInputGroupsock;
00047 delete[] (char*)fInputAddressStr;
00048 }
00049
00050 FramedSource* MPEG2TransportUDPServerMediaSubsession
00051 ::createNewStreamSource(unsigned, unsigned& estBitrate) {
00052 estBitrate = 5000;
00053
00054 if (fInputGroupsock == NULL) {
00055
00056 struct in_addr inputAddress;
00057 inputAddress.s_addr = fInputAddressStr == NULL ? 0 : our_inet_addr(fInputAddressStr);
00058 fInputGroupsock = new Groupsock(envir(), inputAddress, fInputPort, 255);
00059 }
00060
00061 FramedSource* transportStreamSource;
00062 if (fInputStreamIsRawUDP) {
00063 transportStreamSource = BasicUDPSource::createNew(envir(), fInputGroupsock);
00064 } else {
00065 transportStreamSource = SimpleRTPSource::createNew(envir(), fInputGroupsock, 33, 90000, "video/MP2T", 0, False );
00066 }
00067 return MPEG2TransportStreamFramer::createNew(envir(), transportStreamSource);
00068 }
00069
00070 RTPSink* MPEG2TransportUDPServerMediaSubsession
00071 ::createNewRTPSink(Groupsock* rtpGroupsock, unsigned char , FramedSource* ) {
00072 return SimpleRTPSink::createNew(envir(), rtpGroupsock,
00073 33, 90000, "video", "MP2T",
00074 1, True, False );
00075 }