• 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_JITTER_BUFFER_INTERNAL_H_INCLUDED
19 #define PVMF_JITTER_BUFFER_INTERNAL_H_INCLUDED
20 
21 #ifndef PVMF_NODE_UTILS_H_INCLUDED
22 #include "pvmf_node_utils.h"
23 #endif
24 #ifndef OSCL_MEM_MEMPOOL_H_INCLUDED
25 #include "oscl_mem_mempool.h"
26 #endif
27 #ifndef PVMF_MEDIA_DATA_H_INCLUDED
28 #include "pvmf_media_data.h"
29 #endif
30 #ifndef PVMF_JITTER_BUFFER_EXT_INTERFACE_H_INCLUDED
31 #include "pvmf_jitter_buffer_ext_interface.h"
32 #endif
33 
34 /**
35  * Macros for calling PVLogger
36  */
37 #define PVMF_JBNODE_LOGERROR(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipLogger,PVLOGMSG_ERR,m);
38 #define PVMF_JBNODE_LOGWARNING(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipLogger,PVLOGMSG_WARNING,m);
39 #define PVMF_JBNODE_LOGINFOHI(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_HLDBG,ipLogger,PVLOGMSG_INFO,m);
40 #define PVMF_JBNODE_LOGINFOMED(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_MLDBG,ipLogger,PVLOGMSG_INFO,m);
41 #define PVMF_JBNODE_LOGINFOLOW(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_LLDBG,ipLogger,PVLOGMSG_INFO,m);
42 #define PVMF_JBNODE_LOGINFO(m) PVMF_JBNODE_LOGINFOMED(m)
43 #define PVMF_JBNODE_LOGDATATRAFFIC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLogger,PVLOGMSG_INFO,m);
44 #define PVMF_JBNODE_LOGDATATRAFFIC_IN(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLoggerIn,PVLOGMSG_INFO,m);
45 #define PVMF_JBNODE_LOGDATATRAFFIC_IN_E(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLoggerIn,PVLOGMSG_ERR,m);
46 #define PVMF_JBNODE_LOGDATATRAFFIC_OUT(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLoggerOut,PVLOGMSG_INFO,m);
47 #define PVMF_JBNODE_LOGDATATRAFFIC_OUT_E(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLoggerOut,PVLOGMSG_ERR,m);
48 #define PVMF_JBNODE_LOGCLOCK(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipClockLogger,PVLOGMSG_INFO,m);
49 #define PVMF_JBNODE_LOGCLOCK_SESSION_DURATION(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipClockLoggerSessionDuration,PVLOGMSG_INFO,m);
50 #define PVMF_JBNODE_LOGCLOCK_REBUFF(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipClockLoggerRebuff,PVLOGMSG_INFO,m);
51 #define PVMF_JBNODE_LOGDIAGNOSTICS(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_PROF,ipDiagnosticsLogger,PVLOGMSG_INFO,m);
52 #define PVMF_JBNODE_LOGDATATRAFFIC_FLOWCTRL(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLoggerFlowCtrl,PVLOGMSG_INFO,m);
53 #define PVMF_JBNODE_LOGDATATRAFFIC_FLOWCTRL_E(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLoggerFlowCtrl,PVLOGMSG_ERR,m);
54 #define PVMF_JBNODE_LOG_RTCP_DATAPATH(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipDataPathLoggerRTCP,PVLOGMSG_ERR,m);
55 #define PVMF_JBNODE_LOG_EVENTS_CLOCK(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_MLDBG,ipJBEventsClockLogger ,PVLOGMSG_INFO,m);
56 #define PVMF_JBNODE_LOG_RTCP_AVSYNC(m) PVLOGGER_LOGMSG(PVLOGMSG_INST_REL,ipRTCPAVSyncLogger,PVLOGMSG_INFO,m);
57 
58 #define PVMF_JITTER_BUFFER_NEW(auditCB,T,params,ptr)    \
59     {                                                   \
60         ptr = OSCL_NEW(T,params);                       \
61     }
62 
63 #define PVMF_JITTER_BUFFER_DELETE(auditCB,T,ptr)    \
64     {                                               \
65         OSCL_DELETE(ptr);                           \
66     }
67 
68 #define PVMF_JITTER_BUFFER_TEMPLATED_DELETE(auditCB, T, Tsimple, ptr)   \
69     {                                                                   \
70         OSCL_DELETE(ptr);                                               \
71     }
72 
73 //Default vector reserve size
74 #define PVMF_JITTER_BUFFER_VECTOR_RESERVE 10
75 
76 //Starting value for command IDs
77 #define PVMF_JITTER_BUFFER_NODE_COMMAND_ID_START 10000
78 
79 #define PVMF_JITTER_BUFFER_INTERNAL_CMDQ_SIZE 20
80 
81 //Node command type.
82 typedef PVMFGenericNodeCommand<OsclMemAllocator> PVMFJitterBufferNodeCommandBase;
83 
84 class PVMFJitterBufferNodeCommand : public PVMFJitterBufferNodeCommandBase
85 {
86     public:
Construct(PVMFSessionId s,int32 cmd,int32 arg1,int32 arg2,int32 & arg3,const OsclAny * aContext)87         void Construct(PVMFSessionId s,
88                        int32 cmd,
89                        int32 arg1,
90                        int32 arg2,
91                        int32& arg3,
92                        const OsclAny*aContext)
93         {
94             PVMFJitterBufferNodeCommandBase::Construct(s, cmd, aContext);
95             iParam1 = (OsclAny*)arg1;
96             iParam2 = (OsclAny*)arg2;
97             iParam3 = (OsclAny*) & arg3;
98         };
99 
Parse(int32 & arg1,int32 & arg2,int32 * & arg3)100         void Parse(int32&arg1, int32&arg2, int32*&arg3)
101         {
102             arg1 = (int32)iParam1;
103             arg2 = (int32)iParam2;
104             arg3 = (int32*)iParam3;
105         };
106 };
107 
108 //Command queue type
109 typedef PVMFNodeCommandQueue<PVMFJitterBufferNodeCommand, OsclMemAllocator> PVMFJitterBufferNodeCmdQ;
110 
111 typedef struct tagPVMFJBCommandContext
112 {
113     int32 cmd;
114     bool  oFree;
115 } PVMFJBCommandContext;
116 
117 ///////////////////////////////////////////////////////
118 // For Extension Interface implementation
119 ///////////////////////////////////////////////////////
120 
121 //implementation class for extension interface
122 class PVMFJitterBufferNode;
123 
124 class PVMFJitterBufferExtensionInterfaceImpl :
125         public PVInterfaceImpl<OsclMemAllocator>,
126         public PVMFJitterBufferExtensionInterface
127 {
128     public:
129         PVMFJitterBufferExtensionInterfaceImpl(PVMFJitterBufferNode*);
130         ~PVMFJitterBufferExtensionInterfaceImpl();
131 
132         OSCL_IMPORT_REF void setRTCPIntervalInMicroSecs(uint32 aRTCPInterval);
133 
134         OSCL_IMPORT_REF bool setPortParams(PVMFPortInterface* aPort,
135                                            uint32 aTimeScale,
136                                            uint32 aBitRate,
137                                            OsclRefCounterMemFrag& aConfig,
138                                            bool aRateAdaptation = false,
139                                            uint32 aRateAdaptationFeedBackFrequency = 0);
140 
141         OSCL_IMPORT_REF bool setPlayRange(int32 aStartTimeInMS,
142                                           int32 aStopTimeInMS,
143                                           bool oPlayAfterASeek,
144                                           bool aStopTimeAvailable = true);
145 
146         OSCL_IMPORT_REF void setPlayBackThresholdInMilliSeconds(uint32 threshold);
147 
148         OSCL_IMPORT_REF void setJitterBufferRebufferingThresholdInMilliSeconds(uint32 aThreshold);
149         OSCL_IMPORT_REF void getJitterBufferRebufferingThresholdInMilliSeconds(uint32& aThreshold);
150         OSCL_IMPORT_REF void setJitterBufferDurationInMilliSeconds(uint32 duration);
151         OSCL_IMPORT_REF void getJitterBufferDurationInMilliSeconds(uint32& duration);
152 
153         OSCL_IMPORT_REF void setEarlyDecodingTimeInMilliSeconds(uint32 duration);
154         OSCL_IMPORT_REF void setBurstThreshold(float burstThreshold);
155 
156         OSCL_IMPORT_REF void setClientPlayBackClock(PVMFMediaClock* clientClock);
157         OSCL_IMPORT_REF void setMaxInactivityDurationForMediaInMs(uint32 duration);
158         OSCL_IMPORT_REF void getMaxInactivityDurationForMediaInMs(uint32& duration);
159 
160         OSCL_IMPORT_REF bool PrepareForRepositioning(bool oUseExpectedClientClockVal = false,
161                 uint32 aExpectedClientClockVal = 0);
162 
163         OSCL_IMPORT_REF bool setPortSSRC(PVMFPortInterface* aPort, uint32 aSSRC);
164 
165         OSCL_IMPORT_REF bool setPortRTPParams(PVMFPortInterface* aPort,
166                                               bool   aSeqNumBasePresent,
167                                               uint32 aSeqNumBase,
168                                               bool   aRTPTimeBasePresent,
169                                               uint32 aRTPTimeBase,
170                                               bool   aNPTTimeBasePresent,
171                                               uint32 aNPTInMS,
172                                               bool oPlayAfterASeek = false);
173 
174         OSCL_IMPORT_REF bool setPortRTCPParams(PVMFPortInterface* aPort,
175                                                int aNumSenders,
176                                                uint32 aRR,
177                                                uint32 aRS);
178 
179         OSCL_IMPORT_REF PVMFTimestamp getActualMediaDataTSAfterSeek();
180         OSCL_IMPORT_REF PVMFTimestamp getMaxMediaDataTS();
181 
addRef()182         void addRef()
183         {
184             PVInterfaceImpl<OsclMemAllocator>::addRef();
185         }
removeRef()186         void removeRef()
187         {
188             PVInterfaceImpl<OsclMemAllocator>::removeRef();
189         }
queryInterface(const PVUuid & uuid,PVInterface * & iface)190         bool queryInterface(const PVUuid& uuid, PVInterface*& iface)
191         {
192             if (uuid == Uuid())
193             {
194                 addRef();
195                 iface = this;
196                 return true;
197             }
198             else
199             {
200                 iface = NULL;
201                 return false;
202             }
203         }
204 
205         OSCL_IMPORT_REF PVMFStatus setServerInfo(PVMFJitterBufferFireWallPacketInfo& aServerInfo);
206 
207         OSCL_IMPORT_REF PVMFStatus NotifyOutOfBandEOS();
208         OSCL_IMPORT_REF PVMFStatus SendBOSMessage(uint32 aStramID);
209 
210         OSCL_IMPORT_REF void SetSharedBufferResizeParams(uint32 maxNumResizes, uint32 resizeSize);
211         OSCL_IMPORT_REF void GetSharedBufferResizeParams(uint32& maxNumResizes, uint32& resizeSize);
212 
213         OSCL_IMPORT_REF bool ClearJitterBuffer(PVMFPortInterface* aPort, uint32 aSeqNum);
214         OSCL_IMPORT_REF void FlushJitterBuffer();
215 
216         OSCL_IMPORT_REF bool NotifyAutoPauseComplete();
217 
218         OSCL_IMPORT_REF bool NotifyAutoResumeComplete();
219 
220         OSCL_IMPORT_REF PVMFStatus SetInputMediaHeaderPreParsed(PVMFPortInterface* aPort,
221                 bool aHeaderPreParsed);
222 
223         OSCL_IMPORT_REF PVMFStatus HasSessionDurationExpired(bool& aExpired);
224         OSCL_IMPORT_REF bool PurgeElementsWithNPTLessThan(NptTimeFormat &aNPTTime);
225 
226         OSCL_IMPORT_REF void SetBroadCastSession();
227         OSCL_IMPORT_REF void DisableFireWallPackets();
228 
229 
230         OSCL_IMPORT_REF void StartOutputPorts();
231         OSCL_IMPORT_REF void StopOutputPorts();
232         OSCL_IMPORT_REF void UpdateJitterBufferState();
233         OSCL_IMPORT_REF virtual void SetJitterBufferMemPoolInfo(const PvmfPortBaseImpl* aPort, uint32 aSize, uint32 aResizeSize, uint32 aMaxNumResizes, uint32 aExpectedNumberOfBlocksPerBuffer);
234         OSCL_IMPORT_REF virtual void GetJitterBufferMemPoolInfo(const PvmfPortBaseImpl* aPort, uint32& aSize, uint32& aResizeSize, uint32& aMaxNumResizes, uint32& aExpectedNumberOfBlocksPerBuffer) const;
235         OSCL_IMPORT_REF void SetJitterBufferChunkAllocator(OsclMemPoolResizableAllocator* aDataBufferAllocator, const PVMFPortInterface* aPort);
236         OSCL_IMPORT_REF virtual bool PrepareForPlaylistSwitch();
237 
238     private:
239         PVMFJitterBufferNode *iContainer;
240         friend class PVMFJitterBufferNode;
241 };
242 
243 #endif
244