00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _SERVER_MEDIA_SESSION_HH
00025 #define _SERVER_MEDIA_SESSION_HH
00026
00027 #ifndef _MEDIA_HH
00028 #include "Media.hh"
00029 #endif
00030 #ifndef _FRAMED_SOURCE_HH
00031 #include "FramedSource.hh"
00032 #endif
00033 #ifndef _GROUPEID_HH
00034 #include "GroupEId.hh"
00035 #endif
00036 #ifndef _RTP_INTERFACE_HH
00037 #include "RTPInterface.hh"
00038 #endif
00039
00040 class ServerMediaSubsession;
00041
00042 class ServerMediaSession: public Medium {
00043 public:
00044 static ServerMediaSession* createNew(UsageEnvironment& env,
00045 char const* streamName = NULL,
00046 char const* info = NULL,
00047 char const* description = NULL,
00048 Boolean isSSM = False,
00049 char const* miscSDPLines = NULL);
00050
00051 virtual ~ServerMediaSession();
00052
00053 static Boolean lookupByName(UsageEnvironment& env,
00054 char const* mediumName,
00055 ServerMediaSession*& resultSession);
00056
00057 char* generateSDPDescription();
00058
00059
00060 char const* streamName() const { return fStreamName; }
00061
00062 Boolean addSubsession(ServerMediaSubsession* subsession);
00063 unsigned numSubsessions() const { return fSubsessionCounter; }
00064
00065 void testScaleFactor(float& scale);
00066 float duration() const;
00067
00068
00069
00070
00071 unsigned referenceCount() const { return fReferenceCount; }
00072 void incrementReferenceCount() { ++fReferenceCount; }
00073 void decrementReferenceCount() { if (fReferenceCount > 0) --fReferenceCount; }
00074 Boolean& deleteWhenUnreferenced() { return fDeleteWhenUnreferenced; }
00075
00076 protected:
00077 ServerMediaSession(UsageEnvironment& env, char const* streamName,
00078 char const* info, char const* description,
00079 Boolean isSSM, char const* miscSDPLines);
00080
00081
00082 private:
00083 virtual Boolean isServerMediaSession() const;
00084
00085 private:
00086 Boolean fIsSSM;
00087
00088
00089 friend class ServerMediaSubsessionIterator;
00090 ServerMediaSubsession* fSubsessionsHead;
00091 ServerMediaSubsession* fSubsessionsTail;
00092 unsigned fSubsessionCounter;
00093
00094 char* fStreamName;
00095 char* fInfoSDPString;
00096 char* fDescriptionSDPString;
00097 char* fMiscSDPLines;
00098 struct timeval fCreationTime;
00099 unsigned fReferenceCount;
00100 Boolean fDeleteWhenUnreferenced;
00101 };
00102
00103
00104 class ServerMediaSubsessionIterator {
00105 public:
00106 ServerMediaSubsessionIterator(ServerMediaSession& session);
00107 virtual ~ServerMediaSubsessionIterator();
00108
00109 ServerMediaSubsession* next();
00110 void reset();
00111
00112 private:
00113 ServerMediaSession& fOurSession;
00114 ServerMediaSubsession* fNextPtr;
00115 };
00116
00117
00118 class ServerMediaSubsession: public Medium {
00119 public:
00120 virtual ~ServerMediaSubsession();
00121
00122 unsigned trackNumber() const { return fTrackNumber; }
00123 char const* trackId();
00124 virtual char const* sdpLines() = 0;
00125 virtual void getStreamParameters(unsigned clientSessionId,
00126 netAddressBits clientAddress,
00127 Port const& clientRTPPort,
00128 Port const& clientRTCPPort,
00129 int tcpSocketNum,
00130 unsigned char rtpChannelId,
00131 unsigned char rtcpChannelId,
00132 netAddressBits& destinationAddress,
00133 u_int8_t& destinationTTL,
00134 Boolean& isMulticast,
00135 Port& serverRTPPort,
00136 Port& serverRTCPPort,
00137 void*& streamToken
00138 ) = 0;
00139 virtual void startStream(unsigned clientSessionId, void* streamToken,
00140 TaskFunc* rtcpRRHandler,
00141 void* rtcpRRHandlerClientData,
00142 unsigned short& rtpSeqNum,
00143 unsigned& rtpTimestamp,
00144 ServerRequestAlternativeByteHandler* serverRequestAlternativeByteHandler,
00145 void* serverRequestAlternativeByteHandlerClientData) = 0;
00146 virtual void pauseStream(unsigned clientSessionId, void* streamToken);
00147 virtual void seekStream(unsigned clientSessionId, void* streamToken, double& seekNPT, double streamDuration, u_int64_t& numBytes);
00148
00149
00150 virtual void setStreamScale(unsigned clientSessionId, void* streamToken, float scale);
00151 virtual FramedSource* getStreamSource(void* streamToken);
00152 virtual void deleteStream(unsigned clientSessionId, void*& streamToken);
00153
00154 virtual void testScaleFactor(float& scale);
00155 virtual float duration() const;
00156
00157
00158
00159
00160
00161 void setServerAddressAndPortForSDP(netAddressBits addressBits,
00162 portNumBits portBits);
00163
00164 protected:
00165 ServerMediaSubsession(UsageEnvironment& env);
00166
00167 char const* rangeSDPLine() const;
00168
00169
00170 ServerMediaSession* fParentSession;
00171 netAddressBits fServerAddressForSDP;
00172 portNumBits fPortNumForSDP;
00173
00174 private:
00175 friend class ServerMediaSession;
00176 friend class ServerMediaSubsessionIterator;
00177 ServerMediaSubsession* fNext;
00178
00179 unsigned fTrackNumber;
00180 char const* fTrackId;
00181 };
00182
00183 #endif