blob: f5156a5f7b751fdb134e5f73dd8fe74d677f0cc5 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
/**
* @file pvmfprotocolenginenode_extension.h
* @brief Extension interface for PVMFProtocolEngineNode
*/
#ifndef PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED
#define PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef PV_INTERFACE_H
#include "pv_interface.h"
#endif
#ifndef PV_UUID_H_INCLUDED
#include "pv_uuid.h"
#endif
#ifndef OSCL_VECTOR_H_INCLUDED
#include "oscl_vector.h"
#endif
#ifndef OSCL_REFCOUNTER_MEMFRAG_H_INCLUDED
#include "oscl_refcounter_memfrag.h"
#endif
#ifndef OSCL_STRING_CONSTAINERS_H_INCLUDED
#include "oscl_string_containers.h"
#endif
#ifndef PVMF_EVENT_HANDLING_H_INCLUDED
#include "pvmf_event_handling.h"
#endif
#ifndef PVMF_PORT_INTERFACE_H_INCLUDED
#include "pvmf_port_interface.h"
#endif
// default number of redirect trials
#define PVPROTOCOLENGINE_DEFAULT_NUMBER_OF_REDIRECT_TRIALS 10
#define PVPROTOCOLENGINE_DEFAULT_MAXIMUM_ASF_HEADER_SIZE 262144 // 256K
#define PVMF_PROTOCOL_ENGINE_GENERIC_EXTENSION_MIMETYPE "pvxxx/PVMFProtocolEngineNode/GenericExtensionInterface"
#define KPVMFProtocolEngineNodeExtensionUuid PVUuid(0xca27cb64,0x83ed,0x40d6,0x96,0xa3,0xed,0x1d,0x8b,0x60,0x11,0x38)
enum HttpVersion
{
HTTP_V10 = 0, // Http version 1.0
HTTP_V11 // Http version 1.1
};
enum HttpMethod
{
HTTP_GET = 0,
HTTP_POST,
HTTP_HEAD,
HTTP_ALLMETHOD
};
enum DownloadProgressMode
{
DownloadProgressMode_TimeBased = 0,
DownloadProgressMode_ByteBased
};
/**
* PVMFProtocolEngineNodeExtensionInterface allows a client to do exercise extended functions
* of a PVMFProtocolEngineNode
*/
class PVMFProtocolEngineNodeExtensionInterface : public PVInterface
{
public:
/**
* Retrieves the HTTP header. The memory persists until node gets destroyed or reset
*
* @param aHeader pointer to header data.
* @param aHeaderLen length of header data.
* @return true if config info is provided, else false.
*/
virtual PVMFStatus GetHTTPHeader(uint8*& aHeader, uint32& aHeaderLen) = 0;
/**
* Retrieves the file size. The file size is retrieved from http header
* But server might not announce the file size info. In this case, file size
* is not available, and set to zero.
* @param aFileSize returned download file size.
*/
virtual void GetFileSize(uint32& aFileSize) = 0;
/**
* Retrieves the host name and port number for socket node port request
* set up by download manager node
*
* @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvserveroha.pv.com;remote_port=554"
* @return true if config info is provided, else false.
* Note that this extension interface must be called AFTER data source
* initialization interface (url is provided) gets called, otherwise it would fail
*/
virtual bool GetSocketConfig(OSCL_String &aPortConfig) = 0;
/**
* Set the user agent field for a http request. Basically there are two modes, by default,
* the new user agent field will be attached to the default user agent field (PVPlayer 4.0(Beta Release)).
* Another one is the new user agent will replace our default one
*
* @param aUserAgent wide-character string of user agent
* @param aOverwritable, flag to show whether the input user agent will replace or append the default one
* aOverwritable=true => replace
* @return true if user agent is set successfully, else false.
*/
virtual bool SetUserAgent(OSCL_wString &aUserAgent, const bool isOverwritable = true) = 0;
/**
* Set the http version number (HTTP/1.0 or HTTP/1.1) for a http request.
* @param aHttpVersion, a http version. The version is defined as an enum (see above)
*/
virtual void SetHttpVersion(const uint32 aHttpVersion = HTTP_V11) = 0;
/**
* Set the NetworkTimeout for a http request/response. The unit of NetworkTimeout value is SECOND
* @param aTimeout, timeout value in SECONDS
*/
virtual void SetNetworkTimeout(const uint32 aTimeout) = 0;
/**
* Set the number of trials for redirect to avoid rediret looping. If the actual number redirect trials exceeds
* the specified number, then there will be an error out.
* @param aNumTrials, specified number of redirect trials
*/
virtual void SetNumRedirectTrials(const uint32 aNumTrials) = 0;
/**
* Set the http extension header field. Three inputs, field key & field value plus method (field belongs to which HTTP method),
* are needed for composing like "key: value"
* @param aFieldKey, extension field key
* @param aFieldValue, extension field value
* @param aMethod, HTTP method, GET, POST or both
* @param aPurgeOnRedirect - boolean indicating whether this header is carried over across redirects
*/
virtual void SetHttpExtensionHeaderField(OSCL_String &aFieldKey,
OSCL_String &aFieldValue,
const HttpMethod aMethod = HTTP_GET,
const bool aPurgeOnRedirect = false) = 0;
/**
* Set the download progress mode, i.e. the download percentage is time-based or byte-based
* @param aMode, specified download progress mode
*/
virtual void SetDownloadProgressMode(const DownloadProgressMode aMode = DownloadProgressMode_TimeBased) = 0;
/**
* Disable HTTP HEAD request
* @param aDisableHeadRequest, flag to disabling sending HTTP HEAD request
*/
virtual void DisableHttpHeadRequest(const bool aDisableHeadRequest = true) = 0;
};
#define PVMF_PROTOCOL_ENGINE_MSHTTP_STREAMING_EXTENSION_MIMETYPE "pvxxx/PVMFProtocolEngineNod/MSHTTPStreamingExtensionInterface"
#define KPVMFProtocolEngineNodeMSHTTPStreamingExtensionUuid PVUuid(0xe3fb7c31,0x9fb4,0x4263,0x8f,0x1f,0xa0,0xbc,0x77,0x86,0x10,0xea)
class PVMFProtocolEngineNodeMSHTTPStreamingParams
{
public:
PVMFProtocolEngineNodeMSHTTPStreamingParams()
{
reset();
};
~PVMFProtocolEngineNodeMSHTTPStreamingParams()
{
reset();
};
// reset to default values
void reset()
{
iStreamRate = 1;
iStreamByteOffset = 0xFFFFFFFF;
iStreamStartPacketNumber = 0xFFFFFFFF;
iStreamStartTimeInMS = 0;
iMaxStreamDurationInMS = 0x800188A3;
iPacketGrouping = 0;
iNumStreams = 1;
iPlayBackMode = 1;
iStreamIDList.clear();
iStreamPlayBackModeList.clear();
}
// copy constructor
PVMFProtocolEngineNodeMSHTTPStreamingParams(const PVMFProtocolEngineNodeMSHTTPStreamingParams &x)
{
iStreamRate = x.iStreamRate;
iStreamByteOffset = x.iStreamByteOffset;
iStreamStartTimeInMS = x.iStreamStartTimeInMS;
iMaxStreamDurationInMS = x.iMaxStreamDurationInMS;
iStreamStartPacketNumber = x.iStreamStartPacketNumber;
iPacketGrouping = x.iPacketGrouping;
iNumStreams = x.iNumStreams;
iPlayBackMode = x.iPlayBackMode;
iStreamIDList = x.iStreamIDList;
iStreamPlayBackModeList = x.iStreamPlayBackModeList;
}
// assignment operator
PVMFProtocolEngineNodeMSHTTPStreamingParams& operator=(const PVMFProtocolEngineNodeMSHTTPStreamingParams& x)
{
iStreamRate = x.iStreamRate;
iStreamByteOffset = x.iStreamByteOffset;
iStreamStartTimeInMS = x.iStreamStartTimeInMS;
iMaxStreamDurationInMS = x.iMaxStreamDurationInMS;
iStreamStartPacketNumber = x.iStreamStartPacketNumber;
iPacketGrouping = x.iPacketGrouping;
iNumStreams = x.iNumStreams;
iPlayBackMode = x.iPlayBackMode;
iStreamIDList = x.iStreamIDList;
iStreamPlayBackModeList = x.iStreamPlayBackModeList;
return *this;
}
uint32 iPlayBackMode;
uint32 iStreamRate;
uint32 iStreamByteOffset;
uint32 iStreamStartTimeInMS;
uint32 iMaxStreamDurationInMS;
uint32 iStreamStartPacketNumber;
uint32 iPacketGrouping;
uint32 iNumStreams;
Oscl_Vector<uint32, OsclMemAllocator> iStreamIDList;
Oscl_Vector<uint32, OsclMemAllocator> iStreamPlayBackModeList;
};
/**
* PVMFProtocolEngineNodeMSHTTPStreamingExtensionInterface allows a client to exercise
* MS HTTP Streaming extended functions of a PVMFProtocolEngineNode
*/
class PVMFProtocolEngineNodeMSHTTPStreamingExtensionInterface : public PVInterface
{
public:
/**
* Retrieves the ASF header. The ASF header can be retrieved in fragments
*
* @param aHeader a vector of fragments
* @param aHeaderLen length of header data.
* @return true if the asf header is provided, else false.
*/
virtual bool GetASFHeader(Oscl_Vector<OsclRefCounterMemFrag, OsclMemAllocator> &aHeader) = 0;
/**
* Sets ASF streaming params, viz rate, start time, start packet num etc
* Used by HTTP PE Node to compose GET request
*
* @param aParams class containing all the params
* @return true if params are accepted by PE Node, else false.
*/
virtual bool SetStreamParams(const PVMFProtocolEngineNodeMSHTTPStreamingParams &aParams) = 0;
/**
* Retrieves the host name and port number for socket node port request
* set up by streaming manager node
*
* @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvserveroha.pv.com;remote_port=554"
* @return true if config info is provided, else false.
* Note that this extension interface must be called AFTER data source
* initialization interface (url is provided) gets called, otherwise it would fail
*/
virtual bool GetSocketConfig(OSCL_String &aPortConfig) = 0;
/**
* Retrieves the host name and port number for socket node port request, based on logging URL
* set up by streaming manager node
*
* @param aPortConfig string of IP/DNS address + port number, like "TCP/remote_address=pvserveroha.pv.com;remote_port=554"
* @return true if config info is provided, else false.
* Note that this extension interface must be called AFTER data source
* initialization interface (url is provided) gets called, otherwise it would fail
*/
virtual bool GetSocketConfigForLogging(OSCL_String &aPortConfig) = 0;
/**
* Sends a Seek request to the server (HTTP GET) and returns seq number of
* first data packet after seek. The API is asynchronous
*
* @param aNPTInMS Seek NPT in milliseconds .
* @param aFirstSeqNumAfterSeek
* @param aContext - Opaque data provided by caller, to be returned as part of
* command completion.
* @return PVMFCommandId
*/
virtual PVMFCommandId Seek(PVMFSessionId aSessionId,
uint64 aNPTInMS,
uint32& aFirstSeqNumAfterSeek,
OsclAny* aContext) = 0;
/**
* Sends a BitstreamSwitch request to the PE node and PE node will send a seek request
* (HTTP GET) and returns seq number of first data packet after seek. The API is asynchronous
*
* @param aNPTInMS Seek NPT in milliseconds .
* @param aFirstSeqNumAfterSwitch
* @param aContext - Opaque data provided by caller, to be returned as part of
* command completion.
* @return PVMFCommandId
*/
virtual PVMFCommandId BitstreamSwitch(PVMFSessionId aSessionId,
uint64 aNPTInMS,
uint32& aFirstSeqNumAfterSwitch,
OsclAny* aContext) = 0;
/**
* Sets the size of the mem pool interms of number of memory buffers
* for the media msg allocator associated with the port.
*
* @param aPort Port pointer .
* @param aNumBuffersInAllocator - Number of buffers in allocator
* @return PVMFStatus - PVMFSuccess or PVMFFailure
*/
virtual PVMFStatus SetMediaMsgAllocatorNumBuffers(PVMFPortInterface* aPort,
uint32 aNumBuffersInAllocator) = 0;
/**
* Set the user agent field for a http request. Basically there are two modes, by default,
* the new user agent field will be attached to the default user agent field (PVPlayer 4.0(Beta Release)).
* Another one is the new user agent will replace our default one
*
* @param aUserAgent wide-character string of user agent
* @param aOverwritable, flag to show whether the input user agent will replace or append the default one
* aOverwritable=true => replace
* @return true if user agent is set successfully, else false.
*/
virtual bool SetUserAgent(OSCL_wString &aUserAgent, const bool isOverwritable = true) = 0;
/**
* Set the NetworkTimeout for a http request/response. The unit of NetworkTimeout value is SECOND
* @param aTimeout, timeout value in SECONDS
*/
virtual void SetNetworkTimeout(const uint32 aTimeout) = 0;
/**
* Set the NetworkLoggingTimeout for MS streaming Logging POST request/response at stop or EOS. The unit of NetworkLoggingTimeout value is SECOND
* @param aTimeout, timeout value in SECONDS
*/
virtual void SetNetworkLoggingTimeout(const uint32 aTimeout) = 0;
/**
* Set the timeout value for Keep-Alive message. The unit of KeepAliveTimeout value is SECOND
* @param aTimeout, timeout value in SECONDS
*/
virtual void SetKeepAliveTimeout(const uint32 aTimeout) = 0;
/**
* Set the number of trials for redirect to avoid rediret looping. If the actual number redirect trials exceeds
* the specified number, then there will be an error out.
* @param aNumTrials, specified number of redirect trials
*/
virtual void SetNumRedirectTrials(const uint32 aNumTrials) = 0;
/**
* Set the http extension header field. Three inputs, field key & field value plus method (field belongs to which HTTP method),
* are needed for composing like "key: value"
* @param aFieldKey, extension field key
* @param aFieldValue, extension field value
* @param aMethod, HTTP method, GET, POST or both
* @param aPurgeOnRedirect - boolean indicating whether this header is carried over across redirects
*/
virtual void SetHttpExtensionHeaderField(OSCL_String &aFieldKey,
OSCL_String &aFieldValue,
const HttpMethod aMethod = HTTP_GET,
const bool aPurgeOnRedirect = false) = 0;
/**
* Set the logging URL
* @param aSourceURL, a different URL for logging statistics
*/
virtual void SetLoggingURL(OSCL_wString& aSourceURL) = 0;
/**
* Set the proxy URL and the port
* @param aProxyURL, a proxy URL for streaming
* @param aProxyPort, proxy number
* @return true if proxy is set successfully, else false.
*/
virtual bool SetStreamingProxy(OSCL_wString& aProxyURL, const uint32 aProxyPort) = 0;
/**
* Set the maximum ASF header size
* @param aMaxASFHeaderSize, upper limit for ASF header supported
*/
virtual void SetMaxASFHeaderSize(const uint32 aMaxASFHeaderSize = PVPROTOCOLENGINE_DEFAULT_MAXIMUM_ASF_HEADER_SIZE) = 0;
/**
* Set user authentication information, such as userID and password
* @param aUserID, user id
* @param aPasswd, password
* @param aMaxASFHeaderSize, upper limit for ASF header supported
*/
virtual void SetUserAuthInfo(OSCL_String &aUserID, OSCL_String &aPasswd) = 0;
/**
* Check the WM server 4.1 or not
* @return true if the streaming server is wms4.1 else false.
*/
virtual bool IsWMServerVersion4() = 0;
/**
* Set the accel bitrate for fast cache.
* @param aAccelBitrate, specified accel bitrate
*/
virtual void SetAccelBitrate(const uint32 aAccelBitrate) = 0;
/**
* Set the accel duration for fast cache.
* @param aAccelDuration, specified accel duration
*/
virtual void SetAccelDuration(const uint32 aAccelDuration) = 0;
/**
* Set number of buffers to be allocated for media data pool
* @param aVal, the number calculated by SM node
* @return void
*/
virtual void SetNumBuffersInMediaDataPoolSMCalc(uint32 aVal) = 0;
/**
* Set the max http stremaing size.
* @param aMaxHttpStreamingSize
*/
virtual void SetMaxHttpStreamingSize(const uint32 aMaxHttpStreamingSize) = 0;
};
#endif // PVMFPROTOCOLENGINENODE_EXTENSION_H_INCLUDED