00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "MPEG4VideoFileServerMediaSubsession.hh"
00023 #include "MPEG4ESVideoRTPSink.hh"
00024 #include "ByteStreamFileSource.hh"
00025 #include "MPEG4VideoStreamFramer.hh"
00026
00027 MPEG4VideoFileServerMediaSubsession*
00028 MPEG4VideoFileServerMediaSubsession::createNew(UsageEnvironment& env,
00029 char const* fileName,
00030 Boolean reuseFirstSource) {
00031 return new MPEG4VideoFileServerMediaSubsession(env, fileName, reuseFirstSource);
00032 }
00033
00034 MPEG4VideoFileServerMediaSubsession
00035 ::MPEG4VideoFileServerMediaSubsession(UsageEnvironment& env,
00036 char const* fileName, Boolean reuseFirstSource)
00037 : FileServerMediaSubsession(env, fileName, reuseFirstSource),
00038 fAuxSDPLine(NULL), fDoneFlag(0), fDummyRTPSink(NULL) {
00039 }
00040
00041 MPEG4VideoFileServerMediaSubsession::~MPEG4VideoFileServerMediaSubsession() {
00042 delete[] fAuxSDPLine;
00043 }
00044
00045 static void afterPlayingDummy(void* clientData) {
00046 MPEG4VideoFileServerMediaSubsession* subsess
00047 = (MPEG4VideoFileServerMediaSubsession*)clientData;
00048 subsess->afterPlayingDummy1();
00049 }
00050
00051 void MPEG4VideoFileServerMediaSubsession::afterPlayingDummy1() {
00052
00053 envir().taskScheduler().unscheduleDelayedTask(nextTask());
00054
00055 setDoneFlag();
00056 }
00057
00058 static void checkForAuxSDPLine(void* clientData) {
00059 MPEG4VideoFileServerMediaSubsession* subsess
00060 = (MPEG4VideoFileServerMediaSubsession*)clientData;
00061 subsess->checkForAuxSDPLine1();
00062 }
00063
00064 void MPEG4VideoFileServerMediaSubsession::checkForAuxSDPLine1() {
00065 char const* dasl;
00066
00067 if (fAuxSDPLine != NULL) {
00068
00069 setDoneFlag();
00070 } else if (fDummyRTPSink != NULL && (dasl = fDummyRTPSink->auxSDPLine()) != NULL) {
00071 fAuxSDPLine= strDup(dasl);
00072 fDummyRTPSink = NULL;
00073
00074
00075 setDoneFlag();
00076 } else {
00077
00078 int uSecsToDelay = 100000;
00079 nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecsToDelay,
00080 (TaskFunc*)checkForAuxSDPLine, this);
00081 }
00082 }
00083
00084 char const* MPEG4VideoFileServerMediaSubsession::getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource) {
00085 if (fAuxSDPLine != NULL) return fAuxSDPLine;
00086
00087 if (fDummyRTPSink == NULL) {
00088
00089
00090
00091 fDummyRTPSink = rtpSink;
00092
00093
00094 fDummyRTPSink->startPlaying(*inputSource, afterPlayingDummy, this);
00095
00096
00097 checkForAuxSDPLine(this);
00098 }
00099
00100 envir().taskScheduler().doEventLoop(&fDoneFlag);
00101
00102 return fAuxSDPLine;
00103 }
00104
00105 FramedSource* MPEG4VideoFileServerMediaSubsession
00106 ::createNewStreamSource(unsigned , unsigned& estBitrate) {
00107 estBitrate = 500;
00108
00109
00110 ByteStreamFileSource* fileSource
00111 = ByteStreamFileSource::createNew(envir(), fFileName);
00112 if (fileSource == NULL) return NULL;
00113 fFileSize = fileSource->fileSize();
00114
00115
00116 return MPEG4VideoStreamFramer::createNew(envir(), fileSource);
00117 }
00118
00119 RTPSink* MPEG4VideoFileServerMediaSubsession
00120 ::createNewRTPSink(Groupsock* rtpGroupsock,
00121 unsigned char rtpPayloadTypeIfDynamic,
00122 FramedSource* ) {
00123 return MPEG4ESVideoRTPSink::createNew(envir(), rtpGroupsock,
00124 rtpPayloadTypeIfDynamic);
00125 }