1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 #ifndef PVMF_RTCP_PROTO_IMPL_H_INCLUDED 19 #define PVMF_RTCP_PROTO_IMPL_H_INCLUDED 20 21 #ifndef OSCL_BASE_H_INCLUDED 22 #include "oscl_base.h" 23 #endif 24 #ifndef OSCL_VECTOR_H_INCLUDED 25 #include "oscl_vector.h" 26 #endif 27 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED 28 #include "oscl_string_containers.h" 29 #endif 30 #ifndef PVMF_RETURN_CODES_H_INCLUDED 31 #include "pvmf_return_codes.h" 32 #endif 33 #ifndef PVMF_MEDIA_MSG_H_INCLUDED 34 #include "pvmf_media_msg.h" 35 #endif 36 37 #ifndef PVMF_SIMPLE_MEDIA_BUFFER_H_INCLUDED 38 #include "pvmf_simple_media_buffer.h" 39 #endif 40 #ifndef PVMF_MEDIA_DATA_H_INCLUDED 41 #include "pvmf_media_data.h" 42 #endif 43 #ifndef PVMF_SM_TUNABLES_H_INCLUDED 44 #include "pvmf_sm_tunables.h" 45 #endif 46 47 #ifndef PVMF_JITTER_BUFFER_H_INCLUDED 48 #include "pvmf_jitter_buffer.h" 49 #endif 50 51 #ifndef PVMF_RTCP_TIMER_H_INCLUDED 52 #include "pvmf_rtcp_timer.h" 53 #endif 54 55 #ifndef PVMF_JB_EVENT_NOTIFIER_H 56 #include "pvmf_jb_event_notifier.h" 57 #endif 58 59 #ifndef OSCL_RAND_H_INCLUDED 60 #include "oscl_rand.h" 61 #endif 62 63 #ifndef RTCP_H 64 #include "rtcp.h" 65 #endif 66 67 #ifndef PVLOGGER_H_INCLUDED 68 #include "pvlogger.h" 69 #endif 70 71 #ifndef PVMF_RESIZABLE_SIMPLE_MEDIAMSG_H_INCLUDED 72 #include "pvmf_resizable_simple_mediamsg.h" 73 #endif 74 75 #ifndef PVMF_PORT_INTERFACE_H_INCLUDED 76 #include "pvmf_port_interface.h" 77 #endif 78 79 //May be can add a separate config file 80 #define MAX_RTCP_SOURCES 31 81 #define MAX_RTCP_BLOCK_SIZE 512 82 #define DEFAULT_RTCP_MEM_POOL_BUFFERS 4 83 #define RTCP_RAND_SEED 666 84 85 #define MIN_RTSP_SERVER_INACTIVITY_TIMEOUT_IN_SEC 1 86 #define MAX_RTSP_SERVER_INACTIVITY_TIMEOUT_IN_SEC 300 87 88 // RTCP INTERVAL related 89 #define DEFAULT_RTCP_INTERVAL_USEC 1000000 90 #define DEFAULT_RTCP_INTERVAL_SEC 1 91 #define RTCP_FIXED_INTERVAL_MODE 1 92 #define PVMF_MEDIA_DATA_CLASS_SIZE 128 93 94 /////////////////////////////////////////////////////////////////////////////// 95 //PVMFRTCPStats 96 /////////////////////////////////////////////////////////////////////////////// 97 class PVMFRTCPStats 98 { 99 public: PVMFRTCPStats()100 PVMFRTCPStats() 101 { 102 Reset(); 103 } 104 PVMFRTCPStats(const PVMFRTCPStats & aSrc)105 PVMFRTCPStats(const PVMFRTCPStats& aSrc) 106 { 107 lastSenderReportNTP = aSrc.lastSenderReportNTP; 108 lastSenderReportRTP = aSrc.lastSenderReportRTP; 109 lastSenderReportTS = aSrc.lastSenderReportTS; 110 lastSenderReportRecvTime = aSrc.lastSenderReportRecvTime; 111 packetLossUptoThisRR = aSrc.packetLossUptoThisRR; 112 maxSeqNumRecievedUptoThisRR = aSrc.maxSeqNumRecievedUptoThisRR; 113 lastRRGenTime = aSrc.lastRRGenTime; 114 iLastSenderReportSSRC = aSrc.iLastSenderReportSSRC; 115 avg_rtcp_compound_pkt_size = aSrc.avg_rtcp_compound_pkt_size; 116 oSRRecvd = aSrc.oSRRecvd; 117 oRTCPByeRecvd = aSrc.oRTCPByeRecvd; 118 }; 119 120 PVMFRTCPStats& operator=(const PVMFRTCPStats& a) 121 { 122 if (&a != this) 123 { 124 lastSenderReportNTP = a.lastSenderReportNTP; 125 lastSenderReportRTP = a.lastSenderReportRTP; 126 lastSenderReportTS = a.lastSenderReportTS; 127 lastSenderReportRecvTime = a.lastSenderReportRecvTime; 128 packetLossUptoThisRR = a.packetLossUptoThisRR; 129 maxSeqNumRecievedUptoThisRR = a.maxSeqNumRecievedUptoThisRR; 130 lastRRGenTime = a.lastRRGenTime; 131 iLastSenderReportSSRC = a.iLastSenderReportSSRC; 132 avg_rtcp_compound_pkt_size = a.avg_rtcp_compound_pkt_size; 133 oSRRecvd = a.oSRRecvd; 134 oRTCPByeRecvd = a.oRTCPByeRecvd; 135 } 136 return *this; 137 } 138 Reset()139 void Reset() 140 { 141 lastSenderReportNTP = 0; 142 lastSenderReportRTP = 0; 143 lastSenderReportTS = 0; 144 lastSenderReportRecvTime = 0; 145 packetLossUptoThisRR = 0; 146 maxSeqNumRecievedUptoThisRR = 0; 147 lastRRGenTime = 0; 148 iLastSenderReportSSRC = 0; 149 avg_rtcp_compound_pkt_size = 0; 150 oSRRecvd = false; 151 oRTCPByeRecvd = false; 152 } 153 154 155 156 uint64 lastSenderReportNTP; 157 uint32 lastSenderReportRTP; 158 uint32 lastSenderReportTS; 159 uint64 lastSenderReportRecvTime; 160 int32 packetLossUptoThisRR; 161 int32 maxSeqNumRecievedUptoThisRR; 162 uint64 lastRRGenTime; 163 uint32 iLastSenderReportSSRC; 164 float avg_rtcp_compound_pkt_size; 165 bool oSRRecvd; 166 bool oRTCPByeRecvd; 167 }; 168 169 class RTPRateAdaptationInfo 170 { 171 public: RTPRateAdaptationInfo()172 RTPRateAdaptationInfo(): iRateAdaptation(false) 173 , iRateAdaptationFeedBackFrequency(0) 174 , iRateAdaptationRTCPRRCount(0) 175 , iRateAdaptationFreeBufferSpaceInBytes(0) 176 { 177 } 178 bool iRateAdaptation; 179 uint32 iRateAdaptationFeedBackFrequency; 180 uint32 iRateAdaptationRTCPRRCount; 181 uint32 iRateAdaptationFreeBufferSpaceInBytes; 182 }; 183 184 class PVRTCPChannelController; 185 /////////////////////////////////////////////////////////////////////////////// 186 //PVRTCPChannelControllerObserver 187 /////////////////////////////////////////////////////////////////////////////// 188 class PVRTCPChannelControllerObserver 189 { 190 public: 191 virtual PVMFStatus RTCPSRReveived(PVRTCPChannelController* channelController) = 0; 192 virtual PVMFStatus RTCPByeReceived(PVRTCPChannelController* channelController) = 0; 193 virtual PVMFStatus RTCPRRReadyToSend(PVMFPortInterface*& aPort, PVMFSharedMediaMsgPtr& aMessage) = 0; 194 }; 195 196 /////////////////////////////////////////////////////////////////////////////// 197 //PVRTCPChannelController 198 /////////////////////////////////////////////////////////////////////////////// 199 class PVRTCPChannelController: public PvmfRtcpTimerObserver 200 { 201 public: 202 static PVRTCPChannelController* New(PVRTCPChannelControllerObserver* aObserver, PVMFJitterBuffer& aRTPJitterBuffer, PVMFPortInterface* aFeedbackPort, PVMFMediaClock& aClientPlaybackClock, PVMFMediaClock& aRTCPClock); 203 ~PVRTCPChannelController(); 204 205 void Reset(); 206 GetJitterBuffer()207 PVMFJitterBuffer& GetJitterBuffer() 208 { 209 return irRTPDataJitterBuffer; 210 } 211 212 void StartRTCPMessageExchange(); 213 void PauseRTCPMessageExchange(); 214 void StopRTCPMessageExchange(); 215 216 void SetRateAdaptation(bool aRateAdaptation, uint32 aRateAdaptationFeedBackFrequency, uint32 aRateAdaptationFreeBufferSpaceInBytes); 217 void SetRTCPIntervalInMicroSecs(uint32 aRTCPInterval); SetPortRTCPParams(int aNumSenders,uint32 aRR,uint32 aRS)218 bool SetPortRTCPParams(int aNumSenders, uint32 aRR, uint32 aRS) 219 { 220 iNumSenders = aNumSenders; 221 iRR = aRR; 222 iRS = aRS; 223 iRtcpBwConfigured = true; 224 return true; 225 } 226 PVMFStatus ProcessRTCPReport(PVMFSharedMediaMsgPtr& aMsg); CheckAssociatedFeedbackPort(const PVMFPortInterface * aFeedbackPort)227 bool CheckAssociatedFeedbackPort(const PVMFPortInterface* aFeedbackPort)const 228 { 229 return (ipFeedbackPort == aFeedbackPort); 230 } 231 SetMediaClockConverter(MediaClockConverter * aClockConverter)232 void SetMediaClockConverter(MediaClockConverter* aClockConverter) 233 { 234 ipMediaClockConverter = aClockConverter; 235 } 236 Prepare(bool aAfterSeek)237 void Prepare(bool aAfterSeek) 238 { 239 if (aAfterSeek) 240 { 241 iRTCPStats.oRTCPByeRecvd = false; 242 } 243 if (iRtcpBwConfigured && (iRR == 0)) 244 { 245 ipRTCPTimer->setRTCPInterval(0); 246 return; 247 } 248 } 249 GetRTCPStats()250 const PVMFRTCPStats& GetRTCPStats() 251 { 252 return iRTCPStats; 253 } 254 255 virtual void RtcpTimerEvent(); 256 private: 257 void Construct(); 258 PVRTCPChannelController(PVRTCPChannelControllerObserver* aObserver, PVMFJitterBuffer& aRTPJitterBuffer, PVMFPortInterface* aFeedbackPort, PVMFMediaClock& aClientPlaybackClock, PVMFMediaClock& aRTCPClock); 259 PVRTCPChannelController& operator =(const PVRTCPChannelController&); 260 PVRTCPChannelController(const PVRTCPChannelController&); 261 void ResetParams(bool aMemoryCleanUp = false); 262 PVMFStatus ComposeFeedBackPacket(); 263 uint32 CalcRtcpInterval(); 264 PVMFStatus GenerateRTCPRR(); 265 PVMFResizableSimpleMediaMsgAlloc* CreateRTCPRRBufAllocReSize(); 266 267 PVRTCPChannelControllerObserver* ipObserver; 268 PVMFJitterBuffer& irRTPDataJitterBuffer; 269 PVMFPortInterface* ipFeedbackPort; 270 PVMFMediaClock& irClientPlayBackClock; 271 PVMFMediaClock& irRTCPClock; 272 273 RTPRateAdaptationInfo iRTPChannelRateAdaptationInfo; 274 PVMFRTCPStats iRTCPStats; 275 int iNumSenders; 276 uint32 iRR; 277 uint32 iRS; 278 bool iRtcpBwConfigured; 279 bool iInitialRTCPIntervalComputation; 280 uint32 iRTCPIntervalInMicroSeconds; 281 bool iInitialRTCPPacket; 282 PvmfRtcpTimer* ipRTCPTimer; 283 OsclRand iRandGen; 284 MediaClockConverter* ipMediaClockConverter; 285 286 PVLogger* ipRTCPDataPathLoggerIn; 287 PVLogger* ipRTCPDataPathLoggerOut; 288 }; 289 290 /////////////////////////////////////////////////////////////////////////////// 291 //PVRTCPProtoImplementorObserver 292 /////////////////////////////////////////////////////////////////////////////// 293 class PVRTCPProtoImplementorObserver 294 { 295 public: 296 virtual PVMFStatus RTCPPacketReceived(RTCPPacketType aPacketType, PVRTCPChannelController* aController) = 0; 297 virtual PVMFStatus RTCPReportReadyToSend(PVMFPortInterface*& aPort, PVMFSharedMediaMsgPtr& aMessage) = 0; 298 virtual PVMFStatus ProcessInfoEvent(PVMFAsyncEvent& aEvent) = 0; 299 }; 300 301 /////////////////////////////////////////////////////////////////////////////// 302 //PVRTCPProtoImplementor 303 /////////////////////////////////////////////////////////////////////////////// 304 class PVRTCPProtoImplementor: public PVRTCPChannelControllerObserver 305 { 306 public: 307 OSCL_IMPORT_REF static PVRTCPProtoImplementor* New(PVMFMediaClock& aClientPlayBackClock, PVMFMediaClock& aRTCPClock, PVRTCPProtoImplementorObserver* aObs, bool aBroadcastSession); 308 OSCL_IMPORT_REF ~PVRTCPProtoImplementor(); 309 310 OSCL_EXPORT_REF void AddPVRTCPChannelController(PVRTCPChannelController* aPVRTCPChannelController); 311 OSCL_EXPORT_REF void RemoveAllRTCPChannelControllers(); 312 OSCL_EXPORT_REF PVRTCPChannelController* GetRTCPChannelController(const PVMFPortInterface* aPort) const; 313 314 OSCL_IMPORT_REF void StartRTCPMessageExchange(); 315 OSCL_IMPORT_REF void PauseRTCPMessageExchange(); 316 OSCL_IMPORT_REF void StopRTCPMessageExchange(); 317 318 OSCL_IMPORT_REF void Reset(); 319 320 OSCL_IMPORT_REF PVMFStatus ProcessRTCPReport(PVMFPortInterface* aFeedbackPort, PVMFSharedMediaMsgPtr& aMsg); 321 OSCL_IMPORT_REF void SetRTCPIntervalInMicroSecs(uint32 aRTCPInterval); 322 OSCL_IMPORT_REF bool SetPortRTCPParams(PVMFPortInterface* aPort, int aNumSenders, uint32 aRR, uint32 aRS); 323 324 OSCL_IMPORT_REF void Prepare(bool aPlayAfterSeek); 325 326 RTCPByeReceivedOnAllControllers()327 bool RTCPByeReceivedOnAllControllers() 328 { 329 PVRTCPChannelController* rtcpChannelController = NULL; 330 Oscl_Vector<PVRTCPChannelController*, OsclMemAllocator>::iterator iter; 331 for (iter = iPVRTCPChannelController.begin(); iter != iPVRTCPChannelController.end(); iter++) 332 { 333 rtcpChannelController = *iter; 334 if (!(rtcpChannelController->GetRTCPStats().oRTCPByeRecvd)) 335 { 336 337 return false; 338 } 339 } 340 return true; 341 } 342 343 //Implementation of PVRTCPChannelControllerObserver 344 PVMFStatus RTCPSRReveived(PVRTCPChannelController* aChannelController); 345 PVMFStatus RTCPByeReceived(PVRTCPChannelController* aChannelController); 346 PVMFStatus RTCPRRReadyToSend(PVMFPortInterface*& aPort, PVMFSharedMediaMsgPtr& aMessage); 347 private: 348 PVRTCPProtoImplementor(PVMFMediaClock& aClientPlayBackClock, PVMFMediaClock& aRTCPClock, PVRTCPProtoImplementorObserver* aObs, bool aBroadcastSession); 349 void ResetParams(bool aMemoryCleanUp = false); 350 bool ProcessRTCPSRforAVSync(); 351 void Construct(); 352 353 const bool iBroadcastSession; 354 PVMFMediaClock& irClientPlayBackClock; 355 PVMFMediaClock& irRTCPClock; 356 PVRTCPProtoImplementorObserver* ipObserver; 357 358 bool iPerformRTCPBasedAVSync; 359 bool iRTCPAVSyncProcessed; 360 bool iPlayStopTimeAvailable; 361 Oscl_Vector<PVRTCPChannelController*, OsclMemAllocator> iPVRTCPChannelController; 362 363 PVLogger* ipRTCPDataPathLoggerIn; 364 PVLogger* ipRTCPAVSyncLogger; 365 }; 366 367 #endif 368