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