• 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 /**
19  * @file pvmf_jitter_buffer_port.h
20  */
21 #ifndef PVMF_JITTER_BUFFER_PORT_H_INCLUDED
22 #define PVMF_JITTER_BUFFER_PORT_H_INCLUDED
23 
24 #ifndef OSCL_BASE_H_INCLUDED
25 #include "oscl_base.h"
26 #endif
27 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
28 #include "oscl_string_containers.h"
29 #endif
30 #ifndef PVLOGGER_H_INCLUDED
31 #include "pvlogger.h"
32 #endif
33 #ifndef PVMF_PORT_BASE_IMPL_H_INCLUDED
34 #include "pvmf_port_base_impl.h"
35 #endif
36 #ifndef PVMI_CONFIG_AND_CAPABILITY_H_INCLUDED
37 #include "pvmi_config_and_capability.h"
38 #endif
39 #ifndef __MEDIA_CLOCK_CONVERTER_H
40 #include "media_clock_converter.h"
41 #endif
42 #ifndef PVMI_PORT_CONFIG_KVP_H_INCLUDED
43 #include "pvmi_port_config_kvp.h"
44 #endif
45 
46 #define PVMF_JB_PORT_OVERRIDE 1
47 
48 class PVMFJitterBuffer;
49 
50 //Default vector reserve size
51 #define PVMF_JITTER_BUFFER_NODE_PORT_VECTOR_RESERVE 10
52 
53 // Capability mime strings
54 #define PVMF_JITTER_BUFFER_PORT_SPECIFIC_ALLOCATOR          "x-pvmf/pvmfstreaming/socketmemallocator"
55 #define PVMF_JITTER_BUFFER_PORT_SPECIFIC_ALLOCATOR_VALTYPE  "x-pvmf/pvmfstreaming/socketmemallocator;valtype=ksv"
56 
57 /** Enumerated list of port tags supported by this port */
58 typedef enum
59 {
60     PVMF_JITTER_BUFFER_PORT_TYPE_UNKNOWN = -1,
61     PVMF_JITTER_BUFFER_PORT_TYPE_INPUT = 0,
62     PVMF_JITTER_BUFFER_PORT_TYPE_OUTPUT = 1,
63     //Feedback Port: Only used in case of RTSP based streaming to send feedback
64     //reports (RTCP reports) for the RTP session going on at the input port
65     PVMF_JITTER_BUFFER_PORT_TYPE_FEEDBACK = 2
66 } PVMFJitterBufferNodePortTag;
67 
68 class PVMFJitterBufferNode;
69 class PVMFJitterBufferPort;
70 class PVMFJitterBufferPortParams
71 {
72     public:
ResetParams()73         void ResetParams()
74         {
75             iJitterBufferEmpty = false;
76             iProcessIncomingMessages = true;
77             iProcessOutgoingMessages = true;
78             iMonitorForRemoteActivity = true;
79         };
80 
PVMFJitterBufferPortParams(PVMFJitterBufferPort & aPort)81         PVMFJitterBufferPortParams(PVMFJitterBufferPort& aPort): irPort(aPort)
82         {
83             iId = -1;
84             iTag = PVMF_JITTER_BUFFER_PORT_TYPE_UNKNOWN;
85 
86             ipJitterBuffer = NULL;              //Only Input ports will have the jitter buffer associated with them
87             iTimeScale = 0;
88             iBitrate = 0;
89             iLastMsgTimeStamp = 0;
90             iNumMediaMsgsRecvd = 0;
91             iNumMediaMsgsSent = 0;
92             iJitterBufferEmpty = true;
93             iProcessIncomingMessages = true;
94             iProcessOutgoingMessages = true;
95             iCanReceivePktFromJB = false;
96             iMonitorForRemoteActivity = false;
97         }
98 
99         int32                       iId;
100         PVMFJitterBufferNodePortTag iTag;
101         PVMFJitterBufferPort&       irPort;
102         PVMFJitterBuffer*           ipJitterBuffer;             //Only Input ports will have the jitter buffer associated with them
103         uint32                      iTimeScale;
104         uint32                      iBitrate;
105         MediaClockConverter         iMediaClockConverter;
106         PVMFTimestamp               iLastMsgTimeStamp;
107         uint32                      iNumMediaMsgsRecvd;
108         uint32                      iNumMediaMsgsSent;
109         bool                        iJitterBufferEmpty;
110         bool                        iProcessIncomingMessages;
111         bool                        iProcessOutgoingMessages;
112         bool                        iCanReceivePktFromJB;
113         bool                        iMonitorForRemoteActivity;
114         OSCL_HeapString<OsclMemAllocator> iMimeType;
115 };
116 
117 /**
118  * Input (sink) ports have a simple flow control scheme.
119  * Ports report "busy" when their queue is full, then when the
120  * queue goes to half-empty they issue a "get data" to the connected
121  * port.  The media message in the "get data" is empty and is
122  * meant to be discarded.
123  * Output (source) ports assume the connected port uses the
124  * same flow-control scheme.
125  */
126 class PVMFJitterBufferPort : public PvmfPortBaseImpl,
127         public PvmiCapabilityAndConfig
128 {
129     public:
130         /**
131          * Default constructor. Default settings will be used for the data queues.
132          * @param aId ID assigned to this port
133          * @param aTag Port tag
134          * @param aNode Container node
135          */
136         PVMFJitterBufferPort(int32 aTag, PVMFJitterBufferNode& aNode, const char*);
137 
138         /**
139          * Constructor that allows the node to configure the data queues of this port.
140          * @param aTag Port tag
141          * @param aNode Container node
142          * @param aSize Data queue capacity. The data queue size will not grow beyond this capacity.
143          * @param aReserve Size of data queue for which memory is reserved. This must be
144          * less than or equal to the capacity. If this is less than capacity, memory will be
145          * allocated when the queue grows beyond the reserve size, but will stop growing at
146          * capacity.
147          * @param aThreshold Ready-to-receive threshold, in terms of percentage of the data queue capacity.
148          * This value should be between 0 - 100.
149          */
150         PVMFJitterBufferPort(int32 aTag,
151                              PVMFJitterBufferNode& aNode,
152                              uint32 aInCapacity,
153                              uint32 aInReserve,
154                              uint32 aInThreshold,
155                              uint32 aOutCapacity,
156                              uint32 aOutReserve,
157                              uint32 aOutThreshold, const char*);
158 
159         /** Destructor */
160         ~PVMFJitterBufferPort();
161 
162         /* Over ride Connect() */
163         PVMFStatus Connect(PVMFPortInterface* aPort);
164 
165         /* Over ride QueryInterface - this port supports config interface */
QueryInterface(const PVUuid & aUuid,OsclAny * & aPtr)166         void QueryInterface(const PVUuid &aUuid, OsclAny*&aPtr)
167         {
168             if (aUuid == PVMI_CAPABILITY_AND_CONFIG_PVUUID)
169                 aPtr = (PvmiCapabilityAndConfig*)this;
170             else
171                 aPtr = NULL;
172         }
173 
174         // Implement pure virtuals from PvmiCapabilityAndConfig interface
175         PVMFStatus getParametersSync(PvmiMIOSession aSession, PvmiKeyType aIdentifier,
176                                      PvmiKvp*& aParameters, int& num_parameter_elements,    PvmiCapabilityContext aContext);
177         PVMFStatus releaseParameters(PvmiMIOSession aSession, PvmiKvp* aParameters, int num_elements);
178         void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters,
179                                int num_elements, PvmiKvp * & aRet_kvp);
180         PVMFStatus verifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int num_elements);
181 
182         // Unsupported PvmiCapabilityAndConfig methods
setObserver(PvmiConfigAndCapabilityCmdObserver * aObserver)183         void setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver)
184         {
185             OSCL_UNUSED_ARG(aObserver);
186         };
createContext(PvmiMIOSession aSession,PvmiCapabilityContext & aContext)187         void createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext)
188         {
189             OSCL_UNUSED_ARG(aSession);
190             OSCL_UNUSED_ARG(aContext);
191         };
setContextParameters(PvmiMIOSession aSession,PvmiCapabilityContext & aContext,PvmiKvp * aParameters,int num_parameter_elements)192         void setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext,
193                                   PvmiKvp* aParameters, int num_parameter_elements)
194         {
195             OSCL_UNUSED_ARG(aSession);
196             OSCL_UNUSED_ARG(aContext);
197             OSCL_UNUSED_ARG(aParameters);
198             OSCL_UNUSED_ARG(num_parameter_elements);
199         };
DeleteContext(PvmiMIOSession aSession,PvmiCapabilityContext & aContext)200         void DeleteContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext)
201         {
202             OSCL_UNUSED_ARG(aSession);
203             OSCL_UNUSED_ARG(aContext);
204         };
205         PVMFCommandId setParametersAsync(PvmiMIOSession aSession, PvmiKvp* aParameters,
206                                          int num_elements, PvmiKvp*& aRet_kvp, OsclAny* context = NULL)
207         {
208             OSCL_UNUSED_ARG(aSession);
209             OSCL_UNUSED_ARG(aParameters);
210             OSCL_UNUSED_ARG(num_elements);
211             OSCL_UNUSED_ARG(aRet_kvp);
212             OSCL_UNUSED_ARG(context);
213             return -1;
214         }
getCapabilityMetric(PvmiMIOSession aSession)215         uint32 getCapabilityMetric(PvmiMIOSession aSession)
216         {
217             OSCL_UNUSED_ARG(aSession);
218             return 0;
219         }
220 
221 
222 
GetPortParams()223         PVMFJitterBufferPortParams* GetPortParams()
224         {
225             return iPortParams;
226         }
227         //overrides from PVMFPortInterface
228         PVMFStatus QueueOutgoingMsg(PVMFSharedMediaMsgPtr aMsg);
229         bool IsOutgoingQueueBusy();
230     private:
231         void Construct();
232 
233         PVMFFormatType                      iFormat;
234         PVMFJitterBufferNodePortTag         iPortType;
235         PVMFJitterBufferPortParams*         iPortParams;
236         // Corresponding port paired with current port
237         PVMFJitterBufferPort*               iPortCounterpart;
238         // Parameters of port paired with current port
239         PVMFJitterBufferPortParams*         iCounterpartPortParams;
240 
241         PVMFJitterBufferNode&               irJitterBufferNode;
242         PVLogger*                           ipLogger;
243 
244         friend class PVMFJitterBufferNode;
245         friend class PVMFJitterBufferExtensionInterfaceImpl;
246 };
247 
248 #endif // PVMF_JITTER_BUFFER_PORT_H_INCLUDED
249