00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "FramedSource.hh"
00022 #include <stdlib.h>
00023
00025
00026 FramedSource::FramedSource(UsageEnvironment& env)
00027 : MediaSource(env),
00028 fAfterGettingFunc(NULL), fAfterGettingClientData(NULL),
00029 fOnCloseFunc(NULL), fOnCloseClientData(NULL),
00030 fIsCurrentlyAwaitingData(False) {
00031 fPresentationTime.tv_sec = fPresentationTime.tv_usec = 0;
00032 }
00033
00034 FramedSource::~FramedSource() {
00035 }
00036
00037 Boolean FramedSource::isFramedSource() const {
00038 return True;
00039 }
00040
00041 Boolean FramedSource::lookupByName(UsageEnvironment& env, char const* sourceName,
00042 FramedSource*& resultSource) {
00043 resultSource = NULL;
00044
00045 MediaSource* source;
00046 if (!MediaSource::lookupByName(env, sourceName, source)) return False;
00047
00048 if (!source->isFramedSource()) {
00049 env.setResultMsg(sourceName, " is not a framed source");
00050 return False;
00051 }
00052
00053 resultSource = (FramedSource*)source;
00054 return True;
00055 }
00056
00057 void FramedSource::getNextFrame(unsigned char* to, unsigned maxSize,
00058 afterGettingFunc* afterGettingFunc,
00059 void* afterGettingClientData,
00060 onCloseFunc* onCloseFunc,
00061 void* onCloseClientData) {
00062
00063 if (fIsCurrentlyAwaitingData) {
00064 envir() << "FramedSource[" << this << "]::getNextFrame(): attempting to read more than once at the same time!\n";
00065 envir().internalError();
00066 }
00067
00068 fTo = to;
00069 fMaxSize = maxSize;
00070 fNumTruncatedBytes = 0;
00071 fDurationInMicroseconds = 0;
00072 fAfterGettingFunc = afterGettingFunc;
00073 fAfterGettingClientData = afterGettingClientData;
00074 fOnCloseFunc = onCloseFunc;
00075 fOnCloseClientData = onCloseClientData;
00076 fIsCurrentlyAwaitingData = True;
00077
00078 doGetNextFrame();
00079 }
00080
00081 void FramedSource::afterGetting(FramedSource* source) {
00082 source->fIsCurrentlyAwaitingData = False;
00083
00084
00085
00086
00087 if (source->fAfterGettingFunc != NULL) {
00088 (*(source->fAfterGettingFunc))(source->fAfterGettingClientData,
00089 source->fFrameSize, source->fNumTruncatedBytes,
00090 source->fPresentationTime,
00091 source->fDurationInMicroseconds);
00092 }
00093 }
00094
00095 void FramedSource::handleClosure(void* clientData) {
00096 FramedSource* source = (FramedSource*)clientData;
00097 source->fIsCurrentlyAwaitingData = False;
00098 if (source->fOnCloseFunc != NULL) {
00099 (*(source->fOnCloseFunc))(source->fOnCloseClientData);
00100 }
00101 }
00102
00103 void FramedSource::stopGettingFrames() {
00104 fIsCurrentlyAwaitingData = False;
00105
00106
00107 doStopGettingFrames();
00108 }
00109
00110 void FramedSource::doStopGettingFrames() {
00111
00112 envir().taskScheduler().unscheduleDelayedTask(nextTask());
00113
00114 }
00115
00116 unsigned FramedSource::maxFrameSize() const {
00117
00118 return 0;
00119 }