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 fDoneFlag(0) {
00039 }
00040
00041 MPEG4VideoFileServerMediaSubsession
00042 ::~MPEG4VideoFileServerMediaSubsession() {
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 if (fDummyRTPSink->auxSDPLine() != NULL) {
00066
00067 setDoneFlag();
00068 } else {
00069
00070 int uSecsToDelay = 100000;
00071 nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecsToDelay,
00072 (TaskFunc*)checkForAuxSDPLine, this);
00073 }
00074 }
00075
00076 char const* MPEG4VideoFileServerMediaSubsession
00077 ::getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource) {
00078
00079
00080
00081
00082 fDummyRTPSink = rtpSink;
00083
00084
00085 fDummyRTPSink->startPlaying(*inputSource, afterPlayingDummy, this);
00086
00087
00088 checkForAuxSDPLine(this);
00089
00090 envir().taskScheduler().doEventLoop(&fDoneFlag);
00091
00092 char const* auxSDPLine = fDummyRTPSink->auxSDPLine();
00093 return auxSDPLine;
00094 }
00095
00096 FramedSource* MPEG4VideoFileServerMediaSubsession
00097 ::createNewStreamSource(unsigned , unsigned& estBitrate) {
00098 estBitrate = 500;
00099
00100
00101 ByteStreamFileSource* fileSource
00102 = ByteStreamFileSource::createNew(envir(), fFileName);
00103 if (fileSource == NULL) return NULL;
00104 fFileSize = fileSource->fileSize();
00105
00106
00107 return MPEG4VideoStreamFramer::createNew(envir(), fileSource);
00108 }
00109
00110 RTPSink* MPEG4VideoFileServerMediaSubsession
00111 ::createNewRTPSink(Groupsock* rtpGroupsock,
00112 unsigned char rtpPayloadTypeIfDynamic,
00113 FramedSource* ) {
00114 return MPEG4ESVideoRTPSink::createNew(envir(), rtpGroupsock,
00115 rtpPayloadTypeIfDynamic);
00116 }