00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "DVVideoFileServerMediaSubsession.hh"
00023 #include "DVVideoRTPSink.hh"
00024 #include "ByteStreamFileSource.hh"
00025 #include "DVVideoStreamFramer.hh"
00026
00027 DVVideoFileServerMediaSubsession*
00028 DVVideoFileServerMediaSubsession::createNew(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource) {
00029 return new DVVideoFileServerMediaSubsession(env, fileName, reuseFirstSource);
00030 }
00031
00032 DVVideoFileServerMediaSubsession
00033 ::DVVideoFileServerMediaSubsession(UsageEnvironment& env, char const* fileName, Boolean reuseFirstSource)
00034 : FileServerMediaSubsession(env, fileName, reuseFirstSource),
00035 fFileDuration(0.0) {
00036 }
00037
00038 DVVideoFileServerMediaSubsession::~DVVideoFileServerMediaSubsession() {
00039 }
00040
00041 FramedSource* DVVideoFileServerMediaSubsession
00042 ::createNewStreamSource(unsigned , unsigned& estBitrate) {
00043
00044 ByteStreamFileSource* fileSource = ByteStreamFileSource::createNew(envir(), fFileName);
00045 if (fileSource == NULL) return NULL;
00046 fFileSize = fileSource->fileSize();
00047
00048
00049 DVVideoStreamFramer* framer = DVVideoStreamFramer::createNew(envir(), fileSource, True);
00050
00051
00052 unsigned frameSize;
00053 double frameDuration;
00054 if (framer->getFrameParameters(frameSize, frameDuration)) {
00055 fFileDuration = (float)(((int64_t)fFileSize*frameDuration)/(frameSize*1000000.0));
00056 estBitrate = (unsigned)((8000.0*frameSize)/frameDuration);
00057 } else {
00058 estBitrate = 50000;
00059 }
00060
00061 return framer;
00062 }
00063
00064 RTPSink* DVVideoFileServerMediaSubsession::createNewRTPSink(Groupsock* rtpGroupsock,
00065 unsigned char rtpPayloadTypeIfDynamic,
00066 FramedSource* ) {
00067 return DVVideoRTPSink::createNew(envir(), rtpGroupsock, rtpPayloadTypeIfDynamic);
00068 }
00069
00070 char const* DVVideoFileServerMediaSubsession::getAuxSDPLine(RTPSink* rtpSink, FramedSource* inputSource) {
00071 return ((DVVideoRTPSink*)rtpSink)->auxSDPLineFromFramer((DVVideoStreamFramer*)inputSource);
00072 }
00073
00074 float DVVideoFileServerMediaSubsession::duration() const {
00075 return fFileDuration;
00076 }
00077
00078 void DVVideoFileServerMediaSubsession
00079 ::seekStreamSource(FramedSource* inputSource, double& seekNPT, double streamDuration, u_int64_t& numBytes) {
00080
00081 DVVideoStreamFramer* framer = (DVVideoStreamFramer*)inputSource;
00082 ByteStreamFileSource* fileSource = (ByteStreamFileSource*)(framer->inputSource());
00083
00084
00085 if (fFileDuration > 0.0) {
00086 u_int64_t seekByteNumber = (u_int64_t)(((int64_t)fFileSize*seekNPT)/fFileDuration);
00087 numBytes = (u_int64_t)(((int64_t)fFileSize*streamDuration)/fFileDuration);
00088 fileSource->seekToByteAbsolute(seekByteNumber, numBytes);
00089 }
00090 }