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 pvmfprotocolenginenode_extension.h 20 * @brief Extension interface for PVMFProtocolEngineNode 21 */ 22 23 #ifndef PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED 24 #define PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED 25 26 #ifndef OSCL_BASE_H_INCLUDED 27 #include "oscl_base.h" 28 #endif 29 #ifndef PV_INTERFACE_H 30 #include "pv_interface.h" 31 #endif 32 #ifndef PV_UUID_H_INCLUDED 33 #include "pv_uuid.h" 34 #endif 35 #ifndef OSCL_VECTOR_H_INCLUDED 36 #include "oscl_vector.h" 37 #endif 38 #ifndef OSCL_REFCOUNTER_MEMFRAG_H_INCLUDED 39 #include "oscl_refcounter_memfrag.h" 40 #endif 41 #ifndef OSCL_STRING_CONSTAINERS_H_INCLUDED 42 #include "oscl_string_containers.h" 43 #endif 44 #ifndef PVMF_EVENT_HANDLING_H_INCLUDED 45 #include "pvmf_event_handling.h" 46 #endif 47 #ifndef PVMF_PORT_INTERFACE_H_INCLUDED 48 #include "pvmf_port_interface.h" 49 #endif 50 51 // default number of redirect trials 52 #define PVPROTOCOLENGINE_DEFAULT_NUMBER_OF_REDIRECT_TRIALS 10 53 #define PVPROTOCOLENGINE_DEFAULT_MAXIMUM_ASF_HEADER_SIZE 262144 // 256K 54 55 56 57 #define PVMF_PROTOCOL_ENGINE_GENERIC_EXTENSION_MIMETYPE "pvxxx/PVMFProtocolEngineNode/GenericExtensionInterface" 58 #define KPVMFProtocolEngineNodeExtensionUuid PVUuid(0xca27cb64,0x83ed,0x40d6,0x96,0xa3,0xed,0x1d,0x8b,0x60,0x11,0x38) 59 60 enum HttpVersion 61 { 62 HTTP_V10 = 0, // Http version 1.0 63 HTTP_V11 // Http version 1.1 64 }; 65 66 enum HttpMethod 67 { 68 HTTP_GET = 0, 69 HTTP_POST, 70 HTTP_HEAD, 71 HTTP_ALLMETHOD 72 }; 73 74 enum DownloadProgressMode 75 { 76 DownloadProgressMode_TimeBased = 0, 77 DownloadProgressMode_ByteBased 78 }; 79 80 /** 81 * PVMFProtocolEngineNodeExtensionInterface allows a client to do exercise extended functions 82 * of a PVMFProtocolEngineNode 83 */ 84 class PVMFProtocolEngineNodeExtensionInterface : public PVInterface 85 { 86 public: 87 88 /** 89 * Retrieves the HTTP header. The memory persists until node gets destroyed or reset 90 * 91 * @param aHeader pointer to header data. 92 * @param aHeaderLen length of header data. 93 * @return true if config info is provided, else false. 94 */ 95 virtual PVMFStatus GetHTTPHeader(uint8*& aHeader, uint32& aHeaderLen) = 0; 96 97 /** 98 * Retrieves the file size. The file size is retrieved from http header 99 * But server might not announce the file size info. In this case, file size 100 * is not available, and set to zero. 101 * @param aFileSize returned download file size. 102 */ 103 virtual void GetFileSize(uint32& aFileSize) = 0; 104 105 /** 106 * Retrieves the host name and port number for socket node port request 107 * set up by download manager node 108 * 109 * @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvserveroha.pv.com;remote_port=554" 110 * @return true if config info is provided, else false. 111 * Note that this extension interface must be called AFTER data source 112 * initialization interface (url is provided) gets called, otherwise it would fail 113 */ 114 virtual bool GetSocketConfig(OSCL_String &aPortConfig) = 0; 115 116 /** 117 * Set the user agent field for a http request. Basically there are two modes, by default, 118 * the new user agent field will be attached to the default user agent field (PVPlayer 4.0(Beta Release)). 119 * Another one is the new user agent will replace our default one 120 * 121 * @param aUserAgent wide-character string of user agent 122 * @param aOverwritable, flag to show whether the input user agent will replace or append the default one 123 * aOverwritable=true => replace 124 * @return true if user agent is set successfully, else false. 125 */ 126 virtual bool SetUserAgent(OSCL_wString &aUserAgent, const bool isOverwritable = true) = 0; 127 128 /** 129 * Set the http version number (HTTP/1.0 or HTTP/1.1) for a http request. 130 * @param aHttpVersion, a http version. The version is defined as an enum (see above) 131 */ 132 virtual void SetHttpVersion(const uint32 aHttpVersion = HTTP_V11) = 0; 133 134 /** 135 * Set the NetworkTimeout for a http request/response. The unit of NetworkTimeout value is SECOND 136 * @param aTimeout, timeout value in SECONDS 137 */ 138 virtual void SetNetworkTimeout(const uint32 aTimeout) = 0; 139 140 /** 141 * Set the number of trials for redirect to avoid rediret looping. If the actual number redirect trials exceeds 142 * the specified number, then there will be an error out. 143 * @param aNumTrials, specified number of redirect trials 144 */ 145 virtual void SetNumRedirectTrials(const uint32 aNumTrials) = 0; 146 147 /** 148 * Set the http extension header field. Three inputs, field key & field value plus method (field belongs to which HTTP method), 149 * are needed for composing like "key: value" 150 * @param aFieldKey, extension field key 151 * @param aFieldValue, extension field value 152 * @param aMethod, HTTP method, GET, POST or both 153 * @param aPurgeOnRedirect - boolean indicating whether this header is carried over across redirects 154 */ 155 virtual void SetHttpExtensionHeaderField(OSCL_String &aFieldKey, 156 OSCL_String &aFieldValue, 157 const HttpMethod aMethod = HTTP_GET, 158 const bool aPurgeOnRedirect = false) = 0; 159 160 /** 161 * Set the download progress mode, i.e. the download percentage is time-based or byte-based 162 * @param aMode, specified download progress mode 163 */ 164 virtual void SetDownloadProgressMode(const DownloadProgressMode aMode = DownloadProgressMode_TimeBased) = 0; 165 166 /** 167 * Disable HTTP HEAD request 168 * @param aDisableHeadRequest, flag to disabling sending HTTP HEAD request 169 */ 170 virtual void DisableHttpHeadRequest(const bool aDisableHeadRequest = true) = 0; 171 172 }; 173 174 #define PVMF_PROTOCOL_ENGINE_MSHTTP_STREAMING_EXTENSION_MIMETYPE "pvxxx/PVMFProtocolEngineNod/MSHTTPStreamingExtensionInterface" 175 #define KPVMFProtocolEngineNodeMSHTTPStreamingExtensionUuid PVUuid(0xe3fb7c31,0x9fb4,0x4263,0x8f,0x1f,0xa0,0xbc,0x77,0x86,0x10,0xea) 176 177 class PVMFProtocolEngineNodeMSHTTPStreamingParams 178 { 179 public: PVMFProtocolEngineNodeMSHTTPStreamingParams()180 PVMFProtocolEngineNodeMSHTTPStreamingParams() 181 { 182 reset(); 183 }; 184 ~PVMFProtocolEngineNodeMSHTTPStreamingParams()185 ~PVMFProtocolEngineNodeMSHTTPStreamingParams() 186 { 187 reset(); 188 }; 189 190 // reset to default values reset()191 void reset() 192 { 193 iStreamRate = 1; 194 iStreamByteOffset = 0xFFFFFFFF; 195 iStreamStartPacketNumber = 0xFFFFFFFF; 196 iStreamStartTimeInMS = 0; 197 iMaxStreamDurationInMS = 0x800188A3; 198 iPacketGrouping = 0; 199 iNumStreams = 1; 200 iPlayBackMode = 1; 201 iStreamIDList.clear(); 202 iStreamPlayBackModeList.clear(); 203 } 204 205 // copy constructor PVMFProtocolEngineNodeMSHTTPStreamingParams(const PVMFProtocolEngineNodeMSHTTPStreamingParams & x)206 PVMFProtocolEngineNodeMSHTTPStreamingParams(const PVMFProtocolEngineNodeMSHTTPStreamingParams &x) 207 { 208 iStreamRate = x.iStreamRate; 209 iStreamByteOffset = x.iStreamByteOffset; 210 iStreamStartTimeInMS = x.iStreamStartTimeInMS; 211 iMaxStreamDurationInMS = x.iMaxStreamDurationInMS; 212 iStreamStartPacketNumber = x.iStreamStartPacketNumber; 213 iPacketGrouping = x.iPacketGrouping; 214 iNumStreams = x.iNumStreams; 215 iPlayBackMode = x.iPlayBackMode; 216 iStreamIDList = x.iStreamIDList; 217 iStreamPlayBackModeList = x.iStreamPlayBackModeList; 218 } 219 220 // assignment operator 221 PVMFProtocolEngineNodeMSHTTPStreamingParams& operator=(const PVMFProtocolEngineNodeMSHTTPStreamingParams& x) 222 { 223 iStreamRate = x.iStreamRate; 224 iStreamByteOffset = x.iStreamByteOffset; 225 iStreamStartTimeInMS = x.iStreamStartTimeInMS; 226 iMaxStreamDurationInMS = x.iMaxStreamDurationInMS; 227 iStreamStartPacketNumber = x.iStreamStartPacketNumber; 228 iPacketGrouping = x.iPacketGrouping; 229 iNumStreams = x.iNumStreams; 230 iPlayBackMode = x.iPlayBackMode; 231 iStreamIDList = x.iStreamIDList; 232 iStreamPlayBackModeList = x.iStreamPlayBackModeList; 233 return *this; 234 } 235 236 uint32 iPlayBackMode; 237 uint32 iStreamRate; 238 uint32 iStreamByteOffset; 239 uint32 iStreamStartTimeInMS; 240 uint32 iMaxStreamDurationInMS; 241 uint32 iStreamStartPacketNumber; 242 uint32 iPacketGrouping; 243 uint32 iNumStreams; 244 Oscl_Vector<uint32, OsclMemAllocator> iStreamIDList; 245 Oscl_Vector<uint32, OsclMemAllocator> iStreamPlayBackModeList; 246 }; 247 248 /** 249 * PVMFProtocolEngineNodeMSHTTPStreamingExtensionInterface allows a client to exercise 250 * MS HTTP Streaming extended functions of a PVMFProtocolEngineNode 251 */ 252 class PVMFProtocolEngineNodeMSHTTPStreamingExtensionInterface : public PVInterface 253 { 254 public: 255 256 /** 257 * Retrieves the ASF header. The ASF header can be retrieved in fragments 258 * 259 * @param aHeader a vector of fragments 260 * @param aHeaderLen length of header data. 261 * @return true if the asf header is provided, else false. 262 */ 263 virtual bool GetASFHeader(Oscl_Vector<OsclRefCounterMemFrag, OsclMemAllocator> &aHeader) = 0; 264 265 /** 266 * Sets ASF streaming params, viz rate, start time, start packet num etc 267 * Used by HTTP PE Node to compose GET request 268 * 269 * @param aParams class containing all the params 270 * @return true if params are accepted by PE Node, else false. 271 */ 272 virtual bool SetStreamParams(const PVMFProtocolEngineNodeMSHTTPStreamingParams &aParams) = 0; 273 274 /** 275 * Retrieves the host name and port number for socket node port request 276 * set up by streaming manager node 277 * 278 * @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvserveroha.pv.com;remote_port=554" 279 * @return true if config info is provided, else false. 280 * Note that this extension interface must be called AFTER data source 281 * initialization interface (url is provided) gets called, otherwise it would fail 282 */ 283 virtual bool GetSocketConfig(OSCL_String &aPortConfig) = 0; 284 285 /** 286 * Retrieves the host name and port number for socket node port request, based on logging URL 287 * set up by streaming manager node 288 * 289 * @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvserveroha.pv.com;remote_port=554" 290 * @return true if config info is provided, else false. 291 * Note that this extension interface must be called AFTER data source 292 * initialization interface (url is provided) gets called, otherwise it would fail 293 */ 294 virtual bool GetSocketConfigForLogging(OSCL_String &aPortConfig) = 0; 295 296 /** 297 * Sends a Seek request to the server (HTTP GET) and returns seq number of 298 * first data packet after seek. The API is asynchronous 299 * 300 * @param aNPTInMS Seek NPT in milliseconds . 301 * @param aFirstSeqNumAfterSeek 302 * @param aContext - Opaque data provided by caller, to be returned as part of 303 * command completion. 304 * @return PVMFCommandId 305 */ 306 virtual PVMFCommandId Seek(PVMFSessionId aSessionId, 307 uint64 aNPTInMS, 308 uint32& aFirstSeqNumAfterSeek, 309 OsclAny* aContext) = 0; 310 311 /** 312 * Sends a BitstreamSwitch request to the PE node and PE node will send a seek request 313 * (HTTP GET) and returns seq number of first data packet after seek. The API is asynchronous 314 * 315 * @param aNPTInMS Seek NPT in milliseconds . 316 * @param aFirstSeqNumAfterSwitch 317 * @param aContext - Opaque data provided by caller, to be returned as part of 318 * command completion. 319 * @return PVMFCommandId 320 */ 321 virtual PVMFCommandId BitstreamSwitch(PVMFSessionId aSessionId, 322 uint64 aNPTInMS, 323 uint32& aFirstSeqNumAfterSwitch, 324 OsclAny* aContext) = 0; 325 /** 326 * Sets the size of the mem pool interms of number of memory buffers 327 * for the media msg allocator associated with the port. 328 * 329 * @param aPort Port pointer . 330 * @param aNumBuffersInAllocator - Number of buffers in allocator 331 * @return PVMFStatus - PVMFSuccess or PVMFFailure 332 */ 333 virtual PVMFStatus SetMediaMsgAllocatorNumBuffers(PVMFPortInterface* aPort, 334 uint32 aNumBuffersInAllocator) = 0; 335 336 /** 337 * Set the user agent field for a http request. Basically there are two modes, by default, 338 * the new user agent field will be attached to the default user agent field (PVPlayer 4.0(Beta Release)). 339 * Another one is the new user agent will replace our default one 340 * 341 * @param aUserAgent wide-character string of user agent 342 * @param aOverwritable, flag to show whether the input user agent will replace or append the default one 343 * aOverwritable=true => replace 344 * @return true if user agent is set successfully, else false. 345 */ 346 virtual bool SetUserAgent(OSCL_wString &aUserAgent, const bool isOverwritable = true) = 0; 347 348 /** 349 * Set the NetworkTimeout for a http request/response. The unit of NetworkTimeout value is SECOND 350 * @param aTimeout, timeout value in SECONDS 351 */ 352 virtual void SetNetworkTimeout(const uint32 aTimeout) = 0; 353 354 /** 355 * Set the NetworkLoggingTimeout for MS streaming Logging POST request/response at stop or EOS. The unit of NetworkLoggingTimeout value is SECOND 356 * @param aTimeout, timeout value in SECONDS 357 */ 358 virtual void SetNetworkLoggingTimeout(const uint32 aTimeout) = 0; 359 360 /** 361 * Set the timeout value for Keep-Alive message. The unit of KeepAliveTimeout value is SECOND 362 * @param aTimeout, timeout value in SECONDS 363 */ 364 virtual void SetKeepAliveTimeout(const uint32 aTimeout) = 0; 365 366 /** 367 * Set the number of trials for redirect to avoid rediret looping. If the actual number redirect trials exceeds 368 * the specified number, then there will be an error out. 369 * @param aNumTrials, specified number of redirect trials 370 */ 371 virtual void SetNumRedirectTrials(const uint32 aNumTrials) = 0; 372 373 /** 374 * Set the http extension header field. Three inputs, field key & field value plus method (field belongs to which HTTP method), 375 * are needed for composing like "key: value" 376 * @param aFieldKey, extension field key 377 * @param aFieldValue, extension field value 378 * @param aMethod, HTTP method, GET, POST or both 379 * @param aPurgeOnRedirect - boolean indicating whether this header is carried over across redirects 380 */ 381 virtual void SetHttpExtensionHeaderField(OSCL_String &aFieldKey, 382 OSCL_String &aFieldValue, 383 const HttpMethod aMethod = HTTP_GET, 384 const bool aPurgeOnRedirect = false) = 0; 385 386 /** 387 * Set the logging URL 388 * @param aSourceURL, a different URL for logging statistics 389 */ 390 virtual void SetLoggingURL(OSCL_wString& aSourceURL) = 0; 391 392 /** 393 * Set the proxy URL and the port 394 * @param aProxyURL, a proxy URL for streaming 395 * @param aProxyPort, proxy number 396 * @return true if proxy is set successfully, else false. 397 */ 398 virtual bool SetStreamingProxy(OSCL_wString& aProxyURL, const uint32 aProxyPort) = 0; 399 400 /** 401 * Set the maximum ASF header size 402 * @param aMaxASFHeaderSize, upper limit for ASF header supported 403 */ 404 virtual void SetMaxASFHeaderSize(const uint32 aMaxASFHeaderSize = PVPROTOCOLENGINE_DEFAULT_MAXIMUM_ASF_HEADER_SIZE) = 0; 405 406 /** 407 * Set user authentication information, such as userID and password 408 * @param aUserID, user id 409 * @param aPasswd, password 410 * @param aMaxASFHeaderSize, upper limit for ASF header supported 411 */ 412 virtual void SetUserAuthInfo(OSCL_String &aUserID, OSCL_String &aPasswd) = 0; 413 414 /** 415 * Check the WM server 4.1 or not 416 * @return true if the streaming server is wms4.1 else false. 417 */ 418 virtual bool IsWMServerVersion4() = 0; 419 420 /** 421 * Set the accel bitrate for fast cache. 422 * @param aAccelBitrate, specified accel bitrate 423 */ 424 virtual void SetAccelBitrate(const uint32 aAccelBitrate) = 0; 425 426 /** 427 * Set the accel duration for fast cache. 428 * @param aAccelDuration, specified accel duration 429 */ 430 virtual void SetAccelDuration(const uint32 aAccelDuration) = 0; 431 432 /** 433 * Set number of buffers to be allocated for media data pool 434 * @param aVal, the number calculated by SM node 435 * @return void 436 */ 437 virtual void SetNumBuffersInMediaDataPoolSMCalc(uint32 aVal) = 0; 438 439 /** 440 * Set the max http stremaing size. 441 * @param aMaxHttpStreamingSize 442 */ 443 virtual void SetMaxHttpStreamingSize(const uint32 aMaxHttpStreamingSize) = 0; 444 445 }; 446 447 #endif // PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED 448 449 450