• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_JB_JITTERBUFFERMISC_H_INCLUDED
19 #define PVMF_JB_JITTERBUFFERMISC_H_INCLUDED
20 
21 #ifndef PVMF_MEDIA_CLOCK_H_INCLUDED
22 #include "pvmf_media_clock.h"
23 #endif
24 
25 #ifndef PVMF_JB_EVENT_NOTIFIER_H
26 #include "pvmf_jb_event_notifier.h"
27 #endif
28 
29 #ifndef PVMF_JB_SESSION_DURATION_TIMER_H_INCLUDED
30 #include "pvmf_jb_session_duration_timer.h"
31 #endif
32 
33 #ifndef OSCL_MEM_H_INCLUDED
34 #include "oscl_mem.h"
35 #endif
36 
37 #ifndef PVMF_RTCP_PROTO_IMPL_H_INCLUDED
38 #include "pvmf_rtcp_proto_impl.h"
39 #endif
40 
41 #ifndef PVMFFIREWALLPKTS_H_INCLUDED
42 #include "pvmf_jb_firewall_pkts_impl.h"
43 #endif
44 
45 #ifndef PVMF_JITTER_BUFFER_PORT_H_INCLUDED
46 #include "pvmf_jitter_buffer_port.h"
47 #endif
48 
49 #ifndef RTSP_TIME_FORMAT_H
50 #include "rtsp_time_formats.h"
51 #endif
52 
53 class PVLogger;
54 
55 class PVMFJitterBufferMiscObserver
56 {
57     public:
58         virtual void MessageReadyToSend(PVMFPortInterface*& aPort, PVMFSharedMediaMsgPtr& aMessage) = 0;
59         virtual void MediaReceivingChannelPrepared(bool aStatus) = 0;
60         virtual void ProcessRTCPControllerEvent(PVMFAsyncEvent& aEvent) = 0;
61         virtual void SessionSessionExpired() = 0;
62 };
63 
64 class PVMFJitterBufferMisc: public PVRTCPProtoImplementorObserver
65         , public PVMFJBEventNotifierObserver
66         , public PvmfJBSessionDurationTimerObserver
67 {
68     public:
69         OSCL_IMPORT_REF static PVMFJitterBufferMisc* New(PVMFJitterBufferMiscObserver* aObserver, PVMFMediaClock& aClientPlaybackClock, Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>& aPortParamsQueue);
70         OSCL_IMPORT_REF virtual ~PVMFJitterBufferMisc();
71         OSCL_IMPORT_REF void StreamingSessionStarted();
72         OSCL_IMPORT_REF void StreamingSessionStopped();
73         OSCL_IMPORT_REF void StreamingSessionPaused();
74         OSCL_IMPORT_REF void StreamingSessionBufferingStart();
75         OSCL_IMPORT_REF void StreamingSessionBufferingEnd();
76 
77         OSCL_IMPORT_REF void SetBroadcastSession();
78 
79         OSCL_IMPORT_REF void ResetEstimatedServerClock();
80 
81         OSCL_IMPORT_REF bool PrepareForRepositioning(bool oUseExpectedClientClockVal, uint32 aExpectedClientClockVal);
82         OSCL_IMPORT_REF bool PurgeElementsWithNPTLessThan(NptTimeFormat &aNPTTime);
83 
84         OSCL_IMPORT_REF bool IsSessionExpired();
85 
86         OSCL_IMPORT_REF void Prepare();
87         OSCL_IMPORT_REF void Reset();
88 
89         OSCL_IMPORT_REF PVMFStatus PrepareMediaReceivingChannel();
90         OSCL_IMPORT_REF PVMFStatus CancelMediaReceivingChannelPreparation();
91 
92         OSCL_IMPORT_REF PVMFStatus ProcessFeedbackMessage(PVMFJitterBufferPortParams& aParam, PVMFSharedMediaMsgPtr aMsg);
93         OSCL_IMPORT_REF void SetRateAdaptationInfo(PVMFPortInterface* aPort, bool aRateAdaptation, uint32 aRateAdaptationFeedBackFrequency, uint32 aRateAdaptationFreeBufferSpaceInBytes = 0);
94         OSCL_IMPORT_REF void SetRTCPIntervalInMicroSecs(uint32 aRTCPInterval);
95         OSCL_IMPORT_REF bool SetPortRTCPParams(PVMFPortInterface* aPort, int aNumSenders, uint32 aRR, uint32 aRS);
96         OSCL_IMPORT_REF bool ResetSession();
97         OSCL_IMPORT_REF bool SetSessionDurationExpired();
98 
99         OSCL_IMPORT_REF void MediaReceivingChannelPreparationRequired(bool aRequired);
100         OSCL_IMPORT_REF PVMFMediaClock& GetEstimatedServerClock();
101         OSCL_IMPORT_REF PVMFJBEventNotifier* GetEventNotifier();
102 
103         OSCL_IMPORT_REF bool SetPlayRange(int32 aStartTimeInMS,
104                                           int32 aStopTimeInMS,
105                                           bool aPlayAfterASeek,
106                                           bool aStopTimeAvailable);
107 
108         OSCL_IMPORT_REF void SetPortSSRC(PVMFPortInterface* aPort, uint32 aSSRC);
109 
110         OSCL_IMPORT_REF uint32 GetEstimatedServerClockValue();
111 
112         OSCL_IMPORT_REF bool PlayStopTimeAvailable() const;
113 
114         OSCL_IMPORT_REF void SetServerInfo(PVMFJitterBufferFireWallPacketInfo& aServerInfo);
115 
116         OSCL_IMPORT_REF PVMFTimestamp GetMaxMediaDataTS();
117         OSCL_IMPORT_REF PVMFTimestamp GetActualMediaDataTSAfterSeek();
118 
119         OSCL_IMPORT_REF void SetMediaClockConverter(PVMFPortInterface* apPort, MediaClockConverter* apMediaClockConverter);
120         OSCL_IMPORT_REF void ProcessFirstPacketAfterSeek();
121 
122         void ProcessCallback(CLOCK_NOTIFICATION_INTF_TYPE aClockNotificationInterfaceType, uint32 aCallBkId, const OsclAny* aContext, PVMFStatus aStatus);
123         virtual void PVMFJBSessionDurationTimerEvent();
124         PVMFStatus RTCPPacketReceived(RTCPPacketType aPacketType, PVRTCPChannelController* aController);
125         PVMFStatus RTCPReportReadyToSend(PVMFPortInterface*& aPort, PVMFSharedMediaMsgPtr& aMessage);
126         PVMFStatus ProcessInfoEvent(PVMFAsyncEvent& aEvent);
127         void LogClientAndEstimatedServerClock(PVLogger* aLogger);
128 
129     private:
PVMFJitterBufferMisc(PVMFJitterBufferMiscObserver * aObserver,PVMFMediaClock & aClientPlaybackClock,Oscl_Vector<PVMFJitterBufferPortParams *,OsclMemAllocator> & aPortParamsQueue)130         PVMFJitterBufferMisc(PVMFJitterBufferMiscObserver* aObserver, PVMFMediaClock& aClientPlaybackClock, Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>& aPortParamsQueue):
131                 irClientPlaybackClock(aClientPlaybackClock)
132                 , ipObserver(aObserver)
133                 , irPortParamsQueue(aPortParamsQueue)
134                 , ipSessionDurationTimer(NULL)
135                 , ipEventNotifier(NULL)
136                 , ipRTCPProtoImplementator(NULL)
137                 , ipFireWallPacketExchangerImpl(NULL)
138                 , ipEstimatedServerClock(NULL)
139                 , ipWallClock(NULL)
140                 , ipNonDecreasingClock(NULL)
141                 , ipJBEventsClockLogger(NULL)
142                 , ipClockLoggerSessionDuration(NULL)
143                 , ipClockLogger(NULL)
144                 , ipDataPathLoggerIn(NULL)
145                 , ipDataPathLoggerOut(NULL)
146                 , ipDataPathLoggerRTCP(NULL)
147                 , ipLogger(NULL)
148         {
149             ResetParams(false);
150         }
151 
152         void Construct();
153         bool CreateProtocolObjects();
154         bool LookupRTCPChannelParams(PVMFPortInterface* rtpPort, PVMFPortInterface*& rtcpPort, PVMFJitterBuffer*& rtpPktJitterBuffer);
155         bool LocateFeedBackPort(PVMFJitterBufferPortParams*& aInputPortParamsPtr, PVMFJitterBufferPortParams*& aFeedBackPortParamsPtr);
156         bool FirewallPacketExchangerRequired() const;
157         bool RTCPProtocolImplementorRequired() const;
158 
159         void ResetParams(bool aReleaseMemory = true);
ComputeCurrentSessionDurationMonitoringInterval()160         void ComputeCurrentSessionDurationMonitoringInterval()
161         {
162             /* Restart the session duration timer after accounting for any elapsed time */
163             uint64 elapsedTime = ipSessionDurationTimer->GetMonitoringIntervalElapsed();
164             uint32 elapsedTime32 = Oscl_Int64_Utils::get_uint64_lower32(elapsedTime);
165             ipSessionDurationTimer->UpdateElapsedSessionDuration(elapsedTime32);
166             uint32 totalSessionDuration = ipSessionDurationTimer->getSessionDurationInMS();
167             uint32 elapsedSessionDuration = ipSessionDurationTimer->GetElapsedSessionDurationInMS();
168             uint32 interval = (totalSessionDuration - elapsedSessionDuration);
169             if (interval > PVMF_JITTER_BUFFER_NODE_SESSION_DURATION_MONITORING_INTERVAL_MAX_IN_MS)
170             {
171                 interval = PVMF_JITTER_BUFFER_NODE_SESSION_DURATION_MONITORING_INTERVAL_MAX_IN_MS;
172             }
173             ipSessionDurationTimer->setCurrentMonitoringIntervalInMS(interval);
174             PVMF_JB_LOGCLOCK_SESSION_DURATION((0, "PVMFJBN::ComputeCurrentSessionDurationMonitoringInterval - TotalDuration=%d, ElapsedDuration=%d, CurrMonitoringInterval=%d", totalSessionDuration, elapsedSessionDuration, interval));
175         }
176 
177         PVMFMediaClock&     irClientPlaybackClock;      //Reference to the client playback clock passed on by its observer.
178         PVMFJitterBufferMiscObserver*   ipObserver;
179         Oscl_Vector<PVMFJitterBufferPortParams*, OsclMemAllocator>& irPortParamsQueue;
180 
181         Oscl_Vector<RTPSessionInfoForFirewallExchange, OsclMemAllocator> iRTPExchangeInfosForFirewallExchange;
182         struct RateAdapatationInfo
183         {
RateAdapatationInfoRateAdapatationInfo184             RateAdapatationInfo(): iPort(NULL) {}
185             PVMFPortInterface* iPort;
186             RTPRateAdaptationInfo iRateAdapatationInfo;
187         };
188         Oscl_Vector<RateAdapatationInfo, OsclMemAllocator> iRateAdaptationInfos;
189 
190         struct RTCPParams
191         {
RTCPParamsRTCPParams192             RTCPParams(): iFeedbackPort(NULL), iNumSenders(0), iRR(0), iRS(0) {}
193             PVMFPortInterface* iFeedbackPort;
194             int iNumSenders;
195             uint32 iRR;
196             uint32 iRS;
197         };
198         Oscl_Vector<RTCPParams, OsclMemAllocator> iRTCPParamsVect;
199 
200         //Sesion Info
201         uint32  iSessionDuration;
202         bool    iStreamingSessionExpired;
203         bool    iPlayDurationAvailable;
204         bool    iBroadcastSession;
205 
206         bool UseSessionDurationTimerForEOS();
207         bool iUseSessionDurationTimerForEOS;
208 
209         uint32  iPlayStartTimeInMS;
210         uint32  iPlayStopTimeInMS;
211         bool    iPlayStopTimeAvailable;
212 
213         bool    iFireWallPacketsExchangeEnabled;
214 
215         bool   iEstimatedServerClockUpdateCallbackPending;
216         uint32 iEstimatedServerClockUpdateCallbackId;
217 
218         PvmfJBSessionDurationTimer*     ipSessionDurationTimer;
219         PVMFJBEventNotifier*            ipEventNotifier;
220         PVRTCPProtoImplementor*         ipRTCPProtoImplementator;
221         PVFirewallPacketExchangeImpl*   ipFireWallPacketExchangerImpl;
222 
223         PVMFMediaClock*     ipEstimatedServerClock;     //Estimation of the estimated server clock.
224         PVMFMediaClock*     ipWallClock;                //A continously increasing clock.
225         PVMFMediaClock*     ipNonDecreasingClock;       //Always increasing clock but may not be continous (may get pasued in between depending on the state of the streaming session)
226         PVMFTimebase_Tickcount iEstimatedServerClockTimeBase;
227         PVMFTimebase_Tickcount iWallClockTimeBase;
228         PVMFTimebase_Tickcount iNonDecreasingTimeBase;
229 
230         PVLogger* ipJBEventsClockLogger;
231         PVLogger* ipRTCPDataPathLoggerIn;
232         PVLogger* ipClockLoggerSessionDuration;
233         PVLogger* ipClockLoggerRebuff;
234         PVLogger* ipClockLogger;
235         PVLogger* ipDataPathLoggerIn;
236         PVLogger* ipDataPathLoggerOut;
237         PVLogger* ipDataPathLoggerRTCP;
238         PVLogger* ipLogger;
239 };
240 
241 #endif
242