blob: 4955a92b6a4018a25b4a5cecbce0b6c5868e4ae2 [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 pvmp4ffcn_port.h
* @brief Port for PVMp4FFComposerNode
*/
#ifndef PVMP4FFCN_PORT_H_INCLUDED
#define PVMP4FFCN_PORT_H_INCLUDED
#ifndef OSCL_BASE_H_INCLUDED
#include "oscl_base.h"
#endif
#ifndef OSCL_SCHEDULER_AO_H_INCLUDED
#include "oscl_scheduler_ao.h"
#endif
#ifndef PVMF_PORT_BASE_IMPL_H_INCLUDED
#include "pvmf_port_base_impl.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef PVMI_CONFIG_AND_CAPABILITY_H_INCLUDED
#include "pvmi_config_and_capability.h"
#endif
#ifndef TEXTSAMPLEDESCINFO_H
#include "textsampledescinfo.h"
#endif
class PVMp4FFComposerNode;
class PVLogger;
typedef enum
{
PVMP4FFCN_RATE_CONTROL_UNKNOWN = 0,
PVMP4FFCN_RATE_CONTROL_CBR = 1,
PVMP4FFCN_RATE_CONTROL_VBR = 2,
PVMP4FFCN_RATE_CONTROL_LOW_DELAY = 3
} PVMP4FFCNRateControlType;
struct PVMP4FFCNFormatSpecificConfig
{
uint32 iBitrate;
uint32 iTimescale;
// Video configuration
OsclFloat iFrameRate;
uint32 iIFrameInterval;
uint32 iWidth;
uint32 iHeight;
PVMP4FFCNRateControlType iRateControlType;
// H263 configuration
uint8 iH263Profile;
uint8 iH263Level;
// Audio Encode Params
uint32 iNumberOfChannels;
uint32 iBitsPerSample;
uint32 iSamplingRate;
};
class PVMp4FFComposerPort : public PvmfPortBaseImpl,
public PvmiCapabilityAndConfig,
public PVMFPortActivityHandler,
public OsclActiveObject
{
public:
PVMp4FFComposerPort(int32 aTag, PVMp4FFComposerNode* aNode, int32 aPriority, const char* aName = NULL);
~PVMp4FFComposerPort();
// Overload PvmfPortBaseImpl methods
OSCL_IMPORT_REF PVMFStatus Connect(PVMFPortInterface* aPort);
OSCL_IMPORT_REF PVMFStatus PeerConnect(PVMFPortInterface* aPort);
OSCL_IMPORT_REF void QueryInterface(const PVUuid& aUuid, OsclAny*& aPtr);
// Implement pure virtuals from PvmiCapabilityAndConfig interface
OSCL_IMPORT_REF void setObserver(PvmiConfigAndCapabilityCmdObserver* aObserver);
OSCL_IMPORT_REF PVMFStatus getParametersSync(PvmiMIOSession aSession, PvmiKeyType aIdentifier,
PvmiKvp*& aParameters, int& num_parameter_elements,
PvmiCapabilityContext aContext);
OSCL_IMPORT_REF PVMFStatus releaseParameters(PvmiMIOSession aSession, PvmiKvp* aParameters, int num_elements);
OSCL_IMPORT_REF void createContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
OSCL_IMPORT_REF void setContextParameters(PvmiMIOSession aSession, PvmiCapabilityContext& aContext,
PvmiKvp* aParameters, int num_parameter_elements);
OSCL_IMPORT_REF void DeleteContext(PvmiMIOSession aSession, PvmiCapabilityContext& aContext);
OSCL_IMPORT_REF void setParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters,
int num_elements, PvmiKvp * & aRet_kvp);
OSCL_IMPORT_REF PVMFCommandId setParametersAsync(PvmiMIOSession aSession, PvmiKvp* aParameters,
int num_elements, PvmiKvp*& aRet_kvp, OsclAny* context = NULL);
OSCL_IMPORT_REF uint32 getCapabilityMetric(PvmiMIOSession aSession);
OSCL_IMPORT_REF PVMFStatus verifyParametersSync(PvmiMIOSession aSession, PvmiKvp* aParameters, int num_elements);
// For node to notify the port that it's ready to process incoming message
void ProcessIncomingMsgReady();
// From PVMFPortActivityHandler
void HandlePortActivity(const PVMFPortActivity& aActivity);
// Track ID
void SetTrackId(int32 aTrackId)
{
iTrackId = aTrackId;
}
int32 GetTrackId()
{
return iTrackId;
}
// Provide port configuration to node
void SetFormat(PVMFFormatType aFormat)
{
iFormat = aFormat;
iMimeType = aFormat.getMIMEStrPtr();
}
PVMFFormatType GetFormat()
{
return iFormat;
}
OSCL_String& GetMimeType()
{
return iMimeType;
}
void SetCodecType(int32 aCodecType)
{
iCodecType = aCodecType;
}
int32 GetCodecType()
{
return iCodecType;
}
PVMP4FFCNFormatSpecificConfig* GetFormatSpecificConfig()
{
PvmiCapabilityAndConfig* config = NULL;
if (iConnectedPort)
{
OsclAny* temp = NULL;
iConnectedPort->QueryInterface(PVMI_CAPABILITY_AND_CONFIG_PVUUID, temp);
config = OSCL_STATIC_CAST(PvmiCapabilityAndConfig*, temp);
if (config)
{
GetInputParametersFromPeer(config);
}
}
return &iFormatSpecificConfig;
}
// Reference track settings
void SetReferencePort(PVMp4FFComposerPort* aPort)
{
iReferencePort = aPort;
}
const PVMp4FFComposerPort* GetReferencePort()
{
return iReferencePort;
}
// Real-time TS routines
uint32 GetLastTS()
{
return iLastTS;
}
void SetLastTS(uint32 aTS)
{
iLastTS = aTS;
}
friend class PVMp4FFComposerNode;
private:
// Implement pure virtuals from OsclActiveObject
void Run();
/**
* Allocate a specified number of key-value pairs and set the keys
*
* @param aKvp Output parameter to hold the allocated key-value pairs
* @param aKey Key for the allocated key-value pairs
* @param aNumParams Number of key-value pairs to be allocated
* @return Completion status
*/
PVMFStatus AllocateKvp(PvmiKvp*& aKvp, PvmiKeyType aKey, int32 aNumParams);
/**
* Verify one key-value pair parameter against capability of the port and
* if the aSetParam flag is set, set the value of the parameter corresponding to
* the key.
*
* @param aKvp Key-value pair parameter to be verified
* @param aSetParam If true, set the value of parameter corresponding to the key.
* @return PVMFSuccess if parameter is supported, else PVMFFailure
*/
PVMFStatus VerifyAndSetParameter(PvmiKvp* aKvp, bool aSetParam = false);
/**
* Negotiates input port settings (format, video size and frame rate) and
* configures the peer port and the container node with these settings
*
* @param aConfig Capability and config object for peer port
* @return PVMFSuccess if settings are successfully negotiated.
*/
PVMFStatus NegotiateInputSettings(PvmiCapabilityAndConfig* aConfig);
/**
* Query peer port for properties of incoming data.
* @return Completion status
*/
PVMFStatus GetInputParametersFromPeer(PvmiCapabilityAndConfig* aConfig);
/**
* Query peer port for properties of incoming data.
* @return Completion status
*/
PVMFStatus GetVideoInputParametersFromPeer(PvmiCapabilityAndConfig* aConfig);
private:
// Container node
PVMp4FFComposerNode* iNode;
// Port configuration
int32 iTrackId;
PVMFFormatType iFormat;
int32 iCodecType; //integer value to avoid formatype comparisons
PVMP4FFCNFormatSpecificConfig iFormatSpecificConfig;
PVMp4FFComposerPort* iReferencePort;
OsclMemoryFragment* memfrag_sps;
OsclMemoryFragment* memfrag_pps;
// Real-time TS
uint32 iLastTS;
OsclMemAllocator iAlloc;
PVLogger* iLogger;
bool iEndOfDataReached;
//logging
OSCL_HeapString<OsclMemAllocator> iMimeType;
};
#endif // PVMP4FFCN_PORT_H_INCLUDED