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