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 _MEDIA_SESSION_HH
00025 #define _MEDIA_SESSION_HH
00026
00027 #ifndef _RTCP_HH
00028 #include "RTCP.hh"
00029 #endif
00030
00031 class MediaSubsession;
00032
00033 class MediaSession: public Medium {
00034 public:
00035 static MediaSession* createNew(UsageEnvironment& env,
00036 char const* sdpDescription);
00037
00038 static Boolean lookupByName(UsageEnvironment& env, char const* sourceName,
00039 MediaSession*& resultSession);
00040
00041 Boolean hasSubsessions() const { return fSubsessionsHead != NULL; }
00042 float& playStartTime() { return fMaxPlayStartTime; }
00043 float& playEndTime() { return fMaxPlayEndTime; }
00044 char* connectionEndpointName() const { return fConnectionEndpointName; }
00045 char const* CNAME() const { return fCNAME; }
00046 struct in_addr const& sourceFilterAddr() const { return fSourceFilterAddr; }
00047 float& scale() { return fScale; }
00048 char* mediaSessionType() const { return fMediaSessionType; }
00049 char* sessionName() const { return fSessionName; }
00050 char* sessionDescription() const { return fSessionDescription; }
00051 char const* controlPath() const { return fControlPath; }
00052
00053 Boolean initiateByMediaType(char const* mimeType,
00054 MediaSubsession*& resultSubsession,
00055 int useSpecialRTPoffset = -1);
00056
00057
00058
00059 #ifdef SUPPORT_REAL_RTSP
00060
00061 Boolean isRealNetworksRDT;
00062 unsigned fRealFlags;
00063 unsigned char* fRealTitle; unsigned fRealTitleSize;
00064 unsigned char* fRealAuthor; unsigned fRealAuthorSize;
00065 unsigned char* fRealCopyright; unsigned fRealCopyrightSize;
00066 unsigned char* fRealAbstract; unsigned fRealAbstractSize;
00067 #endif
00068
00069 protected:
00070 virtual Boolean isMediaSession() const;
00071
00072 protected:
00073 MediaSession(UsageEnvironment& env);
00074
00075 virtual ~MediaSession();
00076
00077 Boolean initializeWithSDP(char const* sdpDescription);
00078 Boolean parseSDPLine(char const* input, char const*& nextLine);
00079 Boolean parseSDPLine_s(char const* sdpLine);
00080 Boolean parseSDPLine_i(char const* sdpLine);
00081 Boolean parseSDPLine_c(char const* sdpLine);
00082 Boolean parseSDPAttribute_type(char const* sdpLine);
00083 Boolean parseSDPAttribute_control(char const* sdpLine);
00084 Boolean parseSDPAttribute_range(char const* sdpLine);
00085 Boolean parseSDPAttribute_source_filter(char const* sdpLine);
00086
00087 static char* lookupPayloadFormat(unsigned char rtpPayloadType,
00088 unsigned& rtpTimestampFrequency,
00089 unsigned& numChannels);
00090 static unsigned guessRTPTimestampFrequency(char const* mediumName,
00091 char const* codecName);
00092
00093 protected:
00094 friend class MediaSubsessionIterator;
00095 char* fCNAME;
00096
00097
00098 MediaSubsession* fSubsessionsHead;
00099 MediaSubsession* fSubsessionsTail;
00100
00101
00102 char* fConnectionEndpointName;
00103 float fMaxPlayStartTime;
00104 float fMaxPlayEndTime;
00105 struct in_addr fSourceFilterAddr;
00106 float fScale;
00107 char* fMediaSessionType;
00108 char* fSessionName;
00109 char* fSessionDescription;
00110 char* fControlPath;
00111 };
00112
00113
00114 class MediaSubsessionIterator {
00115 public:
00116 MediaSubsessionIterator(MediaSession& session);
00117 virtual ~MediaSubsessionIterator();
00118
00119 MediaSubsession* next();
00120 void reset();
00121
00122 private:
00123 MediaSession& fOurSession;
00124 MediaSubsession* fNextPtr;
00125 };
00126
00127
00128 class MediaSubsession {
00129 public:
00130 MediaSession& parentSession() { return fParent; }
00131 MediaSession const& parentSession() const { return fParent; }
00132
00133 unsigned short clientPortNum() const { return fClientPortNum; }
00134 unsigned char rtpPayloadFormat() const { return fRTPPayloadFormat; }
00135 char const* savedSDPLines() const { return fSavedSDPLines; }
00136 char const* mediumName() const { return fMediumName; }
00137 char const* codecName() const { return fCodecName; }
00138 char const* protocolName() const { return fProtocolName; }
00139 char const* controlPath() const { return fControlPath; }
00140 Boolean isSSM() const { return fSourceFilterAddr.s_addr != 0; }
00141
00142 unsigned short videoWidth() const { return fVideoWidth; }
00143 unsigned short videoHeight() const { return fVideoHeight; }
00144 unsigned videoFPS() const { return fVideoFPS; }
00145 unsigned numChannels() const { return fNumChannels; }
00146 float& scale() { return fScale; }
00147
00148 RTPSource* rtpSource() { return fRTPSource; }
00149 RTCPInstance* rtcpInstance() { return fRTCPInstance; }
00150 unsigned rtpTimestampFrequency() const { return fRTPTimestampFrequency; }
00151 FramedSource* readSource() { return fReadSource; }
00152
00153
00154
00155 float playStartTime() const;
00156 float playEndTime() const;
00157
00158 float& _playStartTime() { return fPlayStartTime; }
00159 float& _playEndTime() { return fPlayEndTime; }
00160
00161 Boolean initiate(int useSpecialRTPoffset = -1);
00162
00163
00164 void deInitiate();
00165 Boolean setClientPortNum(unsigned short portNum);
00166
00167
00168
00169
00170
00171
00172 char*& connectionEndpointName() { return fConnectionEndpointName; }
00173 char const* connectionEndpointName() const {
00174 return fConnectionEndpointName;
00175 }
00176
00177
00178 unsigned fmtp_auxiliarydatasizelength() const { return fAuxiliarydatasizelength; }
00179 unsigned fmtp_constantduration() const { return fConstantduration; }
00180 unsigned fmtp_constantsize() const { return fConstantsize; }
00181 unsigned fmtp_crc() const { return fCRC; }
00182 unsigned fmtp_ctsdeltalength() const { return fCtsdeltalength; }
00183 unsigned fmtp_de_interleavebuffersize() const { return fDe_interleavebuffersize; }
00184 unsigned fmtp_dtsdeltalength() const { return fDtsdeltalength; }
00185 unsigned fmtp_indexdeltalength() const { return fIndexdeltalength; }
00186 unsigned fmtp_indexlength() const { return fIndexlength; }
00187 unsigned fmtp_interleaving() const { return fInterleaving; }
00188 unsigned fmtp_maxdisplacement() const { return fMaxdisplacement; }
00189 unsigned fmtp_objecttype() const { return fObjecttype; }
00190 unsigned fmtp_octetalign() const { return fOctetalign; }
00191 unsigned fmtp_profile_level_id() const { return fProfile_level_id; }
00192 unsigned fmtp_robustsorting() const { return fRobustsorting; }
00193 unsigned fmtp_sizelength() const { return fSizelength; }
00194 unsigned fmtp_streamstateindication() const { return fStreamstateindication; }
00195 unsigned fmtp_streamtype() const { return fStreamtype; }
00196 Boolean fmtp_cpresent() const { return fCpresent; }
00197 Boolean fmtp_randomaccessindication() const { return fRandomaccessindication; }
00198 char const* fmtp_config() const { return fConfig; }
00199 char const* fmtp_mode() const { return fMode; }
00200 char const* fmtp_spropparametersets() const { return fSpropParameterSets; }
00201
00202 netAddressBits connectionEndpointAddress() const;
00203
00204 void setDestinations(netAddressBits defaultDestAddress);
00205
00206
00207
00208
00209
00210
00211 char const* sessionId;
00212 unsigned short serverPortNum;
00213 unsigned char rtpChannelId, rtcpChannelId;
00214 MediaSink* sink;
00215 void* miscPtr;
00216
00217
00218 struct {
00219 u_int16_t seqNum;
00220 u_int32_t timestamp;
00221 Boolean infoIsNew;
00222 } rtpInfo;
00223
00224 float getNormalPlayTime(struct timeval const& presentationTime);
00225
00226
00227
00228
00229
00230
00231
00232 #ifdef SUPPORT_REAL_RTSP
00233
00234 unsigned fRealMaxBitRate, fRealAvgBitRate, fRealMaxPacketSize, fRealAvgPacketSize, fRealPreroll;
00235 char* fRealStreamName; char* fRealMIMEType;
00236 unsigned char* fRealOpaqueData; unsigned fRealOpaqueDataSize;
00237
00238 unsigned char* fRealTypeSpecificData; unsigned fRealTypeSpecificDataSize;
00239 unsigned fRealRuleNumber;
00240 #endif
00241
00242 protected:
00243 friend class MediaSession;
00244 friend class MediaSubsessionIterator;
00245 MediaSubsession(MediaSession& parent);
00246 virtual ~MediaSubsession();
00247
00248 UsageEnvironment& env() { return fParent.envir(); }
00249 void setNext(MediaSubsession* next) { fNext = next; }
00250
00251 Boolean parseSDPLine_c(char const* sdpLine);
00252 Boolean parseSDPAttribute_rtpmap(char const* sdpLine);
00253 Boolean parseSDPAttribute_control(char const* sdpLine);
00254 Boolean parseSDPAttribute_range(char const* sdpLine);
00255 Boolean parseSDPAttribute_fmtp(char const* sdpLine);
00256 Boolean parseSDPAttribute_source_filter(char const* sdpLine);
00257 Boolean parseSDPAttribute_x_dimensions(char const* sdpLine);
00258 Boolean parseSDPAttribute_framerate(char const* sdpLine);
00259
00260 protected:
00261
00262 MediaSession& fParent;
00263 MediaSubsession* fNext;
00264
00265
00266 char* fConnectionEndpointName;
00267 unsigned short fClientPortNum;
00268
00269 unsigned char fRTPPayloadFormat;
00270 char* fSavedSDPLines;
00271 char* fMediumName;
00272 char* fCodecName;
00273 char* fProtocolName;
00274 unsigned fRTPTimestampFrequency;
00275 char* fControlPath;
00276 struct in_addr fSourceFilterAddr;
00277
00278
00279 unsigned fAuxiliarydatasizelength, fConstantduration, fConstantsize;
00280 unsigned fCRC, fCtsdeltalength, fDe_interleavebuffersize, fDtsdeltalength;
00281 unsigned fIndexdeltalength, fIndexlength, fInterleaving;
00282 unsigned fMaxdisplacement, fObjecttype;
00283 unsigned fOctetalign, fProfile_level_id, fRobustsorting;
00284 unsigned fSizelength, fStreamstateindication, fStreamtype;
00285 Boolean fCpresent, fRandomaccessindication;
00286 char *fConfig, *fMode, *fSpropParameterSets;
00287
00288 float fPlayStartTime;
00289 float fPlayEndTime;
00290 unsigned short fVideoWidth, fVideoHeight;
00291
00292 unsigned fVideoFPS;
00293
00294 unsigned fNumChannels;
00295
00296 float fScale;
00297 double fNPT_PTS_Offset;
00298
00299
00300 Groupsock* fRTPSocket; Groupsock* fRTCPSocket;
00301 RTPSource* fRTPSource; RTCPInstance* fRTCPInstance;
00302 FramedSource* fReadSource;
00303 };
00304
00305 #endif