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