00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #if (defined(__WIN32__) || defined(_WIN32)) && !defined(_WIN32_WCE)
00022 #include <io.h>
00023 #include <fcntl.h>
00024 #endif
00025
00026 #include "ByteStreamFileSource.hh"
00027 #include "InputFile.hh"
00028 #include "GroupsockHelper.hh"
00029
00031
00032 ByteStreamFileSource*
00033 ByteStreamFileSource::createNew(UsageEnvironment& env, char const* fileName,
00034 unsigned preferredFrameSize,
00035 unsigned playTimePerFrame) {
00036 FILE* fid = OpenInputFile(env, fileName);
00037 if (fid == NULL) return NULL;
00038
00039 Boolean deleteFidOnClose = fid == stdin ? False : True;
00040 ByteStreamFileSource* newSource
00041 = new ByteStreamFileSource(env, fid, deleteFidOnClose,
00042 preferredFrameSize, playTimePerFrame);
00043 newSource->fFileSize = GetFileSize(fileName, fid);
00044
00045 return newSource;
00046 }
00047
00048 ByteStreamFileSource*
00049 ByteStreamFileSource::createNew(UsageEnvironment& env, FILE* fid,
00050 Boolean deleteFidOnClose,
00051 unsigned preferredFrameSize,
00052 unsigned playTimePerFrame) {
00053 if (fid == NULL) return NULL;
00054
00055 ByteStreamFileSource* newSource
00056 = new ByteStreamFileSource(env, fid, deleteFidOnClose,
00057 preferredFrameSize, playTimePerFrame);
00058 newSource->fFileSize = GetFileSize(NULL, fid);
00059
00060 return newSource;
00061 }
00062
00063 void ByteStreamFileSource::seekToByteAbsolute(u_int64_t byteNumber) {
00064 SeekFile64(fFid, (int64_t)byteNumber, SEEK_SET);
00065 }
00066
00067 void ByteStreamFileSource::seekToByteRelative(int64_t offset) {
00068 SeekFile64(fFid, offset, SEEK_CUR);
00069 }
00070
00071 ByteStreamFileSource::ByteStreamFileSource(UsageEnvironment& env, FILE* fid,
00072 Boolean deleteFidOnClose,
00073 unsigned preferredFrameSize,
00074 unsigned playTimePerFrame)
00075 : FramedFileSource(env, fid), fPreferredFrameSize(preferredFrameSize),
00076 fPlayTimePerFrame(playTimePerFrame), fLastPlayTime(0), fFileSize(0),
00077 fDeleteFidOnClose(deleteFidOnClose) {
00078 }
00079
00080 ByteStreamFileSource::~ByteStreamFileSource() {
00081 if (fDeleteFidOnClose && fFid != NULL) fclose(fFid);
00082 }
00083
00084 void ByteStreamFileSource::doGetNextFrame() {
00085 if (feof(fFid) || ferror(fFid)) {
00086 handleClosure(this);
00087 return;
00088 }
00089
00090
00091
00092 if (fPreferredFrameSize > 0 && fPreferredFrameSize < fMaxSize) {
00093 fMaxSize = fPreferredFrameSize;
00094 }
00095 fFrameSize = fread(fTo, 1, fMaxSize, fFid);
00096
00097
00098 if (fPlayTimePerFrame > 0 && fPreferredFrameSize > 0) {
00099 if (fPresentationTime.tv_sec == 0 && fPresentationTime.tv_usec == 0) {
00100
00101 gettimeofday(&fPresentationTime, NULL);
00102 } else {
00103
00104 unsigned uSeconds = fPresentationTime.tv_usec + fLastPlayTime;
00105 fPresentationTime.tv_sec += uSeconds/1000000;
00106 fPresentationTime.tv_usec = uSeconds%1000000;
00107 }
00108
00109
00110 fLastPlayTime = (fPlayTimePerFrame*fFrameSize)/fPreferredFrameSize;
00111 fDurationInMicroseconds = fLastPlayTime;
00112 } else {
00113
00114
00115 gettimeofday(&fPresentationTime, NULL);
00116 }
00117
00118
00119 nextTask() = envir().taskScheduler().scheduleDelayedTask(0,
00120 (TaskFunc*)FramedSource::afterGetting, this);
00121 }