# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1282729250 -10800 # Node ID 0e4a32b9112dda2f3c6426c4f808b2fabe8dc3a1 Revision: 201033 diff -r 000000000000 -r 0e4a32b9112d bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,22 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +#include "openmaxil_plat/khronos_api/group/bld.inf" +#include "openmaxil_plat/symbian_api/group/bld.inf" +#include "openmaxil_plat/test_api/group/bld.inf" +#include "omxil_generic/omxilcomplib/group/bld.inf" +#include "omxil_generic/omxilcore/group/bld.inf" +#include "omxil_generic/omxilloader/group/bld.inf" + +#include "tsrc/xmltestharness/group/bld.inf" diff -r 000000000000 -r 0e4a32b9112d build.config.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build.config.xml Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,46 @@ + + + + +]> + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/bwins/omxilcomponentcommon.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/bwins/omxilcomponentcommon.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,201 @@ +EXPORTS + ?ManagedConfigIndexes@COmxILConfigManager@@IAEAAV?$RArray@I@@XZ @ 1 NONAME ; class RArray & COmxILConfigManager::ManagedConfigIndexes(void) + ?DoBufferAllocation@COmxILAudioPort@@MAE?AW4OMX_ERRORTYPE@@KAAPAEAAPAX1PAX@Z @ 2 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::DoBufferAllocation(unsigned long, unsigned char * &, void * &, void * &, void *) + ?SetConfig@COmxILConfigManager@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBX@Z @ 3 NONAME ; enum OMX_ERRORTYPE COmxILConfigManager::SetConfig(enum OMX_INDEXTYPE, void const *) + ?FindConfigIndex@COmxILConfigManager@@QBEHI@Z @ 4 NONAME ; int COmxILConfigManager::FindConfigIndex(unsigned int) const + ?IsBufferAtHome@COmxILVideoPort@@UBEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 5 NONAME ; int COmxILVideoPort::IsBufferAtHome(struct OMX_BUFFERHEADERTYPE *) const + ?FreeTunnel@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 6 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::FreeTunnel(int &) + ?SetBufferReturned@COmxILOtherPort@@UAEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 7 NONAME ; int COmxILOtherPort::SetBufferReturned(struct OMX_BUFFERHEADERTYPE *) + ??0COmxILVideoPort@@IAE@XZ @ 8 NONAME ; COmxILVideoPort::COmxILVideoPort(void) + ?GetConfigManager@COmxILComponent@@IBEPAVCOmxILConfigManager@@XZ @ 9 NONAME ; class COmxILConfigManager * COmxILComponent::GetConfigManager(void) const + ?GetSupportedColorFormats@COmxILImagePort@@IAEAAV?$RArray@W4OMX_COLOR_FORMATTYPE@@@@XZ @ 10 NONAME ; class RArray & COmxILImagePort::GetSupportedColorFormats(void) + ?GetParameter@COmxILOtherPort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 11 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::GetParameter(enum OMX_INDEXTYPE, void *) const + ?SetBufferReturned@COmxILAudioPort@@UAEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 12 NONAME ; int COmxILAudioPort::SetBufferReturned(struct OMX_BUFFERHEADERTYPE *) + ?SetTransitionToDisabled@COmxILVideoPort@@UAEXXZ @ 13 NONAME ; void COmxILVideoPort::SetTransitionToDisabled(void) + ?GetSupportedOtherFormats@COmxILOtherPort@@IAEAAV?$RArray@W4OMX_OTHER_FORMATTYPE@@@@XZ @ 14 NONAME ; class RArray & COmxILOtherPort::GetSupportedOtherFormats(void) + ?FreeTunnel@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 15 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::FreeTunnel(int &) + ?SetConfig@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 16 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::SetConfig(enum OMX_INDEXTYPE, void const *, int &) + ?ConstructL@COmxILOtherPort@@IAEXABVTOmxILCommonPortData@@ABV?$RArray@W4OMX_OTHER_FORMATTYPE@@@@@Z @ 17 NONAME ; void COmxILOtherPort::ConstructL(class TOmxILCommonPortData const &, class RArray const &) + ?GetParamOtherPortFormat@COmxILOtherPort@@IAEAAUOMX_OTHER_PARAM_PORTFORMATTYPE@@XZ @ 18 NONAME ; struct OMX_OTHER_PARAM_PORTFORMATTYPE & COmxILOtherPort::GetParamOtherPortFormat(void) + ??1COmxILImagePort@@UAE@XZ @ 19 NONAME ; COmxILImagePort::~COmxILImagePort(void) + ?TunnelRequest@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@PAXKPAUOMX_TUNNELSETUPTYPE@@@Z @ 20 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::TunnelRequest(void *, unsigned long, struct OMX_TUNNELSETUPTYPE *) + ??0COmxILAudioPort@@IAE@XZ @ 21 NONAME ; COmxILAudioPort::COmxILAudioPort(void) + ?GetExtensionIndex@COmxILAudioPort@@UBE?AW4OMX_ERRORTYPE@@PADPAW4OMX_INDEXTYPE@@@Z @ 22 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::GetExtensionIndex(char *, enum OMX_INDEXTYPE *) const + ?FreeBuffer@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@PAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 23 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::FreeBuffer(struct OMX_BUFFERHEADERTYPE *, int &) + ?SetTransitionToEnabledCompleted@COmxILOtherPort@@UAEXXZ @ 24 NONAME ; void COmxILOtherPort::SetTransitionToEnabledCompleted(void) + ?PopulateTunnel@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 25 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::PopulateTunnel(int &) + ?HasAllBuffersAtHome@COmxILImagePort@@UBEHXZ @ 26 NONAME ; int COmxILImagePort::HasAllBuffersAtHome(void) const + ?GetParamImagePortFormat@COmxILImagePort@@IBEABUOMX_IMAGE_PARAM_PORTFORMATTYPE@@XZ @ 27 NONAME ; struct OMX_IMAGE_PARAM_PORTFORMATTYPE const & COmxILImagePort::GetParamImagePortFormat(void) const + ?SetTransitionToDisabled@COmxILAudioPort@@UAEXXZ @ 28 NONAME ; void COmxILAudioPort::SetTransitionToDisabled(void) + ?RegisterProcessingFunction@COmxILComponent@@IAEXPBVCOmxILProcessingFunction@@@Z @ 29 NONAME ; void COmxILComponent::RegisterProcessingFunction(class COmxILProcessingFunction const *) + ?SymbianErrorToGetHandleError@COmxILComponent@@SA?AW4OMX_ERRORTYPE@@H@Z @ 30 NONAME ; enum OMX_ERRORTYPE COmxILComponent::SymbianErrorToGetHandleError(int) + ?GetTunnelledPort@COmxILPort@@IBEABKXZ @ 31 NONAME ; unsigned long const & COmxILPort::GetTunnelledPort(void) const + ?StoreBufferMark@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@PBUOMX_MARKTYPE@@@Z @ 32 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::StoreBufferMark(struct OMX_MARKTYPE const *) + ?DoBufferUnwrapping@COmxILImagePort@@MAEXPAX000@Z @ 33 NONAME ; void COmxILImagePort::DoBufferUnwrapping(void *, void *, void *, void *) + ?DoBufferWrapping@COmxILAudioPort@@MAE?AW4OMX_ERRORTYPE@@KPAEAAPAX1PAX@Z @ 34 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::DoBufferWrapping(unsigned long, unsigned char *, void * &, void * &, void *) + ?FreeBuffer@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@PAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 35 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::FreeBuffer(struct OMX_BUFFERHEADERTYPE *, int &) + ?DoBufferAllocation@COmxILVideoPort@@MAE?AW4OMX_ERRORTYPE@@KAAPAEAAPAX1PAX@Z @ 36 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::DoBufferAllocation(unsigned long, unsigned char * &, void * &, void * &, void *) + ?ComponentRoleIndication@COmxILProcessingFunction@@UAE?AW4OMX_ERRORTYPE@@I@Z @ 37 NONAME ; enum OMX_ERRORTYPE COmxILProcessingFunction::ComponentRoleIndication(unsigned int) + ?PopulateBuffer@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@PAPAUOMX_BUFFERHEADERTYPE@@PAXKPAEAAH@Z @ 38 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::PopulateBuffer(struct OMX_BUFFERHEADERTYPE * *, void *, unsigned long, unsigned char *, int &) + ?DoBufferDeallocation@COmxILImagePort@@MAEXPAX000@Z @ 39 NONAME ; void COmxILImagePort::DoBufferDeallocation(void *, void *, void *, void *) + ?ConstructL@COmxILComponent@@MAEXPAX@Z @ 40 NONAME ; void COmxILComponent::ConstructL(void *) + ?SetBufferSent@COmxILOtherPort@@UAEHPAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 41 NONAME ; int COmxILOtherPort::SetBufferSent(struct OMX_BUFFERHEADERTYPE *, int &) + ?GetSupportedColorFormats@COmxILVideoPort@@IAEAAV?$RArray@W4OMX_COLOR_FORMATTYPE@@@@XZ @ 42 NONAME ; class RArray & COmxILVideoPort::GetSupportedColorFormats(void) + ?FreeBuffer@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@PAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 43 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::FreeBuffer(struct OMX_BUFFERHEADERTYPE *, int &) + ?GetSupportedImageFormats@COmxILImagePort@@IBEABV?$RArray@W4OMX_IMAGE_CODINGTYPE@@@@XZ @ 44 NONAME ; class RArray const & COmxILImagePort::GetSupportedImageFormats(void) const + ?Extension_@COmxILPort@@MAEHIAAPAXPAX@Z @ 45 NONAME ; int COmxILPort::Extension_(unsigned int, void * &, void *) + ?SetTransitionToEnabled@COmxILVideoPort@@UAEXXZ @ 46 NONAME ; void COmxILVideoPort::SetTransitionToEnabled(void) + ??0TOmxILCommonPortData@@QAE@TOMX_VERSIONTYPE@@KW4OMX_DIRTYPE@@KKW4OMX_PORTDOMAINTYPE@@W4OMX_BOOL@@KW4OMX_BUFFERSUPPLIERTYPE@@K@Z @ 47 NONAME ; TOmxILCommonPortData::TOmxILCommonPortData(union OMX_VERSIONTYPE, unsigned long, enum OMX_DIRTYPE, unsigned long, unsigned long, enum OMX_PORTDOMAINTYPE, enum OMX_BOOL, unsigned long, enum OMX_BUFFERSUPPLIERTYPE, unsigned long) + ?SetTransitionToDisabledCompleted@COmxILVideoPort@@UAEXXZ @ 48 NONAME ; void COmxILVideoPort::SetTransitionToDisabledCompleted(void) + ?ConstructL@COmxILAudioPort@@IAEXABVTOmxILCommonPortData@@ABV?$RArray@W4OMX_AUDIO_CODINGTYPE@@@@@Z @ 49 NONAME ; void COmxILAudioPort::ConstructL(class TOmxILCommonPortData const &, class RArray const &) + ?GetConfig@COmxILConfigManager@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 50 NONAME ; enum OMX_ERRORTYPE COmxILConfigManager::GetConfig(enum OMX_INDEXTYPE, void *) const + ?GetSupportedVideoFormats@COmxILVideoPort@@IAEAAV?$RArray@W4OMX_VIDEO_CODINGTYPE@@@@XZ @ 51 NONAME ; class RArray & COmxILVideoPort::GetSupportedVideoFormats(void) + ?SetParameter@COmxILConfigManager@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXW4OMX_BOOL@@@Z @ 52 NONAME ; enum OMX_ERRORTYPE COmxILConfigManager::SetParameter(enum OMX_INDEXTYPE, void const *, enum OMX_BOOL) + ?InitComponentL@COmxILComponent@@IAEXXZ @ 53 NONAME ; void COmxILComponent::InitComponentL(void) + ?DoBufferUnwrapping@COmxILAudioPort@@MAEXPAX000@Z @ 54 NONAME ; void COmxILAudioPort::DoBufferUnwrapping(void *, void *, void *, void *) + ?NewL@COmxILConfigManager@@SAPAV1@ABVTDesC8@@ABTOMX_VERSIONTYPE@@ABV?$RPointerArray@VTDesC8@@@@@Z @ 55 NONAME ; class COmxILConfigManager * COmxILConfigManager::NewL(class TDesC8 const &, union OMX_VERSIONTYPE const &, class RPointerArray const &) + ?DoBufferWrapping@COmxILOtherPort@@MAE?AW4OMX_ERRORTYPE@@KPAEAAPAX1PAX@Z @ 56 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::DoBufferWrapping(unsigned long, unsigned char *, void * &, void * &, void *) + ?ConstructL@COmxILImagePort@@IAEXABVTOmxILCommonPortData@@ABV?$RArray@W4OMX_IMAGE_CODINGTYPE@@@@ABV?$RArray@W4OMX_COLOR_FORMATTYPE@@@@@Z @ 57 NONAME ; void COmxILImagePort::ConstructL(class TOmxILCommonPortData const &, class RArray const &, class RArray const &) + ?FreeTunnel@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 58 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::FreeTunnel(int &) + ?DoOmxUseBuffer@COmxILAudioPort@@MAE?AW4OMX_ERRORTYPE@@PAXPAPAUOMX_BUFFERHEADERTYPE@@K00KPAE@Z @ 59 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::DoOmxUseBuffer(void *, struct OMX_BUFFERHEADERTYPE * *, unsigned long, void *, void *, unsigned long, unsigned char *) + ?DoBufferAllocation@COmxILImagePort@@MAE?AW4OMX_ERRORTYPE@@KAAPAEAAPAX1PAX@Z @ 60 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::DoBufferAllocation(unsigned long, unsigned char * &, void * &, void * &, void *) + ?SetBufferReturned@COmxILImagePort@@UAEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 61 NONAME ; int COmxILImagePort::SetBufferReturned(struct OMX_BUFFERHEADERTYPE *) + ?GetExtensionIndex@COmxILVideoPort@@UBE?AW4OMX_ERRORTYPE@@PADPAW4OMX_INDEXTYPE@@@Z @ 62 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::GetExtensionIndex(char *, enum OMX_INDEXTYPE *) const + ?GetConfig@COmxILVideoPort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 63 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::GetConfig(enum OMX_INDEXTYPE, void *) const + ?SetTransitionToEnabled@COmxILAudioPort@@UAEXXZ @ 64 NONAME ; void COmxILAudioPort::SetTransitionToEnabled(void) + ?SetParameter@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 65 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::SetParameter(enum OMX_INDEXTYPE, void const *, int &) + ?PopulateBuffer@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@PAPAUOMX_BUFFERHEADERTYPE@@PAXKPAEAAH@Z @ 66 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::PopulateBuffer(struct OMX_BUFFERHEADERTYPE * *, void *, unsigned long, unsigned char *, int &) + ?SetTransitionToDisabledCompleted@COmxILAudioPort@@UAEXXZ @ 67 NONAME ; void COmxILAudioPort::SetTransitionToDisabledCompleted(void) + ?MediaTimeIndication@COmxILProcessingFunction@@UAE?AW4OMX_ERRORTYPE@@ABUOMX_TIME_MEDIATIMETYPE@@@Z @ 68 NONAME ; enum OMX_ERRORTYPE COmxILProcessingFunction::MediaTimeIndication(struct OMX_TIME_MEDIATIMETYPE const &) + ?DoBufferDeallocation@COmxILAudioPort@@MAEXPAX000@Z @ 69 NONAME ; void COmxILAudioPort::DoBufferDeallocation(void *, void *, void *, void *) + ?GetLocalOmxParamIndexes@COmxILAudioPort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 70 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::GetLocalOmxParamIndexes(class RArray &) const + ??0COmxILConfigManager@@IAE@XZ @ 71 NONAME ; COmxILConfigManager::COmxILConfigManager(void) + ??0COmxILOtherPort@@IAE@XZ @ 72 NONAME ; COmxILOtherPort::COmxILOtherPort(void) + ??0TOmxILSpecVersion@@QAE@XZ @ 73 NONAME ; TOmxILSpecVersion::TOmxILSpecVersion(void) + ??1COmxILVideoPort@@UAE@XZ @ 74 NONAME ; COmxILVideoPort::~COmxILVideoPort(void) + ?SetBufferSent@COmxILImagePort@@UAEHPAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 75 NONAME ; int COmxILImagePort::SetBufferSent(struct OMX_BUFFERHEADERTYPE *, int &) + ?SetTransitionToDisabled@COmxILOtherPort@@UAEXXZ @ 76 NONAME ; void COmxILOtherPort::SetTransitionToDisabled(void) + ?GetParameter@COmxILVideoPort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 77 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::GetParameter(enum OMX_INDEXTYPE, void *) const + ?GetHandle@COmxILComponent@@IBEPAUOMX_COMPONENTTYPE@@XZ @ 78 NONAME ; struct OMX_COMPONENTTYPE * COmxILComponent::GetHandle(void) const + ?PopulateBuffer@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@PAPAUOMX_BUFFERHEADERTYPE@@PAXKPAEAAH@Z @ 79 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::PopulateBuffer(struct OMX_BUFFERHEADERTYPE * *, void *, unsigned long, unsigned char *, int &) + ?HasAllBuffersAtHome@COmxILVideoPort@@UBEHXZ @ 80 NONAME ; int COmxILVideoPort::HasAllBuffersAtHome(void) const + ?SetTransitionToEnabledCompleted@COmxILImagePort@@UAEXXZ @ 81 NONAME ; void COmxILImagePort::SetTransitionToEnabledCompleted(void) + ?DoPortReconfiguration@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@IABVTDesC8@@AAW4OMX_EVENTTYPE@@@Z @ 82 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::DoPortReconfiguration(unsigned int, class TDesC8 const &, enum OMX_EVENTTYPE &) + ?IsBufferAtHome@COmxILOtherPort@@UBEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 83 NONAME ; int COmxILOtherPort::IsBufferAtHome(struct OMX_BUFFERHEADERTYPE *) const + ?DoBufferUnwrapping@COmxILVideoPort@@MAEXPAX000@Z @ 84 NONAME ; void COmxILVideoPort::DoBufferUnwrapping(void *, void *, void *, void *) + ?GetParamImagePortFormat@COmxILImagePort@@IAEAAUOMX_IMAGE_PARAM_PORTFORMATTYPE@@XZ @ 85 NONAME ; struct OMX_IMAGE_PARAM_PORTFORMATTYPE & COmxILImagePort::GetParamImagePortFormat(void) + ?SetParameter@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 86 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::SetParameter(enum OMX_INDEXTYPE, void const *, int &) + ?Extension_@COmxILConfigManager@@MAEHIAAPAXPAX@Z @ 87 NONAME ; int COmxILConfigManager::Extension_(unsigned int, void * &, void *) + ??1COmxILAudioPort@@UAE@XZ @ 88 NONAME ; COmxILAudioPort::~COmxILAudioPort(void) + ?IsBufferAtHome@COmxILAudioPort@@UBEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 89 NONAME ; int COmxILAudioPort::IsBufferAtHome(struct OMX_BUFFERHEADERTYPE *) const + ?SetParameter@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 90 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::SetParameter(enum OMX_INDEXTYPE, void const *, int &) + ?DoBufferAllocation@COmxILOtherPort@@MAE?AW4OMX_ERRORTYPE@@KAAPAEAAPAX1PAX@Z @ 91 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::DoBufferAllocation(unsigned long, unsigned char * &, void * &, void * &, void *) + ?GetParamPortDefinition@COmxILPort@@IBEABUOMX_PARAM_PORTDEFINITIONTYPE@@XZ @ 92 NONAME ; struct OMX_PARAM_PORTDEFINITIONTYPE const & COmxILPort::GetParamPortDefinition(void) const + ?DoBufferWrapping@COmxILImagePort@@MAE?AW4OMX_ERRORTYPE@@KPAEAAPAX1PAX@Z @ 93 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::DoBufferWrapping(unsigned long, unsigned char *, void * &, void * &, void *) + ?GetLocalOmxConfigIndexes@COmxILAudioPort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 94 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::GetLocalOmxConfigIndexes(class RArray &) const + ?HasAllBuffersAtHome@COmxILAudioPort@@UBEHXZ @ 95 NONAME ; int COmxILAudioPort::HasAllBuffersAtHome(void) const + ??1COmxILConfigManager@@UAE@XZ @ 96 NONAME ; COmxILConfigManager::~COmxILConfigManager(void) + ?DoBufferDeallocation@COmxILVideoPort@@MAEXPAX000@Z @ 97 NONAME ; void COmxILVideoPort::DoBufferDeallocation(void *, void *, void *, void *) + ?ConstructL@COmxILConfigManager@@IAEXABVTDesC8@@ABTOMX_VERSIONTYPE@@ABV?$RPointerArray@VTDesC8@@@@@Z @ 98 NONAME ; void COmxILConfigManager::ConstructL(class TDesC8 const &, union OMX_VERSIONTYPE const &, class RPointerArray const &) + ?FreeTunnel@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 99 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::FreeTunnel(int &) + ?GetConfig@COmxILAudioPort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 100 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::GetConfig(enum OMX_INDEXTYPE, void *) const + ?NewL@COmxILClientClockPort@@SAPAV1@ABVTOmxILCommonPortData@@ABV?$RArray@W4OMX_OTHER_FORMATTYPE@@@@@Z @ 101 NONAME ; class COmxILClientClockPort * COmxILClientClockPort::NewL(class TOmxILCommonPortData const &, class RArray const &) + ?GetAppData@COmxILComponent@@IBEPAXXZ @ 102 NONAME ; void * COmxILComponent::GetAppData(void) const + ?GetConfig@COmxILImagePort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 103 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::GetConfig(enum OMX_INDEXTYPE, void *) const + ?Extension_@COmxILOtherPort@@MAEHIAAPAXPAX@Z @ 104 NONAME ; int COmxILOtherPort::Extension_(unsigned int, void * &, void *) + ?GetExtensionIndex@COmxILConfigManager@@UBE?AW4OMX_ERRORTYPE@@PADPAW4OMX_INDEXTYPE@@@Z @ 105 NONAME ; enum OMX_ERRORTYPE COmxILConfigManager::GetExtensionIndex(char *, enum OMX_INDEXTYPE *) const + ?GetLocalOmxParamIndexes@COmxILVideoPort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 106 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::GetLocalOmxParamIndexes(class RArray &) const + ?TunnelRequest@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@PAXKPAUOMX_TUNNELSETUPTYPE@@@Z @ 107 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::TunnelRequest(void *, unsigned long, struct OMX_TUNNELSETUPTYPE *) + ?Extension_@COmxILAudioPort@@MAEHIAAPAXPAX@Z @ 108 NONAME ; int COmxILAudioPort::Extension_(unsigned int, void * &, void *) + ?SetBufferReturned@COmxILVideoPort@@UAEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 109 NONAME ; int COmxILVideoPort::SetBufferReturned(struct OMX_BUFFERHEADERTYPE *) + ??0COmxILComponent@@IAE@XZ @ 110 NONAME ; COmxILComponent::COmxILComponent(void) + ?GetCallbacks@COmxILComponent@@IBEPAUOMX_CALLBACKTYPE@@XZ @ 111 NONAME ; struct OMX_CALLBACKTYPE * COmxILComponent::GetCallbacks(void) const + ?SetConfig@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 112 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::SetConfig(enum OMX_INDEXTYPE, void const *, int &) + ?CreatePortManagerL@COmxILComponent@@IAEXW4TPortManagerType@1@ABTOMX_VERSIONTYPE@@KKKKKKKKW4OMX_BOOL@@@Z @ 113 NONAME ; void COmxILComponent::CreatePortManagerL(enum COmxILComponent::TPortManagerType, union OMX_VERSIONTYPE const &, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, enum OMX_BOOL) + ?GetSupportedColorFormats@COmxILImagePort@@IBEABV?$RArray@W4OMX_COLOR_FORMATTYPE@@@@XZ @ 114 NONAME ; class RArray const & COmxILImagePort::GetSupportedColorFormats(void) const + ?PopulateTunnel@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 115 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::PopulateTunnel(int &) + ?StoreBufferMark@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@PBUOMX_MARKTYPE@@@Z @ 116 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::StoreBufferMark(struct OMX_MARKTYPE const *) + ?SetTransitionToEnabled@COmxILOtherPort@@UAEXXZ @ 117 NONAME ; void COmxILOtherPort::SetTransitionToEnabled(void) + ?GetParamVideoPortFormat@COmxILVideoPort@@IBEABUOMX_VIDEO_PARAM_PORTFORMATTYPE@@XZ @ 118 NONAME ; struct OMX_VIDEO_PARAM_PORTFORMATTYPE const & COmxILVideoPort::GetParamVideoPortFormat(void) const + ?GetSupportedOtherFormats@COmxILOtherPort@@IBEABV?$RArray@W4OMX_OTHER_FORMATTYPE@@@@XZ @ 119 NONAME ; class RArray const & COmxILOtherPort::GetSupportedOtherFormats(void) const + ?SetTransitionToDisabledCompleted@COmxILOtherPort@@UAEXXZ @ 120 NONAME ; void COmxILOtherPort::SetTransitionToDisabledCompleted(void) + ?GetParameter@COmxILAudioPort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 121 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::GetParameter(enum OMX_INDEXTYPE, void *) const + ?GetTunnelledComponent@COmxILPort@@IBEABQAXXZ @ 122 NONAME ; void * const const & COmxILPort::GetTunnelledComponent(void) const + ?GetParameter@COmxILImagePort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 123 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::GetParameter(enum OMX_INDEXTYPE, void *) const + ?TunnelRequest@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@PAXKPAUOMX_TUNNELSETUPTYPE@@@Z @ 124 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::TunnelRequest(void *, unsigned long, struct OMX_TUNNELSETUPTYPE *) + ?SetComponentRoleDefaults@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@I@Z @ 125 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::SetComponentRoleDefaults(unsigned int) + ?PopulateTunnel@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 126 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::PopulateTunnel(int &) + ?StoreBufferMark@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@PBUOMX_MARKTYPE@@@Z @ 127 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::StoreBufferMark(struct OMX_MARKTYPE const *) + ?FreeBuffer@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@PAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 128 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::FreeBuffer(struct OMX_BUFFERHEADERTYPE *, int &) + ?GetLocalOmxParamIndexes@COmxILImagePort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 129 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::GetLocalOmxParamIndexes(class RArray &) const + ?Index@COmxILPort@@QBEKXZ @ 130 NONAME ; unsigned long COmxILPort::Index(void) const + ?InsertConfigIndexL@COmxILConfigManager@@QAEXI@Z @ 131 NONAME ; void COmxILConfigManager::InsertConfigIndexL(unsigned int) + ?Extension_@COmxILComponent@@MAEHIAAPAXPAX@Z @ 132 NONAME ; int COmxILComponent::Extension_(unsigned int, void * &, void *) + ?AddPort@COmxILComponent@@IAEHPBVCOmxILPort@@W4OMX_DIRTYPE@@@Z @ 133 NONAME ; int COmxILComponent::AddPort(class COmxILPort const *, enum OMX_DIRTYPE) + ?GetSupportedImageFormats@COmxILImagePort@@IAEAAV?$RArray@W4OMX_IMAGE_CODINGTYPE@@@@XZ @ 134 NONAME ; class RArray & COmxILImagePort::GetSupportedImageFormats(void) + ?ConstructL@COmxILVideoPort@@IAEXABVTOmxILCommonPortData@@ABV?$RArray@W4OMX_VIDEO_CODINGTYPE@@@@ABV?$RArray@W4OMX_COLOR_FORMATTYPE@@@@@Z @ 135 NONAME ; void COmxILVideoPort::ConstructL(class TOmxILCommonPortData const &, class RArray const &, class RArray const &) + ?CheckOmxStructSizeAndVersion@TOmxILUtil@@SA?AW4OMX_ERRORTYPE@@PAXK@Z @ 136 NONAME ; enum OMX_ERRORTYPE TOmxILUtil::CheckOmxStructSizeAndVersion(void *, unsigned long) + ?TunnelRequest@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@PAXKPAUOMX_TUNNELSETUPTYPE@@@Z @ 137 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::TunnelRequest(void *, unsigned long, struct OMX_TUNNELSETUPTYPE *) + ?DoOmxUseBuffer@COmxILImagePort@@MAE?AW4OMX_ERRORTYPE@@PAXPAPAUOMX_BUFFERHEADERTYPE@@K00KPAE@Z @ 138 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::DoOmxUseBuffer(void *, struct OMX_BUFFERHEADERTYPE * *, unsigned long, void *, void *, unsigned long, unsigned char *) + ?SetBufferSent@COmxILAudioPort@@UAEHPAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 139 NONAME ; int COmxILAudioPort::SetBufferSent(struct OMX_BUFFERHEADERTYPE *, int &) + ?DoBufferUnwrapping@COmxILOtherPort@@MAEXPAX000@Z @ 140 NONAME ; void COmxILOtherPort::DoBufferUnwrapping(void *, void *, void *, void *) + ??0COmxILImagePort@@IAE@XZ @ 141 NONAME ; COmxILImagePort::COmxILImagePort(void) + ?GetLocalOmxConfigIndexes@COmxILVideoPort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 142 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::GetLocalOmxConfigIndexes(class RArray &) const + ?SetConfig@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 143 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::SetConfig(enum OMX_INDEXTYPE, void const *, int &) + ??0COmxILProcessingFunction@@IAE@AAVMOmxILCallbackNotificationIf@@@Z @ 144 NONAME ; COmxILProcessingFunction::COmxILProcessingFunction(class MOmxILCallbackNotificationIf &) + ?DoBufferWrapping@COmxILVideoPort@@MAE?AW4OMX_ERRORTYPE@@KPAEAAPAX1PAX@Z @ 145 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::DoBufferWrapping(unsigned long, unsigned char *, void * &, void * &, void *) + ?GetProcessingFunction@COmxILComponent@@IBEPAVCOmxILProcessingFunction@@XZ @ 146 NONAME ; class COmxILProcessingFunction * COmxILComponent::GetProcessingFunction(void) const + ?SetConfig@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 147 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::SetConfig(enum OMX_INDEXTYPE, void const *, int &) + ?GetTunnelledPort@COmxILPort@@IAEAAKXZ @ 148 NONAME ; unsigned long & COmxILPort::GetTunnelledPort(void) + ?InsertParamIndexL@COmxILConfigManager@@QAEXI@Z @ 149 NONAME ; void COmxILConfigManager::InsertParamIndexL(unsigned int) + ?SetTransitionToDisabled@COmxILImagePort@@UAEXXZ @ 150 NONAME ; void COmxILImagePort::SetTransitionToDisabled(void) + ?SetComponentRoleDefaults@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@I@Z @ 151 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::SetComponentRoleDefaults(unsigned int) + ?IsBufferAtHome@COmxILImagePort@@UBEHPAUOMX_BUFFERHEADERTYPE@@@Z @ 152 NONAME ; int COmxILImagePort::IsBufferAtHome(struct OMX_BUFFERHEADERTYPE *) const + ?GetParamOtherPortFormat@COmxILOtherPort@@IBEABUOMX_OTHER_PARAM_PORTFORMATTYPE@@XZ @ 153 NONAME ; struct OMX_OTHER_PARAM_PORTFORMATTYPE const & COmxILOtherPort::GetParamOtherPortFormat(void) const + ?SetTransitionToEnabledCompleted@COmxILVideoPort@@UAEXXZ @ 154 NONAME ; void COmxILVideoPort::SetTransitionToEnabledCompleted(void) + ?DoBufferDeallocation@COmxILOtherPort@@MAEXPAX000@Z @ 155 NONAME ; void COmxILOtherPort::DoBufferDeallocation(void *, void *, void *, void *) + ??1COmxILOtherPort@@UAE@XZ @ 156 NONAME ; COmxILOtherPort::~COmxILOtherPort(void) + ?CleanUpPort@COmxILPort@@IAEXXZ @ 157 NONAME ; void COmxILPort::CleanUpPort(void) + ?Extension_@COmxILImagePort@@MAEHIAAPAXPAX@Z @ 158 NONAME ; int COmxILImagePort::Extension_(unsigned int, void * &, void *) + ?Extension_@COmxILVideoPort@@MAEHIAAPAXPAX@Z @ 159 NONAME ; int COmxILVideoPort::Extension_(unsigned int, void * &, void *) + ?GetParameter@COmxILConfigManager@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 160 NONAME ; enum OMX_ERRORTYPE COmxILConfigManager::GetParameter(enum OMX_INDEXTYPE, void *) const + ?HasAllBuffersAtHome@COmxILOtherPort@@UBEHXZ @ 161 NONAME ; int COmxILOtherPort::HasAllBuffersAtHome(void) const + ?StoreBufferMark@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@PBUOMX_MARKTYPE@@@Z @ 162 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::StoreBufferMark(struct OMX_MARKTYPE const *) + ?GetSupportedColorFormats@COmxILVideoPort@@IBEABV?$RArray@W4OMX_COLOR_FORMATTYPE@@@@XZ @ 163 NONAME ; class RArray const & COmxILVideoPort::GetSupportedColorFormats(void) const + ?DoOmxUseBuffer@COmxILVideoPort@@MAE?AW4OMX_ERRORTYPE@@PAXPAPAUOMX_BUFFERHEADERTYPE@@K00KPAE@Z @ 164 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::DoOmxUseBuffer(void *, struct OMX_BUFFERHEADERTYPE * *, unsigned long, void *, void *, unsigned long, unsigned char *) + ?FindParamIndex@COmxILConfigManager@@QBEHI@Z @ 165 NONAME ; int COmxILConfigManager::FindParamIndex(unsigned int) const + ?DoPortReconfiguration@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@IABVTDesC8@@AAW4OMX_EVENTTYPE@@@Z @ 166 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::DoPortReconfiguration(unsigned int, class TDesC8 const &, enum OMX_EVENTTYPE &) + ?GetLocalOmxConfigIndexes@COmxILImagePort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 167 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::GetLocalOmxConfigIndexes(class RArray &) const + ?ClearBufferContents@TOmxILUtil@@SAXPAUOMX_BUFFERHEADERTYPE@@@Z @ 168 NONAME ; void TOmxILUtil::ClearBufferContents(struct OMX_BUFFERHEADERTYPE *) + ?SetParameter@COmxILImagePort@@UAE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PBXAAH@Z @ 169 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::SetParameter(enum OMX_INDEXTYPE, void const *, int &) + ?GetLocalOmxParamIndexes@COmxILOtherPort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 170 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::GetLocalOmxParamIndexes(class RArray &) const + ?SetTransitionToEnabledCompleted@COmxILAudioPort@@UAEXXZ @ 171 NONAME ; void COmxILAudioPort::SetTransitionToEnabledCompleted(void) + ?PopulateBuffer@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@PAPAUOMX_BUFFERHEADERTYPE@@PAXKPAEAAH@Z @ 172 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::PopulateBuffer(struct OMX_BUFFERHEADERTYPE * *, void *, unsigned long, unsigned char *, int &) + ?GetParamPortDefinition@COmxILPort@@IAEAAUOMX_PARAM_PORTDEFINITIONTYPE@@XZ @ 173 NONAME ; struct OMX_PARAM_PORTDEFINITIONTYPE & COmxILPort::GetParamPortDefinition(void) + ?GetSupportedVideoFormats@COmxILVideoPort@@IBEABV?$RArray@W4OMX_VIDEO_CODINGTYPE@@@@XZ @ 174 NONAME ; class RArray const & COmxILVideoPort::GetSupportedVideoFormats(void) const + ?GetExtensionIndex@COmxILImagePort@@UBE?AW4OMX_ERRORTYPE@@PADPAW4OMX_INDEXTYPE@@@Z @ 175 NONAME ; enum OMX_ERRORTYPE COmxILImagePort::GetExtensionIndex(char *, enum OMX_INDEXTYPE *) const + ?Extension_@COmxILProcessingFunction@@MAEHIAAPAXPAX@Z @ 176 NONAME ; int COmxILProcessingFunction::Extension_(unsigned int, void * &, void *) + ?UpdateColorFormat@COmxILVideoPort@@IAEHAAW4OMX_COLOR_FORMATTYPE@@W42@AAH@Z @ 177 NONAME ; int COmxILVideoPort::UpdateColorFormat(enum OMX_COLOR_FORMATTYPE &, enum OMX_COLOR_FORMATTYPE, int &) + ?PopulateTunnel@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@AAH@Z @ 178 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::PopulateTunnel(int &) + ?SetComponentRoleDefaults@COmxILAudioPort@@UAE?AW4OMX_ERRORTYPE@@I@Z @ 179 NONAME ; enum OMX_ERRORTYPE COmxILAudioPort::SetComponentRoleDefaults(unsigned int) + ?DoOmxUseBuffer@COmxILOtherPort@@MAE?AW4OMX_ERRORTYPE@@PAXPAPAUOMX_BUFFERHEADERTYPE@@K00KPAE@Z @ 180 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::DoOmxUseBuffer(void *, struct OMX_BUFFERHEADERTYPE * *, unsigned long, void *, void *, unsigned long, unsigned char *) + ?GetExtensionIndex@COmxILOtherPort@@UBE?AW4OMX_ERRORTYPE@@PADPAW4OMX_INDEXTYPE@@@Z @ 181 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::GetExtensionIndex(char *, enum OMX_INDEXTYPE *) const + ?RegisterConfigurationManager@COmxILComponent@@IAEXPBVCOmxILConfigManager@@@Z @ 182 NONAME ; void COmxILComponent::RegisterConfigurationManager(class COmxILConfigManager const *) + ?DoPortReconfiguration@COmxILOtherPort@@UAE?AW4OMX_ERRORTYPE@@IABVTDesC8@@AAW4OMX_EVENTTYPE@@@Z @ 183 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::DoPortReconfiguration(unsigned int, class TDesC8 const &, enum OMX_EVENTTYPE &) + ?SetBufferSent@COmxILVideoPort@@UAEHPAUOMX_BUFFERHEADERTYPE@@AAH@Z @ 184 NONAME ; int COmxILVideoPort::SetBufferSent(struct OMX_BUFFERHEADERTYPE *, int &) + ??BTOmxILVersion@@QAEAATOMX_VERSIONTYPE@@XZ @ 185 NONAME ; TOmxILVersion::operator union OMX_VERSIONTYPE &(void) + ?GetTunnelledComponent@COmxILPort@@IAEAAPAXXZ @ 186 NONAME ; void * & COmxILPort::GetTunnelledComponent(void) + ?UpdateCodingType@COmxILVideoPort@@IAEHAAW4OMX_VIDEO_CODINGTYPE@@W42@AAH@Z @ 187 NONAME ; int COmxILVideoPort::UpdateCodingType(enum OMX_VIDEO_CODINGTYPE &, enum OMX_VIDEO_CODINGTYPE, int &) + ?CreateCallbackManagerL@COmxILComponent@@IAEPAVMOmxILCallbackNotificationIf@@W4TCallbackManagerType@1@@Z @ 188 NONAME ; class MOmxILCallbackNotificationIf * COmxILComponent::CreateCallbackManagerL(enum COmxILComponent::TCallbackManagerType) + ?SetTransitionToEnabled@COmxILImagePort@@UAEXXZ @ 189 NONAME ; void COmxILImagePort::SetTransitionToEnabled(void) + ?IsEnabled@COmxILPort@@QBEHXZ @ 190 NONAME ; int COmxILPort::IsEnabled(void) const + ??0TOmxILVersion@@QAE@EEEE@Z @ 191 NONAME ; TOmxILVersion::TOmxILVersion(unsigned char, unsigned char, unsigned char, unsigned char) + ?GetConfig@COmxILOtherPort@@UBE?AW4OMX_ERRORTYPE@@W4OMX_INDEXTYPE@@PAX@Z @ 192 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::GetConfig(enum OMX_INDEXTYPE, void *) const + ?SetComponentRoleDefaults@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@I@Z @ 193 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::SetComponentRoleDefaults(unsigned int) + ??1COmxILProcessingFunction@@UAE@XZ @ 194 NONAME ; COmxILProcessingFunction::~COmxILProcessingFunction(void) + ?GetParamVideoPortFormat@COmxILVideoPort@@IAEAAUOMX_VIDEO_PARAM_PORTFORMATTYPE@@XZ @ 195 NONAME ; struct OMX_VIDEO_PARAM_PORTFORMATTYPE & COmxILVideoPort::GetParamVideoPortFormat(void) + ?DoPortReconfiguration@COmxILVideoPort@@UAE?AW4OMX_ERRORTYPE@@IABVTDesC8@@AAW4OMX_EVENTTYPE@@@Z @ 196 NONAME ; enum OMX_ERRORTYPE COmxILVideoPort::DoPortReconfiguration(unsigned int, class TDesC8 const &, enum OMX_EVENTTYPE &) + ?SetTransitionToDisabledCompleted@COmxILImagePort@@UAEXXZ @ 197 NONAME ; void COmxILImagePort::SetTransitionToDisabledCompleted(void) + ??1COmxILComponent@@UAE@XZ @ 198 NONAME ; COmxILComponent::~COmxILComponent(void) + ?GetLocalOmxConfigIndexes@COmxILOtherPort@@UBE?AW4OMX_ERRORTYPE@@AAV?$RArray@I@@@Z @ 199 NONAME ; enum OMX_ERRORTYPE COmxILOtherPort::GetLocalOmxConfigIndexes(class RArray &) const + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/eabi/omxilcomponentcommon.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/eabi/omxilcomponentcommon.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,292 @@ +EXPORTS + _ZN10COmxILPort10Extension_EjRPvS0_ @ 1 NONAME + _ZN10COmxILPort11CleanUpPortEv @ 2 NONAME + _ZN10COmxILPort16GetTunnelledPortEv @ 3 NONAME + _ZN10COmxILPort21GetTunnelledComponentEv @ 4 NONAME + _ZN10COmxILPort22GetParamPortDefinitionEv @ 5 NONAME + _ZN10TOmxILUtil19ClearBufferContentsEP20OMX_BUFFERHEADERTYPE @ 6 NONAME + _ZN10TOmxILUtil28CheckOmxStructSizeAndVersionEPvm @ 7 NONAME + _ZN13TOmxILVersionC1Ehhhh @ 8 NONAME + _ZN13TOmxILVersionC2Ehhhh @ 9 NONAME + _ZN13TOmxILVersioncvR15OMX_VERSIONTYPEEv @ 10 NONAME + _ZN15COmxILAudioPort10ConstructLERK20TOmxILCommonPortDataRK6RArrayI20OMX_AUDIO_CODINGTYPEE @ 11 NONAME + _ZN15COmxILAudioPort10Extension_EjRPvS0_ @ 12 NONAME + _ZN15COmxILAudioPort10FreeBufferEP20OMX_BUFFERHEADERTYPERi @ 13 NONAME + _ZN15COmxILAudioPort10FreeTunnelERi @ 14 NONAME + _ZN15COmxILAudioPort12SetParameterE13OMX_INDEXTYPEPKvRi @ 15 NONAME + _ZN15COmxILAudioPort13SetBufferSentEP20OMX_BUFFERHEADERTYPERi @ 16 NONAME + _ZN15COmxILAudioPort13TunnelRequestEPvmP19OMX_TUNNELSETUPTYPE @ 17 NONAME + _ZN15COmxILAudioPort14DoOmxUseBufferEPvPP20OMX_BUFFERHEADERTYPEmS0_S0_mPh @ 18 NONAME + _ZN15COmxILAudioPort14PopulateBufferEPP20OMX_BUFFERHEADERTYPEPvmPhRi @ 19 NONAME + _ZN15COmxILAudioPort14PopulateTunnelERi @ 20 NONAME + _ZN15COmxILAudioPort15StoreBufferMarkEPK12OMX_MARKTYPE @ 21 NONAME + _ZN15COmxILAudioPort16DoBufferWrappingEmPhRPvS2_S1_ @ 22 NONAME + _ZN15COmxILAudioPort17SetBufferReturnedEP20OMX_BUFFERHEADERTYPE @ 23 NONAME + _ZN15COmxILAudioPort18DoBufferAllocationEmRPhRPvS3_S2_ @ 24 NONAME + _ZN15COmxILAudioPort18DoBufferUnwrappingEPvS0_S0_S0_ @ 25 NONAME + _ZN15COmxILAudioPort20DoBufferDeallocationEPvS0_S0_S0_ @ 26 NONAME + _ZN15COmxILAudioPort21DoPortReconfigurationEjRK6TDesC8R13OMX_EVENTTYPE @ 27 NONAME + _ZN15COmxILAudioPort22SetTransitionToEnabledEv @ 28 NONAME + _ZN15COmxILAudioPort23SetTransitionToDisabledEv @ 29 NONAME + _ZN15COmxILAudioPort24SetComponentRoleDefaultsEj @ 30 NONAME + _ZN15COmxILAudioPort31SetTransitionToEnabledCompletedEv @ 31 NONAME + _ZN15COmxILAudioPort32SetTransitionToDisabledCompletedEv @ 32 NONAME + _ZN15COmxILAudioPort9SetConfigE13OMX_INDEXTYPEPKvRi @ 33 NONAME + _ZN15COmxILAudioPortC2Ev @ 34 NONAME + _ZN15COmxILAudioPortD0Ev @ 35 NONAME + _ZN15COmxILAudioPortD1Ev @ 36 NONAME + _ZN15COmxILAudioPortD2Ev @ 37 NONAME + _ZN15COmxILComponent10ConstructLEPv @ 38 NONAME + _ZN15COmxILComponent10Extension_EjRPvS0_ @ 39 NONAME + _ZN15COmxILComponent14InitComponentLEv @ 40 NONAME + _ZN15COmxILComponent18CreatePortManagerLENS_16TPortManagerTypeERK15OMX_VERSIONTYPEmmmmmmmm8OMX_BOOL @ 41 NONAME + _ZN15COmxILComponent22CreateCallbackManagerLENS_20TCallbackManagerTypeE @ 42 NONAME + _ZN15COmxILComponent26RegisterProcessingFunctionEPK24COmxILProcessingFunction @ 43 NONAME + _ZN15COmxILComponent28RegisterConfigurationManagerEPK19COmxILConfigManager @ 44 NONAME + _ZN15COmxILComponent28SymbianErrorToGetHandleErrorEi @ 45 NONAME + _ZN15COmxILComponent7AddPortEPK10COmxILPort11OMX_DIRTYPE @ 46 NONAME + _ZN15COmxILComponentC1Ev @ 47 NONAME + _ZN15COmxILComponentC2Ev @ 48 NONAME + _ZN15COmxILComponentD0Ev @ 49 NONAME + _ZN15COmxILComponentD1Ev @ 50 NONAME + _ZN15COmxILComponentD2Ev @ 51 NONAME + _ZN15COmxILImagePort10ConstructLERK20TOmxILCommonPortDataRK6RArrayI20OMX_IMAGE_CODINGTYPEERKS3_I20OMX_COLOR_FORMATTYPEE @ 52 NONAME + _ZN15COmxILImagePort10Extension_EjRPvS0_ @ 53 NONAME + _ZN15COmxILImagePort10FreeBufferEP20OMX_BUFFERHEADERTYPERi @ 54 NONAME + _ZN15COmxILImagePort10FreeTunnelERi @ 55 NONAME + _ZN15COmxILImagePort12SetParameterE13OMX_INDEXTYPEPKvRi @ 56 NONAME + _ZN15COmxILImagePort13SetBufferSentEP20OMX_BUFFERHEADERTYPERi @ 57 NONAME + _ZN15COmxILImagePort13TunnelRequestEPvmP19OMX_TUNNELSETUPTYPE @ 58 NONAME + _ZN15COmxILImagePort14DoOmxUseBufferEPvPP20OMX_BUFFERHEADERTYPEmS0_S0_mPh @ 59 NONAME + _ZN15COmxILImagePort14PopulateBufferEPP20OMX_BUFFERHEADERTYPEPvmPhRi @ 60 NONAME + _ZN15COmxILImagePort14PopulateTunnelERi @ 61 NONAME + _ZN15COmxILImagePort15StoreBufferMarkEPK12OMX_MARKTYPE @ 62 NONAME + _ZN15COmxILImagePort16DoBufferWrappingEmPhRPvS2_S1_ @ 63 NONAME + _ZN15COmxILImagePort17SetBufferReturnedEP20OMX_BUFFERHEADERTYPE @ 64 NONAME + _ZN15COmxILImagePort18DoBufferAllocationEmRPhRPvS3_S2_ @ 65 NONAME + _ZN15COmxILImagePort18DoBufferUnwrappingEPvS0_S0_S0_ @ 66 NONAME + _ZN15COmxILImagePort20DoBufferDeallocationEPvS0_S0_S0_ @ 67 NONAME + _ZN15COmxILImagePort21DoPortReconfigurationEjRK6TDesC8R13OMX_EVENTTYPE @ 68 NONAME + _ZN15COmxILImagePort22SetTransitionToEnabledEv @ 69 NONAME + _ZN15COmxILImagePort23GetParamImagePortFormatEv @ 70 NONAME + _ZN15COmxILImagePort23SetTransitionToDisabledEv @ 71 NONAME + _ZN15COmxILImagePort24GetSupportedColorFormatsEv @ 72 NONAME + _ZN15COmxILImagePort24GetSupportedImageFormatsEv @ 73 NONAME + _ZN15COmxILImagePort24SetComponentRoleDefaultsEj @ 74 NONAME + _ZN15COmxILImagePort31SetTransitionToEnabledCompletedEv @ 75 NONAME + _ZN15COmxILImagePort32SetTransitionToDisabledCompletedEv @ 76 NONAME + _ZN15COmxILImagePort9SetConfigE13OMX_INDEXTYPEPKvRi @ 77 NONAME + _ZN15COmxILImagePortC2Ev @ 78 NONAME + _ZN15COmxILImagePortD0Ev @ 79 NONAME + _ZN15COmxILImagePortD1Ev @ 80 NONAME + _ZN15COmxILImagePortD2Ev @ 81 NONAME + _ZN15COmxILOtherPort10ConstructLERK20TOmxILCommonPortDataRK6RArrayI20OMX_OTHER_FORMATTYPEE @ 82 NONAME + _ZN15COmxILOtherPort10Extension_EjRPvS0_ @ 83 NONAME + _ZN15COmxILOtherPort10FreeBufferEP20OMX_BUFFERHEADERTYPERi @ 84 NONAME + _ZN15COmxILOtherPort10FreeTunnelERi @ 85 NONAME + _ZN15COmxILOtherPort12SetParameterE13OMX_INDEXTYPEPKvRi @ 86 NONAME + _ZN15COmxILOtherPort13SetBufferSentEP20OMX_BUFFERHEADERTYPERi @ 87 NONAME + _ZN15COmxILOtherPort13TunnelRequestEPvmP19OMX_TUNNELSETUPTYPE @ 88 NONAME + _ZN15COmxILOtherPort14DoOmxUseBufferEPvPP20OMX_BUFFERHEADERTYPEmS0_S0_mPh @ 89 NONAME + _ZN15COmxILOtherPort14PopulateBufferEPP20OMX_BUFFERHEADERTYPEPvmPhRi @ 90 NONAME + _ZN15COmxILOtherPort14PopulateTunnelERi @ 91 NONAME + _ZN15COmxILOtherPort15StoreBufferMarkEPK12OMX_MARKTYPE @ 92 NONAME + _ZN15COmxILOtherPort16DoBufferWrappingEmPhRPvS2_S1_ @ 93 NONAME + _ZN15COmxILOtherPort17SetBufferReturnedEP20OMX_BUFFERHEADERTYPE @ 94 NONAME + _ZN15COmxILOtherPort18DoBufferAllocationEmRPhRPvS3_S2_ @ 95 NONAME + _ZN15COmxILOtherPort18DoBufferUnwrappingEPvS0_S0_S0_ @ 96 NONAME + _ZN15COmxILOtherPort20DoBufferDeallocationEPvS0_S0_S0_ @ 97 NONAME + _ZN15COmxILOtherPort21DoPortReconfigurationEjRK6TDesC8R13OMX_EVENTTYPE @ 98 NONAME + _ZN15COmxILOtherPort22SetTransitionToEnabledEv @ 99 NONAME + _ZN15COmxILOtherPort23GetParamOtherPortFormatEv @ 100 NONAME + _ZN15COmxILOtherPort23SetTransitionToDisabledEv @ 101 NONAME + _ZN15COmxILOtherPort24GetSupportedOtherFormatsEv @ 102 NONAME + _ZN15COmxILOtherPort24SetComponentRoleDefaultsEj @ 103 NONAME + _ZN15COmxILOtherPort31SetTransitionToEnabledCompletedEv @ 104 NONAME + _ZN15COmxILOtherPort32SetTransitionToDisabledCompletedEv @ 105 NONAME + _ZN15COmxILOtherPort9SetConfigE13OMX_INDEXTYPEPKvRi @ 106 NONAME + _ZN15COmxILOtherPortC2Ev @ 107 NONAME + _ZN15COmxILOtherPortD0Ev @ 108 NONAME + _ZN15COmxILOtherPortD1Ev @ 109 NONAME + _ZN15COmxILOtherPortD2Ev @ 110 NONAME + _ZN15COmxILVideoPort10ConstructLERK20TOmxILCommonPortDataRK6RArrayI20OMX_VIDEO_CODINGTYPEERKS3_I20OMX_COLOR_FORMATTYPEE @ 111 NONAME + _ZN15COmxILVideoPort10Extension_EjRPvS0_ @ 112 NONAME + _ZN15COmxILVideoPort10FreeBufferEP20OMX_BUFFERHEADERTYPERi @ 113 NONAME + _ZN15COmxILVideoPort10FreeTunnelERi @ 114 NONAME + _ZN15COmxILVideoPort12SetParameterE13OMX_INDEXTYPEPKvRi @ 115 NONAME + _ZN15COmxILVideoPort13SetBufferSentEP20OMX_BUFFERHEADERTYPERi @ 116 NONAME + _ZN15COmxILVideoPort13TunnelRequestEPvmP19OMX_TUNNELSETUPTYPE @ 117 NONAME + _ZN15COmxILVideoPort14DoOmxUseBufferEPvPP20OMX_BUFFERHEADERTYPEmS0_S0_mPh @ 118 NONAME + _ZN15COmxILVideoPort14PopulateBufferEPP20OMX_BUFFERHEADERTYPEPvmPhRi @ 119 NONAME + _ZN15COmxILVideoPort14PopulateTunnelERi @ 120 NONAME + _ZN15COmxILVideoPort15StoreBufferMarkEPK12OMX_MARKTYPE @ 121 NONAME + _ZN15COmxILVideoPort16DoBufferWrappingEmPhRPvS2_S1_ @ 122 NONAME + _ZN15COmxILVideoPort16UpdateCodingTypeER20OMX_VIDEO_CODINGTYPES0_Ri @ 123 NONAME + _ZN15COmxILVideoPort17SetBufferReturnedEP20OMX_BUFFERHEADERTYPE @ 124 NONAME + _ZN15COmxILVideoPort17UpdateColorFormatER20OMX_COLOR_FORMATTYPES0_Ri @ 125 NONAME + _ZN15COmxILVideoPort18DoBufferAllocationEmRPhRPvS3_S2_ @ 126 NONAME + _ZN15COmxILVideoPort18DoBufferUnwrappingEPvS0_S0_S0_ @ 127 NONAME + _ZN15COmxILVideoPort20DoBufferDeallocationEPvS0_S0_S0_ @ 128 NONAME + _ZN15COmxILVideoPort21DoPortReconfigurationEjRK6TDesC8R13OMX_EVENTTYPE @ 129 NONAME + _ZN15COmxILVideoPort22SetTransitionToEnabledEv @ 130 NONAME + _ZN15COmxILVideoPort23GetParamVideoPortFormatEv @ 131 NONAME + _ZN15COmxILVideoPort23SetTransitionToDisabledEv @ 132 NONAME + _ZN15COmxILVideoPort24GetSupportedColorFormatsEv @ 133 NONAME + _ZN15COmxILVideoPort24GetSupportedVideoFormatsEv @ 134 NONAME + _ZN15COmxILVideoPort24SetComponentRoleDefaultsEj @ 135 NONAME + _ZN15COmxILVideoPort31SetTransitionToEnabledCompletedEv @ 136 NONAME + _ZN15COmxILVideoPort32SetTransitionToDisabledCompletedEv @ 137 NONAME + _ZN15COmxILVideoPort9SetConfigE13OMX_INDEXTYPEPKvRi @ 138 NONAME + _ZN15COmxILVideoPortC2Ev @ 139 NONAME + _ZN15COmxILVideoPortD0Ev @ 140 NONAME + _ZN15COmxILVideoPortD1Ev @ 141 NONAME + _ZN15COmxILVideoPortD2Ev @ 142 NONAME + _ZN17TOmxILSpecVersionC1Ev @ 143 NONAME + _ZN17TOmxILSpecVersionC2Ev @ 144 NONAME + _ZN19COmxILConfigManager10ConstructLERK6TDesC8RK15OMX_VERSIONTYPERK13RPointerArrayIS0_E @ 145 NONAME + _ZN19COmxILConfigManager10Extension_EjRPvS0_ @ 146 NONAME + _ZN19COmxILConfigManager12SetParameterE13OMX_INDEXTYPEPKv8OMX_BOOL @ 147 NONAME + _ZN19COmxILConfigManager17InsertParamIndexLEj @ 148 NONAME + _ZN19COmxILConfigManager18InsertConfigIndexLEj @ 149 NONAME + _ZN19COmxILConfigManager20ManagedConfigIndexesEv @ 150 NONAME + _ZN19COmxILConfigManager4NewLERK6TDesC8RK15OMX_VERSIONTYPERK13RPointerArrayIS0_E @ 151 NONAME + _ZN19COmxILConfigManager9SetConfigE13OMX_INDEXTYPEPKv @ 152 NONAME + _ZN19COmxILConfigManagerC1Ev @ 153 NONAME + _ZN19COmxILConfigManagerC2Ev @ 154 NONAME + _ZN19COmxILConfigManagerD0Ev @ 155 NONAME + _ZN19COmxILConfigManagerD1Ev @ 156 NONAME + _ZN19COmxILConfigManagerD2Ev @ 157 NONAME + _ZN20TOmxILCommonPortDataC1E15OMX_VERSIONTYPEm11OMX_DIRTYPEmm18OMX_PORTDOMAINTYPE8OMX_BOOLm22OMX_BUFFERSUPPLIERTYPEm @ 158 NONAME + _ZN20TOmxILCommonPortDataC2E15OMX_VERSIONTYPEm11OMX_DIRTYPEmm18OMX_PORTDOMAINTYPE8OMX_BOOLm22OMX_BUFFERSUPPLIERTYPEm @ 159 NONAME + _ZN21COmxILClientClockPort4NewLERK20TOmxILCommonPortDataRK6RArrayI20OMX_OTHER_FORMATTYPEE @ 160 NONAME + _ZN24COmxILProcessingFunction10Extension_EjRPvS0_ @ 161 NONAME + _ZN24COmxILProcessingFunction19MediaTimeIndicationERK22OMX_TIME_MEDIATIMETYPE @ 162 NONAME + _ZN24COmxILProcessingFunction23ComponentRoleIndicationEj @ 163 NONAME + _ZN24COmxILProcessingFunctionC2ER28MOmxILCallbackNotificationIf @ 164 NONAME + _ZN24COmxILProcessingFunctionD0Ev @ 165 NONAME + _ZN24COmxILProcessingFunctionD1Ev @ 166 NONAME + _ZN24COmxILProcessingFunctionD2Ev @ 167 NONAME + _ZNK10COmxILPort16GetTunnelledPortEv @ 168 NONAME + _ZNK10COmxILPort21GetTunnelledComponentEv @ 169 NONAME + _ZNK10COmxILPort22GetParamPortDefinitionEv @ 170 NONAME + _ZNK10COmxILPort5IndexEv @ 171 NONAME + _ZNK10COmxILPort9IsEnabledEv @ 172 NONAME + _ZNK15COmxILAudioPort12GetParameterE13OMX_INDEXTYPEPv @ 173 NONAME + _ZNK15COmxILAudioPort14IsBufferAtHomeEP20OMX_BUFFERHEADERTYPE @ 174 NONAME + _ZNK15COmxILAudioPort17GetExtensionIndexEPcP13OMX_INDEXTYPE @ 175 NONAME + _ZNK15COmxILAudioPort19HasAllBuffersAtHomeEv @ 176 NONAME + _ZNK15COmxILAudioPort23GetLocalOmxParamIndexesER6RArrayIjE @ 177 NONAME + _ZNK15COmxILAudioPort24GetLocalOmxConfigIndexesER6RArrayIjE @ 178 NONAME + _ZNK15COmxILAudioPort9GetConfigE13OMX_INDEXTYPEPv @ 179 NONAME + _ZNK15COmxILComponent10GetAppDataEv @ 180 NONAME + _ZNK15COmxILComponent12GetCallbacksEv @ 181 NONAME + _ZNK15COmxILComponent16GetConfigManagerEv @ 182 NONAME + _ZNK15COmxILComponent21GetProcessingFunctionEv @ 183 NONAME + _ZNK15COmxILComponent9GetHandleEv @ 184 NONAME + _ZNK15COmxILImagePort12GetParameterE13OMX_INDEXTYPEPv @ 185 NONAME + _ZNK15COmxILImagePort14IsBufferAtHomeEP20OMX_BUFFERHEADERTYPE @ 186 NONAME + _ZNK15COmxILImagePort17GetExtensionIndexEPcP13OMX_INDEXTYPE @ 187 NONAME + _ZNK15COmxILImagePort19HasAllBuffersAtHomeEv @ 188 NONAME + _ZNK15COmxILImagePort23GetLocalOmxParamIndexesER6RArrayIjE @ 189 NONAME + _ZNK15COmxILImagePort23GetParamImagePortFormatEv @ 190 NONAME + _ZNK15COmxILImagePort24GetLocalOmxConfigIndexesER6RArrayIjE @ 191 NONAME + _ZNK15COmxILImagePort24GetSupportedColorFormatsEv @ 192 NONAME + _ZNK15COmxILImagePort24GetSupportedImageFormatsEv @ 193 NONAME + _ZNK15COmxILImagePort9GetConfigE13OMX_INDEXTYPEPv @ 194 NONAME + _ZNK15COmxILOtherPort12GetParameterE13OMX_INDEXTYPEPv @ 195 NONAME + _ZNK15COmxILOtherPort14IsBufferAtHomeEP20OMX_BUFFERHEADERTYPE @ 196 NONAME + _ZNK15COmxILOtherPort17GetExtensionIndexEPcP13OMX_INDEXTYPE @ 197 NONAME + _ZNK15COmxILOtherPort19HasAllBuffersAtHomeEv @ 198 NONAME + _ZNK15COmxILOtherPort23GetLocalOmxParamIndexesER6RArrayIjE @ 199 NONAME + _ZNK15COmxILOtherPort23GetParamOtherPortFormatEv @ 200 NONAME + _ZNK15COmxILOtherPort24GetLocalOmxConfigIndexesER6RArrayIjE @ 201 NONAME + _ZNK15COmxILOtherPort24GetSupportedOtherFormatsEv @ 202 NONAME + _ZNK15COmxILOtherPort9GetConfigE13OMX_INDEXTYPEPv @ 203 NONAME + _ZNK15COmxILVideoPort12GetParameterE13OMX_INDEXTYPEPv @ 204 NONAME + _ZNK15COmxILVideoPort14IsBufferAtHomeEP20OMX_BUFFERHEADERTYPE @ 205 NONAME + _ZNK15COmxILVideoPort17GetExtensionIndexEPcP13OMX_INDEXTYPE @ 206 NONAME + _ZNK15COmxILVideoPort19HasAllBuffersAtHomeEv @ 207 NONAME + _ZNK15COmxILVideoPort23GetLocalOmxParamIndexesER6RArrayIjE @ 208 NONAME + _ZNK15COmxILVideoPort23GetParamVideoPortFormatEv @ 209 NONAME + _ZNK15COmxILVideoPort24GetLocalOmxConfigIndexesER6RArrayIjE @ 210 NONAME + _ZNK15COmxILVideoPort24GetSupportedColorFormatsEv @ 211 NONAME + _ZNK15COmxILVideoPort24GetSupportedVideoFormatsEv @ 212 NONAME + _ZNK15COmxILVideoPort9GetConfigE13OMX_INDEXTYPEPv @ 213 NONAME + _ZNK19COmxILConfigManager12GetParameterE13OMX_INDEXTYPEPv @ 214 NONAME + _ZNK19COmxILConfigManager14FindParamIndexEj @ 215 NONAME + _ZNK19COmxILConfigManager15FindConfigIndexEj @ 216 NONAME + _ZNK19COmxILConfigManager17GetExtensionIndexEPcP13OMX_INDEXTYPE @ 217 NONAME + _ZNK19COmxILConfigManager9GetConfigE13OMX_INDEXTYPEPv @ 218 NONAME + _ZTI10COmxILPort @ 219 NONAME + _ZTI14COmxILPortImpl @ 220 NONAME + _ZTI15COmxILAudioPort @ 221 NONAME + _ZTI15COmxILComponent @ 222 NONAME + _ZTI15COmxILImagePort @ 223 NONAME + _ZTI15COmxILOtherPort @ 224 NONAME + _ZTI15COmxILVideoPort @ 225 NONAME + _ZTI19COmxILAudioPortImpl @ 226 NONAME + _ZTI19COmxILComponentImpl @ 227 NONAME + _ZTI19COmxILConfigManager @ 228 NONAME + _ZTI19COmxILImagePortImpl @ 229 NONAME + _ZTI19COmxILOtherPortImpl @ 230 NONAME + _ZTI19COmxILVideoPortImpl @ 231 NONAME + _ZTI23COmxILConfigManagerImpl @ 232 NONAME + _ZTI24COmxILProcessingFunction @ 233 NONAME + _ZTI27XOmxILCallbackManagerIfImpl @ 234 NONAME + _ZTIN21COmxILCallbackManager16CCallbackCommandE @ 235 NONAME + _ZTIN21COmxILCallbackManager21CBufferRemovalCommandE @ 236 NONAME + _ZTIN21COmxILCallbackManager21CEventCallbackCommandE @ 237 NONAME + _ZTIN21COmxILCallbackManager26CBufferDoneCallbackCommandE @ 238 NONAME + _ZTIN21COmxILCallbackManager26CPortSettingsChangeCommandE @ 239 NONAME + _ZTIN21COmxILCallbackManager30CCompHandleRegistrationCommandE @ 240 NONAME + _ZTIN21COmxILCallbackManager34CTunnelCallbackRegistrationCommandE @ 241 NONAME + _ZTIN21COmxILCallbackManager35CClientCallbacksRegistrationCommandE @ 242 NONAME + _ZTIN21COmxILCallbackManager41CBufferMarkPropagationRegistrationCommandE @ 243 NONAME + _ZTIN9COmxILFsm11COmxILStateE @ 244 NONAME + _ZTIN9COmxILFsm15COmxILStateIdleE @ 245 NONAME + _ZTIN9COmxILFsm16COmxILStatePauseE @ 246 NONAME + _ZTIN9COmxILFsm17COmxILStateLoadedE @ 247 NONAME + _ZTIN9COmxILFsm18COmxILStateInvalidE @ 248 NONAME + _ZTIN9COmxILFsm20COmxILStateExecutingE @ 249 NONAME + _ZTIN9COmxILFsm22COmxILStatePauseToIdleE @ 250 NONAME + _ZTIN9COmxILFsm23COmxILStateIdleToLoadedE @ 251 NONAME + _ZTIN9COmxILFsm23COmxILStateLoadedToIdleE @ 252 NONAME + _ZTIN9COmxILFsm26COmxILStateExecutingToIdleE @ 253 NONAME + _ZTIN9COmxILFsm27COmxILStateWaitForResourcesE @ 254 NONAME + _ZTV10COmxILPort @ 255 NONAME + _ZTV14COmxILPortImpl @ 256 NONAME + _ZTV15COmxILAudioPort @ 257 NONAME + _ZTV15COmxILComponent @ 258 NONAME + _ZTV15COmxILImagePort @ 259 NONAME + _ZTV15COmxILOtherPort @ 260 NONAME + _ZTV15COmxILVideoPort @ 261 NONAME + _ZTV19COmxILAudioPortImpl @ 262 NONAME + _ZTV19COmxILComponentImpl @ 263 NONAME + _ZTV19COmxILConfigManager @ 264 NONAME + _ZTV19COmxILImagePortImpl @ 265 NONAME + _ZTV19COmxILOtherPortImpl @ 266 NONAME + _ZTV19COmxILVideoPortImpl @ 267 NONAME + _ZTV23COmxILConfigManagerImpl @ 268 NONAME + _ZTV24COmxILProcessingFunction @ 269 NONAME + _ZTV27XOmxILCallbackManagerIfImpl @ 270 NONAME + _ZTVN21COmxILCallbackManager16CCallbackCommandE @ 271 NONAME + _ZTVN21COmxILCallbackManager21CBufferRemovalCommandE @ 272 NONAME + _ZTVN21COmxILCallbackManager21CEventCallbackCommandE @ 273 NONAME + _ZTVN21COmxILCallbackManager26CBufferDoneCallbackCommandE @ 274 NONAME + _ZTVN21COmxILCallbackManager26CPortSettingsChangeCommandE @ 275 NONAME + _ZTVN21COmxILCallbackManager30CCompHandleRegistrationCommandE @ 276 NONAME + _ZTVN21COmxILCallbackManager34CTunnelCallbackRegistrationCommandE @ 277 NONAME + _ZTVN21COmxILCallbackManager35CClientCallbacksRegistrationCommandE @ 278 NONAME + _ZTVN21COmxILCallbackManager41CBufferMarkPropagationRegistrationCommandE @ 279 NONAME + _ZTVN9COmxILFsm11COmxILStateE @ 280 NONAME + _ZTVN9COmxILFsm15COmxILStateIdleE @ 281 NONAME + _ZTVN9COmxILFsm16COmxILStatePauseE @ 282 NONAME + _ZTVN9COmxILFsm17COmxILStateLoadedE @ 283 NONAME + _ZTVN9COmxILFsm18COmxILStateInvalidE @ 284 NONAME + _ZTVN9COmxILFsm20COmxILStateExecutingE @ 285 NONAME + _ZTVN9COmxILFsm22COmxILStatePauseToIdleE @ 286 NONAME + _ZTVN9COmxILFsm23COmxILStateIdleToLoadedE @ 287 NONAME + _ZTVN9COmxILFsm23COmxILStateLoadedToIdleE @ 288 NONAME + _ZTVN9COmxILFsm26COmxILStateExecutingToIdleE @ 289 NONAME + _ZTVN9COmxILFsm27COmxILStateWaitForResourcesE @ 290 NONAME + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,28 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +PRJ_PLATFORMS +BASEDEFAULT + +PRJ_EXPORTS +// OMX IL Component Extensions +omxilcomp.iby /epoc32/rom/include/omxilcomp.iby + +PRJ_MMPFILES +// Component common framework +../mmpfiles/omxilcomponentcommon.mmp + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/group/omxilcomp.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/group/omxilcomp.iby Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,28 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalTechnology +*/ + +#ifndef OMXILCOMP_IBY +#define OMXILCOMP_IBY + +// OMX IL component common +file=ABI_DIR\BUILD_DIR\omxilcomponentcommon.dll System\Libs\omxilcomponentcommon.dll + +#endif // OMXILCOMP_IBY diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/mmpfiles/omxilcomponentcommon.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/mmpfiles/omxilcomponentcommon.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,73 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +#include +#include "../src/omxilcomponent.hrh" // get UIDs + +TARGET omxilcomponentcommon.dll +CAPABILITY ALL -TCB +TARGETTYPE dll +UID KSharedLibraryUidDefine KUidSymbianOmxILComponentCommonDll +VENDORID 0x70000001 + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +SOURCEPATH ../src/ +SOURCE omxilcomponent.cpp +SOURCE omxilcomponentimpl.cpp +SOURCE omxilcallbackmanagerifimpl.cpp +SOURCE omxilcallbackmanager.cpp +SOURCE omxilconfigmanager.cpp +SOURCE omxilconfigmanagerimpl.cpp +SOURCE omxilincontextcallbackmanager.cpp +SOURCE omxilfsm.cpp +SOURCE omxilport.cpp +SOURCE omxilportimpl.cpp +SOURCE omxilaudioport.cpp +SOURCE omxilaudioportimpl.cpp +SOURCE omxilportmanager.cpp +SOURCE omxilprocessingfunction.cpp +SOURCE omxilstate.cpp +SOURCE omxilspecversion.cpp +SOURCE omxilutil.cpp +SOURCE omxilimageport.cpp +SOURCE omxilimageportimpl.cpp +SOURCE omxilvideoport.cpp +SOURCE omxilvideoportimpl.cpp +SOURCE omxilotherport.cpp +SOURCE omxilotherportimpl.cpp +SOURCE omxilclientclockport.cpp + +LIBRARY euser.lib +LIBRARY mmfserverbaseclasses.lib + +// Uncomment to activate debug tracing in this module +//MACRO _OMXIL_COMMON_DEBUG_TRACING_ON + + +// Uncomment to activate tracing of FillThisBuffer and EmptyThisBuffer +// This produces a *lot* of output +//MACRO _OMXIL_COMMON_BUFFER_TRACING_ON + +// Uncomment to activate spec version checks in OMX IL structs +//MACRO _OMXIL_COMMON_SPEC_VERSION_CHECKS_ON + +// Uncomment to activate the "alternatives to App Note IL #318" +// See IL516c_Issue#1-Race-Conditions-Solutions-for-1.y_Nokia.pdf +// MACRO _OMXIL_COMMON_IL516C_ON + + +NOSTRICTDEF + +SMPSAFE diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/log.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/log.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,149 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +#ifndef __SWI_LOG_H__ +#define __SWI_LOG_H__ + +#include +namespace DSD +{ + +#ifdef _DEBUG + +//#define _OMXIL_COMMON_DEBUG_TRACING_ON +#ifdef _OMXIL_COMMON_DEBUG_TRACING_ON + + + +class TTruncateOverflowHandler16 : public TDes16Overflow + { + public: + virtual void Overflow( TDes16& aDes ); + }; + +inline void TTruncateOverflowHandler16::Overflow( TDes16& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +class TTruncateOverflowHandler8 : public TDes8Overflow + { + public: + virtual void Overflow( TDes8& aDes ); + }; + +inline void TTruncateOverflowHandler8::Overflow( TDes8& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +#define DEBUG_PRINTF(a) {DSD::DebugPrintf(__LINE__, __FILE__, a);} +#define DEBUG_PRINTF2(a, b) {DSD::DebugPrintf(__LINE__, __FILE__, a, b);} +#define DEBUG_PRINTF3(a, b, c) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c);} +#define DEBUG_PRINTF4(a, b, c, d) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d);} +#define DEBUG_PRINTF5(a, b, c, d, e) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d, e);} + +#define DEBUG_CODE_SECTION(a) TRAP_IGNORE({ a; }) + +// UTF-8 overload of the DebufPrintf method. Should be used by default, +// since it's cheaper both in CPU cycles and stack space. + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler8 overflowHandler8; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<1024> buffer; + _LIT8(KSwiLogPrefix, "[ccommon] "); + _LIT8(KSwiLineFileFormat, "TID[%d] : [%s:%d] -- "); + buffer.Append(KSwiLogPrefix); + RThread thread; + TUint threadId = thread.Id(); + thread.Close(); + RProcess proc; + TFileName fName = proc.FileName(); + proc.Close(); + buffer.AppendFormat(KSwiLineFileFormat, threadId, aFile, aLine); + buffer.AppendFormatList(aFormat, list ,&overflowHandler8 ); + buffer.Append(_L8("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } + +// Unicode DebufPrintf overload + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler16 overflowHandler16; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<256> header; + _LIT8(KSwiLogPrefix, "[common] "); + _LIT8(KSwiLineFileFormat, "%Ld Line: % 5d, File: %s -- "); + header.Append(KSwiLogPrefix); + header.AppendFormat(KSwiLineFileFormat, now.Int64(), aLine, aFile); + + TBuf<1024> buffer; + buffer.Copy(header); + buffer.AppendFormatList(aFormat, list ,&overflowHandler16); + buffer.Append(_L("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + + +} // namespace DSD + +#endif // __SWI_LOG_H__ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilaudioport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilaudioport.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,387 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include "omxilaudioportimpl.h" +#include +#include + +EXPORT_C +COmxILAudioPort::~COmxILAudioPort() + { + DEBUG_PRINTF(_L8("COmxILAudioPort::~COmxILAudioPort")); + delete ipAudioPortImpl; + } + +EXPORT_C +COmxILAudioPort::COmxILAudioPort() + { + DEBUG_PRINTF(_L8("COmxILAudioPort::COmxILAudioPort")); + } + +EXPORT_C void COmxILAudioPort::ConstructL(const TOmxILCommonPortData& aCommonPortData, const RArray& aSupportedAudioFormats) + { + COmxILPort::ConstructL(aCommonPortData); //create COmxILPortImpl + ipAudioPortImpl=COmxILAudioPortImpl::NewL(aSupportedAudioFormats, aCommonPortData); //create COmxILAudioPortImpl + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::GetLocalOmxParamIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILAudioPort::GetLocalOmxParamIndexes")); + + // Always collect local indexes from parent + OMX_ERRORTYPE omxRetValue = + COmxILPort::GetLocalOmxParamIndexes(aIndexArray); + + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + TInt err = aIndexArray.InsertInOrder(OMX_IndexParamAudioPortFormat); + + // Note that index duplication is OK. + if (KErrNone != err && KErrAlreadyExists != err) + { + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::GetLocalOmxConfigIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILAudioPort::GetLocalOmxConfigIndexes")); + + // Always collect local indexes from parent + return COmxILPort::GetLocalOmxConfigIndexes(aIndexArray); + + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILAudioPort::GetParameter")); + __ASSERT_ALWAYS(ipAudioPortImpl, User::Panic(KOmxILAudioPortPanicCategory, 1)); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + + switch(aParamIndex) + { + case OMX_IndexParamAudioPortFormat: + { + omxRetValue=ipAudioPortImpl->GetParameter(aParamIndex, apComponentParameterStructure); + } + break; + + default: + { + // Try the parent's indexes + omxRetValue=COmxILPort::GetParameter(aParamIndex, apComponentParameterStructure); + } + }; + + return omxRetValue; + + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetParameter")); + __ASSERT_ALWAYS(ipAudioPortImpl, User::Panic(KOmxILAudioPortPanicCategory, 1)); + aUpdateProcessingFunction = EFalse; + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamAudioPortFormat: + { + omxRetValue=ipAudioPortImpl->SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + } + break; + + default: + { + // Try the parent's indexes + omxRetValue = COmxILPort::SetParameter(aParamIndex, + apComponentParameterStructure, + aUpdateProcessingFunction); + } + }; + + return omxRetValue; + } + + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILPort::GetConfig")); + return COmxILPort::GetConfig(aConfigIndex, + apComponentConfigStructure); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILPort::SetConfig")); + return COmxILPort::SetConfig(aConfigIndex, + apComponentConfigStructure, + aUpdateProcessingFunction); + + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::GetExtensionIndex(OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const + { + return COmxILPort::GetExtensionIndex(aParameterName, + apIndexType); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& aPortPopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILAudioPort::PopulateBuffer : pBuffer [%X]"), apBuffer); + return COmxILPort::PopulateBuffer(appBufferHdr, + apAppPrivate, + aSizeBytes, + apBuffer, + aPortPopulationCompleted); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::FreeBuffer(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILAudioPort::FreeBuffer : BUFFER [%X]"), apBufferHeader); + return COmxILPort::FreeBuffer(apBufferHeader, aPortDepopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::TunnelRequest(OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::TunnelRequest")); + return COmxILPort::TunnelRequest(aTunneledComp, + aTunneledPort, + apTunnelSetup); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::PopulateTunnel(TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::PopulateTunnel")); + return COmxILPort::PopulateTunnel(portPopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::FreeTunnel(TBool& portDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::FreeTunnel")); + return COmxILPort::FreeTunnel(portDepopulationCompleted); + } + +EXPORT_C TBool +COmxILAudioPort::SetBufferSent(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetBufferSent")); + return COmxILPort::SetBufferSent(apBufferHeader, + aBufferMarkedWithOwnMark); + } + +EXPORT_C TBool +COmxILAudioPort::SetBufferReturned(OMX_BUFFERHEADERTYPE* apBufferHeader) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetBufferReturned")); + return COmxILPort::SetBufferReturned(apBufferHeader); + } + +EXPORT_C void +COmxILAudioPort::SetTransitionToEnabled() + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetTransitionToEnabled")); + return COmxILPort::SetTransitionToEnabled(); + } + +EXPORT_C void +COmxILAudioPort::SetTransitionToDisabled() + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetTransitionToDisabled")); + return COmxILPort::SetTransitionToDisabled(); + } + +EXPORT_C void +COmxILAudioPort::SetTransitionToDisabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetTransitionToDisabledCompleted")); + return COmxILPort::SetTransitionToDisabledCompleted(); + } + +EXPORT_C void +COmxILAudioPort::SetTransitionToEnabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetTransitionToEnabledCompleted")); + return COmxILPort::SetTransitionToEnabledCompleted(); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::StoreBufferMark(const OMX_MARKTYPE* apMark) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::StoreBufferMark")); + return COmxILPort::StoreBufferMark(apMark); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::SetComponentRoleDefaults(TUint aComponentRoleIndex) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::SetComponentRoleDefaults")); + + return COmxILPort::SetComponentRoleDefaults(aComponentRoleIndex); + } + +EXPORT_C TBool +COmxILAudioPort::HasAllBuffersAtHome() const + { + return COmxILPort::HasAllBuffersAtHome(); + } + +EXPORT_C TBool +COmxILAudioPort::IsBufferAtHome(OMX_BUFFERHEADERTYPE* apBufferHeader) const + { + DEBUG_PRINTF2(_L8("COmxILAudioPort::IsBufferAtHome : [%X]"), apBufferHeader); + return COmxILPort::IsBufferAtHome(apBufferHeader); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::DoPortReconfiguration(TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::DoPortReconfiguration")); + + return COmxILPort::DoPortReconfiguration(aPortSettingsIndex, + aPortSettings, + aEventForILClient); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::DoBufferAllocation(OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF2(_L8("COmxILAudioPort::DoBufferAllocation : aSizeBytes[%u]"), aSizeBytes); + return COmxILPort::DoBufferAllocation(aSizeBytes, + apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILAudioPort::DoBufferDeallocation(OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::DoBufferDeallocation")); + return COmxILPort::DoBufferDeallocation(apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::DoBufferWrapping(OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILAudioPort::DoBufferWrapping")); + return COmxILPort::DoBufferWrapping(aSizeBytes, + apBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILAudioPort::DoBufferUnwrapping(OMX_PTR apBuffer, + OMX_PTR appPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + + DEBUG_PRINTF(_L8("COmxILAudioPort::DoBufferUnwrapping")); + return COmxILPort::DoBufferUnwrapping(apBuffer, + appPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C OMX_ERRORTYPE +COmxILAudioPort::DoOmxUseBuffer(OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer) + { + + DEBUG_PRINTF(_L8("COmxILAudioPort::DoOmxUseBuffer")); + return COmxILPort::DoOmxUseBuffer(aTunnelledComponent, + appBufferHdr, + aTunnelledPortIndex, + apPortPrivate, + apPlatformPrivate, + aSizeBytes, + apBuffer); + } + +EXPORT_C +TInt COmxILAudioPort::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return COmxILPort::Extension_(aExtensionId, a0, a1); + } + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilaudioportimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilaudioportimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,161 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include +#include "omxilaudioportimpl.h" +#include + +COmxILAudioPortImpl* COmxILAudioPortImpl::NewL(const RArray& aSupportedAudioFormats, + const TOmxILCommonPortData& aCommonPortData) + { + COmxILAudioPortImpl* self = new(ELeave) COmxILAudioPortImpl(); + CleanupStack::PushL(self); + self->ConstructL(aSupportedAudioFormats, aCommonPortData); + CleanupStack::Pop(); + return self; + } + +void COmxILAudioPortImpl::ConstructL(const RArray& aSupportedAudioFormats, + const TOmxILCommonPortData& aCommonPortData) + { + iParamAudioPortFormat.nSize = sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE); + iParamAudioPortFormat.nVersion = aCommonPortData.iOmxVersion; + iParamAudioPortFormat.nPortIndex = aCommonPortData.iPortIndex; + iParamAudioPortFormat.nIndex = 0; + + TUint count = aSupportedAudioFormats.Count(); + for (TInt i = 0; i < count; i++) + { + iSupportedAudioFormats.AppendL(aSupportedAudioFormats[i]); + } + iParamAudioPortFormat.eEncoding = count ? iSupportedAudioFormats[0] : OMX_AUDIO_CodingUnused; + } + +COmxILAudioPortImpl::~COmxILAudioPortImpl() + { + DEBUG_PRINTF(_L8("COmxILAudioPortImpl::~COmxILAudioPortImpl")); + iSupportedAudioFormats.Close(); + } + +COmxILAudioPortImpl::COmxILAudioPortImpl() + { + DEBUG_PRINTF(_L8("COmxILAudioPortImpl::COmxILAudioPortImpl")); + } + +OMX_ERRORTYPE +COmxILAudioPortImpl::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILAudioPortImpl::GetParameter")); + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamAudioPortFormat: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentParameterStructure, + sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)))) + { + return omxRetValue; + } + + OMX_AUDIO_PARAM_PORTFORMATTYPE* pParamAudioPortFormat + = static_cast(apComponentParameterStructure); + + if (pParamAudioPortFormat->nIndex >= + iSupportedAudioFormats.Count()) + { + return OMX_ErrorNoMore; + } + + pParamAudioPortFormat->eEncoding = + iSupportedAudioFormats[pParamAudioPortFormat->nIndex]; + } + break; + + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILAudioPortPanicCategory, 1)); + + }; + return OMX_ErrorNone; + } + +OMX_ERRORTYPE +COmxILAudioPortImpl::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILAudioPortImpl::SetParameter")); + aUpdateProcessingFunction = EFalse; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamAudioPortFormat: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE)))) + { + return omxRetValue; + } + + const OMX_AUDIO_PARAM_PORTFORMATTYPE* pParamAudioPortFormat + = static_cast( + apComponentParameterStructure); + + // Check in case the specified format is not actually supported by this + // port + OMX_AUDIO_CODINGTYPE newDefaultCodingType = + pParamAudioPortFormat->eEncoding; + + if (newDefaultCodingType > OMX_AUDIO_CodingMax) + { + return OMX_ErrorBadParameter; + } + + if (KErrNotFound == iSupportedAudioFormats.Find(newDefaultCodingType)) + { + return OMX_ErrorUnsupportedSetting; + } + + // Set the new default format, but check first that we are actually + // changing something... + if (iParamAudioPortFormat.eEncoding != newDefaultCodingType) + { + iParamAudioPortFormat.eEncoding = newDefaultCodingType; + // This is an indication to the PortManager that the processing + // function needs to get updated + // + aUpdateProcessingFunction = ETrue; + } + } + break; + + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILAudioPortPanicCategory, 1)); + }; + + return OMX_ErrorNone; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilaudioportimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilaudioportimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,53 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILAUDIOPORTIMPL_H +#define OMXILAUDIOPORTIMPL_H + +#include +#include +#include +#include +#include + +class COmxILAudioPortImpl : public CBase + { +public: + static COmxILAudioPortImpl* NewL(const RArray& aSupportedAudioFormats, + const TOmxILCommonPortData& aCommonPortData); + ~COmxILAudioPortImpl(); + OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction); + +private: + COmxILAudioPortImpl(); + void ConstructL(const RArray& aSupportedAudioFormats, + const TOmxILCommonPortData& aCommonPortData); +private: + RArray iSupportedAudioFormats; + OMX_AUDIO_PARAM_PORTFORMATTYPE iParamAudioPortFormat; + }; + +#endif // OMXILAUDIOPORTIMPL_H + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanager.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1084 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include "omxilcallbackmanager.h" +#include "omxilfsm.h" +#include +#include +#include "omxilportmanagerif.h" + +const TInt COmxILCallbackManager::KMaxMsgQueueEntries; + + +COmxILCallbackManager* +COmxILCallbackManager::NewL( + OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::NewL")); + COmxILCallbackManager* self = new (ELeave)COmxILCallbackManager( + apComponentHandle, + apAppData, + apCallbacks); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void +COmxILCallbackManager::ConstructL() + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::ConstructL")); + + CActiveScheduler::Add(this); + User::LeaveIfError(iCommandQueue.CreateLocal(KMaxMsgQueueEntries)); + iCommandQueue.NotifyDataAvailable(iStatus); + + User::LeaveIfError(iPendingQueue.CreateLocal(KMaxMsgQueueEntries)); + + SetActive(); + + } + +COmxILCallbackManager::COmxILCallbackManager(OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks) + : + CActive(CActive::EPriorityStandard), + XOmxILCallbackManagerIfImpl( + static_cast(apComponentHandle), + apAppData, + apCallbacks), + iCommandQueue(), + iPendingQueue(), + iFlushPendingQueue(EFalse), + iCurrentState(OMX_StateLoaded), + iPreviousState(OMX_StateLoaded) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::COmxILCallbackManager")); + } + + +COmxILCallbackManager::~COmxILCallbackManager() + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::~COmxILCallbackManager")); + + Cancel(); + + CleanUpQueue(iPendingQueue); + + CleanUpQueue(iCommandQueue); + + } + + +void +COmxILCallbackManager::CleanUpQueue(RCallbackManagerQueue& aQueue) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::CleanUpQueue")); + + if (aQueue.Handle() != 0) + { + CCallbackCommand* pCommand = 0; + TInt err = KErrNone; + while ((err = aQueue.Receive(pCommand)) == KErrNone) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::CleanUpQueue : aQueue.Receive [%X]"), pCommand); + delete pCommand; + pCommand = 0; + } + + if (KErrNone != err) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::CleanUpQueue : aQueue.Receive returned error [%d]"), err); + if (KErrNoMemory == err) + { + HandleInsufficientResources(); + } + } + + } + + aQueue.Close(); + + } + + +void +COmxILCallbackManager::SetPortManager(MOmxILPortManagerIf& apPortManager) + { + DoSetPortManager(apPortManager); + } + +void +COmxILCallbackManager::SetFsm(COmxILFsm& apFsm) + { + DoSetFsm(apFsm); + } + +OMX_ERRORTYPE +COmxILCallbackManager::RegisterComponentHandle(OMX_HANDLETYPE aComponentHandle) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::RegisterComponentHandle")); + + __ASSERT_DEBUG(aComponentHandle, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + + CCompHandleRegistrationCommand* pHandleReg = + new CCompHandleRegistrationCommand(aComponentHandle); + if (!pHandleReg || (iCommandQueue.Send(pHandleReg) != KErrNone)) + { + delete pHandleReg; + DoRegisterComponentHandle(aComponentHandle); + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + +/** + The IL Client callback registration is handled in this implementation + asynchronously. Note that this implementation assumes that the IL Client + will update the callbacks information once all expected callbacks from this + component have already been received and therefore, the callback change will + be safe leading to no race condition at the IL Client side. + + @param apCallbacks The IL Client callback structure. + + @param apAppData Pointer to an application provided value so that the + application can have a component specific context when receiving + the callback. + + @return OMX_ERRORTYPE + */ +OMX_ERRORTYPE +COmxILCallbackManager::RegisterILClientCallbacks( + const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::RegisterILClientCallbacks")); + + CClientCallbacksRegistrationCommand* pClientCBacksReg = + new CClientCallbacksRegistrationCommand( + apCallbacks, + apAppData); + if (!pClientCBacksReg || (iCommandQueue.Send(pClientCBacksReg) != KErrNone)) + { + delete pClientCBacksReg; + DoRegisterILClientCallbacks(apCallbacks, apAppData); + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILCallbackManager::RegisterTunnelCallback( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::RegisterTunnelCallback : aTunnelledComponentHandle [%x]"), aTunnelledComponentHandle); + + CTunnelCallbackRegistrationCommand* pTunnelCBacksReg = + new CTunnelCallbackRegistrationCommand(aLocalPortIndex, + aLocalPortDirection, + aTunnelledComponentHandle, + aTunnelledPortIndex); + + if (!pTunnelCBacksReg || (iCommandQueue.Send(pTunnelCBacksReg) != KErrNone)) + { + delete pTunnelCBacksReg; + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILCallbackManager::DeregisterTunnelCallback( + OMX_U32 aLocalPortIndex) + { + + DEBUG_PRINTF(_L8("COmxILCallbackManager::DeregisterTunnelCallback")); + + return RegisterTunnelCallback(aLocalPortIndex, + OMX_DirMax, + 0, + 0); + + } + +OMX_ERRORTYPE +COmxILCallbackManager::RegisterBufferMarkPropagationPort( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::RegisterBufferMarkPropagationPort")); + + CBufferMarkPropagationRegistrationCommand* pBufferMarkPropReg = + new CBufferMarkPropagationRegistrationCommand(aPortIndex, + aPropagationPortIndex); + if (!pBufferMarkPropReg || (iCommandQueue.Send(pBufferMarkPropReg) != KErrNone)) + { + delete pBufferMarkPropReg; + HandleInsufficientResources(); + } + + return OMX_ErrorNone; + + } + +TBool +COmxILCallbackManager::BufferRemovalIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::BufferRemovalIndication")); + + CBufferRemovalCommand* pBufferRemovalCmd = + new CBufferRemovalCommand(apBufferHeader, aDirection); + + if (!pBufferRemovalCmd || + (iCommandQueue.Send(pBufferRemovalCmd) != KErrNone)) + { + delete pBufferRemovalCmd; + HandleInsufficientResources(); + } + + // Always return false now as the buffer would be removed asynchronously + return EFalse; + + } + +OMX_ERRORTYPE +COmxILCallbackManager::TransitionCompleteNotification(OMX_STATETYPE aOmxState) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::TransitionCompleteNotification")); + + return EventNotificationImpl(OMX_EventCmdComplete, + OMX_CommandStateSet, + aOmxState, + 0); + + } + + +OMX_ERRORTYPE +COmxILCallbackManager::CommandCompleteNotification(OMX_COMMANDTYPE aOmxCommand, + OMX_U32 aOmxPortIndex) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::CommandCompleteNotification")); + + return EventNotification(OMX_EventCmdComplete, + aOmxCommand, + aOmxPortIndex, + 0); + + } + +#ifdef _OMXIL_COMMON_IL516C_ON +OMX_ERRORTYPE +COmxILCallbackManager::EjectBuffersRequest(OMX_U32 aLocalOmxPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::EjectBuffersRequest : aLocalOmxPortIndex [%u]"), aLocalOmxPortIndex); + + CEjectBuffersRequestCommand* pEjectCBack = + new CEjectBuffersRequestCommand(aLocalOmxPortIndex); + if (!pEjectCBack || (iCommandQueue.Send(pEjectCBack) != KErrNone)) + { + delete pEjectCBack; + HandleInsufficientResources(); + } + + return OMX_ErrorNone; + + } +#endif + +OMX_ERRORTYPE +COmxILCallbackManager::ErrorEventNotification(OMX_ERRORTYPE aOmxError) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::ErrorEventNotification : aOmxError[%X] "), aOmxError); + + return EventNotification(OMX_EventError, + aOmxError, + 0, + 0); + + } + +OMX_ERRORTYPE +COmxILCallbackManager::EventNotification(OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo) + { + // The error code is ignored intentionally, as errors from this function cannot be handled by clients, since they don't have + // another mechanism for reporting an error + (void)EventNotificationImpl(aEvent, aData1, aData2, aExtraInfo); + return OMX_ErrorNone; + } + + +OMX_ERRORTYPE COmxILCallbackManager::EventNotificationImpl(OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo) + { + DEBUG_PRINTF4(_L8("COmxILCallbackManager::EventNotificationImpl : aEvent[%X] aData1[%X] aData2[%u]"), aEvent, aData1, aData2); + + CEventCallbackCommand* pEventCBack = + new CEventCallbackCommand(aEvent, + aData1, + aData2, + aExtraInfo); + if (!pEventCBack || (iCommandQueue.Send(pEventCBack) != KErrNone)) + { + delete pEventCBack; + HandleInsufficientResources(); + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILCallbackManager::BufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::BufferDoneNotificaton")); + + return SendBufferDoneNotification(apBufferHeader, + aLocalPortIndex, + aLocalPortDirection, + CCallbackCommand::EPriorityNormal); + + } + +OMX_ERRORTYPE +COmxILCallbackManager::ClockBufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::ClockBufferDoneNotification")); + + return SendBufferDoneNotification(apBufferHeader, + aLocalPortIndex, + aLocalPortDirection, + CCallbackCommand::EPriorityHigh); + + } + +OMX_ERRORTYPE +COmxILCallbackManager::PortSettingsChangeNotification( + OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::PortSettingsChangeNotification : aLocalPortIndex[%d]"), aLocalPortIndex); + + HBufC8* pPortSettings = aPortSettings.Alloc(); + if (!pPortSettings) + { + HandleInsufficientResources(); + return OMX_ErrorNone; + } + + CPortSettingsChangeCommand* pPortSettingsCmd = + new CPortSettingsChangeCommand(aLocalPortIndex, + aPortSettingsIndex, + pPortSettings); + if (!pPortSettingsCmd) + { + delete pPortSettings; + HandleInsufficientResources(); + return OMX_ErrorNone; + } + + if (iCommandQueue.Send(pPortSettingsCmd) != KErrNone) + { + delete pPortSettingsCmd; // Destructor will delete pPortSettings + HandleInsufficientResources(); + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILCallbackManager::SendBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + TInt aPriority) + { + DEBUG_PRINTF(_L8("COmxILCallbackManager::SendBufferDoneNotification")); + + __ASSERT_ALWAYS(apBufferHeader && + (OMX_DirInput == aLocalPortDirection || + OMX_DirOutput == aLocalPortDirection), + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + + __ASSERT_ALWAYS(apBufferHeader->nOffset + apBufferHeader->nFilledLen + <= apBufferHeader->nAllocLen, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + + CBufferDoneCallbackCommand* pEventCBack = + new CBufferDoneCallbackCommand(apBufferHeader, + aLocalPortIndex, + aLocalPortDirection, + aPriority); + + if (!pEventCBack || (iCommandQueue.Send(pEventCBack) != KErrNone)) + { + delete pEventCBack; + HandleInsufficientResources(); + } + + return OMX_ErrorNone; + + } + + +void +COmxILCallbackManager::RunL() + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::RunL : Handle[%X]"), ipHandle); + + ProcessQueue(iCommandQueue); + + // Setup for next callbacks + iCommandQueue.NotifyDataAvailable(iStatus); + SetActive(); + + } + + +void +COmxILCallbackManager::ProcessQueue(RCallbackManagerQueue& aQueue) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::ProcessQueue : Handle[%X]"), ipHandle); + + CCallbackCommand* pCommand = 0; + + TInt receiveRes = 0; + TBool hasBeenDeferred = EFalse; + while ((receiveRes = aQueue.Receive(pCommand)) == KErrNone) + { + if (pCommand) + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::ProcessQueue : aQueue.Receive [%X]"), + pCommand); + hasBeenDeferred = EFalse; + (*pCommand)(*this, hasBeenDeferred); + if (hasBeenDeferred) + { + // Move the current command to the pending queue + if (iPendingQueue.Send(pCommand) != KErrNone) + { + delete pCommand; + pCommand = 0; + HandleInsufficientResources(); + } + } + else + { + delete pCommand; + pCommand = 0; + } + } + + } + + if (KErrNoMemory == receiveRes) + { + HandleInsufficientResources(); + } + + } + +void +COmxILCallbackManager::DoCancel() + { + DEBUG_PRINTF2(_L8("COmxILCallbackManager::DoCancel : Handle[%X]"), ipHandle); + + iCommandQueue.CancelDataAvailable(); + + } + + +// +// COmxILCallbackManager::RCallbackManagerQueue +// +TBool +COmxILCallbackManager::RCallbackManagerQueue::RemoveBufferDoneCbCommandsByBufferHeader( + COmxILCallbackManager& aCbMgr, + const OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) + { + DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByBufferHeader : Handle[%X]"), aCbMgr.ipHandle); + + if (KErrNone != DrainBackQueue()) + { + aCbMgr.HandleInsufficientResources(); + return EFalse; + } + + if(!iFrontQueue.IsEmpty()) + { + TBool removed = EFalse; + TDblQueIter frontQueueIter(iFrontQueue); + TFrontQueueElement* pLastElement = iFrontQueue.Last(); + TFrontQueueElement* pCurrentElement = 0; + + do + { + pCurrentElement = frontQueueIter++; + __ASSERT_DEBUG(pCurrentElement && pCurrentElement->ipInfo, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + removed = reinterpret_cast( + const_cast(pCurrentElement->ipInfo))-> + DoRemoveBufferDoneCbCommandByBufferHeader(aCbMgr, + apBufferHeader, + aDirection); + if (removed) + { + pCurrentElement->iLink.Deque(); + delete reinterpret_cast( + const_cast(pCurrentElement->ipInfo)); + delete pCurrentElement; + DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByBufferHeader : Removed Buffer Done @ Header [%X]"), apBufferHeader); + return ETrue; + } + } + while (pCurrentElement != pLastElement); + } + + return EFalse; + + } + +TBool +COmxILCallbackManager::RCallbackManagerQueue::RemoveBufferDoneCbCommandsByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex) + { + DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByPortIndex : Handle[%X]"), aCbMgr.ipHandle); + + TBool somethingRemoved = EFalse; + + if (KErrNone != DrainBackQueue()) + { + aCbMgr.HandleInsufficientResources(); + return EFalse; + } + + if(!iFrontQueue.IsEmpty()) + { + TBool removed = EFalse; + TDblQueIter frontQueueIter(iFrontQueue); + TFrontQueueElement* pLastElement = iFrontQueue.Last(); + TFrontQueueElement* pCurrentElement = 0; + + do + { + pCurrentElement = frontQueueIter++; + __ASSERT_DEBUG(pCurrentElement && pCurrentElement->ipInfo, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + removed = reinterpret_cast( + const_cast(pCurrentElement->ipInfo))-> + DoRemoveBufferDoneCbCommandByPortIndex(aCbMgr, + aLocalPortIndex); + if (removed) + { + somethingRemoved = ETrue; + pCurrentElement->iLink.Deque(); + delete reinterpret_cast( + const_cast(pCurrentElement->ipInfo)); + delete pCurrentElement; + DEBUG_PRINTF2(_L8("RCallbackManagerQueue::RemoveBufferDoneCbCommandsByPortIndex : Removed Buffer Done @ Port Index [%d]"), aLocalPortIndex); + } + } + while (pCurrentElement != pLastElement); + } + + return somethingRemoved; + + } + + +TBool +COmxILCallbackManager::RCallbackManagerQueue::ExecuteBufferDoneCbCommandsByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex) + { + DEBUG_PRINTF2(_L8("RCallbackManagerQueue::ExecuteBufferDoneCbCommandsByPortIndex : Handle[%X]"), aCbMgr.ipHandle); + + TBool somethingExecuted = EFalse; + + if (KErrNone != DrainBackQueue()) + { + aCbMgr.HandleInsufficientResources(); + return EFalse; + } + + if(!iFrontQueue.IsEmpty()) + { + TBool executed = EFalse; + TDblQueIter frontQueueIter(iFrontQueue); + TFrontQueueElement* pLastElement = iFrontQueue.Last(); + TFrontQueueElement* pCurrentElement = 0; + + do + { + pCurrentElement = frontQueueIter++; + __ASSERT_DEBUG(pCurrentElement && pCurrentElement->ipInfo, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + executed = reinterpret_cast( + const_cast(pCurrentElement->ipInfo))-> + DoExecuteBufferDoneCbCommandByPortIndex(aCbMgr, + aLocalPortIndex); + if (executed) + { + somethingExecuted = ETrue; + pCurrentElement->iLink.Deque(); + delete reinterpret_cast( + const_cast(pCurrentElement->ipInfo)); + delete pCurrentElement; + DEBUG_PRINTF2(_L8("RCallbackManagerQueue::ExecuteBufferDoneCbCommandsByPortIndex : Executed Buffer Done @ Port Index [%d]"), aLocalPortIndex); + } + } + while (pCurrentElement != pLastElement); + } + + return somethingExecuted; + + } + + +// +// COmxILCallbackManager commands +// + +TBool +COmxILCallbackManager::CCallbackCommand::DoRemoveBufferDoneCbCommandByBufferHeader( + COmxILCallbackManager& /*aCbMgr*/, + const OMX_BUFFERHEADERTYPE* /*apBufferHeader*/, + OMX_DIRTYPE /*aDirection*/) + { + return EFalse; + } + +TBool +COmxILCallbackManager::CCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& /*aCbMgr*/, + OMX_U32 /* aLocalPortIndex */) + { + return EFalse; + } + +TBool +COmxILCallbackManager::CCallbackCommand::DoExecuteBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& /*aCbMgr*/, + OMX_U32 /* aLocalPortIndex */) + { + return EFalse; + } + +void +COmxILCallbackManager::CCompHandleRegistrationCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF2(_L8("CCompHandleRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle); + aCbMgr.DoRegisterComponentHandle(ipHandle); + } + +void +COmxILCallbackManager::CClientCallbacksRegistrationCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF2(_L8("CClientCallbacksRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle); + aCbMgr.DoRegisterILClientCallbacks(ipCallbacks, ipAppData); + } + +void +COmxILCallbackManager::CBufferMarkPropagationRegistrationCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF2(_L8("CBufferMarkPropagationRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle); + + OMX_ERRORTYPE omxError = + aCbMgr.DoRegisterBufferMarkPropagationPort( + iMarkPropagationInfo.iPortIndex, + iMarkPropagationInfo.iPropagationPortIndex); + + if (OMX_ErrorInsufficientResources == omxError) + { + aCbMgr.HandleInsufficientResources(); + } + } + +void +COmxILCallbackManager::CBufferRemovalCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF2(_L8("CBufferRemovalCommand::operator() : Handle[%X]"), aCbMgr.ipHandle); + + // Returned value not relevant + aCbMgr.iPendingQueue.RemoveBufferDoneCbCommandsByBufferHeader( + aCbMgr, + ipBufferHeader, + iDirection); + + // Returned value not relevant + aCbMgr.iCommandQueue.RemoveBufferDoneCbCommandsByBufferHeader( + aCbMgr, + ipBufferHeader, + iDirection); + + + } + +void +COmxILCallbackManager::CTunnelCallbackRegistrationCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF2(_L8("CTunnelCallbackRegistrationCommand::operator() : Handle[%X]"), aCbMgr.ipHandle); + + if (!iTunnelInfo.iTunnelledComponentHandle) + { + // This is a tunnel deregistration command, then remove any pending + // callbacks on that tunnel... + aCbMgr.iCommandQueue.RemoveBufferDoneCbCommandsByPortIndex( + aCbMgr, + iTunnelInfo.iLocalPortIndex); + } + + OMX_ERRORTYPE omxError = + aCbMgr.DoRegisterTunnelCallback(iTunnelInfo.iLocalPortIndex, + iTunnelInfo.iLocalPortDirection, + iTunnelInfo.iTunnelledComponentHandle, + iTunnelInfo.iTunnelledPortIndex); + + if (OMX_ErrorInsufficientResources == omxError) + { + aCbMgr.HandleInsufficientResources(); + } + + } + + +void +COmxILCallbackManager::CEventCallbackCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF2(_L8("CEventCallbackCommand::operator() : Handle[%X]"), aCbMgr.ipHandle); + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + switch(iData1) + { + case OMX_CommandStateSet: + { + aCbMgr.iPreviousState = aCbMgr.iCurrentState; + aCbMgr.iCurrentState = static_cast(iData2); + + DEBUG_PRINTF4(_L8("CEventCallbackCommand::operator() : Handle[%X] iPreviousState[%d] -> iCurrentState[%d]"), aCbMgr.ipHandle, aCbMgr.iPreviousState, aCbMgr.iCurrentState); + + if (OMX_StatePause == aCbMgr.iPreviousState && + OMX_StateIdle == aCbMgr.iCurrentState) + { + // Flush pending queue first... + aCbMgr.ProcessQueue(aCbMgr.iPendingQueue); + + // ... and now signal command completion... + omxError = + aCbMgr.DoEventNotification(iEvent, + iData1, + iData2, + iExtraInfo); + + } + else if (OMX_StatePause == aCbMgr.iPreviousState && + OMX_StateExecuting == aCbMgr.iCurrentState) + { + // Signal command completion first... + omxError = + aCbMgr.DoEventNotification(iEvent, + iData1, + iData2, + iExtraInfo); + + // ... and now flush... + aCbMgr.ProcessQueue(aCbMgr.iPendingQueue); + + } + else + { + // Signal command completion... + omxError = + aCbMgr.DoEventNotification(iEvent, + iData1, + iData2, + iExtraInfo); + + } + + } + break; + + case OMX_CommandPortDisable: + case OMX_CommandFlush: + { + // Process pending queue unconditionally... + aCbMgr.iFlushPendingQueue = ETrue; + + // Flush first... + if (OMX_ALL == iData2) + { + aCbMgr.ProcessQueue(aCbMgr.iPendingQueue); + } + else + { + aCbMgr.iPendingQueue. + ExecuteBufferDoneCbCommandsByPortIndex(aCbMgr, + iData2); + + } + + aCbMgr.iFlushPendingQueue = EFalse; + + // ... and now signal command completion... + omxError = + aCbMgr.DoEventNotification(iEvent, + iData1, + iData2, + iExtraInfo); + + } + break; + + default: + { + // Signal command completion... + omxError = + aCbMgr.DoEventNotification(iEvent, + iData1, + iData2, + iExtraInfo); + + } + + }; + + if (OMX_ErrorInsufficientResources == omxError) + { + aCbMgr.HandleInsufficientResources(); + } + + } + + +void +COmxILCallbackManager::CBufferDoneCallbackCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred) + { + DEBUG_PRINTF2(_L8("CBufferDoneCallbackCommand::operator() : Handle[%X]"), aCbMgr.ipHandle); + + // Only send the buffer done callback if is not in Pause stae or if there + // is a buffer flushing situation... + + if ((OMX_StatePause == aCbMgr.iCurrentState) && + (!aCbMgr.iFlushPendingQueue)) + { + aHasBeenDeferred = ETrue; + return; + } + + OMX_ERRORTYPE omxError = + aCbMgr.DoBufferDoneNotification(ipBufferHeader, + iLocalPortIndex, + iLocalPortDirection); + + if (OMX_ErrorInsufficientResources == omxError) + { + aCbMgr.HandleInsufficientResources(); + } + + } + +TBool +COmxILCallbackManager::CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByBufferHeader( + COmxILCallbackManager& aCbMgr, + const OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) + { + + if (apBufferHeader == ipBufferHeader) + { + __ASSERT_DEBUG(aCbMgr.ipFsm, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + __ASSERT_DEBUG(aDirection == OMX_DirInput || + aDirection == OMX_DirOutput, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + + DEBUG_PRINTF4(_L8("DoRemoveBufferDoneCbCommandByBufferHeader() : Nofiying FSM : Handle[%X] aDirection[%X] apBufferHeader[%X]"), aCbMgr.ipHandle, aDirection, apBufferHeader); + + // Make sure the buffer contents are cleared... + TOmxILUtil::ClearBufferContents( + const_cast(apBufferHeader)); + + if (aDirection == OMX_DirInput) + { + aCbMgr.ipFsm->EmptyThisBuffer( + const_cast(apBufferHeader)); + } + else + { + aCbMgr.ipFsm->FillThisBuffer( + const_cast(apBufferHeader)); + } + return ETrue; + } + + return EFalse; + + } + +// +// This method only prints some logging information for debugging purposes. For +// now, there's no other action to be performed as the deletion is done by the caller. +// +TBool +COmxILCallbackManager::CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& /* aCbMgr */, + OMX_U32 aLocalPortIndex) + { + + if (iLocalPortIndex == aLocalPortIndex) + { + DEBUG_PRINTF2(_L8("CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex() : FOUND -> PortIndex[%d]"), aLocalPortIndex); + return ETrue; + } + + DEBUG_PRINTF2(_L8("CBufferDoneCallbackCommand::DoRemoveBufferDoneCbCommandByPortIndex() : NOT FOUND -> PortIndex[%d]"), aLocalPortIndex); + + return EFalse; + } + + +TBool +COmxILCallbackManager::CBufferDoneCallbackCommand::DoExecuteBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex) + { + + TBool executed = EFalse; + + if (iLocalPortIndex == aLocalPortIndex) + { + TBool hasBeenDeferred = EFalse; + // The only use case for this method is during unconditional flushing + // of the pending queue... + __ASSERT_DEBUG(aCbMgr.iFlushPendingQueue, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + this->operator()(aCbMgr, hasBeenDeferred); + __ASSERT_DEBUG(!hasBeenDeferred, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + executed = ETrue; + } + + DEBUG_PRINTF3(_L8("CBufferDoneCallbackCommand::DoExecuteBufferDoneCbCommandByPortIndex() : %s FOUND -> PortIndex[%d]"), + (executed ? "" : "NOT"), aLocalPortIndex); + + return executed; + + } + + +TBool +XOmxILCallbackManagerIfImpl::TBufferMarkPropagationInfo::Compare( + const TBufferMarkPropagationInfo& aBmpi1, + const TBufferMarkPropagationInfo& aBmpi2) + { + return (aBmpi1.iPortIndex == aBmpi2.iPortIndex ? ETrue : EFalse); + } + +TBool +XOmxILCallbackManagerIfImpl::TOutputPortBufferMarkInfo::Compare( + const TOutputPortBufferMarkInfo& aOpbmi1, + const TOutputPortBufferMarkInfo& aOpbmi2) + { + return (aOpbmi1.iPortIndex == aOpbmi2.iPortIndex ? ETrue : EFalse); + } + +COmxILCallbackManager::CPortSettingsChangeCommand::~CPortSettingsChangeCommand() + { + delete ipPortSettings; + } + +void +COmxILCallbackManager::CPortSettingsChangeCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF3(_L8("CPortSettingsChangeCommand::operator() : Handle[%X], iLocalPortIndex=[%d]"), + aCbMgr.ipHandle, iLocalPortIndex); + + OMX_ERRORTYPE omxError = + aCbMgr.DoPortSettingsChangeNotification(iLocalPortIndex, + iPortSettingsIndex, + *ipPortSettings); + + if (OMX_ErrorInsufficientResources == omxError) + { + aCbMgr.HandleInsufficientResources(); + } + + } + +#ifdef _OMXIL_COMMON_IL516C_ON +void +COmxILCallbackManager::CEjectBuffersRequestCommand::operator()( + COmxILCallbackManager& aCbMgr, TBool& /* aHasBeenDeferred */) + { + DEBUG_PRINTF3(_L8("CEjectBuffersRequestCommand::operator() : Handle[%X], iLocalOmxPortIndex=[%u]"), + aCbMgr.ipHandle, iLocalOmxPortIndex); + + OMX_ERRORTYPE omxError = + aCbMgr.DoEjectBuffersRequest(iLocalOmxPortIndex); + + if (OMX_ErrorInsufficientResources == omxError) + { + aCbMgr.HandleInsufficientResources(); + } + + } +#endif //_OMXIL_COMMON_IL516C_ON diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanager.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,527 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCALLBACKMANAGER_H +#define OMXILCALLBACKMANAGER_H + +#include + +#include "omxilcallbackmanagerif.h" +#include "omxilcallbackmanagerifimpl.h" +#include "primsgqueue.h" + + +/** + Call Back Manager Panic category +*/ +_LIT(KOmxILCallbackManagerPanicCategory, "OmxILCallbackManager"); + + +/** + OpenMAX IL call backs and buffer marks manager. This is an asynchronous + implementation of MOmxILCallbackManagerIf. It keeps and manages the IL + Client callback information as well as the buffer mark propagation info. + + */ +NONSHARABLE_CLASS(COmxILCallbackManager) : + public CActive, + public MOmxILCallbackManagerIf, + private XOmxILCallbackManagerIfImpl + { + + // Declaration of nested private command classes + class CCallbackCommand; + class CCompHandleRegistrationCommand; + class CClientCallbacksRegistrationCommand; + class CTunnelCallbackRegistrationCommand; + class CBufferMarkPropagationRegistrationCommand; + class CBufferRemovalCommand; + class CEventCallbackCommand; + class CBufferDoneCallbackCommand; + class CPortSettingsChangeCommand; +#ifdef _OMXIL_COMMON_IL516C_ON + class CEjectBuffersRequestCommand; +#endif + // Note that the following friends don't break COmxILCallbackManager's + // interface as all friends below are COmxILCallbackManager's private + // nested classes and therefore they are logically part of + // COmxILCallbackManager implementation + friend class CCompHandleRegistrationCommand; + friend class CClientCallbacksRegistrationCommand; + friend class CTunnelCallbackRegistrationCommand; + friend class CBufferMarkPropagationRegistrationCommand; + friend class CBufferRemovalCommand; + friend class CEventCallbackCommand; + friend class CBufferDoneCallbackCommand; + friend class CPortSettingsChangeCommand; +#ifdef _OMXIL_COMMON_IL516C_ON + friend class CEjectBuffersRequestCommand; +#endif + +public: + + static COmxILCallbackManager* NewL( + OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks); + + ~COmxILCallbackManager(); + + void SetPortManager(MOmxILPortManagerIf& apPortManager); + + void SetFsm(COmxILFsm& apFsm); + + + // + // Methods for Callback Registration (from MOmxILCallbackManagerIf) + // + + OMX_ERRORTYPE RegisterComponentHandle( + OMX_HANDLETYPE aComponentHandle); + + OMX_ERRORTYPE RegisterILClientCallbacks( + const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData); + + OMX_ERRORTYPE RegisterTunnelCallback( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex + ); + + OMX_ERRORTYPE DeregisterTunnelCallback( + OMX_U32 aLocalPortIndex); + + OMX_ERRORTYPE RegisterBufferMarkPropagationPort( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex); + + TBool BufferRemovalIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + + // + // Methods for Callback Notification (from MOmxILCallbackManagerIf) + // + + OMX_ERRORTYPE TransitionCompleteNotification( + OMX_STATETYPE aOmxState); + + OMX_ERRORTYPE CommandCompleteNotification( + OMX_COMMANDTYPE aOmxCommand, + OMX_U32 aOmxPortIndex); + +#ifdef _OMXIL_COMMON_IL516C_ON + OMX_ERRORTYPE EjectBuffersRequest( + OMX_U32 aLocalOmxPortIndex); +#endif + + // + // Methods for Callback Notification (from MOmxILCallbackManagerIf) + // + + OMX_ERRORTYPE ErrorEventNotification( + OMX_ERRORTYPE aOmxError); + + OMX_ERRORTYPE EventNotification( + OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo); + + OMX_ERRORTYPE BufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection); + + OMX_ERRORTYPE ClockBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection); + + OMX_ERRORTYPE PortSettingsChangeNotification( + OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings); + + // + // From CActive + // +private: + void RunL(); + void DoCancel(); + +private: + + // Convenience typedef + typedef RPriMsgQueue RCbCmdPriQue; + + /** + COmxILCallbackManager's priority-based command queue. + + This queue is based on RPriMsgQueue but it is specialized to support the + search and deletion of Buffer Done Callback Commands using some specific + search criteria like buffer headers or port indexes. + */ + class RCallbackManagerQueue : public RCbCmdPriQue + { + + public: + + TBool RemoveBufferDoneCbCommandsByBufferHeader( + COmxILCallbackManager& aCbMgr, + const OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + TBool RemoveBufferDoneCbCommandsByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex); + + TBool ExecuteBufferDoneCbCommandsByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex); + + + }; + +private: + + static const TInt KMaxMsgQueueEntries = 30; + +private: + + COmxILCallbackManager(OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks); + void ConstructL(); + + + OMX_ERRORTYPE SendBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + TInt aPriority); + + void ProcessQueue(RCallbackManagerQueue& aQueue); + + void CleanUpQueue(RCallbackManagerQueue& aQueue); + + OMX_ERRORTYPE EventNotificationImpl( + OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo); + +private: + + // COmxILCallbackManager priority queue. + RCallbackManagerQueue iCommandQueue; + + // Queue of buffer done notifications that need to be queued during + // OMX_StatePaused state + RCallbackManagerQueue iPendingQueue; + + // Flag to enable unconditional flushing of buffer done notifications + TBool iFlushPendingQueue; + + OMX_STATETYPE iCurrentState; + OMX_STATETYPE iPreviousState; + + }; + + +// +// COmxILCallbackManager nested classes +// + +/** + Abstract Callback Manager's command class. + */ +class COmxILCallbackManager::CCallbackCommand : public CBase + { + +public: + + enum TCommandPriority + { + EPriorityLow, + EPriorityNormal, + EPriorityHigh, + EPriorityVeryHigh + }; + +public: + + inline CCallbackCommand(TInt aPriority); + + /** + Operator() method that must be implemented to perform the specific + command logic. + + @param [in] aCbMgr The Callback Manager object used as context to the + command operation + */ + virtual void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred) = 0; + + virtual TBool DoRemoveBufferDoneCbCommandByBufferHeader( + COmxILCallbackManager& aCbMgr, + const OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + virtual TBool DoRemoveBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex); + + virtual TBool DoExecuteBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex); + + inline TInt Priority(); + +public: + + TInt iPriority; + + }; + +/** + Callback Manager's command class for registering component handles. + */ +class COmxILCallbackManager::CCompHandleRegistrationCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CCompHandleRegistrationCommand(OMX_HANDLETYPE aComponentHandle); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + +private: + + OMX_COMPONENTTYPE* ipHandle; // Not owned + + }; + +/** + Callback Manager's command class for registering IL Client callbacks . + */ +class COmxILCallbackManager::CClientCallbacksRegistrationCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CClientCallbacksRegistrationCommand( + const OMX_CALLBACKTYPE*& apCallbacks, + const OMX_PTR& apAppData); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + +private: + + const OMX_CALLBACKTYPE* ipCallbacks; // not owned + const OMX_PTR ipAppData; // not owned + + }; + +/** + Callback Manager's command class for registering tunnel callbacks. + */ +class COmxILCallbackManager::CTunnelCallbackRegistrationCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CTunnelCallbackRegistrationCommand( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + + +public: + + TTunnelRegistrationInfo iTunnelInfo; + + }; + +/** + Callback Manager's command class for registering buffer marks info . + */ +class COmxILCallbackManager::CBufferMarkPropagationRegistrationCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CBufferMarkPropagationRegistrationCommand( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + +public: + + TBufferMarkPropagationInfo iMarkPropagationInfo; + + }; + +/** + Callback Manager's command class for buffer header removal. + */ +class COmxILCallbackManager::CBufferRemovalCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CBufferRemovalCommand( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + +public: + + OMX_BUFFERHEADERTYPE* ipBufferHeader; + OMX_DIRTYPE iDirection; + + }; + +/** + Callback Manager's command class for notification of OpenMAX IL events . + */ +class COmxILCallbackManager::CEventCallbackCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CEventCallbackCommand(OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + +private: + + OMX_EVENTTYPE iEvent; + TUint32 iData1; + TUint32 iData2; + OMX_STRING iExtraInfo; + + }; + +/** + Callback Manager's command class for notification of buffer done events . + */ +class COmxILCallbackManager::CBufferDoneCallbackCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CBufferDoneCallbackCommand(OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + TInt aPriority = CCallbackCommand::EPriorityNormal); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + + TBool DoRemoveBufferDoneCbCommandByBufferHeader( + COmxILCallbackManager& aCbMgr, + const OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + TBool DoRemoveBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex); + + TBool DoExecuteBufferDoneCbCommandByPortIndex( + COmxILCallbackManager& aCbMgr, + OMX_U32 aLocalPortIndex); + +private: + + OMX_BUFFERHEADERTYPE* ipBufferHeader; // not owned + OMX_U32 iLocalPortIndex; + OMX_DIRTYPE iLocalPortDirection; + + }; + +/** + Callback Manager's command class for notification of port settings change + events . + */ +class COmxILCallbackManager::CPortSettingsChangeCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CPortSettingsChangeCommand(OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + HBufC8*& apPortSettings); + + ~CPortSettingsChangeCommand(); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + +private: + + OMX_U32 iLocalPortIndex; + TUint iPortSettingsIndex; + HBufC8* ipPortSettings; // This is owned by this class + + }; + +#ifdef _OMXIL_COMMON_IL516C_ON +/** + Callback Manager's command class for requesting buffer ejection from tunnelled component. + */ +class COmxILCallbackManager::CEjectBuffersRequestCommand : + public COmxILCallbackManager::CCallbackCommand + { + +public: + + inline CEjectBuffersRequestCommand(OMX_U32 aLocalOmxPortIndex); + + void operator()(COmxILCallbackManager& aCbMgr, TBool& aHasBeenDeferred); + +private: + + OMX_U32 iLocalOmxPortIndex; + + }; +#endif + + +#include "omxilcallbackmanager.inl" + +#endif // OMXILCALLBACKMANAGER_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanager.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanager.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,145 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +inline +COmxILCallbackManager::CCallbackCommand::CCallbackCommand( + TInt aPriority) + : + iPriority(aPriority) + { + } + +inline TInt +COmxILCallbackManager::CCallbackCommand::Priority() + { + return iPriority; + } + +inline +COmxILCallbackManager::CCompHandleRegistrationCommand::CCompHandleRegistrationCommand( + OMX_HANDLETYPE aComponentHandle) + : + CCallbackCommand(CCallbackCommand::EPriorityVeryHigh), + ipHandle(static_cast(aComponentHandle)) + { + } + +inline +COmxILCallbackManager::CClientCallbacksRegistrationCommand::CClientCallbacksRegistrationCommand( + const OMX_CALLBACKTYPE*& apCallbacks, + const OMX_PTR& apAppData) + : + CCallbackCommand(CCallbackCommand::EPriorityVeryHigh), + ipCallbacks(apCallbacks), + ipAppData(apAppData) + { + } + +inline +COmxILCallbackManager::CTunnelCallbackRegistrationCommand::CTunnelCallbackRegistrationCommand( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex) + : + CCallbackCommand(CCallbackCommand::EPriorityVeryHigh), + iTunnelInfo(aLocalPortIndex, + aLocalPortDirection, + aTunnelledComponentHandle, + aTunnelledPortIndex) + { + } + +inline +COmxILCallbackManager::CBufferMarkPropagationRegistrationCommand:: +CBufferMarkPropagationRegistrationCommand( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex) + : + CCallbackCommand(CCallbackCommand::EPriorityVeryHigh), + iMarkPropagationInfo(aPortIndex, + aPropagationPortIndex) + { + } + +inline +COmxILCallbackManager::CBufferRemovalCommand::CBufferRemovalCommand( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) + : + CCallbackCommand(CCallbackCommand::EPriorityVeryHigh), + ipBufferHeader(apBufferHeader), + iDirection(aDirection) + { + } + +inline +COmxILCallbackManager::CEventCallbackCommand::CEventCallbackCommand( + OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo) + : + CCallbackCommand(CCallbackCommand::EPriorityNormal), + iEvent(aEvent), + iData1(aData1), + iData2(aData2), + iExtraInfo(aExtraInfo) + { + } + +inline +COmxILCallbackManager::CBufferDoneCallbackCommand:: +CBufferDoneCallbackCommand(OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + TInt aPriority) + : + CCallbackCommand(aPriority), + ipBufferHeader(apBufferHeader), + iLocalPortIndex(aLocalPortIndex), + iLocalPortDirection(aLocalPortDirection) + { + } + +inline +COmxILCallbackManager::CPortSettingsChangeCommand:: +CPortSettingsChangeCommand(OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + HBufC8*& apPortSettings) + : + CCallbackCommand(CCallbackCommand::EPriorityNormal), + iLocalPortIndex(aLocalPortIndex), + iPortSettingsIndex(aPortSettingsIndex), + ipPortSettings(apPortSettings) + { + } + +#ifdef _OMXIL_COMMON_IL516C_ON +inline +COmxILCallbackManager::CEjectBuffersRequestCommand:: +CEjectBuffersRequestCommand(OMX_U32 aLocalOmxPortIndex) + : + CCallbackCommand(CCallbackCommand::EPriorityNormal), + iLocalOmxPortIndex(aLocalOmxPortIndex) + { + } +#endif diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanagerif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanagerif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,195 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** +@file +@internalComponent +*/ + +#ifndef OMXILCALLBACKMANAGERIF_H +#define OMXILCALLBACKMANAGERIF_H + +#include + +#include + +// Forward declarations +class MOmxILPortManagerIf; +class COmxILFsm; + +/** + CallBack Manager Interface used by Callback Manager implementations. + */ +class MOmxILCallbackManagerIf : public MOmxILCallbackNotificationIf + { + +public: + + virtual ~MOmxILCallbackManagerIf(); + + /** + Method to update the Port Manager reference + + @param [in] aPortManager The Port Manager + + @return OMX_ERRORTYPE + */ + virtual void SetPortManager(MOmxILPortManagerIf& aPortManager) = 0; + + /** + Method to update the FSM reference + + @param [in] aFsm The FSM + + @return OMX_ERRORTYPE + */ + virtual void SetFsm(COmxILFsm& aFsm) = 0; + + + // + // Methods for Callback Registration/Un-registration + // + + /** + Method to register the component handle + + @param [in] aComponentHandle The component handle + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE RegisterComponentHandle( + OMX_HANDLETYPE aComponentHandle) = 0; + + /** + Method to register the IL Client callbacks + + @param [in] apCallbacks The IL Client callback pointers + + @param [in] apAppData The IL Client data used to provide + component-specific context + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE RegisterILClientCallbacks( + const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData) = 0; + + /** + Method to register a tunnel callback + + @param [in] aLocalPortIndex The tunnel's local port index + + @param [in] aLocalPortDirection The direction of the tunnel's local port + + @param [in] aTunnelledComponentHandle Tunnelled component handle + + @param [in] aTunnelledPortIndex Index of the tunnelled port + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE RegisterTunnelCallback( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex) = 0; + + /** + Method to un-register a tunnel callback + + @param [in] aLocalPortIndex The tunnel's local port index + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE DeregisterTunnelCallback( + OMX_U32 aLocalPortIndex) = 0; + + /** + Method to register buffer mark propagation ports + + @param [in] aPortIndex The index of the input port that receives buffer + marks + + @param [in] aPropagationPortIndex An index of the ouput port where buffer marks + will be propagated + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE RegisterBufferMarkPropagationPort( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex) = 0; + + /** + Method to remove a buffer done commands from the Callback Manager + internal queues, if queueing is in use + + @param [in] apBufferHeader The buffer header contained in the buffer indication + + @param [in] aDirection The direction of the port that handles the buffer + + @return TBool + */ + virtual TBool BufferRemovalIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) = 0; + + // + // Methods for Callback Notification + // + + /** + Method to notify the IL Client of the completion of an OpenMAX IL state + transition + + @param [in] aOmxState The new state + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE TransitionCompleteNotification( + OMX_STATETYPE aOmxState) = 0; + + /** + Method to notify the IL Client of the completion of a OpenMAX IL command + + @param [in] aOmxCommand The command that has been completed + + @param [in] aOmxPortIndex The index of the port where the command + applies, if any + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE CommandCompleteNotification( + OMX_COMMANDTYPE aOmxCommand, + OMX_U32 aOmxPortIndex) = 0; + +#ifdef _OMXIL_COMMON_IL516C_ON + /** + Method to request from the tunnelled component the ejection of the + buffers present in one of its ports + + @param [in] aLocalOmxPortIndex The index of the local port that is + tunnelled to the component that the ejection request applies to + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE EjectBuffersRequest( + OMX_U32 aLocalOmxPortIndex) = 0; +#endif + + }; + +#include "omxilcallbackmanagerif.inl" + +#endif // OMXILCALLBACKMANAGERIF_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanagerif.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanagerif.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,24 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** +@file +@internalComponent +*/ + +inline MOmxILCallbackManagerIf::~MOmxILCallbackManagerIf() + { + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanagerifimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanagerifimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,581 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include "omxilcallbackmanagerifimpl.h" +#include "omxilfsm.h" +#include "omxilportmanagerif.h" +#include + + + + +XOmxILCallbackManagerIfImpl::XOmxILCallbackManagerIfImpl(OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks) + : + ipHandle(static_cast(apComponentHandle)), + ipAppData(apAppData), + ipCallbacks(apCallbacks), + iRegisteredTunnels(), + iBufferMarkPropagationPorts(), + iBufferMarks(), + ipPortManager(0), + ipFsm(0) + { + DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::XOmxILCallbackManagerIfImpl")); + } + + +XOmxILCallbackManagerIfImpl::~XOmxILCallbackManagerIfImpl() + { + DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::~XOmxILCallbackManagerIfImpl")); + // These pointers are cleared to make sure that any further calls on this + // object will fail (e.g., from a threaded PF) + ipHandle = 0; + ipAppData = 0; + ipCallbacks = 0; + + iRegisteredTunnels.Close(); + iBufferMarkPropagationPorts.Close(); + iBufferMarks.Close(); + + ipPortManager = 0; + + ipFsm = 0; + + } + +void +XOmxILCallbackManagerIfImpl::DoSetPortManager(MOmxILPortManagerIf& apPortManager) + { + ipPortManager = &apPortManager; + } + +void +XOmxILCallbackManagerIfImpl::DoSetFsm(COmxILFsm& apFsm) + { + ipFsm = &apFsm; + } + +OMX_ERRORTYPE +XOmxILCallbackManagerIfImpl::DoRegisterComponentHandle(OMX_HANDLETYPE aComponentHandle) + { + DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterComponentHandle")); + + __ASSERT_DEBUG(aComponentHandle, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + ipHandle = static_cast(aComponentHandle); + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +XOmxILCallbackManagerIfImpl::DoRegisterILClientCallbacks(const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData) + { + DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterILClientCallbacks")); + + ipAppData = const_cast(apAppData); + ipCallbacks = const_cast(apCallbacks); + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +XOmxILCallbackManagerIfImpl::DoRegisterTunnelCallback( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex) + { + DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::DoRegisterTunnelCallback")); + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + + if (aTunnelledComponentHandle) + { + // Register tunnelled port + TInt err = iRegisteredTunnels.Append( + TTunnelRegistrationInfo(aLocalPortIndex, + aLocalPortDirection, + aTunnelledComponentHandle, + aTunnelledPortIndex)); + if (KErrNone != err) + { + switch (err) + { + case KErrNoMemory: + { + omxError = OMX_ErrorInsufficientResources; + } + break; + default: + { + omxError = OMX_ErrorUndefined; + } + }; + } + + } + else + { + // Deregister tunnelled port + const TUint tunnelCount = iRegisteredTunnels.Count(); + for (TUint i=0; iEventHandler(ipHandle, + ipAppData, + aEvent, + aData1, + aData2, + aExtraInfo); + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +XOmxILCallbackManagerIfImpl::DoBufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) + { + DEBUG_PRINTF5(_L8("XOmxILCallbackManagerIfImpl::DoBufferDoneNotification : HANDLE [%X] BUFFER [%X] PORT[%d] DIR[%d]"), ipHandle, apBufferHeader, aLocalPortIndex, aLocalPortDirection); + + __ASSERT_ALWAYS(apBufferHeader && + (OMX_DirInput == aLocalPortDirection || + OMX_DirOutput == aLocalPortDirection), + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + __ASSERT_ALWAYS(apBufferHeader->nOffset + apBufferHeader->nFilledLen + <= apBufferHeader->nAllocLen, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + __ASSERT_DEBUG(ipHandle && ipCallbacks, User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + // Look for buffer marks to be signalled or propagated + SignalOrPropagateBufferMarks(apBufferHeader, + aLocalPortDirection); + + // find out whether the port is tunnelled or not + TBool tunnelled = EFalse; + TUint tunnelInfoArrayIndex = 0; + const TUint tunnelCount = iRegisteredTunnels.Count(); + for (TUint i=0; i( + iRegisteredTunnels[tunnelInfoArrayIndex]. + iTunnelledComponentHandle); + + __ASSERT_DEBUG(ipTunnelledComponent, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + // From OMX_Core.h "Callbacks should not return an error to the + // component, so if an error occurs, the application shall handle it + // internally". Callback return error ignored here. + if (OMX_DirInput == aLocalPortDirection) + { + OMX_FillThisBuffer(ipTunnelledComponent, apBufferHeader); + } + else + { + OMX_EmptyThisBuffer(ipTunnelledComponent, apBufferHeader); + } + + } + else + { + OMX_ERRORTYPE (*fp2CBackHandler) + (OMX_HANDLETYPE, OMX_PTR, OMX_BUFFERHEADERTYPE*) = + (aLocalPortDirection == OMX_DirInput ? + ipCallbacks->EmptyBufferDone : + ipCallbacks->FillBufferDone); + + // From OMX_Core.h "Callbacks should not return an error to the + // component, so if an error occurs, the application shall handle it + // internally". Callback return error ignored here. +#ifdef OMX_DEBUG_TRACING_ON + if (aLocalPortDirection == OMX_DirInput) + { + OMX_TRACE_EMPTYBUFFERDONE_IN(ipHandle, ipAppData, apBufferHeader); + } + else + { + OMX_TRACE_FILLBUFFERDONE_IN(ipHandle, ipAppData, apBufferHeader); + } +#endif + fp2CBackHandler(ipHandle, + ipAppData, + apBufferHeader); +#ifdef OMX_DEBUG_TRACING_ON + if (aLocalPortDirection == OMX_DirInput) + { + OMX_TRACE_EMPTYBUFFERDONE_OUT(ipHandle, ipAppData, apBufferHeader, 0); + } + else + { + OMX_TRACE_FILLBUFFERDONE_OUT(ipHandle, ipAppData, apBufferHeader, 0); + } +#endif + + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +XOmxILCallbackManagerIfImpl::DoPortSettingsChangeNotification( + OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings) + { + DEBUG_PRINTF2(_L8("XOmxILCallbackManagerIfImpl::DoPortSettingsChangeNotification : aLocalPortIndex[%d]"), aLocalPortIndex); + + __ASSERT_DEBUG(ipHandle && + ipCallbacks && + ipPortManager, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + HBufC8* pPortSettings = HBufC8::New(aPortSettings.Length()); + if (!pPortSettings) + { + return OMX_ErrorInsufficientResources; + } + *pPortSettings = aPortSettings; + + // This is an event that the port may want to convey to the IL Client... + OMX_EVENTTYPE eventForILClient = OMX_EventMax; + OMX_ERRORTYPE omxRetError = + ipPortManager->PortSettingsChangeIndication(aLocalPortIndex, + aPortSettingsIndex, + *pPortSettings, + eventForILClient); + + delete pPortSettings; + pPortSettings = NULL; + + // Inform the IL Client that some value in one of the ports' configuration + // structures has changed... + if (OMX_EventMax != eventForILClient) + { + // Only allow these two port events... + __ASSERT_ALWAYS(eventForILClient == OMX_EventPortSettingsChanged || + eventForILClient == OMX_EventPortFormatDetected, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + // From OMX_Core.h "Callbacks should not return an error to the component, + // so if an error occurs, the application shall handle it + // internally". Callback return error ignored here. + ipCallbacks->EventHandler(ipHandle, + ipAppData, + eventForILClient, + aLocalPortIndex, + 0, + 0); + } + + return OMX_ErrorNone; + + } + +#ifdef _OMXIL_COMMON_IL516C_ON +OMX_ERRORTYPE +XOmxILCallbackManagerIfImpl::DoEjectBuffersRequest( + OMX_U32 aLocalPortIndex) + { + DEBUG_PRINTF2(_L8("XOmxILCallbackManagerIfImpl::DoEjectBuffersRequest : " + "aLocalPortIndex[%d]"), aLocalPortIndex); + + __ASSERT_DEBUG(ipHandle && + ipCallbacks && + ipPortManager, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + // find out whether the port is tunnelled or not + const TUint tunnelCount = iRegisteredTunnels.Count(); + for (TUint i=0; i( + iRegisteredTunnels[i]. + iTunnelledComponentHandle); + + __ASSERT_DEBUG(ipTunnelledComponent, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + DEBUG_PRINTF3(_L8("XOmxILCallbackManagerIfImpl::DoEjectBuffersRequest : " + "iTunnelledComponent [%X] iTunnelledPortIndex[%u]"), + ipTunnelledComponent, + iRegisteredTunnels[i].iTunnelledPortIndex); + + OMX_PARAM_U32TYPE ejectBufferRequest; + ejectBufferRequest.nSize = sizeof(OMX_PARAM_U32TYPE); + ejectBufferRequest.nVersion = TOmxILSpecVersion(); + ejectBufferRequest.nPortIndex = iRegisteredTunnels[i].iTunnelledPortIndex; + ejectBufferRequest.nU32 = 1; // .... we can define a constant to be used here + + // Returned error ignored here. Cannot handle an error from the + // tunnelled component + OMX_SetConfig(ipTunnelledComponent, + OMX_IndexConfigPortBufferReturnRequest, + &ejectBufferRequest); + + break; + } + } + + return OMX_ErrorNone; + + } +#endif + +void +XOmxILCallbackManagerIfImpl::SignalOrPropagateBufferMarks( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex) + { + DEBUG_PRINTF(_L8("XOmxILCallbackManagerIfImpl::SignalOrPropagateBufferMarks()")); + + // Look for buffer marks to be signalled or propagated + if (apBufferHeader->hMarkTargetComponent) + { + // See if this component is the buffer mark target component... + if (apBufferHeader->hMarkTargetComponent == ipHandle) + { + // Inform the IL Client that a marked buffer has been processed... + ipCallbacks->EventHandler(ipHandle, + ipAppData, + OMX_EventMark, + 0, + 0, + apBufferHeader->pMarkData); + + // At this point, the mark has been delivered to the IL + // Client...Remove the mark from the processed header... + apBufferHeader->hMarkTargetComponent = 0; + apBufferHeader->pMarkData = 0; + + } + else + { + // Propagate the mark... + + // First find the buffer mark propagation port... + const TInt index = iBufferMarkPropagationPorts.Find( + TBufferMarkPropagationInfo(aLocalPortIndex), + TIdentityRelation( + &TBufferMarkPropagationInfo::Compare)); + + // Note that sink components don't propagate marks... + if (index != KErrNotFound) + { + const TBufferMarkPropagationInfo& propInfo = + iBufferMarkPropagationPorts[index]; + + // Let's check for the special case: The case for a source + // component where the output port is both the port that marks + // the headers and the port that propagates them ... Therefore + // no need to store the mark for later propagation... + if (propInfo.iPropagationPortIndex != aLocalPortIndex) + { + // Now, store temporarily the mark so the next time we send + // a buffer done callback in that propagation port, we mark + // that header accordingly... + // Unsuccessful insertion is ignored. + iBufferMarks.Append( + TOutputPortBufferMarkInfo( + propInfo.iPropagationPortIndex, + apBufferHeader->hMarkTargetComponent, + apBufferHeader->pMarkData)); + + // At this point the mark has been set for propagation to + // an output port. Remove the mark from the processed + // header... + apBufferHeader->hMarkTargetComponent = 0; + apBufferHeader->pMarkData = 0; + } + } + } + } + else + { + if(iBufferMarks.Count() != 0) + { + // Let's see if we have a mark waiting to go out...This will find the + // first mark in the local list of marks ... + const TInt index = iBufferMarks.Find( + TOutputPortBufferMarkInfo(aLocalPortIndex), + TIdentityRelation( + &TOutputPortBufferMarkInfo::Compare)); + if (index != KErrNotFound) + { + const TOutputPortBufferMarkInfo& markInfo = + iBufferMarks[index]; + + // Mark the header... + apBufferHeader->hMarkTargetComponent = markInfo.ipMarkTargetComponent; + apBufferHeader->pMarkData = markInfo.ipMarkData; + + // Remove the mark info from the local store + iBufferMarks.Remove(index); + } + } + + } + + + } + +void +XOmxILCallbackManagerIfImpl::HandleInsufficientResources() + { + DEBUG_PRINTF3(_L8("XOmxILCallbackManagerIfImpl::HandleInsufficientResources : ipCallbacks[%X] ipHandle[%X]"), ipCallbacks, ipHandle); + + if (ipCallbacks && ipHandle) + { + // This is a best-effort action, let's try to inform the IL Client of + // the lack of resources... + ipCallbacks->EventHandler(ipHandle, + ipAppData, + OMX_EventError, + (OMX_U32)OMX_ErrorInsufficientResources, + 0, + 0); + } + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanagerifimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanagerifimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,236 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** +@file +@internalComponent +*/ + +#ifndef OMXILCALLBACKMANAGERIFIMPL_H +#define OMXILCALLBACKMANAGERIFIMPL_H + +#include + +/** + Call Back ManagerIf Impl Panic category +*/ +_LIT(KOmxILCallbackManagerIfImplPanicCategory, "OmxILCallbackManagerIfImpl"); + +// Forward declarations +class MOmxILPortManagerIf; +class COmxILFsm; + +/** + This is a generic implementation of the Callback Manager functionality. + + This implementation is meant to be reused totally or partially by specilized + implementations of a Callback Manager object. + */ +class XOmxILCallbackManagerIfImpl + { + +protected: + + XOmxILCallbackManagerIfImpl(OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks); + + virtual ~XOmxILCallbackManagerIfImpl(); + + virtual void DoSetPortManager(MOmxILPortManagerIf& apPortManager); + + virtual void DoSetFsm(COmxILFsm& apFsm); + + // + // Methods for Callback Registration + // + virtual OMX_ERRORTYPE DoRegisterComponentHandle( + OMX_HANDLETYPE aComponentHandle); + + virtual OMX_ERRORTYPE DoRegisterILClientCallbacks( + const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData); + + virtual OMX_ERRORTYPE DoRegisterTunnelCallback( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex); + + virtual OMX_ERRORTYPE DoRegisterBufferMarkPropagationPort( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex); + + // + // Methods for Callback Notification + // + + virtual OMX_ERRORTYPE DoTransitionCompleteNotification( + OMX_STATETYPE aOmxState); + + virtual OMX_ERRORTYPE DoCommandCompleteNotification( + OMX_COMMANDTYPE aOmxCommand, + OMX_U32 aOmxPortIndex); + + // + // Methods for Callback Notification + // + + virtual OMX_ERRORTYPE DoErrorEventNotification( + OMX_ERRORTYPE aOmxError); + + virtual OMX_ERRORTYPE DoEventNotification( + OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo); + + virtual OMX_ERRORTYPE DoBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection); + + virtual OMX_ERRORTYPE DoPortSettingsChangeNotification( + OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings); + +#ifdef _OMXIL_COMMON_IL516C_ON + virtual OMX_ERRORTYPE DoEjectBuffersRequest( + OMX_U32 aLocalPortIndex); +#endif + + virtual void SignalOrPropagateBufferMarks(OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex); + + virtual void HandleInsufficientResources(); + +protected: + + // Declaration of nested protected classes + class TTunnelRegistrationInfo; + class TBufferMarkPropagationInfo; + class TOutputPortBufferMarkInfo; + +protected: + + // \defgroup IL Client callbacks data + //@{ + OMX_COMPONENTTYPE* ipHandle; // not owned + OMX_PTR ipAppData; // not owned + OMX_CALLBACKTYPE* ipCallbacks; // not owned + //@} + + // Tunnelled ports callback data + RArray iRegisteredTunnels; + + // Associations between input and output ports to be used in buffer marks + // propagation + RArray iBufferMarkPropagationPorts; + + // Temporary store of buffer marks waiting to go out in the next output + // buffer + RArray iBufferMarks; + + // Port manager + MOmxILPortManagerIf* ipPortManager; + + // FSM + COmxILFsm* ipFsm; + + }; + +/** + Structure used to hold the tunnel information needed for callback handling + in tunnelled communication. + */ +class XOmxILCallbackManagerIfImpl::TTunnelRegistrationInfo + { + +public: + + inline TTunnelRegistrationInfo( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex); + +public: + + OMX_U32 iLocalPortIndex; + OMX_DIRTYPE iLocalPortDirection; + OMX_HANDLETYPE iTunnelledComponentHandle; + OMX_U32 iTunnelledPortIndex; + + }; + + +/** + Structure used to hold the association of marked port and propagation port. + */ +class XOmxILCallbackManagerIfImpl::TBufferMarkPropagationInfo + { + +public: + + inline TBufferMarkPropagationInfo( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex); + + // This constructor should only be used for array look-ups + inline explicit TBufferMarkPropagationInfo(OMX_U32 aPortIndex); + + static TBool Compare(const TBufferMarkPropagationInfo& aBmpi1, + const TBufferMarkPropagationInfo& aBmpi2); + +public: + + OMX_U32 iPortIndex; + OMX_U32 iPropagationPortIndex; + + }; + +/** + Structure used to hold the buffer marking info needed to propagate buffer + marks on output ports. + */ +class XOmxILCallbackManagerIfImpl::TOutputPortBufferMarkInfo + { + +public: + + inline TOutputPortBufferMarkInfo( + OMX_U32 aPortIndex, + OMX_HANDLETYPE apMarkTargetComponent, + OMX_PTR apMarkData); + + // This constructor should only be used for array look-ups + inline explicit TOutputPortBufferMarkInfo(OMX_U32 aPortIndex); + + static TBool Compare(const TOutputPortBufferMarkInfo& aOpbmi1, + const TOutputPortBufferMarkInfo& aOpbmi2); + +public: + + OMX_U32 iPortIndex; + OMX_HANDLETYPE ipMarkTargetComponent; + OMX_PTR ipMarkData; + + }; + +#include "omxilcallbackmanagerifimpl.inl" + +#endif // OMXILCALLBACKMANAGERIFIMPL_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcallbackmanagerifimpl.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcallbackmanagerifimpl.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,78 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** +@file +@internalComponent +*/ + + +inline +XOmxILCallbackManagerIfImpl::TTunnelRegistrationInfo::TTunnelRegistrationInfo( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex) + : + iLocalPortIndex(aLocalPortIndex), + iLocalPortDirection(aLocalPortDirection), + iTunnelledComponentHandle(aTunnelledComponentHandle), + iTunnelledPortIndex(aTunnelledPortIndex) + { + } + +inline +XOmxILCallbackManagerIfImpl::TBufferMarkPropagationInfo::TBufferMarkPropagationInfo( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex) + : + iPortIndex(aPortIndex), + iPropagationPortIndex(aPropagationPortIndex) + { + } + +// This constructor should only be used for array look-ups +inline +XOmxILCallbackManagerIfImpl::TBufferMarkPropagationInfo::TBufferMarkPropagationInfo( + OMX_U32 aPortIndex) + : + iPortIndex(aPortIndex), + iPropagationPortIndex(0) + { + } + +inline +XOmxILCallbackManagerIfImpl::TOutputPortBufferMarkInfo::TOutputPortBufferMarkInfo( + OMX_U32 aPortIndex, + OMX_HANDLETYPE apMarkTargetComponent, + OMX_PTR apMarkData) + : + iPortIndex(aPortIndex), + ipMarkTargetComponent(apMarkTargetComponent), + ipMarkData(apMarkData) + { + } + +// This constructor should only be used for array look-ups +inline +XOmxILCallbackManagerIfImpl::TOutputPortBufferMarkInfo::TOutputPortBufferMarkInfo( + OMX_U32 aPortIndex) + : + iPortIndex(aPortIndex), + ipMarkTargetComponent(0), + ipMarkData(0) + { + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilclientclockport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilclientclockport.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,229 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include "log.h" + + +EXPORT_C COmxILClientClockPort* COmxILClientClockPort::NewL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedOtherFormats) + { + COmxILClientClockPort* self = new(ELeave) COmxILClientClockPort(); + CleanupStack::PushL(self); + self->ConstructL(aCommonPortData, aSupportedOtherFormats); + CleanupStack::Pop(); + return self; + } + +void COmxILClientClockPort::ConstructL(const TOmxILCommonPortData& aCommonPortData, const RArray& aSupportedOtherFormats) + { + COmxILOtherPort::ConstructL(aCommonPortData, aSupportedOtherFormats); + } + +COmxILClientClockPort::COmxILClientClockPort() + : iSpecVersion(TOmxILSpecVersion()) + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::COmxILClientClockPort")); + } + +OMX_ERRORTYPE COmxILClientClockPort::GetLocalOmxParamIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::GetLocalOmxParamIndexes")); + return COmxILOtherPort::GetLocalOmxParamIndexes(aIndexArray); + } + + +OMX_ERRORTYPE COmxILClientClockPort::GetLocalOmxConfigIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::GetLocalOmxParamIndexes")); + return COmxILOtherPort::GetLocalOmxConfigIndexes(aIndexArray); + } + + +OMX_ERRORTYPE COmxILClientClockPort::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::GetParameter")); + return COmxILOtherPort::GetParameter(aParamIndex, apComponentParameterStructure); + } + + +OMX_ERRORTYPE COmxILClientClockPort::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::SetParameter")); + return COmxILOtherPort::SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + } + + +OMX_ERRORTYPE COmxILClientClockPort::SetFormatInPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE& /*aPortDefinition*/, + TBool& /*aUpdateProcessingFunction*/) + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::SetFormatInPortDefinition")); + return OMX_ErrorNone; + } + + +TBool COmxILClientClockPort::IsTunnelledPortCompatible(const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::IsTunnelledPortCompatible")); + // Domain check + if(aPortDefinition.eDomain != GetParamPortDefinition().eDomain) + { + return EFalse; + } + + // Format check + if (aPortDefinition.format.other.eFormat != GetParamPortDefinition().format.other.eFormat) + { + return EFalse; + } + + return ETrue; + } + + +OMX_ERRORTYPE COmxILClientClockPort::GetMediaTime(OMX_TICKS& aMediaTime) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::GetMediaTime")); + return GetTime(aMediaTime, OMX_IndexConfigTimeCurrentMediaTime); + } + + +OMX_ERRORTYPE COmxILClientClockPort::GetWallTime(OMX_TICKS& aWallTime) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::GetWallTime")); + return GetTime(aWallTime, OMX_IndexConfigTimeCurrentWallTime); + } + + +OMX_ERRORTYPE COmxILClientClockPort::GetClockState(OMX_TIME_CONFIG_CLOCKSTATETYPE& aClockState) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::GetClockState")); + + if (IsClockComponentAvailable()) + { + aClockState.nSize = sizeof(OMX_TIME_CONFIG_CLOCKSTATETYPE); + aClockState.nVersion = iSpecVersion; + aClockState.eState = OMX_TIME_ClockStateMax; + aClockState.nStartTime = 0; + aClockState.nOffset = 0; + aClockState.nWaitMask = 0; + return OMX_GetConfig(GetTunnelledComponent(), OMX_IndexConfigTimeClockState, &aClockState); + } + + return OMX_ErrorIncorrectStateOperation; + + } + +OMX_ERRORTYPE COmxILClientClockPort::MediaTimeRequest(const OMX_PTR apPrivate, + const OMX_TICKS aMediaTime, + const OMX_TICKS aOffset) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::MediaTimeRequest")); + OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE timeInfo; + timeInfo.nSize = sizeof(timeInfo); + timeInfo.nVersion = iSpecVersion; + timeInfo.nPortIndex = GetTunnelledPort(); + timeInfo.pClientPrivate = apPrivate; + timeInfo.nMediaTimestamp = aMediaTime; + timeInfo.nOffset = aOffset; + + if (IsClockComponentAvailable()) + { + return OMX_SetConfig(GetTunnelledComponent(), OMX_IndexConfigTimeMediaTimeRequest, &timeInfo); + } + + return OMX_ErrorIncorrectStateOperation; + } + + +OMX_ERRORTYPE COmxILClientClockPort::SetStartTime(const OMX_TICKS aStartTime) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::SetStartTime")); + return SetTime(aStartTime, OMX_IndexConfigTimeClientStartTime); + } + + +OMX_ERRORTYPE COmxILClientClockPort::SetVideoReference(const OMX_TICKS aVideoRef) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::SetVideoReference")); + return SetTime(aVideoRef, OMX_IndexConfigTimeCurrentVideoReference); + } + + +OMX_ERRORTYPE COmxILClientClockPort::SetAudioReference(const OMX_TICKS aAudioRef) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::SetAudioReference")); + return SetTime(aAudioRef, OMX_IndexConfigTimeCurrentAudioReference); + } + +OMX_BOOL COmxILClientClockPort::IsClockComponentAvailable() const +{ + if (GetTunnelledComponent() != NULL && GetParamPortDefinition().bEnabled) + { + return OMX_TRUE; + } + + return OMX_FALSE; +} + +OMX_ERRORTYPE COmxILClientClockPort::GetTime(OMX_TICKS& aWallTime, const OMX_INDEXTYPE aTimeIndex) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::GetTime")); + OMX_TIME_CONFIG_TIMESTAMPTYPE timeInfo; + timeInfo.nSize = sizeof(timeInfo); + timeInfo.nVersion = iSpecVersion; + timeInfo.nPortIndex = GetTunnelledPort(); + + if (!IsClockComponentAvailable()) + { + return OMX_ErrorIncorrectStateOperation; + } + + OMX_ERRORTYPE error = OMX_GetConfig(GetTunnelledComponent(), aTimeIndex, &timeInfo); + + if (error == OMX_ErrorNone) + { + aWallTime = timeInfo.nTimestamp; + } + + return error; + } + + +OMX_ERRORTYPE COmxILClientClockPort::SetTime(const OMX_TICKS aStartTime, const OMX_INDEXTYPE aTimeIndex) const + { + DEBUG_PRINTF(_L8("COmxILClientClockPort::SetTime")); + OMX_TIME_CONFIG_TIMESTAMPTYPE timeInfo; + timeInfo.nSize = sizeof(timeInfo); + timeInfo.nVersion = iSpecVersion; + timeInfo.nPortIndex = GetTunnelledPort(); + timeInfo.nTimestamp = aStartTime; + + if (IsClockComponentAvailable()) + { + return OMX_SetConfig(GetTunnelledComponent(), aTimeIndex, &timeInfo); + } + + return OMX_ErrorIncorrectStateOperation; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcommand.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcommand.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,54 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +#ifndef OMXILCOMMAND_H +#define OMXILCOMMAND_H + + +#include + +class TOmxILCommand + { + +public: + + OMX_COMMANDTYPE iCommandType; + OMX_U32 iParam1; + OMX_PTR ipCommandData; + + // Constructor + inline TOmxILCommand( + OMX_COMMANDTYPE aCommandType, + OMX_U32 aParam1, + OMX_PTR apCommandData); + + }; + + +inline +TOmxILCommand::TOmxILCommand( + OMX_COMMANDTYPE aCommandType, + OMX_U32 aParam1, + OMX_PTR apCommandData + ) + : + iCommandType(aCommandType), + iParam1(aParam1), + ipCommandData(apCommandData) + { + } + +#endif // OMXILCOMMAND_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcomponent.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcomponent.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,165 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalComponent +*/ + +#include +#include "omxilcomponentimpl.h" +#include "log.h" + +EXPORT_C +COmxILComponent::COmxILComponent() + { + DEBUG_PRINTF(_L8("COmxILComponent::COmxILComponent")); + } + +EXPORT_C +COmxILComponent::~COmxILComponent() + { + DEBUG_PRINTF(_L8("COmxILComponent::~COmxILComponent")); + delete ipImpl; + } + +EXPORT_C void +COmxILComponent::ConstructL(OMX_HANDLETYPE aComponent) + { + DEBUG_PRINTF(_L8("COmxILComponent::ConstructL")); + ipImpl = COmxILComponentImpl::NewL(this, aComponent); + } + +EXPORT_C void +COmxILComponent::InitComponentL() + { + DEBUG_PRINTF(_L8("COmxILComponent::InitComponent")); + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + ipImpl->InitComponentL(); + } + +EXPORT_C +OMX_ERRORTYPE COmxILComponent::SymbianErrorToGetHandleError(TInt aSymbianError) + { + switch(aSymbianError) + { + case KErrNone: + return OMX_ErrorNone; + case KErrNoMemory: + return OMX_ErrorInsufficientResources; + case KErrArgument: + return OMX_ErrorBadParameter; + }; + return OMX_ErrorUndefined; + } + +EXPORT_C +MOmxILCallbackNotificationIf* COmxILComponent::CreateCallbackManagerL(TCallbackManagerType aCallbackManagerType) + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + return ipImpl->CreateCallbackManagerL(aCallbackManagerType); + } + +EXPORT_C +TInt COmxILComponent::AddPort(const COmxILPort* aPort, OMX_DIRTYPE aDirection) + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + return ipImpl->AddPort(aPort, aDirection); + } + +EXPORT_C +void COmxILComponent::CreatePortManagerL(TPortManagerType aType, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer) + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + ipImpl->CreatePortManagerL(aType, + aOmxVersion, + aNumberOfAudioPorts, + aStartAudioPortNumber, + aNumberOfImagePorts, + aStartImagePortNumber, + aNumberOfVideoPorts, + aStartVideoPortNumber, + aNumberOfOtherPorts, + aStartOtherPortNumber, + aImmediateReturnTimeBuffer); + } + +EXPORT_C +void COmxILComponent::RegisterProcessingFunction(const COmxILProcessingFunction* apProcessingFunction) + { + __ASSERT_ALWAYS(ipImpl && apProcessingFunction, User::Panic(KOmxILComponentPanicCategory, 1)); + ipImpl->RegisterProcessingFunction(apProcessingFunction); + } + +EXPORT_C +void COmxILComponent::RegisterConfigurationManager(const COmxILConfigManager* apConfigManager) + { + __ASSERT_ALWAYS(ipImpl && apConfigManager, User::Panic(KOmxILComponentPanicCategory, 1)); + ipImpl->RegisterConfigurationManager(apConfigManager); + } + + +EXPORT_C +OMX_COMPONENTTYPE* COmxILComponent::GetHandle() const + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + return ipImpl->GetHandle(); + } + +EXPORT_C +OMX_PTR COmxILComponent::GetAppData() const + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + return ipImpl->GetAppData(); + } + +EXPORT_C +OMX_CALLBACKTYPE* COmxILComponent::GetCallbacks() const + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + return ipImpl->GetCallbacks(); + } + +EXPORT_C +COmxILConfigManager* COmxILComponent::GetConfigManager() const + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + return ipImpl->GetConfigManager(); + } + +EXPORT_C +COmxILProcessingFunction* COmxILComponent::GetProcessingFunction() const + { + __ASSERT_ALWAYS(ipImpl, User::Panic(KOmxILComponentPanicCategory, 1)); + return ipImpl->GetProcessingFunction(); + } + +EXPORT_C +TInt COmxILComponent::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return CBase::Extension_(aExtensionId, a0, a1); + } + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcomponent.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcomponent.hrh Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,23 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +#ifndef OMXILCOMPONENT_HRH +#define OMXILCOMPONENT_HRH + +#define KUidSymbianOmxILComponentCommonDll 0x10283498 + +#endif // OMXILCOMPONENT_HRH + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcomponentimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcomponentimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,504 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalComponent +*/ + +#include +#include "omxilindexmanager.h" +#include "omxilportmanager.h" +#include "omxilcallbackmanager.h" +#include "omxilincontextcallbackmanager.h" +#include +#include +#include +#include +#include "omxilcomponentimpl.h" +#include "omxilfsm.h" +#include "log.h" + +COmxILComponentImpl* COmxILComponentImpl::NewL(COmxILComponent* aComponent, OMX_HANDLETYPE aHandle) + { + if (aComponent==0 || aHandle==0) + { + User::Leave(KErrArgument); + } + COmxILComponentImpl* self=new(ELeave) COmxILComponentImpl(aComponent, aHandle); + return self; + } + +COmxILComponentImpl::COmxILComponentImpl(COmxILComponent* aComponent, OMX_HANDLETYPE aHandle) + : ipComponent(aComponent), + iComponentName(0), + ipHandle(static_cast(aHandle)), + ipAppData(0), + ipCallbacks(0), + ipFsm(0), + ipConfigManager(0), + ipCallbackManager(0), + ipPortManager(0), + ipProcessingFunction(0) + { + DEBUG_PRINTF3(_L8("COmxILComponentImpl::COmxILComponentImpl : Comp[%X], Handle[%X]"), aComponent, ipHandle); + } + +COmxILComponentImpl::~COmxILComponentImpl() + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::~COmxILComponentImpl : Handle[%X]"), ipHandle); + delete ipProcessingFunction; + delete ipPortManager; + delete ipConfigManager; + delete ipFsm; + delete ipCallbackManager; + iComponentName.Close(); + } + +OMX_ERRORTYPE +COmxILComponentImpl::GetComponentVersion( + OMX_HANDLETYPE aComponent, + OMX_STRING aComponentName, + OMX_VERSIONTYPE* apComponentVersion, + OMX_VERSIONTYPE* apSpecVersion, + OMX_UUIDTYPE* apComponentUUID) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::GetComponentVersion : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + GetComponentVersion(aComponentName, apComponentVersion, + apSpecVersion, apComponentUUID); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::SendCommand( + OMX_HANDLETYPE aComponent, + OMX_COMMANDTYPE aCmd, + OMX_U32 aParam1, + OMX_PTR aCmdData) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::SendCommand : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + SendCommand(aCmd ,aParam1, aCmdData); + + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::GetParameter( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aParamIndex, + OMX_PTR aComponentParameterStructure) + { + DEBUG_PRINTF3(_L8("COmxILComponentImpl::GetParameter : Handle[%X]; ParamIndex[0x%X]"), aComponent, aParamIndex); + + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + GetParameter(aParamIndex, aComponentParameterStructure); + + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::SetParameter( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aIndex, + OMX_PTR aComponentParameterStructure) + { + DEBUG_PRINTF3(_L8("COmxILComponentImpl::SetParameter : Handle[%X]; ParamIndex[0x%X]"), aComponent, aIndex); + + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + SetParameter(aIndex, + const_cast(aComponentParameterStructure)); + + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::GetConfig( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aIndex, + OMX_PTR aComponentParameterStructure) + { + DEBUG_PRINTF3(_L8("COmxILComponentImpl::GetConfig : Handle[%X]; ConfigIndex[0x%X]"), aComponent, aIndex); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + GetConfig(aIndex, aComponentParameterStructure); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::SetConfig( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aIndex, + OMX_PTR aComponentConfigStructure) + { + DEBUG_PRINTF3(_L8("COmxILComponentImpl::SetConfig : Handle[%X]; ConfigIndex[0x%X]"), aComponent, aIndex); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + SetConfig(aIndex, const_cast(aComponentConfigStructure)); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::GetExtensionIndex( + OMX_HANDLETYPE aComponent, + OMX_STRING aParameterName, + OMX_INDEXTYPE* aIndexType) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::GetExtensionIndex : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + GetExtensionIndex(aParameterName, aIndexType); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::GetState( + OMX_HANDLETYPE aComponent, + OMX_STATETYPE* aState) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::GetState : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + GetState(aState); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::ComponentTunnelRequest( + OMX_HANDLETYPE aComponent, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* aTunnelSetup) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::ComponentTunnelRequest : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + ComponentTunnelRequest(aPort, aTunneledComp, + aTunneledPort, aTunnelSetup); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::UseBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* aBuffer) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::UseBuffer : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + UseBuffer(appBufferHdr, aPortIndex, apAppPrivate, aSizeBytes, aBuffer); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::AllocateBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE** apBuffer, + OMX_U32 aPortIndex, + OMX_PTR aAppData, + OMX_U32 aSizeBytes) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::AllocateBuffer : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + AllocateBuffer(apBuffer, aPortIndex, aAppData, aSizeBytes); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::FreeBuffer( + OMX_HANDLETYPE aComponent, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* aBuffer) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::FreeBuffer : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + FreeBuffer(aPortIndex, aBuffer); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::EmptyThisBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE* aBuffer) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::EmptyThisBuffer : Handle[%X]"), aComponent); +#ifdef _OMXIL_COMMON_BUFFER_TRACING_ON + RDebug::Print(_L("COmxILComponentImpl::EmptyThisBuffer component=0x%08X header=0x%08X port=%d flags=0x%X filledLen=%d timeStamp=%Ld"), + aComponent, aBuffer, aBuffer->nInputPortIndex, aBuffer->nFlags, aBuffer->nFilledLen, aBuffer->nTimeStamp); +#endif + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + EmptyThisBuffer(aBuffer); + + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::FillThisBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE* aBuffer) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::FillThisBuffer : Handle[%X]"), aComponent); +#ifdef _OMXIL_COMMON_BUFFER_TRACING_ON + RDebug::Print(_L("COmxILComponentImpl::FillThisBuffer component=0x%08X header=0x%08X port=%d"), aComponent, aBuffer, aBuffer->nOutputPortIndex); +#endif + + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + FillThisBuffer(aBuffer); + + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::SetCallbacks( + OMX_HANDLETYPE aComponent, + OMX_CALLBACKTYPE* aCallbacks, + OMX_PTR aAppData) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::SetCallbacks : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + SetCallbacks(const_cast(aCallbacks), aAppData); + if (OMX_ErrorNone==omxError) + { + (static_cast(aComponent))->pApplicationPrivate = aAppData; + } + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::ComponentDeInit( + OMX_HANDLETYPE aComponent) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::ComponentDeInit : Handle[%X]"), aComponent); + delete (static_cast( + (static_cast( + (static_cast(aComponent))-> + pComponentPrivate))->GetComponent())); + return OMX_ErrorNone; + } + +OMX_ERRORTYPE +COmxILComponentImpl::UseEGLImage( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR aAppPrivate, + void* eglImage) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::UseEGLImage : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + UseEGLImage(appBufferHdr, aPortIndex, aAppPrivate, eglImage); + return omxError; + } + +OMX_ERRORTYPE +COmxILComponentImpl::ComponentRoleEnum( + OMX_HANDLETYPE aComponent, + OMX_U8* aRole, + OMX_U32 aIndex) + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::ComponentRoleEnum : Handle[%X]"), aComponent); + OMX_ERRORTYPE omxError; + omxError = (static_cast + ((static_cast(aComponent))->pComponentPrivate))-> + ComponentRoleEnum(aRole, aIndex); + return omxError; + } + +void +COmxILComponentImpl::InitComponentL() + { + DEBUG_PRINTF2(_L8("COmxILComponentImpl::InitComponent : Handle[%X]"), ipHandle); + __ASSERT_ALWAYS(ipHandle && ipProcessingFunction && ipCallbackManager && ipPortManager && ipConfigManager, User::Panic(KOmxILComponentPanicCategory, 1)); + ipFsm = COmxILFsm::NewL(*ipComponent, + *ipProcessingFunction, + *ipPortManager, + *ipConfigManager, + *ipCallbackManager); + + char componentNamebuffer[OMX_MAX_STRINGNAME_SIZE]; + OMX_VERSIONTYPE componentVersion; + OMX_VERSIONTYPE specVersion; + OMX_UUIDTYPE componentUid; + + ipConfigManager->GetComponentVersion(componentNamebuffer, + &componentVersion, + &specVersion, + &componentUid); + TBuf8<128> componentNameBuf8; + componentNameBuf8 = const_cast(reinterpret_cast(componentNamebuffer)); + iComponentName.CreateL(componentNameBuf8, componentNameBuf8.Length() + 1); + iComponentName.PtrZ(); + DEBUG_PRINTF2(_L8("COmxILComponentImpl::InitComponent : [%S]"), &iComponentName); + + // Fill in the component handle + ipHandle->nVersion = componentVersion; + // The FSM will take care of all the API calls + ipHandle->pComponentPrivate = ipFsm; + ipHandle->pApplicationPrivate = 0; + ipHandle->GetComponentVersion = COmxILComponentImpl::GetComponentVersion; + ipHandle->SendCommand = COmxILComponentImpl::SendCommand; + ipHandle->GetParameter = COmxILComponentImpl::GetParameter; + ipHandle->SetParameter = COmxILComponentImpl::SetParameter; + ipHandle->GetConfig = COmxILComponentImpl::GetConfig; + ipHandle->SetConfig = COmxILComponentImpl::SetConfig; + ipHandle->GetExtensionIndex = COmxILComponentImpl::GetExtensionIndex; + ipHandle->GetState = COmxILComponentImpl::GetState; + ipHandle->ComponentTunnelRequest = COmxILComponentImpl::ComponentTunnelRequest; + ipHandle->UseBuffer = COmxILComponentImpl::UseBuffer; + ipHandle->AllocateBuffer = COmxILComponentImpl::AllocateBuffer; + ipHandle->FreeBuffer = COmxILComponentImpl::FreeBuffer; + ipHandle->EmptyThisBuffer = COmxILComponentImpl::EmptyThisBuffer; + ipHandle->FillThisBuffer = COmxILComponentImpl::FillThisBuffer; + ipHandle->SetCallbacks = COmxILComponentImpl::SetCallbacks; + ipHandle->ComponentDeInit = COmxILComponentImpl::ComponentDeInit; + ipHandle->UseEGLImage = COmxILComponentImpl::UseEGLImage; + ipHandle->ComponentRoleEnum = COmxILComponentImpl::ComponentRoleEnum; + + OMX_ERRORTYPE omxRetValue = + ipCallbackManager->RegisterComponentHandle(ipHandle); + if (OMX_ErrorNone != omxRetValue) + { + if (OMX_ErrorInsufficientResources == omxRetValue) + { + User::Leave(KErrNoMemory); + } + User::Leave(KErrGeneral); + } + + // Let's init the FSM... + ipFsm->InitFsm(); + } + +MOmxILCallbackNotificationIf* COmxILComponentImpl::CreateCallbackManagerL(COmxILComponent::TCallbackManagerType aCallbackManagerType) + { + if (aCallbackManagerType==COmxILComponent::EInContext) + { + ipCallbackManager = COmxILInContextCallbackManager::NewL(ipHandle, ipAppData, ipCallbacks); + } + else if (aCallbackManagerType==COmxILComponent::EOutofContext) + { + ipCallbackManager = COmxILCallbackManager::NewL(ipHandle, ipAppData, ipCallbacks); + } + + return ipCallbackManager; + } + +TInt COmxILComponentImpl::AddPort(const COmxILPort* aPort, OMX_DIRTYPE aDirection) + { + return ipPortManager->AddPort(aPort, aDirection); + } + +void COmxILComponentImpl::CreatePortManagerL(COmxILComponent::TPortManagerType /*aType*/, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer) + { + __ASSERT_ALWAYS(ipProcessingFunction && ipCallbackManager, User::Panic(KOmxILComponentPanicCategory, 1)); + ipPortManager = COmxILPortManager::NewL(*ipProcessingFunction, // The component's processing function + *ipCallbackManager, // The call back manager object + aOmxVersion, // Component's OMX Version + aNumberOfAudioPorts, // The number of audio ports in this component + aStartAudioPortNumber, // The starting audio port index + aNumberOfImagePorts, // The number of image ports in this component + aStartImagePortNumber, // The starting image port index + aNumberOfVideoPorts, // The number of video ports in this component + aStartVideoPortNumber, // The starting video port index + aNumberOfOtherPorts, // The number of other ports in this component + aStartOtherPortNumber, // The starting other port index + aImmediateReturnTimeBuffer + ); + } + +void COmxILComponentImpl::RegisterProcessingFunction(const COmxILProcessingFunction* apProcessingFunction) + { + __ASSERT_ALWAYS(apProcessingFunction, User::Panic(KOmxILComponentPanicCategory, 1)); + ipProcessingFunction = const_cast(apProcessingFunction); + } + +void COmxILComponentImpl::RegisterConfigurationManager(const COmxILConfigManager* apConfigManager) + { + __ASSERT_ALWAYS(apConfigManager, User::Panic(KOmxILComponentPanicCategory, 1)); + ipConfigManager = const_cast(apConfigManager); + SetPortManagerForConfigManager(); + } + +OMX_COMPONENTTYPE* COmxILComponentImpl::GetHandle() const + { + return ipHandle; + } +OMX_PTR COmxILComponentImpl::GetAppData() const + { + return ipAppData; + } +OMX_CALLBACKTYPE* COmxILComponentImpl::GetCallbacks() const + { + return ipCallbacks; + } +COmxILConfigManager* COmxILComponentImpl::GetConfigManager() const + { + return ipConfigManager; + } +COmxILProcessingFunction* COmxILComponentImpl::GetProcessingFunction() const + { + return ipProcessingFunction; + } +MOmxILCallbackNotificationIf* COmxILComponentImpl::GetCallbackNotificationIf() const + { + return ipCallbackManager; + } +void COmxILComponentImpl::SetPortManagerForConfigManager() + { + __ASSERT_ALWAYS(ipPortManager && ipConfigManager, User::Panic(KOmxILComponentPanicCategory, 1)); + ipConfigManager->SetPortManager(ipPortManager); + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilcomponentimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilcomponentimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,183 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCOMPONENTIMPL_H +#define OMXILCOMPONENTIMPL_H + +#include +#include + +// forward declarations +class COmxILFsm; +class COmxILConfigManager; +class MOmxILCallbackManagerIf; +class MOmxILPortManagerIf; +class MOmxILCallbackNotificationIf; +class COmxILProcessingFunction; +class COmxILPort; + +class COmxILComponentImpl : public CBase + { +public: + static COmxILComponentImpl* NewL(COmxILComponent* aComponent, OMX_HANDLETYPE aHandle); + virtual ~COmxILComponentImpl(); + + void InitComponentL(); + void ConstructL(OMX_HANDLETYPE aComponent); + MOmxILCallbackNotificationIf* CreateCallbackManagerL(COmxILComponent::TCallbackManagerType aCallbackManagerType); + void CreatePortManagerL(COmxILComponent::TPortManagerType aType, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer); + TInt AddPort(const COmxILPort* aPort, OMX_DIRTYPE aDirection); + void RegisterProcessingFunction(const COmxILProcessingFunction* aProcessingFunction); + void RegisterConfigurationManager(const COmxILConfigManager* aConfigManager); + //Getters + OMX_COMPONENTTYPE* GetHandle() const; + OMX_PTR GetAppData() const; + OMX_CALLBACKTYPE* GetCallbacks() const; + COmxILConfigManager* GetConfigManager() const; + COmxILProcessingFunction* GetProcessingFunction() const; + MOmxILCallbackNotificationIf* GetCallbackNotificationIf() const; + //Setters + void SetPortManagerForConfigManager(); + +private: + COmxILComponentImpl(COmxILComponent* aComponent, OMX_HANDLETYPE aHandle); + void ConstructL(); + static OMX_ERRORTYPE GetComponentVersion( + OMX_HANDLETYPE aComponent, + OMX_STRING aComponentName, + OMX_VERSIONTYPE* apComponentVersion, + OMX_VERSIONTYPE* apSpecVersion, + OMX_UUIDTYPE* apComponentUUID); + + static OMX_ERRORTYPE SendCommand( + OMX_HANDLETYPE aComponent, + OMX_COMMANDTYPE aCmd, + OMX_U32 aParam1, + OMX_PTR aCmdData); + + static OMX_ERRORTYPE GetParameter( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aParamIndex, + OMX_PTR aComponentParameterStructure); + + static OMX_ERRORTYPE SetParameter( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aIndex, + OMX_PTR aComponentParameterStructure); + + static OMX_ERRORTYPE GetConfig( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aIndex, + OMX_PTR aComponentConfigStructure); + + static OMX_ERRORTYPE SetConfig( + OMX_HANDLETYPE aComponent, + OMX_INDEXTYPE aIndex, + OMX_PTR aComponentConfigStructure); + + static OMX_ERRORTYPE GetExtensionIndex( + OMX_HANDLETYPE aComponent, + OMX_STRING aParameterName, + OMX_INDEXTYPE* aIndexType); + + static OMX_ERRORTYPE GetState( + OMX_HANDLETYPE aComponent, + OMX_STATETYPE* aState); + + static OMX_ERRORTYPE ComponentTunnelRequest( + OMX_HANDLETYPE aComp, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* aTunnelSetup); + + static OMX_ERRORTYPE UseBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* aBuffer); + + static OMX_ERRORTYPE AllocateBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE** apBuffer, + OMX_U32 aPortIndex, + OMX_PTR aAppData, + OMX_U32 aSizeBytes); + + static OMX_ERRORTYPE FreeBuffer( + OMX_HANDLETYPE aComponent, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* aBuffer); + + static OMX_ERRORTYPE EmptyThisBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE* aBuffer); + + static OMX_ERRORTYPE FillThisBuffer( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE* aBuffer); + + static OMX_ERRORTYPE SetCallbacks( + OMX_HANDLETYPE aComponent, + OMX_CALLBACKTYPE* aCallbacks, + OMX_PTR aAppData); + + static OMX_ERRORTYPE ComponentDeInit( + OMX_HANDLETYPE aComponent); + + static OMX_ERRORTYPE UseEGLImage( + OMX_HANDLETYPE aComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR aAppPrivate, + void* eglImage); + + static OMX_ERRORTYPE ComponentRoleEnum( + OMX_HANDLETYPE aComponent, + OMX_U8* aRole, + OMX_U32 aIndex); + +private: + COmxILComponent* ipComponent; + RBuf8 iComponentName; + OMX_COMPONENTTYPE* ipHandle; + OMX_PTR ipAppData; + OMX_CALLBACKTYPE* ipCallbacks; + COmxILFsm* ipFsm; + COmxILConfigManager* ipConfigManager; + MOmxILCallbackManagerIf* ipCallbackManager; + MOmxILPortManagerIf* ipPortManager; + COmxILProcessingFunction* ipProcessingFunction; + }; + +#endif // OMXILCOMPONENTIMPL_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilconfigmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilconfigmanager.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,194 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include + +#include "log.h" +#include +#include +#include +#include "omxilportmanagerif.h" +#include "omxilconfigmanagerimpl.h" + +EXPORT_C COmxILConfigManager* +COmxILConfigManager::NewL( + const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList) + { + DEBUG_PRINTF(_L8("COmxILConfigManager::NewL")); + __ASSERT_DEBUG(aComponentName.Length() && aComponentRoleList.Count(), + User::Panic(KOmxILConfigManagerPanicCategory, 1)); + + COmxILConfigManager* self = new (ELeave)COmxILConfigManager(); + CleanupStack::PushL(self); + self->ConstructL(aComponentName, + aComponentVersion, + aComponentRoleList); + CleanupStack::Pop(self); + return self; + + } + +EXPORT_C void +COmxILConfigManager::ConstructL(const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList) + { + DEBUG_PRINTF(_L8("COmxILConfigManager::ConstructL")); + ipConfigManagerImpl=COmxILConfigManagerImpl::NewL(aComponentName, + aComponentVersion, + aComponentRoleList); + } + +EXPORT_C +COmxILConfigManager::COmxILConfigManager() + { + DEBUG_PRINTF(_L8("COmxILConfigManager::COmxILConfigManager")); + } + +EXPORT_C +COmxILConfigManager::~COmxILConfigManager() + { + DEBUG_PRINTF(_L8("COmxILConfigManager::~COmxILConfigManager")); + + delete ipConfigManagerImpl; + } + +OMX_ERRORTYPE +COmxILConfigManager::GetComponentVersion(OMX_STRING aComponentName, + OMX_VERSIONTYPE* apComponentVersion, + OMX_VERSIONTYPE* apSpecVersion, + OMX_UUIDTYPE* apComponentUUID) const + { + DEBUG_PRINTF(_L8("COmxILConfigManager::GetComponentVersion")); + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->GetComponentVersion(aComponentName, + apComponentVersion, + apSpecVersion, + apComponentUUID); + } + +EXPORT_C OMX_ERRORTYPE +COmxILConfigManager::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILConfigManager::GetParameter")); + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->GetParameter(aParamIndex, apComponentParameterStructure); + } + +EXPORT_C OMX_ERRORTYPE +COmxILConfigManager::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + OMX_BOOL aInitTime /* = OMX_TRUE */) + { + DEBUG_PRINTF(_L8("COmxILConfigManager::SetParameter")); + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->SetParameter(aParamIndex, apComponentParameterStructure, aInitTime); + } + +EXPORT_C OMX_ERRORTYPE +COmxILConfigManager::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILConfigManager::GetConfig")); + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->GetConfig(aConfigIndex, apComponentConfigStructure); + } + +EXPORT_C OMX_ERRORTYPE +COmxILConfigManager::SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure) + + { + DEBUG_PRINTF(_L8("COmxILConfigManager::SetConfig")); + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->SetConfig(aConfigIndex, apComponentConfigStructure); + } + +EXPORT_C OMX_ERRORTYPE +COmxILConfigManager::GetExtensionIndex( + OMX_STRING /*aParameterName*/, + OMX_INDEXTYPE* /*apIndexType*/) const + { + DEBUG_PRINTF(_L8("COmxILConfigManager::GetExtensionIndex")); + + // No custom index here for now... + return OMX_ErrorUnsupportedIndex; + } + +OMX_ERRORTYPE +COmxILConfigManager::ComponentRoleEnum(OMX_U8* aRole, + OMX_U32 aIndex) const + { + DEBUG_PRINTF(_L8("COmxILConfigManager::ComponentRoleEnum")); + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->ComponentRoleEnum(aRole, aIndex); + } + +void COmxILConfigManager::SetPortManager(MOmxILPortManagerIf* aPortManager) + { + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->SetPortManager(aPortManager); + } +EXPORT_C +void COmxILConfigManager::InsertParamIndexL(TUint aParamIndex) + { + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->InsertParamIndexL(aParamIndex); + } +EXPORT_C +TInt COmxILConfigManager::FindParamIndex(TUint aParamIndex) const + { + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->FindParamIndex(aParamIndex); + } +EXPORT_C +void COmxILConfigManager::InsertConfigIndexL(TUint aConfigIndex) + { + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->InsertConfigIndexL(aConfigIndex); + } +EXPORT_C +TInt COmxILConfigManager::FindConfigIndex(TUint aConfigIndex) const + { + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->FindConfigIndex(aConfigIndex); + } + +RArray& COmxILConfigManager::ManagedParamIndexes() + { + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->ManagedParamIndexes(); + } +EXPORT_C +RArray& COmxILConfigManager::ManagedConfigIndexes() + { + __ASSERT_ALWAYS(ipConfigManagerImpl, User::Panic(KOmxILConfigManagerPanicCategory, 1)); + return ipConfigManagerImpl->ManagedConfigIndexes(); + } +EXPORT_C +TInt COmxILConfigManager::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return CBase::Extension_(aExtensionId, a0, a1); + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilconfigmanagerimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilconfigmanagerimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,539 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include + +#include "log.h" +#include +#include +#include +#include "omxilportmanagerif.h" +#include "omxilconfigmanagerimpl.h" + +// NOTE: OMX_UUIDTYPE[128] is defined in OMX_Types.h +#define KMAX_UUIDTYPE_SIZE 128 + +COmxILConfigManagerImpl* +COmxILConfigManagerImpl::NewL( + const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList) + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::NewL")); + COmxILConfigManagerImpl* self = new (ELeave)COmxILConfigManagerImpl(); + CleanupStack::PushL(self); + self->ConstructL(aComponentName, + aComponentVersion, + aComponentRoleList); + CleanupStack::Pop(self); + return self; + + } + +void +COmxILConfigManagerImpl::ConstructL(const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList) + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::ConstructL")); + + iComponentName.CreateL(aComponentName, OMX_MAX_STRINGNAME_SIZE); + iComponentName.PtrZ(); + iComponentVersion.s = aComponentVersion.s; + + // Note that the first role in the list of roles becomes the default role + // assumed by the component + + const TUint rolesCount = aComponentRoleList.Count(); + for (TUint i=0; iAllocLC()); + CleanupStack::Pop(); + } + + + InsertParamIndexL(OMX_IndexParamDisableResourceConcealment); + InsertParamIndexL(OMX_IndexParamSuspensionPolicy); + InsertParamIndexL(OMX_IndexParamStandardComponentRole); + InsertParamIndexL(OMX_IndexParamPriorityMgmt); + InsertConfigIndexL(OMX_IndexConfigPriorityMgmt); + + } + +COmxILConfigManagerImpl::COmxILConfigManagerImpl() + : + iComponentName(), + iComponentRoleList(), + iCurrentRoleIndex(0) + + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::COmxILConfigManagerImpl")); + + iParamDisableResourceConcealment.nSize = sizeof(OMX_RESOURCECONCEALMENTTYPE); + iParamDisableResourceConcealment.nVersion = TOmxILSpecVersion(); + iParamDisableResourceConcealment.bResourceConcealmentForbidden = OMX_TRUE; + + iParamSuspensionPolicy.nSize = sizeof(OMX_PARAM_SUSPENSIONPOLICYTYPE); + iParamSuspensionPolicy.nVersion = TOmxILSpecVersion(); + iParamSuspensionPolicy.ePolicy = OMX_SuspensionDisabled; + + iConfigPriorityMgmt.nSize = sizeof(OMX_PRIORITYMGMTTYPE); + iConfigPriorityMgmt.nVersion = TOmxILSpecVersion(); + iConfigPriorityMgmt.nGroupPriority = 0; + iConfigPriorityMgmt.nGroupID = 0; + + } + +COmxILConfigManagerImpl::~COmxILConfigManagerImpl() + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::~COmxILConfigManagerImpl")); + + iComponentName.Close(); + iComponentRoleList.ResetAndDestroy(); + } + +OMX_ERRORTYPE +COmxILConfigManagerImpl::GetComponentVersion(OMX_STRING aComponentName, + OMX_VERSIONTYPE* apComponentVersion, + OMX_VERSIONTYPE* apSpecVersion, + OMX_UUIDTYPE* apComponentUUID) const + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::GetComponentVersion")); + + TPtr8 name(reinterpret_cast(aComponentName), + OMX_MAX_STRINGNAME_SIZE); + name.Copy(iComponentName); + name.PtrZ(); + + (*apComponentVersion) = iComponentVersion; + (*apSpecVersion) = TOmxILSpecVersion(); + + // Generate a component uuid + TUint32 uid = reinterpret_cast(this); + TPtr8 uidPtr(reinterpret_cast(*apComponentUUID), + KMAX_UUIDTYPE_SIZE); + uidPtr = TPtr8(reinterpret_cast(uid), sizeof(uid)); + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILConfigManagerImpl::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::GetParameter")); + + TInt index = FindParamIndex(aParamIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamStandardComponentRole: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentParameterStructure, + sizeof(OMX_PARAM_COMPONENTROLETYPE)))) + { + return omxRetValue; + } + + OMX_PARAM_COMPONENTROLETYPE* pComponentRole + = static_cast( + apComponentParameterStructure); + + // Here, the role returned must be the role that this component is + // currently assuming + TPtr8 role(reinterpret_cast(pComponentRole->cRole), + OMX_MAX_STRINGNAME_SIZE); + + role = *(iComponentRoleList[iCurrentRoleIndex]); + role.PtrZ(); + + } + break; + + case OMX_IndexParamDisableResourceConcealment: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentParameterStructure, + sizeof(OMX_RESOURCECONCEALMENTTYPE)))) + { + return omxRetValue; + } + + OMX_RESOURCECONCEALMENTTYPE* pResConceal + = static_cast( + apComponentParameterStructure); + + *pResConceal = iParamDisableResourceConcealment; + + } + break; + case OMX_IndexParamSuspensionPolicy: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentParameterStructure, + sizeof(OMX_PARAM_SUSPENSIONPOLICYTYPE)))) + { + return omxRetValue; + } + + OMX_PARAM_SUSPENSIONPOLICYTYPE* pSuspensionPolicy + = static_cast( + apComponentParameterStructure); + + *pSuspensionPolicy = iParamSuspensionPolicy; + + } + break; + + case OMX_IndexParamPriorityMgmt: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentParameterStructure, + sizeof(OMX_PRIORITYMGMTTYPE)))) + { + return omxRetValue; + } + + OMX_PRIORITYMGMTTYPE* pPriorityMgmt + = static_cast( + apComponentParameterStructure); + + *pPriorityMgmt = iConfigPriorityMgmt; + + } + break; + + default: + { + __ASSERT_ALWAYS(EFalse, + User::Panic(KOmxILConfigManagerPanicCategory, 1)); + } + }; + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILConfigManagerImpl::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + OMX_BOOL aInitTime /* = OMX_TRUE */) + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::SetParameter")); + + TInt index = FindParamIndex(aParamIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamStandardComponentRole: + { + if (!aInitTime) + { + return OMX_ErrorIncorrectStateOperation; + } + + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_PARAM_COMPONENTROLETYPE)))) + { + return omxRetValue; + } + + const OMX_PARAM_COMPONENTROLETYPE* pComponentRole + = static_cast( + apComponentParameterStructure); + + TPtrC8 roleToFindPtr( + static_cast(pComponentRole->cRole)); + + HBufC8* pRoleToFind = HBufC8::New(OMX_MAX_STRINGNAME_SIZE); + if (!pRoleToFind) + { + return OMX_ErrorInsufficientResources; + } + *pRoleToFind = roleToFindPtr; + + TInt newRoleIndex = 0; + if (KErrNotFound == + (newRoleIndex = + iComponentRoleList.Find(pRoleToFind, + TIdentityRelation( + &COmxILConfigManagerImpl::CompareRoles)))) + { + delete pRoleToFind; + return OMX_ErrorBadParameter; + } + + if (*pRoleToFind != *(iComponentRoleList[iCurrentRoleIndex])) + { + // At this point, it is mandated that the component populates all + // defaults according to the new role that has just been set by the + // IL Client + if (OMX_ErrorNone != + (omxRetValue = + ipPortManager->ComponentRoleIndication(newRoleIndex))) + { + delete pRoleToFind; + return omxRetValue; + } + + iCurrentRoleIndex = newRoleIndex; + + } + + delete pRoleToFind; + + } + break; + + case OMX_IndexParamDisableResourceConcealment: + { + if (!aInitTime) + { + return OMX_ErrorIncorrectStateOperation; + } + + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_RESOURCECONCEALMENTTYPE)))) + { + return omxRetValue; + } + + const OMX_RESOURCECONCEALMENTTYPE* pResConceal + = static_cast( + apComponentParameterStructure); + + iParamDisableResourceConcealment = *pResConceal; + + } + break; + + case OMX_IndexParamSuspensionPolicy: + { + if (!aInitTime) + { + return OMX_ErrorIncorrectStateOperation; + } + + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_PARAM_SUSPENSIONPOLICYTYPE)))) + { + return omxRetValue; + } + + const OMX_PARAM_SUSPENSIONPOLICYTYPE* pSuspensionPolicy + = static_cast( + apComponentParameterStructure); + + // OMX_SuspensionEnabled is the last of the supported values as of + // v1.1.1 + if (pSuspensionPolicy->ePolicy > OMX_SuspensionEnabled) + { + return OMX_ErrorBadParameter; + } + + iParamSuspensionPolicy = *pSuspensionPolicy; + + } + break; + + case OMX_IndexParamPriorityMgmt: + { + if (!aInitTime) + { + return OMX_ErrorIncorrectStateOperation; + } + + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_PRIORITYMGMTTYPE)))) + { + return omxRetValue; + } + + + const OMX_PRIORITYMGMTTYPE* pPriorityMgmt + = static_cast( + apComponentParameterStructure); + + iConfigPriorityMgmt = *pPriorityMgmt; + + } + break; + + default: + { + __ASSERT_ALWAYS(EFalse, + User::Panic(KOmxILConfigManagerPanicCategory, 1)); + } + }; + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILConfigManagerImpl::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::GetConfig")); + + TInt index = FindConfigIndex(aConfigIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aConfigIndex) + { + case OMX_IndexConfigPriorityMgmt: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentConfigStructure, + sizeof(OMX_PRIORITYMGMTTYPE)))) + { + return omxRetValue; + } + + OMX_PRIORITYMGMTTYPE* pPriorityMgmt + = static_cast( + apComponentConfigStructure); + + *pPriorityMgmt = iConfigPriorityMgmt; + + } + break; + default: + { + __ASSERT_ALWAYS(EFalse, + User::Panic(KOmxILConfigManagerPanicCategory, 1)); + } + }; + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILConfigManagerImpl::SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure) + + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::SetConfig")); + + TInt index = FindConfigIndex(aConfigIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aConfigIndex) + { + case OMX_IndexConfigPriorityMgmt: + { + if (OMX_ErrorNone != + (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentConfigStructure), + sizeof(OMX_PRIORITYMGMTTYPE)))) + { + return omxRetValue; + } + + const OMX_PRIORITYMGMTTYPE* pPriorityMgmt + = static_cast( + apComponentConfigStructure); + + iConfigPriorityMgmt = *pPriorityMgmt; + + } + break; + default: + { + __ASSERT_ALWAYS(EFalse, + User::Panic(KOmxILConfigManagerPanicCategory, 1)); + } + }; + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILConfigManagerImpl::ComponentRoleEnum(OMX_U8* aRole, + OMX_U32 aIndex) const + { + DEBUG_PRINTF(_L8("COmxILConfigManagerImpl::ComponentRoleEnum")); + + // TWC:OpenmaxIL requires error code OMX_ErrorNoMore to be returned when no more roles + if (aIndex >= iComponentRoleList.Count()) + { + return OMX_ErrorNoMore; + } + + HBufC8* pRole = iComponentRoleList[aIndex]; + + TPtr8 role(reinterpret_cast(aRole), + OMX_MAX_STRINGNAME_SIZE); + role = *pRole; + role.PtrZ(); + + return OMX_ErrorNone; + + } + +TBool +COmxILConfigManagerImpl::CompareRoles( + const HBufC8& aRole1, const HBufC8& aRole2) + { + return (aRole1 == aRole2); + } + +void COmxILConfigManagerImpl::SetPortManager(MOmxILPortManagerIf* aPortManager) + { + ipPortManager = aPortManager; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilconfigmanagerimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilconfigmanagerimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,118 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCONFIGMANAGERIMPL_H +#define OMXILCONFIGMANAGERIMPL_H + +#include +#include +#include +#include + +#include "omxilindexmanager.h" + +// Forward declarations +class MOmxILPortManagerIf; + +class COmxILConfigManagerImpl : public COmxILIndexManager + { + +public: + + static COmxILConfigManagerImpl* NewL( + const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList); + + ~COmxILConfigManagerImpl(); + + virtual OMX_ERRORTYPE GetComponentVersion( + OMX_STRING aComponentName, + OMX_VERSIONTYPE* apComponentVersion, + OMX_VERSIONTYPE* apSpecVersion, + OMX_UUIDTYPE* apComponentUUID) const; + + OMX_ERRORTYPE GetParameter( + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter( + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + OMX_BOOL aInitTime = OMX_TRUE); + + OMX_ERRORTYPE GetConfig( + OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + OMX_ERRORTYPE SetConfig( + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure); + + OMX_ERRORTYPE ComponentRoleEnum( + OMX_U8* aRole, + OMX_U32 aIndex) const; + + void SetPortManager(MOmxILPortManagerIf* aPortManager); + +private: + + COmxILConfigManagerImpl(); + + void ConstructL(const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList); + + static TBool CompareRoles(const HBufC8& aRole1, const HBufC8& aRole2); + +private: + + // Reference to the component's port manager + MOmxILPortManagerIf* ipPortManager; + + // Reference to the component's port manager + RBuf8 iComponentName; + + // The list of OpenMAX IL roles supported by the component + RPointerArray iComponentRoleList; + + // The current OpenMAX IL role + TUint iCurrentRoleIndex; + + // The current version of this component (this is different to the spec + // version) + OMX_VERSIONTYPE iComponentVersion; + + // OpenMAX IL resource concealment structure (only set/get, resource + // concealment logic not implemented) + OMX_RESOURCECONCEALMENTTYPE iParamDisableResourceConcealment; + + // OpenMAX IL component suspension policy structure (only set/get, + // component suspension logic not implemented) + OMX_PARAM_SUSPENSIONPOLICYTYPE iParamSuspensionPolicy; + + // OpenMAX IL component priority structure (only set/get, component + // priority logic not implemented) + OMX_PRIORITYMGMTTYPE iConfigPriorityMgmt; + + }; + +#endif // OMXILCONFIGMANAGERIMPL_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilfsm.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilfsm.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,785 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include "omxilfsm.h" +#include "omxilstate.h" +#include +#include "omxilcallbackmanager.h" +#include +#include "omxilportmanagerif.h" +#include "omxilcommand.h" +#include + +#define RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED(_a) \ + { \ + const OMX_ERRORTYPE _err = _a; \ + if (OMX_ErrorNone == _err) return _err; \ + else return SendOmxErrorEventIfNeeded(_err); \ + } + + +const TInt COmxILFsm::KMaxMsgQueueEntries; + +COmxILFsm* +COmxILFsm::NewL(COmxILComponent& aComponent, + COmxILProcessingFunction& aProcFunction, + MOmxILPortManagerIf& aPortManager, + COmxILConfigManager& aConfigManager, + MOmxILCallbackManagerIf& aCallbacks) + { + DEBUG_PRINTF(_L8("COmxILFsm::NewLC")); + + COmxILFsm* self = new (ELeave) COmxILFsm(aComponent, + aProcFunction, + aPortManager, + aConfigManager, + aCallbacks); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return (self); + } + +void +COmxILFsm::ConstructL() + { + DEBUG_PRINTF(_L8("COmxILFsm::ConstructL")); + + // Create the FSM states + + // Init the array + for (TUint i=0; i < EStateMax; ++i) + { + iStates.AppendL(NULL); + } + + // Add the standard states... + iStates[EStateInvalid] = new (ELeave)COmxILStateInvalid; + iStates[EStateLoaded] = new (ELeave)COmxILStateLoaded; + iStates[EStateIdle] = new (ELeave)COmxILStateIdle; + iStates[EStateExecuting] = new (ELeave)COmxILStateExecuting; + iStates[EStatePause] = new (ELeave)COmxILStatePause; + iStates[EStateWaitForResources] = new (ELeave)COmxILStateWaitForResources; + + // Now add the substates + iStates[ESubStateLoadedToIdle] = new (ELeave)COmxILStateLoadedToIdle; + iStates[ESubStateIdleToLoaded] = new (ELeave)COmxILStateIdleToLoaded; + iStates[ESubStateExecutingToIdle] = new (ELeave)COmxILStateExecutingToIdle; + iStates[ESubStatePauseToIdle] = new (ELeave)COmxILStatePauseToIdle; + + iCallbacks.SetPortManager(iPortManager); + iCallbacks.SetFsm(*this); + + } + +COmxILFsm::COmxILFsm(COmxILComponent& aComponent, + COmxILProcessingFunction& aProcFunction, + MOmxILPortManagerIf& aPortManager, + COmxILConfigManager& aConfigManager, + MOmxILCallbackManagerIf& aCallbacks) + : + iComponent(aComponent), + iProcFunction(aProcFunction), + iPortManager(aPortManager), + iConfigManager(aConfigManager), + iCallbacks(aCallbacks), + iStates(), + iCurrentStateIndex(EStateMax), + ipCurrentState(0) + { + DEBUG_PRINTF(_L8("COmxILFsm::COmxILFsm")); + } + +COmxILFsm::~COmxILFsm() + { + DEBUG_PRINTF(_L8("COmxILFsm::~COmxILFsm")); + + iCurrentStateIndex = EStateMax; + ipCurrentState = 0; + iStates.ResetAndDestroy(); + + } + +OMX_ERRORTYPE +COmxILFsm::InitFsm() + { + DEBUG_PRINTF(_L8("COmxILFsm::InitFsm")); + + // Let's get ready to handle API calls... + iCurrentStateIndex = EStateLoaded; + ipCurrentState = iStates[iCurrentStateIndex]; + return OMX_ErrorNone; + + } + +COmxILComponent* +COmxILFsm::GetComponent() const + { + return &iComponent; + } + +OMX_ERRORTYPE +COmxILFsm::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILFsm::PopulateBuffer")); + + TBool portPopulationCompleted = EFalse; + OMX_ERRORTYPE omxRetValue = + ipCurrentState->PopulateBuffer(*this, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + + if (OMX_ErrorNone == omxRetValue) + { + if (portPopulationCompleted && + ESubStateLoadedToIdle == iCurrentStateIndex && + iPortManager.AllPortsPopulated()) + { + // Complete here the transition to OMX_StateIdle + omxRetValue = FsmTransition(EStateIdle); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that port population has + // completed sucessfully + omxRetValue = iCallbacks.TransitionCompleteNotification( + OMX_StateIdle); + + } + } + } + + if (OMX_ErrorNone == omxRetValue || + OMX_ErrorInsufficientResources == omxRetValue) + { + // OMX_ErrorInsufficientResources is allowed in OMX_EmptyThisBuffer and + // OMX_FillThisBuffer + return omxRetValue; + } + else + { + return SendOmxErrorEventIfNeeded(omxRetValue); + } + + } + +OMX_ERRORTYPE +COmxILFsm::FsmTransition(TStateIndex aNewState) + { + DEBUG_PRINTF2(_L8("COmxILFsm::FsmTransition : %d"), aNewState); + + __ASSERT_ALWAYS(aNewState < EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (aNewState != iCurrentStateIndex) + { + // We notify the processing function of all the state transitions, even + // if they are not to a final OpenMAX IL state. + OMX_ERRORTYPE omxRetValue; + if (OMX_ErrorNone != + (omxRetValue = + iProcFunction.StateTransitionIndication(aNewState))) + { + // No need of propagating further error codes if the component is + // transitioning to OMX_StateInvalid or if the PF itself is + // invalidating the component... + if (EStateInvalid != aNewState && + OMX_ErrorInvalidState != omxRetValue) + { + return omxRetValue; + } + } + + iCurrentStateIndex = aNewState; + ipCurrentState = iStates[iCurrentStateIndex]; + + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILFsm::FsmTransition(TUint32 aNewState) + { + + return FsmTransition(static_cast(aNewState)); + + } + + +OMX_ERRORTYPE +COmxILFsm::GetComponentVersion(OMX_STRING aComponentName, + OMX_VERSIONTYPE* apComponentVersion, + OMX_VERSIONTYPE* apSpecVersion, + OMX_UUIDTYPE* apComponentUUID) const + { + DEBUG_PRINTF(_L8("COmxILFsm::GetComponentVersion")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // This api should not be allowed in OMX_StateInvalid + if (EStateInvalid == iCurrentStateIndex) + { + return SendOmxErrorEventIfNeeded(OMX_ErrorInvalidState); + } + + if (!aComponentName || + !apComponentVersion || + !apSpecVersion || + !apComponentUUID) + { + return OMX_ErrorBadParameter; + } + + // This API call is independent of the current state. Its handled by the + // the config manager + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + iConfigManager.GetComponentVersion( + aComponentName, + apComponentVersion, + apSpecVersion, + apComponentUUID)); + } + + +OMX_ERRORTYPE +COmxILFsm::SendCommand(OMX_COMMANDTYPE aCommand, + TUint32 anParam1, + TAny* apCmdData) + { + DEBUG_PRINTF3(_L8("COmxILFsm::SendCommand : command [%d] Param1 [%d]"), aCommand, anParam1); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // Do some very minor error checking here to try to save some time... + if (OMX_CommandStateSet == aCommand && + anParam1 > OMX_StateWaitForResources) + { + return OMX_ErrorBadParameter; + } + + TOmxILCommand command(aCommand, anParam1, apCmdData); + OMX_ERRORTYPE sendCommandError; + switch (aCommand) + { + case OMX_CommandStateSet: + { + sendCommandError = ipCurrentState->CommandStateSet(*this, command); + } + break; + case OMX_CommandFlush: + { + sendCommandError = ipCurrentState->CommandFlush(*this, command); + } + break; + case OMX_CommandPortDisable: + { + sendCommandError = ipCurrentState->CommandPortDisable(*this, command); + } + break; + case OMX_CommandPortEnable: + { + sendCommandError = ipCurrentState->CommandPortEnable(*this, command); + } + break; + case OMX_CommandMarkBuffer: + { + sendCommandError = ipCurrentState->CommandMarkBuffer(*this, command); + } + break; + default: + { + // This is an invalid command type + return OMX_ErrorBadParameter; + } + }; + + if (OMX_ErrorNone == sendCommandError || + OMX_ErrorInsufficientResources == sendCommandError) + { + // OMX_ErrorInsufficientResources is allowed in OMX_SendCommand + return sendCommandError; + } + else + { + return SendOmxErrorEventIfNeeded(sendCommandError); + } + + } + + +OMX_ERRORTYPE +COmxILFsm::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILFsm::GetParameter")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apComponentParameterStructure) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->GetParameter(*this, aParamIndex, + apComponentParameterStructure)); + } + + +OMX_ERRORTYPE +COmxILFsm::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILFsm::SetParameter")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apComponentParameterStructure) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->SetParameter(*this, aParamIndex, + apComponentParameterStructure)); + } + + +OMX_ERRORTYPE +COmxILFsm::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILFsm::GetConfig")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apComponentConfigStructure) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->GetConfig(*this, + aConfigIndex, + apComponentConfigStructure)); + + } + + +OMX_ERRORTYPE +COmxILFsm::SetConfig(OMX_INDEXTYPE aIndex, + const TAny* apComponentConfigStructure) + { + DEBUG_PRINTF(_L8("COmxILFsm::SetConfig")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apComponentConfigStructure) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->SetConfig(*this, aIndex, apComponentConfigStructure)); + + } + + +OMX_ERRORTYPE +COmxILFsm::GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const + { + DEBUG_PRINTF(_L8("COmxILFsm::GetExtensionIndex")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apIndexType || !aParameterName) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->GetExtensionIndex(*this, + aParameterName, + apIndexType)); + } + + +OMX_ERRORTYPE +COmxILFsm::GetState(OMX_STATETYPE* apState) const + { + DEBUG_PRINTF(_L8("COmxILFsm::GetState")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apState) + { + return OMX_ErrorBadParameter; + } + + *apState = ipCurrentState->GetState(); + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILFsm::ComponentTunnelRequest(OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILFsm::ComponentTunnelRequest")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // Here, since NULL is a valid parameter for aTunneledComp, checking of + // input parameters is completely done by the ports. + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->ComponentTunnelRequest(*this, + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup)); + + } + + +OMX_ERRORTYPE +COmxILFsm::UseBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILFsm::UseBuffer")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!appBufferHdr || !aSizeBytes || !apBuffer) + { + return OMX_ErrorBadParameter; + } + + return PopulateBuffer(appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer); + + } + + +OMX_ERRORTYPE +COmxILFsm::AllocateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes) + { + DEBUG_PRINTF(_L8("COmxILFsm::AllocateBuffer")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!appBufferHdr || !aSizeBytes) + { + return OMX_ErrorBadParameter; + } + + + return PopulateBuffer(appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + 0); + + } + + +OMX_ERRORTYPE +COmxILFsm::FreeBuffer(OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILFsm::FreeBuffer")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apBuffer) + { + return OMX_ErrorBadParameter; + } + + TBool portDepopulationCompleted = EFalse; + OMX_ERRORTYPE omxRetValue = + ipCurrentState->FreeBuffer(*this, + aPortIndex, + apBuffer, + portDepopulationCompleted); + + if (OMX_ErrorNone == omxRetValue) + { + if (portDepopulationCompleted) + { + if (ESubStateIdleToLoaded == iCurrentStateIndex) + { + if (iPortManager.AllPortsDePopulated()) + { + // Complete here the transition to OMX_StateLoaded + omxRetValue = FsmTransition(EStateLoaded); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that port depopulation has + // completed sucessfully + omxRetValue = + iCallbacks.TransitionCompleteNotification( + OMX_StateLoaded); + } + } + } + } + } + + if (OMX_ErrorNone == omxRetValue) + { + return OMX_ErrorNone; + } + else + { + return SendOmxErrorEventIfNeeded(omxRetValue); + } + + } + + +OMX_ERRORTYPE +COmxILFsm::EmptyThisBuffer(OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF2(_L8("COmxILFsm::EmptyThisBuffer : BUFFER [%X]"), apBuffer); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apBuffer) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->EmptyThisBuffer(*this, apBuffer)); + + } + + +OMX_ERRORTYPE +COmxILFsm::FillThisBuffer(OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF2(_L8("COmxILFsm::FillThisBuffer : BUFFER [%X]"), apBuffer); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apBuffer) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + ipCurrentState->FillThisBuffer(*this, apBuffer)); + + } + + +OMX_ERRORTYPE +COmxILFsm::SetCallbacks(const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData) + { + DEBUG_PRINTF(_L8("COmxILFsm::SetCallbacks")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!apCallbacks) + { + return OMX_ErrorBadParameter; + } + + // This api should only be allowed in OMX_StateLoaded + if (EStateLoaded != iCurrentStateIndex) + { + return OMX_ErrorIncorrectStateOperation; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + iCallbacks.RegisterILClientCallbacks(apCallbacks, apAppData)); + + } + + +OMX_ERRORTYPE +COmxILFsm::UseEGLImage(OMX_BUFFERHEADERTYPE** /*appBufferHdr*/, + OMX_U32 /*aPortIndex*/, + OMX_PTR /*aAppPrivate*/, + void* /*eglImage*/) + { + DEBUG_PRINTF(_L8("COmxILFsm::UseEGLImage")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + return OMX_ErrorNotImplemented; + } + +OMX_ERRORTYPE +COmxILFsm::ComponentRoleEnum(OMX_U8* aRole, + OMX_U32 aIndex) const + { + DEBUG_PRINTF(_L8("COmxILFsm::ComponentRoleEnum")); + + __ASSERT_DEBUG(iCurrentStateIndex != EStateMax, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // This api should not be allowed in OMX_StateInvalid + if (EStateInvalid == iCurrentStateIndex) + { + return SendOmxErrorEventIfNeeded(OMX_ErrorInvalidState); + } + + if (!aRole) + { + return OMX_ErrorBadParameter; + } + + RETURN_OMX_ERROR_AND_EVENT_IF_NEEDED( + iConfigManager.ComponentRoleEnum(aRole, + aIndex)); + + } + +/** + This method is here to fullfill the following functionalities: + + -# It is used to make sure that the component error codes are returned to + the IL Client in a way that conforms with Table 3-9 of the OpenMAX IL + 1.1.1 spec. This table specifies which error codes must be sent with + EventHandler. If an error code is to be sent via EventHandler, the API + return code must be OMX_ErrorNone. + + -# This method is also used to invalidate the component whenever an internal + component action returns OMX_ErrorInvalidState. For example, this is + useful when code executed by a port or by the processing function cannot + recover from an internal error. Returning OMX_ErrorInvalidState in that + kind of situation will invalidate the component in + SendOmxErrorEventIfNeeded and the event will be conveyed to the IL Client + as mandated by the spec. + + @param aError An OpenMAX IL error code. + */ +OMX_ERRORTYPE +COmxILFsm::SendOmxErrorEventIfNeeded(OMX_ERRORTYPE aError) + { + DEBUG_PRINTF2(_L8("COmxILFsm::SendOmxErrorEventIfNeeded - aError = 0x%X"), aError); + + OMX_ERRORTYPE returnError = aError; + switch(aError) + { + case OMX_ErrorInsufficientResources: + { + DEBUG_PRINTF(_L8("COmxILFsm::SendOmxErrorEventIfNeeded aError[OMX_ErrorInsufficientResources]")); + iCallbacks.ErrorEventNotification(aError); + } + break; + case OMX_ErrorInvalidState: + { + DEBUG_PRINTF(_L8("COmxILFsm::SendOmxErrorEventIfNeeded aError[OMX_ErrorInvalidState]")); + iCallbacks.ErrorEventNotification(aError); + if (EStateInvalid != iCurrentStateIndex) + { + returnError = OMX_ErrorNone; + } + } + break; + case OMX_ErrorUnderflow: + case OMX_ErrorOverflow: + case OMX_ErrorHardware: + case OMX_ErrorStreamCorrupt: + case OMX_ErrorResourcesLost: + case OMX_ErrorSameState: + case OMX_ErrorResourcesPreempted: + case OMX_ErrorPortUnresponsiveDuringAllocation: + case OMX_ErrorPortUnresponsiveDuringDeallocation: + case OMX_ErrorPortUnresponsiveDuringStop: + case OMX_ErrorIncorrectStateTransition: + case OMX_ErrorPortUnpopulated: + case OMX_ErrorDynamicResourcesUnavailable: + case OMX_ErrorMbErrorsInFrame: + case OMX_ErrorFormatNotDetected: + { + DEBUG_PRINTF2(_L8("COmxILFsm::SendOmxErrorEventIfNeeded aError[%X]"), aError); + iCallbacks.ErrorEventNotification(aError); + returnError = OMX_ErrorNone; + } + break; + }; + + if(OMX_ErrorInvalidState == aError && + EStateInvalid != iCurrentStateIndex) + { + // Invalidate this component. This instance of the component should be + // destroyed by the IL Client after this. No need to check error code. + FsmTransition(EStateInvalid); + } + + return returnError; + + } + +OMX_ERRORTYPE +COmxILFsm::SendOmxErrorEventIfNeeded(OMX_ERRORTYPE aError) const + { + DEBUG_PRINTF(_L8("COmxILFsm::SendOmxErrorEventIfNeeded")); + + return const_cast(this)->SendOmxErrorEventIfNeeded(aError); + + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilfsm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilfsm.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,204 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILFSM_H +#define OMXILFSM_H + + +#include +#include +#include +#include + +// forward declarations +class MOmxILPortManagerIf; +class COmxILConfigManager; +class MOmxILCallbackManagerIf; +class COmxILComponent; +class COmxILProcessingFunction; + +/** + FSM Panic category +*/ +_LIT(KOmxILFsmPanicCategory, "OmxILFsm"); + + +/** + FSM class that represents the main FSM context object of the State + pattern. It delegates most events for processing to the current state + object. + */ +NONSHARABLE_CLASS(COmxILFsm) : public CBase + { + +public: + + static const TInt KMaxMsgQueueEntries = 10; +public: + + static COmxILFsm* NewL(COmxILComponent& aComponent, + COmxILProcessingFunction& aProcFunction, + MOmxILPortManagerIf& aPortManager, + COmxILConfigManager& aConfigManager, + MOmxILCallbackManagerIf& aCallbacks); + + ~COmxILFsm(); + + OMX_ERRORTYPE InitFsm(); + + COmxILComponent* GetComponent() const; + + // + // OpenMAX IL API calls + // + + OMX_ERRORTYPE GetComponentVersion(OMX_STRING aComponentName, + OMX_VERSIONTYPE* pComponentVersion, + OMX_VERSIONTYPE* pSpecVersion, + OMX_UUIDTYPE* pComponentUUID) const; + + OMX_ERRORTYPE SendCommand(OMX_COMMANDTYPE Cmd, + TUint32 nParam1, + TAny* apCmdData); + + OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure); + + OMX_ERRORTYPE GetExtensionIndex(OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + OMX_ERRORTYPE GetState(OMX_STATETYPE* apState) const; + + OMX_ERRORTYPE ComponentTunnelRequest(OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE UseBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer); + + OMX_ERRORTYPE AllocateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes); + + OMX_ERRORTYPE FreeBuffer(OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE EmptyThisBuffer(OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE SetCallbacks(const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData); + + OMX_ERRORTYPE UseEGLImage(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR aAppPrivate, + void* eglImage); + + OMX_ERRORTYPE ComponentRoleEnum(OMX_U8* aRole, + OMX_U32 aIndex) const; + +private: + + // Declaration of nested private state classes + class COmxILState; + class COmxILStateInvalid; + class COmxILStateLoaded; + class COmxILStateLoadedToIdle; + class COmxILStateWaitForResources; + class COmxILStateIdle; + class COmxILStateIdleToLoaded; + class COmxILStateExecuting; + class COmxILStateExecutingToIdle; + class COmxILStatePause; + class COmxILStatePauseToIdle; + class MOmxILPauseOrExecutingToIdle; + + // Note that the following friends don't break COmxILFsm's interface as all + // friends below are COmxILFsm's private nested classes and therefore they + // are logically part of COmxILFsm implementation + friend class COmxILState; + friend class COmxILStateInvalid; + friend class COmxILStateLoaded; + friend class COmxILStateLoadedToIdle; + friend class COmxILStateWaitForResources; + friend class COmxILStateIdle; + friend class COmxILStateIdleToLoaded; + friend class COmxILStateExecuting; + friend class COmxILStateExecutingToIdle; + friend class COmxILStatePause; + friend class COmxILStatePauseToIdle; + friend class MOmxILPauseOrExecutingToIdle; + +private: + + COmxILFsm(COmxILComponent& aComponent, + COmxILProcessingFunction& aProcFunction, + MOmxILPortManagerIf& aPortManager, + COmxILConfigManager& aConfigManager, + MOmxILCallbackManagerIf& aCallbacks); + + void ConstructL(); + + OMX_ERRORTYPE PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer); + + OMX_ERRORTYPE FsmTransition(TStateIndex aNewState); + + OMX_ERRORTYPE FsmTransition(TUint32 aNewState); + + OMX_ERRORTYPE SendOmxErrorEventIfNeeded(OMX_ERRORTYPE aError) const; + + OMX_ERRORTYPE SendOmxErrorEventIfNeeded(OMX_ERRORTYPE aError); + +private: + + COmxILComponent& iComponent; + COmxILProcessingFunction& iProcFunction; + MOmxILPortManagerIf& iPortManager; + COmxILConfigManager& iConfigManager; + MOmxILCallbackManagerIf& iCallbacks; + + RPointerArray iStates; + TStateIndex iCurrentStateIndex; + COmxILState* ipCurrentState; + + }; + + +#endif // OMXILFSM_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilimageport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilimageport.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,418 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent + */ + +#include +#include +#include "log.h" +#include "omxilimageportimpl.h" + +EXPORT_C +COmxILImagePort::COmxILImagePort() + { + DEBUG_PRINTF(_L8("COmxILImagePort::COmxILImagePort")); + } + +EXPORT_C +COmxILImagePort::~COmxILImagePort() + { + DEBUG_PRINTF(_L8("COmxILImagePort::~COmxILImagePort")) + delete ipImagePortImpl; + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::GetLocalOmxParamIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILImagePort::GetLocalOmxParamIndexes")); + + // Always collect local indexes from parent + OMX_ERRORTYPE omxRetValue = COmxILPort::GetLocalOmxParamIndexes(aIndexArray); + + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + TInt err = aIndexArray.InsertInOrder(OMX_IndexParamImagePortFormat); + + // Note that index duplication is OK. + if (KErrNone != err && KErrAlreadyExists != err) + { + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::GetLocalOmxConfigIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILImagePort::GetLocalOmxConfigIndexes")); + + // Always collect local indexes from parent + return COmxILPort::GetLocalOmxConfigIndexes(aIndexArray); + + } + +EXPORT_C OMX_ERRORTYPE COmxILImagePort::GetParameter(OMX_INDEXTYPE aParamIndex, TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILImagePort::GetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamImagePortFormat: + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + omxRetValue = ipImagePortImpl->GetParameter(aParamIndex, apComponentParameterStructure); + } + break; + default: + { + // Try the parent's indexes + omxRetValue = COmxILPort::GetParameter(aParamIndex, apComponentParameterStructure); + } + }; + + return omxRetValue; + } + +EXPORT_C OMX_ERRORTYPE COmxILImagePort::SetParameter(OMX_INDEXTYPE aParamIndex, const TAny* apComponentParameterStructure, TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + + switch(aParamIndex) + { + case OMX_IndexParamImagePortFormat: + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + omxRetValue = ipImagePortImpl->SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + } + break; + default: + { + // Try the parent's indexes + omxRetValue = COmxILPort::SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + } + }; + return omxRetValue; + } + +EXPORT_C +void COmxILImagePort::ConstructL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedImageFormats, + const RArray& aSupportedColorFormats) + { + COmxILPort::ConstructL(aCommonPortData); //create COmxILPortImpl + ipImagePortImpl=COmxILImagePortImpl::NewL(aCommonPortData, aSupportedImageFormats, aSupportedColorFormats); //create COmxILImagePortImpl + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILPort::GetConfig")); + return COmxILPort::GetConfig(aConfigIndex, + apComponentConfigStructure); + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILPort::SetConfig")); + return COmxILPort::SetConfig(aConfigIndex, + apComponentConfigStructure, + aUpdateProcessingFunction); + + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::GetExtensionIndex(OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const + { + return COmxILPort::GetExtensionIndex(aParameterName, + apIndexType); + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& aPortPopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILImagePort::PopulateBuffer : pBuffer [%X]"), apBuffer); + return COmxILPort::PopulateBuffer(appBufferHdr, + apAppPrivate, + aSizeBytes, + apBuffer, + aPortPopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::FreeBuffer(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILImagePort::FreeBuffer : BUFFER [%X]"), apBufferHeader); + return COmxILPort::FreeBuffer(apBufferHeader, aPortDepopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::TunnelRequest(OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILImagePort::TunnelRequest")); + return COmxILPort::TunnelRequest(aTunneledComp, + aTunneledPort, + apTunnelSetup); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::PopulateTunnel(TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILImagePort::PopulateTunnel")); + return COmxILPort::PopulateTunnel(portPopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::FreeTunnel(TBool& portDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILImagePort::FreeTunnel")); + return COmxILPort::FreeTunnel(portDepopulationCompleted); + } + +EXPORT_C TBool +COmxILImagePort::SetBufferSent(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark) + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetBufferSent")); + return COmxILPort::SetBufferSent(apBufferHeader, + aBufferMarkedWithOwnMark); + } + +EXPORT_C TBool +COmxILImagePort::SetBufferReturned(OMX_BUFFERHEADERTYPE* apBufferHeader) + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetBufferReturned")); + return COmxILPort::SetBufferReturned(apBufferHeader); + } + +EXPORT_C void +COmxILImagePort::SetTransitionToEnabled() + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetTransitionToEnabled")); + return COmxILPort::SetTransitionToEnabled(); + } + +EXPORT_C void +COmxILImagePort::SetTransitionToDisabled() + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetTransitionToDisabled")); + return COmxILPort::SetTransitionToDisabled(); + } + +EXPORT_C void +COmxILImagePort::SetTransitionToDisabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetTransitionToDisabledCompleted")); + return COmxILPort::SetTransitionToDisabledCompleted(); + } + +EXPORT_C void +COmxILImagePort::SetTransitionToEnabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetTransitionToEnabledCompleted")); + return COmxILPort::SetTransitionToEnabledCompleted(); + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::StoreBufferMark(const OMX_MARKTYPE* apMark) + { + DEBUG_PRINTF(_L8("COmxILImagePort::StoreBufferMark")); + return COmxILPort::StoreBufferMark(apMark); + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::SetComponentRoleDefaults(TUint aComponentRoleIndex) + { + DEBUG_PRINTF(_L8("COmxILImagePort::SetComponentRoleDefaults")); + + return COmxILPort::SetComponentRoleDefaults(aComponentRoleIndex); + } + +EXPORT_C TBool +COmxILImagePort::HasAllBuffersAtHome() const + { + return COmxILPort::HasAllBuffersAtHome(); + } + +EXPORT_C TBool +COmxILImagePort::IsBufferAtHome(OMX_BUFFERHEADERTYPE* apBufferHeader) const + { + DEBUG_PRINTF2(_L8("COmxILImagePort::IsBufferAtHome : [%X]"), apBufferHeader); + return COmxILPort::IsBufferAtHome(apBufferHeader); + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::DoPortReconfiguration(TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient) + { + DEBUG_PRINTF(_L8("COmxILImagePort::DoPortReconfiguration")); + + return COmxILPort::DoPortReconfiguration(aPortSettingsIndex, + aPortSettings, + aEventForILClient); + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::DoBufferAllocation(OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF2(_L8("COmxILImagePort::DoBufferAllocation : aSizeBytes[%u]"), aSizeBytes); + return COmxILPort::DoBufferAllocation(aSizeBytes, + apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILImagePort::DoBufferDeallocation(OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILImagePort::DoBufferDeallocation")); + return COmxILPort::DoBufferDeallocation(apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::DoBufferWrapping(OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILImagePort::DoBufferWrapping")); + return COmxILPort::DoBufferWrapping(aSizeBytes, + apBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILImagePort::DoBufferUnwrapping(OMX_PTR apBuffer, + OMX_PTR appPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + + DEBUG_PRINTF(_L8("COmxILImagePort::DoBufferUnwrapping")); + return COmxILPort::DoBufferUnwrapping(apBuffer, + appPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C OMX_ERRORTYPE +COmxILImagePort::DoOmxUseBuffer(OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer) + { + + DEBUG_PRINTF(_L8("COmxILImagePort::DoOmxUseBuffer")); + return COmxILPort::DoOmxUseBuffer(aTunnelledComponent, + appBufferHdr, + aTunnelledPortIndex, + apPortPrivate, + apPlatformPrivate, + aSizeBytes, + apBuffer); + } + + +EXPORT_C +TInt COmxILImagePort::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return COmxILPort::Extension_(aExtensionId, a0, a1); + } + +EXPORT_C +const RArray& COmxILImagePort::GetSupportedImageFormats() const + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + return ipImagePortImpl->GetSupportedImageFormats(); + } + +EXPORT_C +const RArray& COmxILImagePort::GetSupportedColorFormats() const + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + return ipImagePortImpl->GetSupportedColorFormats(); + } + +EXPORT_C +const OMX_IMAGE_PARAM_PORTFORMATTYPE& COmxILImagePort::GetParamImagePortFormat() const + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + return ipImagePortImpl->GetParamImagePortFormat(); + } + +EXPORT_C +RArray& COmxILImagePort::GetSupportedImageFormats() + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + return ipImagePortImpl->GetSupportedImageFormats(); + } + +EXPORT_C +RArray& COmxILImagePort::GetSupportedColorFormats() + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + return ipImagePortImpl->GetSupportedColorFormats(); + } + +EXPORT_C +OMX_IMAGE_PARAM_PORTFORMATTYPE& COmxILImagePort::GetParamImagePortFormat() + { + __ASSERT_ALWAYS(ipImagePortImpl, User::Panic(KOmxILImagePortPanicCategory, 1)); + return ipImagePortImpl->GetParamImagePortFormat(); + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilimageportimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilimageportimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,221 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent + */ + +#include +#include +#include "log.h" +#include "omxilimageportimpl.h" + +COmxILImagePortImpl* COmxILImagePortImpl::NewL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedImageFormats, + const RArray& aSupportedColorFormats) + { + COmxILImagePortImpl* self = new(ELeave) COmxILImagePortImpl(); + CleanupStack::PushL(self); + self->ConstructL(aCommonPortData, aSupportedImageFormats, aSupportedColorFormats); + CleanupStack::Pop(); + return self; + } + +COmxILImagePortImpl::COmxILImagePortImpl() + { + DEBUG_PRINTF(_L8("COmxILImagePortImpl::COmxILImagePortImpl")); + } + +void COmxILImagePortImpl::ConstructL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedImageFormats, + const RArray& aSupportedColorFormats) + { + DEBUG_PRINTF(_L8("COmxILImagePortImpl::ConstructL")); + TUint count = aSupportedImageFormats.Count(); + for (TInt i = 0; i < count; ++i) + { + iSupportedImageFormats.AppendL(aSupportedImageFormats[i]); + } + + count = aSupportedColorFormats.Count(); + for (TInt i = 0; i < count; ++i) + { + iSupportedColorFormats.AppendL(aSupportedColorFormats[i]); + } + + TInt numImageFormats = iSupportedImageFormats.Count(); + TInt numColorFormats = iSupportedColorFormats.Count(); + iParamImagePortFormat.nSize = sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE); + iParamImagePortFormat.nVersion = aCommonPortData.iOmxVersion; + iParamImagePortFormat.nPortIndex = aCommonPortData.iPortIndex; + iParamImagePortFormat.nIndex = numImageFormats ? numImageFormats - 1 : 0; + iParamImagePortFormat.eCompressionFormat = numImageFormats ? iSupportedImageFormats[0] : OMX_IMAGE_CodingUnused; + iParamImagePortFormat.eColorFormat = numColorFormats ? iSupportedColorFormats[0] : OMX_COLOR_FormatUnused; + } + +COmxILImagePortImpl::~COmxILImagePortImpl() + { + DEBUG_PRINTF(_L8("COmxILImagePortImpl::~COmxILImagePortImpl")); + iSupportedImageFormats.Close(); + iSupportedColorFormats.Close(); + } + +OMX_ERRORTYPE COmxILImagePortImpl::GetParameter(OMX_INDEXTYPE aParamIndex, TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILImagePortImpl::GetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + + switch(aParamIndex) + { + case OMX_IndexParamImagePortFormat: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)))) + { + return omxRetValue; + } + + OMX_IMAGE_PARAM_PORTFORMATTYPE* imagePortDefinition = static_cast(apComponentParameterStructure); + + if(OMX_IMAGE_CodingUnused == iParamImagePortFormat.eCompressionFormat) + { + if (imagePortDefinition->nIndex >= iSupportedColorFormats.Count()) + { + return OMX_ErrorNoMore; + } + imagePortDefinition->eCompressionFormat = OMX_IMAGE_CodingUnused; + imagePortDefinition->eColorFormat = iSupportedColorFormats[imagePortDefinition->nIndex]; + } + else + { + if (imagePortDefinition->nIndex >= iSupportedImageFormats.Count()) + { + return OMX_ErrorNoMore; + } + imagePortDefinition->eCompressionFormat = iSupportedImageFormats[imagePortDefinition->nIndex]; + } + break; + } + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILImagePortPanicCategory, 1)); + }; + + return OMX_ErrorNone; + } + +OMX_ERRORTYPE COmxILImagePortImpl::SetParameter(OMX_INDEXTYPE aParamIndex, const TAny* apComponentParameterStructure, TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILImagePortImpl::SetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + + switch(aParamIndex) + { + case OMX_IndexParamImagePortFormat: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE)))) + { + return omxRetValue; + } + + const OMX_IMAGE_PARAM_PORTFORMATTYPE *componentParameterStructure = static_cast(apComponentParameterStructure); + + if(OMX_IMAGE_CodingUnused == componentParameterStructure->eCompressionFormat) + { + if(OMX_COLOR_FormatUnused == componentParameterStructure->eColorFormat) + { + // Both Compression Format and Color can not be Unused at the same time. + return OMX_ErrorBadParameter; + } + + if(iParamImagePortFormat.eColorFormat != componentParameterStructure->eColorFormat) + { + if(KErrNotFound == iSupportedColorFormats.Find(componentParameterStructure->eColorFormat)) + { + return OMX_ErrorUnsupportedSetting; + } + else + { + iParamImagePortFormat.eColorFormat = componentParameterStructure->eColorFormat; + } + aUpdateProcessingFunction = ETrue; + } + } + else + { + // Data is compressed. Change relevant variables. + if (OMX_COLOR_FormatUnused != componentParameterStructure->eColorFormat) + { + // Both Compression Format and Color can not be Unused at the same time. + return OMX_ErrorBadParameter; + } + + if (iParamImagePortFormat.eCompressionFormat != componentParameterStructure->eCompressionFormat) + { + if(KErrNotFound == iSupportedImageFormats.Find(componentParameterStructure->eCompressionFormat)) + { + return OMX_ErrorUnsupportedSetting; + } + else + { + iParamImagePortFormat.eCompressionFormat = componentParameterStructure->eCompressionFormat; + aUpdateProcessingFunction = ETrue; + } + } + } + break; + } + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILImagePortPanicCategory, 1)); + }; + return OMX_ErrorNone; + } + +const RArray& COmxILImagePortImpl::GetSupportedImageFormats() const + { + return iSupportedImageFormats; + } + +const RArray& COmxILImagePortImpl::GetSupportedColorFormats() const + { + return iSupportedColorFormats; + } + +const OMX_IMAGE_PARAM_PORTFORMATTYPE& COmxILImagePortImpl::GetParamImagePortFormat() const + { + return iParamImagePortFormat; + } + +RArray& COmxILImagePortImpl::GetSupportedImageFormats() + { + return iSupportedImageFormats; + } + +RArray& COmxILImagePortImpl::GetSupportedColorFormats() + { + return iSupportedColorFormats; + } + +OMX_IMAGE_PARAM_PORTFORMATTYPE& COmxILImagePortImpl::GetParamImagePortFormat() + { + return iParamImagePortFormat; + } + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilimageportimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilimageportimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,66 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + * @file + * @internalTechnology + */ + +#ifndef OMXILIMAGEPORTIMPL_H +#define OMXILIMAGEPORTIMPL_H + +#include + +#include +#include +#include + +#include + +class COmxILImagePortImpl : public CBase + { +public: + static COmxILImagePortImpl* NewL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedImageFormats, + const RArray& aSupportedColorFormats); + ~COmxILImagePortImpl(); + + OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction); + + const RArray& GetSupportedImageFormats() const; + const RArray& GetSupportedColorFormats() const; + const OMX_IMAGE_PARAM_PORTFORMATTYPE& GetParamImagePortFormat() const; + RArray& GetSupportedImageFormats(); + RArray& GetSupportedColorFormats(); + OMX_IMAGE_PARAM_PORTFORMATTYPE& GetParamImagePortFormat(); + +private: + COmxILImagePortImpl(); + void ConstructL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedImageFormats, + const RArray& aSupportedColorFormats); + +private: + RArray iSupportedImageFormats; + RArray iSupportedColorFormats; + OMX_IMAGE_PARAM_PORTFORMATTYPE iParamImagePortFormat; + }; +#endif // OMXILIMAGEPORTIMPL_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilincontextcallbackmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilincontextcallbackmanager.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,780 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include "omxilincontextcallbackmanager.h" +#include "omxilfsm.h" +#include +#include + +COmxILInContextCallbackManager* +COmxILInContextCallbackManager::NewL( + OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::NewL")); + COmxILInContextCallbackManager* self = new (ELeave)COmxILInContextCallbackManager( + apComponentHandle, + apAppData, + apCallbacks); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void +COmxILInContextCallbackManager::ConstructL() + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::ConstructL")); + + User::LeaveIfError(iLock.CreateLocal()); + + } + +COmxILInContextCallbackManager::COmxILInContextCallbackManager(OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks) + : + CBase(), + XOmxILCallbackManagerIfImpl( + static_cast(apComponentHandle), + apAppData, + apCallbacks), + iLock(), + iPendingQueue(), + iFlushPendingQueue(EFalse), + iCurrentState(OMX_StateLoaded), + iPreviousState(OMX_StateLoaded) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::COmxILInContextCallbackManager")); + } + +COmxILInContextCallbackManager::~COmxILInContextCallbackManager() + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::~COmxILInContextCallbackManager Pending Queue count [%d]"), + iPendingQueue.Count()); + + iLock.Close(); + + iPendingQueue.Close(); + + } + +void +COmxILInContextCallbackManager::LockCallbackManager() + { + iLock.Wait(); + } + +void +COmxILInContextCallbackManager::UnlockCallbackManager() + { + iLock.Signal(); + } + +void +COmxILInContextCallbackManager::SetPortManager(MOmxILPortManagerIf& apPortManager) + { + LockCallbackManager(); + DoSetPortManager(apPortManager); + UnlockCallbackManager(); + } + +void +COmxILInContextCallbackManager::SetFsm(COmxILFsm& apFsm) + { + LockCallbackManager(); + DoSetFsm(apFsm); + UnlockCallbackManager(); + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::RegisterComponentHandle(OMX_HANDLETYPE aComponentHandle) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::RegisterComponentHandle")); + LockCallbackManager(); + OMX_ERRORTYPE omxError = DoRegisterComponentHandle(aComponentHandle); + UnlockCallbackManager(); + return omxError; + } + +/** + The IL Client callback registration is handled in this implementation + asynchronously. Note that this implementation assumes that the IL Client + will update the callbacks information once all expected callbacks from this + component have already been received and therefore, the callback change will + be safe leading to no race condition at the IL Client side. + + @param apCallbacks The IL Client callback structure. + + @param apAppData Pointer to an application provided value so that the + application can have a component specific context when receiving + the callback. + + @return OMX_ERRORTYPE + */ +OMX_ERRORTYPE +COmxILInContextCallbackManager::RegisterILClientCallbacks(const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::RegisterILClientCallbacks")); + + LockCallbackManager(); + OMX_ERRORTYPE omxError = DoRegisterILClientCallbacks(apCallbacks, apAppData); + UnlockCallbackManager(); + return omxError; + + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::RegisterTunnelCallback( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::RegisterTunnelCallback : aTunnelledComponentHandle [%x]"), aTunnelledComponentHandle); + + LockCallbackManager(); + OMX_ERRORTYPE omxError = DoRegisterTunnelCallback(aLocalPortIndex, + aLocalPortDirection, + aTunnelledComponentHandle, + aTunnelledPortIndex); + UnlockCallbackManager(); + return omxError; + + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::DeregisterTunnelCallback( + OMX_U32 aLocalPortIndex) + { + + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::DeregisterTunnelCallback")); + + LockCallbackManager(); + OMX_ERRORTYPE omxError = DoRegisterTunnelCallback(aLocalPortIndex, + OMX_DirMax, + 0, + 0); + UnlockCallbackManager(); + return omxError; + + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::RegisterBufferMarkPropagationPort( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::RegisterBufferMarkPropagationPort")); + + LockCallbackManager(); + OMX_ERRORTYPE omxError = DoRegisterBufferMarkPropagationPort( + aPortIndex, + aPropagationPortIndex); + UnlockCallbackManager(); + return omxError; + + } + +TBool +COmxILInContextCallbackManager::BufferRemovalIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::BufferRemovalIndication")); + + return RemoveBuffersByBufferHeader( + iPendingQueue, apBufferHeader, aDirection); + + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::TransitionCompleteNotification(OMX_STATETYPE aOmxState) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::TransitionCompleteNotification")); + + // No need to lock callback manager. Anyway, we should not have it locked + // when calling an IL Client callback method + OMX_ERRORTYPE omxError = EventNotification(OMX_EventCmdComplete, + OMX_CommandStateSet, + aOmxState, + 0); + + return omxError; + + } + + +OMX_ERRORTYPE +COmxILInContextCallbackManager::CommandCompleteNotification(OMX_COMMANDTYPE aOmxCommand, + OMX_U32 aOmxPortIndex) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::CommandCompleteNotification")); + + // No need to lock callback manager. Anyway, we should not have it locked + // when calling an IL Client callback method + + OMX_ERRORTYPE omxError = EventNotification(OMX_EventCmdComplete, + aOmxCommand, + aOmxPortIndex, + 0); + + return omxError; + + } + + +OMX_ERRORTYPE +COmxILInContextCallbackManager::ErrorEventNotification(OMX_ERRORTYPE aOmxError) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::ErrorEventNotification : aOmxError[%X] "), aOmxError); + + // No need to lock callback manager. Anyway, we should not have it locked + // when calling an IL Client callback method + OMX_ERRORTYPE omxError = EventNotification(OMX_EventError, + aOmxError, + 0, + 0); + + return omxError; + + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::EventNotification(OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo) + { + DEBUG_PRINTF4(_L8("COmxILInContextCallbackManager::EventNotification : aEvent[%u] aData1[%u] aData2[%u]"), + aEvent, aData1, aData2); + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + switch(aData1) + { + case OMX_CommandStateSet: + { + LockCallbackManager(); + iPreviousState = iCurrentState; + iCurrentState = static_cast(aData2); + + DEBUG_PRINTF4(_L8("COmxILInContextCallbackManager::EventNotification() : Handle[%X] iPreviousState[%d] -> iCurrentState[%d]"), ipHandle, iPreviousState, iCurrentState); + + if (OMX_StatePause == iPreviousState && + OMX_StateIdle == iCurrentState) + { + // Release lock before any callback gets called... + UnlockCallbackManager(); + + // Flush pending queue first... + FlushQueue(iPendingQueue); + + // ... and now signal command completion... + omxError = + DoEventNotification(aEvent, + aData1, + aData2, + aExtraInfo); + + } + else if (OMX_StatePause == iPreviousState && + OMX_StateExecuting == iCurrentState) + { + // Release lock before any callback... + UnlockCallbackManager(); + + // Signal command completion first... + omxError = + DoEventNotification(aEvent, + aData1, + aData2, + aExtraInfo); + + // ... and now flush... + FlushQueue(iPendingQueue); + + } + else + { + // Release lock before any callback... + UnlockCallbackManager(); + + // Signal command completion... + omxError = + DoEventNotification(aEvent, + aData1, + aData2, + aExtraInfo); + + } + + } + break; + + case OMX_CommandPortDisable: + case OMX_CommandFlush: + { + // Flush first... + if (OMX_ALL == aData2) + { + FlushQueue(iPendingQueue); + } + else + { + FlushBuffersByPortIndex(iPendingQueue, + aData2); + } + + // ... and now signal command completion... + omxError = + DoEventNotification(aEvent, + aData1, + aData2, + aExtraInfo); + + } + break; + + default: + { + // Signal command completion... + omxError = + DoEventNotification(aEvent, + aData1, + aData2, + aExtraInfo); + + } + + }; + + if (OMX_ErrorInsufficientResources == omxError) + { + HandleInsufficientResources(); + } + + return omxError; + + } + + +OMX_ERRORTYPE +COmxILInContextCallbackManager::BufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::BufferDoneNotificaton : BUFFER [%X]"), + apBufferHeader); + + __ASSERT_ALWAYS(apBufferHeader && + (OMX_DirInput == aLocalPortDirection || + OMX_DirOutput == aLocalPortDirection), + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + __ASSERT_ALWAYS(apBufferHeader->nOffset + apBufferHeader->nFilledLen + <= apBufferHeader->nAllocLen, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + __ASSERT_DEBUG(ipHandle && ipCallbacks, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + LockCallbackManager(); + if (OMX_StatePause == iCurrentState) + { + if (KErrNone != iPendingQueue.Append(TOmxILBuffer( + apBufferHeader, + aLocalPortIndex, + aLocalPortDirection))) + { + // Not much we can do here... + UnlockCallbackManager(); + HandleInsufficientResources(); + } + else + { + DEBUG_PRINTF4(_L8("COmxILInContextCallbackManager::BufferDoneNotificaton : DEFERRED buffer header[%X] port [%X] queue items [%d]"), + apBufferHeader, aLocalPortIndex, iPendingQueue.Count()); + UnlockCallbackManager(); + } + + return OMX_ErrorNone; + + } + UnlockCallbackManager(); + + ProcessBufferDoneNotification(apBufferHeader, + aLocalPortIndex, + aLocalPortDirection); + + return OMX_ErrorNone; + + } + +void +COmxILInContextCallbackManager::ProcessBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::ProcessBufferDoneNotification : BUFFER [%X]"), + apBufferHeader); + + // Look for buffer marks to be signalled or propagated (maintain callback + // manager unlocked here) + SignalOrPropagateBufferMarks(apBufferHeader, + aLocalPortDirection); + + LockCallbackManager(); + + // find out whether the port is tunnelled or not + TBool tunnelled = EFalse; + OMX_COMPONENTTYPE* pTunnelledComponent = 0; + const TUint tunnelCount = iRegisteredTunnels.Count(); + for (TUint i=0; i( + iRegisteredTunnels[i]. + iTunnelledComponentHandle); + + __ASSERT_DEBUG(pTunnelledComponent, + User::Panic(KOmxILCallbackManagerIfImplPanicCategory, 1)); + + break; + } + } + + // Unlock callback manager before calling the callback + UnlockCallbackManager(); + + if (tunnelled) + { + // From OMX_Core.h "Callbacks should not return an error to the + // component, so if an error occurs, the application shall handle it + // internally". Callback return error ignored here. + if (OMX_DirInput == aLocalPortDirection) + { + OMX_FillThisBuffer(pTunnelledComponent, apBufferHeader); + } + else + { + OMX_EmptyThisBuffer(pTunnelledComponent, apBufferHeader); + } + + } + else + { + OMX_ERRORTYPE (*fp2CBackHandler) + (OMX_HANDLETYPE, OMX_PTR, OMX_BUFFERHEADERTYPE*) = + (aLocalPortDirection == OMX_DirInput ? + ipCallbacks->EmptyBufferDone : + ipCallbacks->FillBufferDone); + + + // From OMX_Core.h "Callbacks should not return an error to the + // component, so if an error occurs, the application shall handle it + // internally". Callback return error ignored here. + fp2CBackHandler(ipHandle, + ipAppData, + apBufferHeader); + + } + + } + +void +COmxILInContextCallbackManager::SignalOrPropagateBufferMarks( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::SignalOrPropagateBufferMarks() : BUFFER [%X]"), + apBufferHeader); + + // Look for buffer marks to be signalled or propagated + if (apBufferHeader->hMarkTargetComponent) + { + // See if this component is the buffer mark target component... + if (apBufferHeader->hMarkTargetComponent == ipHandle) + { + // Inform the IL Client that a marked buffer has been processed... + ipCallbacks->EventHandler(ipHandle, + ipAppData, + OMX_EventMark, + 0, + 0, + apBufferHeader->pMarkData); + + // At this point, the mark has been delivered to the IL + // Client...Remove the mark from the processed header... + apBufferHeader->hMarkTargetComponent = 0; + apBufferHeader->pMarkData = 0; + + } + else + { + // Propagate the mark... + + LockCallbackManager(); + + // First find the buffer mark propagation port... + const TInt index = iBufferMarkPropagationPorts.Find( + TBufferMarkPropagationInfo(aLocalPortIndex), + TIdentityRelation( + &TBufferMarkPropagationInfo::Compare)); + + // Note that sink components don't propagate marks... + if (index != KErrNotFound) + { + const TBufferMarkPropagationInfo& propInfo = + iBufferMarkPropagationPorts[index]; + + // Let's check for the special case: The case for a source + // component where the output port is both the port that marks + // the headers and the port that propagates them ... Therefore + // no need to store the mark for later propagation... + if (propInfo.iPropagationPortIndex != aLocalPortIndex) + { + // Now, store temporarily the mark so the next time we send + // a buffer done callback in that propagation port, we mark + // that header accordingly... + // Unsuccessful insertion is ignored. + iBufferMarks.Append( + TOutputPortBufferMarkInfo( + propInfo.iPropagationPortIndex, + apBufferHeader->hMarkTargetComponent, + apBufferHeader->pMarkData)); + + // At this point the mark has been set for propagation to + // an output port. Remove the mark from the processed + // header... + apBufferHeader->hMarkTargetComponent = 0; + apBufferHeader->pMarkData = 0; + } + } + + UnlockCallbackManager(); + + } + } + else + { + LockCallbackManager(); + + if(iBufferMarks.Count() != 0) + { + // Let's see if we have a mark waiting to go out...This will find the + // first mark in the local list of marks ... + const TInt index = iBufferMarks.Find( + TOutputPortBufferMarkInfo(aLocalPortIndex), + TIdentityRelation( + &TOutputPortBufferMarkInfo::Compare)); + if (index != KErrNotFound) + { + const TOutputPortBufferMarkInfo& markInfo = + iBufferMarks[index]; + + // Mark the header... + apBufferHeader->hMarkTargetComponent = markInfo.ipMarkTargetComponent; + apBufferHeader->pMarkData = markInfo.ipMarkData; + + // Remove the mark info from the local store + iBufferMarks.Remove(index); + } + + } + + UnlockCallbackManager(); + + } + + + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::ClockBufferDoneNotification(OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) + { + DEBUG_PRINTF(_L8("COmxILInContextCallbackManager::ClockBufferDoneNotification")); + + return BufferDoneNotification(apBufferHeader, + aLocalPortIndex, + aLocalPortDirection); + + } + +OMX_ERRORTYPE +COmxILInContextCallbackManager::PortSettingsChangeNotification( + OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::PortSettingsChangeNotification : aLocalPortIndex[%d]"), aLocalPortIndex); + + LockCallbackManager(); + OMX_ERRORTYPE omxError = DoPortSettingsChangeNotification(aLocalPortIndex, + aPortSettingsIndex, + aPortSettings); + UnlockCallbackManager(); + return omxError; + + } + +#ifdef _OMXIL_COMMON_IL516C_ON +OMX_ERRORTYPE +COmxILInContextCallbackManager::EjectBuffersRequest( + OMX_U32 aLocalOmxPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::EjectBuffersRequest : aLocalOmxPortIndex[%d]"), aLocalOmxPortIndex); + + OMX_ERRORTYPE omxError = DoEjectBuffersRequest(aLocalOmxPortIndex); + return omxError; + + } +#endif + +void +COmxILInContextCallbackManager::FlushQueue( + RCbMgrBufferQueue& aQueue) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::FlushQueue : Handle[%X]"), ipHandle); + + LockCallbackManager(); + + TInt i = 0; + while(i < aQueue.Count()) + { + TOmxILBuffer buffer(aQueue[i]); + aQueue.Remove(i); + DEBUG_PRINTF4(_L8("COmxILInContextCallbackManager::FlushQueue() : FOUND -> buffer header [%X] PortIndex[%d], queue items [%d]"), buffer.ipBufferHeader, buffer.iLocalPortIndex, aQueue.Count()); + + UnlockCallbackManager(); + ProcessBufferDoneNotification(buffer.ipBufferHeader, + buffer.iLocalPortIndex, + buffer.iLocalPortDirection); + LockCallbackManager(); + // There is a window where new items could have been added to the + // queue. Restart loop just in case... + i = 0; + } + + UnlockCallbackManager(); + } + +TBool +COmxILInContextCallbackManager::RemoveBuffersByBufferHeader( + RCbMgrBufferQueue& aQueue, + OMX_BUFFERHEADERTYPE* apBufferHeader, + const OMX_DIRTYPE aDirection) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::RemoveBuffersByBufferHeader : Handle[%X]"), ipHandle); + + LockCallbackManager(); + + TInt i = 0; + while(i < aQueue.Count()) + { + TOmxILBuffer buffer(aQueue[i]); + if (apBufferHeader == buffer.ipBufferHeader) + { + __ASSERT_DEBUG(aDirection == OMX_DirInput || + aDirection == OMX_DirOutput, + User::Panic(KOmxILCallbackManagerPanicCategory, 1)); + + DEBUG_PRINTF4(_L8("COmxILInContextCallbackManager::RemoveBuffersByBufferHeader() : Nofiying FSM : Handle[%X] aDirection[%X] apBufferHeader[%X]"), ipHandle, aDirection, apBufferHeader); + + // Make sure the buffer contents are cleared... + TOmxILUtil::ClearBufferContents(apBufferHeader); + + aQueue.Remove(i); + UnlockCallbackManager(); + + if (aDirection == OMX_DirInput) + { + ipFsm->EmptyThisBuffer( + const_cast(apBufferHeader)); + } + else + { + ipFsm->FillThisBuffer( + const_cast(apBufferHeader)); + } + + return ETrue; + } + else + { + ++i; + } + } + + UnlockCallbackManager(); + + return EFalse; + } + + +void +COmxILInContextCallbackManager::FlushBuffersByPortIndex( + RCbMgrBufferQueue& aQueue, + const OMX_U32 aLocalPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILInContextCallbackManager::FlushBuffersByPortIndex : Handle[%X]"), ipHandle); + + LockCallbackManager(); + + TInt i = 0; + while(i < aQueue.Count()) + { + TOmxILBuffer buffer(aQueue[i]); + DEBUG_PRINTF4(_L8("COmxILInContextCallbackManager::FlushBuffersByPortIndex() : LOOKING -> buffer header [%X] PortIndex[%d], queue items [%d]"), buffer.ipBufferHeader, aLocalPortIndex, aQueue.Count()); + if (aLocalPortIndex == buffer.iLocalPortIndex) + { + aQueue.Remove(i); + DEBUG_PRINTF4(_L8("COmxILInContextCallbackManager::FlushBuffersByPortIndex() : FOUND -> buffer header [%X] PortIndex[%d], queue items [%d]"), buffer.ipBufferHeader, aLocalPortIndex, aQueue.Count()); + UnlockCallbackManager(); + ProcessBufferDoneNotification(buffer.ipBufferHeader, + buffer.iLocalPortIndex, + buffer.iLocalPortDirection); + LockCallbackManager(); + // There is a window where new items could have been added to the + // queue. Restart loop just in case... + i = 0; + } + else + { + ++i; + } + } + + UnlockCallbackManager(); + + } + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilincontextcallbackmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilincontextcallbackmanager.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,222 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILINCONTEXTCALLBACKMANAGER_H +#define OMXILINCONTEXTCALLBACKMANAGER_H + +#include "omxilcallbackmanager.h" + +/** + OpenMAX IL call backs and buffer marks manager. This is a synchronous + implementation of MOmxILCallbackManagerIf. + + */ +NONSHARABLE_CLASS(COmxILInContextCallbackManager) : + public CBase, + public MOmxILCallbackManagerIf, + private XOmxILCallbackManagerIfImpl + { + +public: + + static COmxILInContextCallbackManager* NewL( + OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks); + + ~COmxILInContextCallbackManager(); + + void SetPortManager(MOmxILPortManagerIf& apPortManager); + + void SetFsm(COmxILFsm& apFsm); + + // + // Methods for Callback Registration (from MOmxILCallbackManagerIf) + // + OMX_ERRORTYPE RegisterComponentHandle( + OMX_HANDLETYPE aComponentHandle); + + OMX_ERRORTYPE RegisterILClientCallbacks( + const OMX_CALLBACKTYPE* apCallbacks, + const OMX_PTR apAppData); + + OMX_ERRORTYPE RegisterTunnelCallback( + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection, + OMX_HANDLETYPE aTunnelledComponentHandle, + OMX_U32 aTunnelledPortIndex + ); + + OMX_ERRORTYPE DeregisterTunnelCallback( + OMX_U32 aLocalPortIndex); + + OMX_ERRORTYPE RegisterBufferMarkPropagationPort( + OMX_U32 aPortIndex, + OMX_U32 aPropagationPortIndex); + + TBool BufferRemovalIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection); + + + // + // Methods for Callback Notification (from MOmxILCallbackManagerIf) + // + + OMX_ERRORTYPE TransitionCompleteNotification( + OMX_STATETYPE aOmxState); + + OMX_ERRORTYPE CommandCompleteNotification( + OMX_COMMANDTYPE aOmxCommand, + OMX_U32 aOmxPortIndex); + +#ifdef _OMXIL_COMMON_IL516C_ON + OMX_ERRORTYPE EjectBuffersRequest( + OMX_U32 aLocalOmxPortIndex); +#endif + + // + // Methods for Callback Notification (from MOmxILCallbackManagerIf) + // + + OMX_ERRORTYPE ErrorEventNotification( + OMX_ERRORTYPE aOmxError); + + OMX_ERRORTYPE EventNotification( + OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo); + + OMX_ERRORTYPE BufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection); + + OMX_ERRORTYPE ClockBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection); + + OMX_ERRORTYPE PortSettingsChangeNotification( + OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings); + + +private: + + class TOmxILBuffer + { + + public: + + OMX_BUFFERHEADERTYPE* ipBufferHeader; + OMX_U32 iLocalPortIndex; + OMX_DIRTYPE iLocalPortDirection; + + // Default Constructor + inline TOmxILBuffer(); + + // Constructor + inline TOmxILBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection); + + }; + +private: + + // Convenience typedef + typedef RArray RCbMgrBufferQueue; + + +private: + + COmxILInContextCallbackManager(OMX_HANDLETYPE apComponentHandle, + OMX_PTR apAppData, + OMX_CALLBACKTYPE* apCallbacks); + void ConstructL(); + + void LockCallbackManager(); + void UnlockCallbackManager(); + + void SignalOrPropagateBufferMarks( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex); + + void ProcessBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection); + + void FlushQueue(RCbMgrBufferQueue& aQueue); + + TBool RemoveBuffersByBufferHeader( + RCbMgrBufferQueue& aQueue, + OMX_BUFFERHEADERTYPE* apBufferHeader, + const OMX_DIRTYPE aDirection); + + void FlushBuffersByPortIndex(RCbMgrBufferQueue& aQueue, + const OMX_U32 aLocalPortIndex); + + +private: + + RFastLock iLock; + + // Queue of buffer done notifications that need to be queued during + // OMX_StatePaused state + RCbMgrBufferQueue iPendingQueue; + + // Flag to enable unconditional flushing of buffer done notifications + TBool iFlushPendingQueue; + + OMX_STATETYPE iCurrentState; + OMX_STATETYPE iPreviousState; + + }; + +inline +COmxILInContextCallbackManager::TOmxILBuffer::TOmxILBuffer() + : + ipBufferHeader(0), + iLocalPortIndex(0), + iLocalPortDirection(OMX_DirMax) + { + } + +inline +COmxILInContextCallbackManager::TOmxILBuffer::TOmxILBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection + ) + : + ipBufferHeader(apBufferHeader), + iLocalPortIndex(aLocalPortIndex), + iLocalPortDirection(aLocalPortDirection) + { + } + + +#endif // OMXILINCONTEXTCALLBACKMANAGER_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilindexmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilindexmanager.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,62 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILINDEXMANAGER_H +#define OMXILINDEXMANAGER_H + +#include + +// Forward declarations + + +class COmxILIndexManager : public CBase + { + +public: + + inline ~COmxILIndexManager(); + + inline void InsertParamIndexL(TUint aParamIndex); + + inline TInt FindParamIndex(TUint aParamIndex) const; + + inline void InsertConfigIndexL(TUint aConfigIndex); + + inline TInt FindConfigIndex(TUint aConfigIndex) const; + + inline RArray& ManagedParamIndexes(); + + inline RArray& ManagedConfigIndexes(); +protected: + + inline COmxILIndexManager(); + +protected: + + RArray iManagedOmxParamIndexes; + RArray iManagedOmxConfigIndexes; + + }; + +#include "omxilindexmanager.inl" + +#endif // OMXILINDEXMANAGER_H + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilindexmanager.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilindexmanager.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,86 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +inline COmxILIndexManager::COmxILIndexManager() + { + } + +inline COmxILIndexManager::~COmxILIndexManager() + { + iManagedOmxParamIndexes.Close(); + iManagedOmxConfigIndexes.Close(); + } + +inline void +COmxILIndexManager::InsertParamIndexL(TUint aParamIndex) + { + TInt err = iManagedOmxParamIndexes.InsertInOrder(aParamIndex); + + // Note that index duplication is OK. + if (KErrNone != err && KErrAlreadyExists != err) + { + User::Leave(err); + } + + } + +inline TInt +COmxILIndexManager::FindParamIndex(TUint aParamIndex) const + { + return iManagedOmxParamIndexes.SpecificFindInOrder( + aParamIndex, + EArrayFindMode_First); + } + +inline void +COmxILIndexManager::InsertConfigIndexL(TUint aConfigIndex) + { + TInt err = iManagedOmxConfigIndexes.InsertInOrder(aConfigIndex); + + // Note that index duplication is OK. + if (KErrNone != err && KErrAlreadyExists != err) + { + User::Leave(err); + } + + } + +inline TInt +COmxILIndexManager::FindConfigIndex(TUint aConfigIndex) const + { + return iManagedOmxConfigIndexes.SpecificFindInOrder( + aConfigIndex, + EArrayFindMode_First); + } + +inline RArray& +COmxILIndexManager::ManagedParamIndexes() + { + return iManagedOmxParamIndexes; + } + +inline RArray& +COmxILIndexManager::ManagedConfigIndexes() + { + return iManagedOmxConfigIndexes; + } + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilotherport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilotherport.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,381 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include +#include "omxilotherportimpl.h" +#include "log.h" + +EXPORT_C COmxILOtherPort::COmxILOtherPort() + { + } + +EXPORT_C void COmxILOtherPort::ConstructL(const TOmxILCommonPortData& aCommonPortData, const RArray& aSupportedOtherFormats) + { + COmxILPort::ConstructL(aCommonPortData); //create COmxILPortImpl + ipOtherPortImpl=COmxILOtherPortImpl::NewL(aSupportedOtherFormats, aCommonPortData); //create COmxILOtherPortImpl + } + +EXPORT_C COmxILOtherPort::~COmxILOtherPort() + { + delete ipOtherPortImpl; + } + +EXPORT_C OMX_ERRORTYPE COmxILOtherPort::GetLocalOmxParamIndexes(RArray& aIndexArray) const + { + // Always collect local indexes from parent + OMX_ERRORTYPE omxRetValue = COmxILPort::GetLocalOmxParamIndexes(aIndexArray); + if (omxRetValue != OMX_ErrorNone) + { + return omxRetValue; + } + + TInt err = aIndexArray.InsertInOrder(OMX_IndexParamOtherPortFormat); + // Note that index duplication is OK + if (err != KErrNone && err != KErrAlreadyExists) + { + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + } + +EXPORT_C OMX_ERRORTYPE COmxILOtherPort::GetLocalOmxConfigIndexes(RArray& aIndexArray) const + { + // Always collect local indexes from parent + return COmxILPort::GetLocalOmxConfigIndexes(aIndexArray); + } + +EXPORT_C OMX_ERRORTYPE COmxILOtherPort::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamOtherPortFormat: + { + __ASSERT_ALWAYS(ipOtherPortImpl, User::Panic(KOmxILOtherPortPanicCategory, 1)); + omxRetValue = ipOtherPortImpl->GetParameter(aParamIndex, apComponentParameterStructure); + } + break; + default: + { + // Try the parent's indexes + omxRetValue = COmxILPort::GetParameter(aParamIndex, apComponentParameterStructure); + } + }; + + return omxRetValue; + } + +EXPORT_C OMX_ERRORTYPE COmxILOtherPort::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) + { + aUpdateProcessingFunction = EFalse; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamOtherPortFormat: + { + __ASSERT_ALWAYS(ipOtherPortImpl, User::Panic(KOmxILOtherPortPanicCategory, 1)); + omxRetValue = ipOtherPortImpl->SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + } + break; + default: + { + // Try the parent's indexes + omxRetValue = COmxILPort::SetParameter(aParamIndex, + apComponentParameterStructure, + aUpdateProcessingFunction); + } + }; + + return omxRetValue; + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + return COmxILPort::GetConfig(aConfigIndex, + apComponentConfigStructure); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction) + { + return COmxILPort::SetConfig(aConfigIndex, + apComponentConfigStructure, + aUpdateProcessingFunction); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::GetExtensionIndex(OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const + { + return COmxILPort::GetExtensionIndex(aParameterName, + apIndexType); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& aPortPopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILOtherPort::PopulateBuffer : pBuffer [%X]"), apBuffer); + return COmxILPort::PopulateBuffer(appBufferHdr, + apAppPrivate, + aSizeBytes, + apBuffer, + aPortPopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::FreeBuffer(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILOtherPort::FreeBuffer : BUFFER [%X]"), apBufferHeader); + return COmxILPort::FreeBuffer(apBufferHeader, aPortDepopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::TunnelRequest(OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::TunnelRequest")); + return COmxILPort::TunnelRequest(aTunneledComp, + aTunneledPort, + apTunnelSetup); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::PopulateTunnel(TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::PopulateTunnel")); + return COmxILPort::PopulateTunnel(portPopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::FreeTunnel(TBool& portDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::FreeTunnel")); + return COmxILPort::FreeTunnel(portDepopulationCompleted); + } + +EXPORT_C TBool +COmxILOtherPort::SetBufferSent(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::SetBufferSent")); + return COmxILPort::SetBufferSent(apBufferHeader, + aBufferMarkedWithOwnMark); + } + +EXPORT_C TBool +COmxILOtherPort::SetBufferReturned(OMX_BUFFERHEADERTYPE* apBufferHeader) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::SetBufferReturned")); + return COmxILPort::SetBufferReturned(apBufferHeader); + } + +EXPORT_C void +COmxILOtherPort::SetTransitionToEnabled() + { + DEBUG_PRINTF(_L8("COmxILOtherPort::SetTransitionToEnabled")); + return COmxILPort::SetTransitionToEnabled(); + } + +EXPORT_C void +COmxILOtherPort::SetTransitionToDisabled() + { + DEBUG_PRINTF(_L8("COmxILOtherPort::SetTransitionToDisabled")); + return COmxILPort::SetTransitionToDisabled(); + } + +EXPORT_C void +COmxILOtherPort::SetTransitionToDisabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILOtherPort::SetTransitionToDisabledCompleted")); + return COmxILPort::SetTransitionToDisabledCompleted(); + } + +EXPORT_C void +COmxILOtherPort::SetTransitionToEnabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILOtherPort::SetTransitionToEnabledCompleted")); + return COmxILPort::SetTransitionToEnabledCompleted(); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::StoreBufferMark(const OMX_MARKTYPE* apMark) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::StoreBufferMark")); + return COmxILPort::StoreBufferMark(apMark); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::SetComponentRoleDefaults(TUint aComponentRoleIndex) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::SetComponentRoleDefaults")); + + return COmxILPort::SetComponentRoleDefaults(aComponentRoleIndex); + } + +EXPORT_C TBool +COmxILOtherPort::HasAllBuffersAtHome() const + { + return COmxILPort::HasAllBuffersAtHome(); + } + +EXPORT_C TBool +COmxILOtherPort::IsBufferAtHome(OMX_BUFFERHEADERTYPE* apBufferHeader) const + { + DEBUG_PRINTF2(_L8("COmxILOtherPort::IsBufferAtHome : [%X]"), apBufferHeader); + return COmxILPort::IsBufferAtHome(apBufferHeader); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::DoPortReconfiguration(TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::DoPortReconfiguration")); + + return COmxILPort::DoPortReconfiguration(aPortSettingsIndex, + aPortSettings, + aEventForILClient); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::DoBufferAllocation(OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF2(_L8("COmxILOtherPort::DoBufferAllocation : aSizeBytes[%u]"), aSizeBytes); + return COmxILPort::DoBufferAllocation(aSizeBytes, + apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILOtherPort::DoBufferDeallocation(OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::DoBufferDeallocation")); + return COmxILPort::DoBufferDeallocation(apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::DoBufferWrapping(OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILOtherPort::DoBufferWrapping")); + return COmxILPort::DoBufferWrapping(aSizeBytes, + apBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILOtherPort::DoBufferUnwrapping(OMX_PTR apBuffer, + OMX_PTR appPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + + DEBUG_PRINTF(_L8("COmxILOtherPort::DoBufferUnwrapping")); + return COmxILPort::DoBufferUnwrapping(apBuffer, + appPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C OMX_ERRORTYPE +COmxILOtherPort::DoOmxUseBuffer(OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer) + { + + DEBUG_PRINTF(_L8("COmxILOtherPort::DoOmxUseBuffer")); + return COmxILPort::DoOmxUseBuffer(aTunnelledComponent, + appBufferHdr, + aTunnelledPortIndex, + apPortPrivate, + apPlatformPrivate, + aSizeBytes, + apBuffer); + } + +EXPORT_C RArray& COmxILOtherPort::GetSupportedOtherFormats() + { + __ASSERT_ALWAYS(ipOtherPortImpl, User::Panic(KOmxILOtherPortPanicCategory, 1)); + return ipOtherPortImpl->GetSupportedOtherFormats(); + } +EXPORT_C OMX_OTHER_PARAM_PORTFORMATTYPE& COmxILOtherPort::GetParamOtherPortFormat() + { + __ASSERT_ALWAYS(ipOtherPortImpl, User::Panic(KOmxILOtherPortPanicCategory, 1)); + return ipOtherPortImpl->GetParamOtherPortFormat(); + } +EXPORT_C const RArray& COmxILOtherPort::GetSupportedOtherFormats() const + { + __ASSERT_ALWAYS(ipOtherPortImpl, User::Panic(KOmxILOtherPortPanicCategory, 1)); + return ipOtherPortImpl->GetSupportedOtherFormats(); + + } +EXPORT_C const OMX_OTHER_PARAM_PORTFORMATTYPE& COmxILOtherPort::GetParamOtherPortFormat() const + { + __ASSERT_ALWAYS(ipOtherPortImpl, User::Panic(KOmxILOtherPortPanicCategory, 1)); + return ipOtherPortImpl->GetParamOtherPortFormat(); + } + +EXPORT_C +TInt COmxILOtherPort::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return COmxILPort::Extension_(aExtensionId, a0, a1); + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilotherportimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilotherportimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,168 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include +#include "omxilotherportimpl.h" + +COmxILOtherPortImpl* COmxILOtherPortImpl::NewL(const RArray& aSupportedOtherFormats, const TOmxILCommonPortData& aCommonPortData) + { + COmxILOtherPortImpl* self = new(ELeave) COmxILOtherPortImpl(aCommonPortData); + CleanupStack::PushL(self); + self->ConstructL(aSupportedOtherFormats); + CleanupStack::Pop(); + return self; + } + +COmxILOtherPortImpl::COmxILOtherPortImpl(const TOmxILCommonPortData& aCommonPortData) + { + iParamOtherPortFormat.nSize = sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE); + iParamOtherPortFormat.nVersion = aCommonPortData.iOmxVersion; + iParamOtherPortFormat.nPortIndex = aCommonPortData.iPortIndex; + iParamOtherPortFormat.nIndex = 0; + } + +void COmxILOtherPortImpl::ConstructL(const RArray& aSupportedOtherFormats) + { + TUint count = aSupportedOtherFormats.Count(); + for (TInt i = 0; i < count; i++) + { + iSupportedOtherFormats.AppendL(aSupportedOtherFormats[i]); + } + iParamOtherPortFormat.eFormat = count ? iSupportedOtherFormats[0] : OMX_OTHER_FormatMax; + } + +COmxILOtherPortImpl::~COmxILOtherPortImpl() + { + iSupportedOtherFormats.Close(); + } + +OMX_ERRORTYPE COmxILOtherPortImpl::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + switch(aParamIndex) + { + case OMX_IndexParamOtherPortFormat: + { + OMX_ERRORTYPE omxRetValue = TOmxILUtil::CheckOmxStructSizeAndVersion(apComponentParameterStructure, + sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE)); + + if (omxRetValue != OMX_ErrorNone) + { + return omxRetValue; + } + + OMX_OTHER_PARAM_PORTFORMATTYPE* pParamOtherPortFormat = + static_cast(apComponentParameterStructure); + + if (pParamOtherPortFormat->nIndex >= iSupportedOtherFormats.Count()) + { + return OMX_ErrorNoMore; + } + + pParamOtherPortFormat->eFormat = iSupportedOtherFormats[pParamOtherPortFormat->nIndex]; + } + break; + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILOtherPortPanicCategory, 1)); + }; + + return OMX_ErrorNone; + } + +OMX_ERRORTYPE COmxILOtherPortImpl::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) + { + aUpdateProcessingFunction = EFalse; + + switch(aParamIndex) + { + case OMX_IndexParamOtherPortFormat: + { + OMX_ERRORTYPE omxRetValue = TOmxILUtil::CheckOmxStructSizeAndVersion(const_cast(apComponentParameterStructure), + sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE)); + + if (omxRetValue != OMX_ErrorNone) + { + return omxRetValue; + } + + const OMX_OTHER_PARAM_PORTFORMATTYPE* pParamOtherPortFormat = + static_cast(apComponentParameterStructure); + + // Check in case the specified format is not actually supported by this + // port + OMX_OTHER_FORMATTYPE newFormatType = pParamOtherPortFormat->eFormat; + + // OMX_OTHER_FormatVendorReserved is the last of the supported values as of + // v1.1.1 + if (newFormatType > OMX_OTHER_FormatVendorReserved) + { + return OMX_ErrorBadParameter; + } + + if (KErrNotFound == iSupportedOtherFormats.Find(newFormatType)) + { + return OMX_ErrorUnsupportedSetting; + } + + // Set the new default format, but check first that we are actually + // changing something... + if (iParamOtherPortFormat.eFormat != newFormatType) + { + iParamOtherPortFormat.eFormat = newFormatType; + + // This is an indication to the PortManager that the processing + // function needs to get updated + // + aUpdateProcessingFunction = ETrue; + } + } + break; + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILOtherPortPanicCategory, 1)); + }; + + return OMX_ErrorNone; + } + +const RArray& COmxILOtherPortImpl::GetSupportedOtherFormats() const + { + return iSupportedOtherFormats; + } + +const OMX_OTHER_PARAM_PORTFORMATTYPE& COmxILOtherPortImpl::GetParamOtherPortFormat() const + { + return iParamOtherPortFormat; + } + +RArray& COmxILOtherPortImpl::GetSupportedOtherFormats() + { + return iSupportedOtherFormats; + } + +OMX_OTHER_PARAM_PORTFORMATTYPE& COmxILOtherPortImpl::GetParamOtherPortFormat() + { + return iParamOtherPortFormat; + } + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilotherportimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilotherportimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,60 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalTechnology +*/ + +#ifndef OMXILOTHERPORTIMPL_H +#define OMXILOTHERPORTIMPL_H + +#include +#include +#include +#include +#include + +class COmxILOtherPortImpl : public CBase + { +public: + static COmxILOtherPortImpl* NewL(const RArray& aSupportedOtherFormats, + const TOmxILCommonPortData& aCommonPortData); + ~COmxILOtherPortImpl(); + OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction); + + const RArray& GetSupportedOtherFormats() const; + const OMX_OTHER_PARAM_PORTFORMATTYPE& GetParamOtherPortFormat() const; + RArray& GetSupportedOtherFormats(); + OMX_OTHER_PARAM_PORTFORMATTYPE& GetParamOtherPortFormat(); + + +protected: + COmxILOtherPortImpl(const TOmxILCommonPortData& aCommonPortData); + void ConstructL(const RArray& aSupportedOtherFormats); + +private: + // To indicate the supported formats + RArray iSupportedOtherFormats; + OMX_OTHER_PARAM_PORTFORMATTYPE iParamOtherPortFormat; + }; + +#endif // OMXILOTHERPORTIMPL_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilport.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,716 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include + +#include "log.h" +#include "omxilportimpl.h" +#include +#include + +const TInt COmxILPort::KBufferMarkPropagationPortNotNeeded; + +EXPORT_C +TOmxILCommonPortData::TOmxILCommonPortData( + OMX_VERSIONTYPE aOmxVersion, + OMX_U32 aPortIndex, + OMX_DIRTYPE aDirection, + OMX_U32 aBufferCountMin, + OMX_U32 aBufferSizeMin, + OMX_PORTDOMAINTYPE aPortDomain, + OMX_BOOL aBuffersContiguous, + OMX_U32 aBufferAlignment, + OMX_BUFFERSUPPLIERTYPE aBufferSupplier, + OMX_U32 aBufferMarkPropagationPortIndex) + : + iOmxVersion(aOmxVersion), + iPortIndex(aPortIndex), + iDirection(aDirection), + iBufferCountMin(aBufferCountMin), + iBufferSizeMin(aBufferSizeMin), + iPortDomain(aPortDomain), + iBuffersContiguous(aBuffersContiguous), + iBufferAlignment(aBufferAlignment), + iBufferSupplier(aBufferSupplier), + iBufferMarkPropagationPortIndex(aBufferMarkPropagationPortIndex) + { + } + + +COmxILPort::COmxILPort() + { + DEBUG_PRINTF(_L8("COmxILPort::COmxILPort")); + } + + +COmxILPort::~COmxILPort() + { + DEBUG_PRINTF(_L8("COmxILPort::~COmxILPort")); + delete ipPortImpl; + } + +void COmxILPort::ConstructL(const TOmxILCommonPortData& aCommonPortData) + { + __ASSERT_DEBUG(aCommonPortData.iDirection == OMX_DirInput || + aCommonPortData.iDirection == OMX_DirOutput, + User::Panic(KOmxILPortPanicCategory, 1)); + + // From Section 3.1.2.12.1 . + // + // nBufferCountMin : "The component shall define this non-zero default + // value." + // + // nBufferCountActual : "The component shall set a default value no less + // than nBufferCountMin for this field" + __ASSERT_DEBUG(aCommonPortData.iBufferCountMin > 0, + User::Panic(KOmxILPortPanicCategory, 1)); + + ipPortImpl=COmxILPortImpl::NewL(aCommonPortData, *this); + } + +OMX_ERRORTYPE +COmxILPort::GetLocalOmxParamIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILPort::GetLocalOmxParamIndexes")); + + TInt err = aIndexArray.InsertInOrder(OMX_IndexParamPortDefinition); + + // Note that index duplication is OK. + if (KErrNone == err || KErrAlreadyExists == err) + { + err = aIndexArray.InsertInOrder(OMX_IndexParamCompBufferSupplier); + } + + if (KErrNone != err && KErrAlreadyExists != err) + { + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPort::GetLocalOmxConfigIndexes(RArray& /*aIndexArray*/) const + { + DEBUG_PRINTF(_L8("COmxILPort::GetLocalOmxConfigIndexes")); + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILPort::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILPort::GetParameter")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->GetParameter(aParamIndex, apComponentParameterStructure); + } + +OMX_ERRORTYPE +COmxILPort::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILPort::SetParameter")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + } + + +OMX_ERRORTYPE +COmxILPort::GetConfig(OMX_INDEXTYPE /*aConfigIndex*/, + TAny* /*apComponentConfigStructure*/) const + { + DEBUG_PRINTF(_L8("COmxILPort::GetConfig")); + return OMX_ErrorUnsupportedIndex; + } + +OMX_ERRORTYPE +COmxILPort::SetConfig(OMX_INDEXTYPE /*aConfigIndex*/, + const TAny* /*apComponentConfigStructure*/, + TBool& /*aUpdateProcessingFunction*/) + { + DEBUG_PRINTF(_L8("COmxILPort::SetConfig")); + return OMX_ErrorUnsupportedIndex; + } + +OMX_ERRORTYPE +COmxILPort::GetExtensionIndex(OMX_STRING /* aParameterName */, + OMX_INDEXTYPE* /* apIndexType */) const + { + // This method is intended to be overridden by the concrete ports when + // needed... + return OMX_ErrorUnsupportedIndex; + } + +OMX_ERRORTYPE +COmxILPort::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& aPortPopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILPort::PopulateBuffer : pBuffer [%X]"), apBuffer); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->PopulateBuffer(appBufferHdr, apAppPrivate, aSizeBytes, apBuffer, aPortPopulationCompleted); + } + + +OMX_ERRORTYPE +COmxILPort::FreeBuffer(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILPort::FreeBuffer : BUFFER [%X]"), apBufferHeader); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->FreeBuffer(apBufferHeader, aPortDepopulationCompleted); + } + + +OMX_ERRORTYPE +COmxILPort::TunnelRequest(OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILPort::TunnelRequest")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->TunnelRequest(aTunneledComp, aTunneledPort, apTunnelSetup); + } + + +OMX_ERRORTYPE +COmxILPort::PopulateTunnel(TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILPort::PopulateTunnel")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->PopulateTunnel(portPopulationCompleted); + } + + +OMX_ERRORTYPE +COmxILPort::FreeTunnel(TBool& portDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILPort::FreeTunnel")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->FreeTunnel(portDepopulationCompleted); + } + + + +TBool +COmxILPort::SetBufferSent(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark) + { + DEBUG_PRINTF(_L8("COmxILPort::SetBufferSent")); + __ASSERT_DEBUG(apBufferHeader, User::Panic(KOmxILPortPanicCategory, 1)); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->SetBufferSent(apBufferHeader, aBufferMarkedWithOwnMark); + } + +TBool +COmxILPort::SetBufferReturned(OMX_BUFFERHEADERTYPE* apBufferHeader) + { + DEBUG_PRINTF(_L8("COmxILPort::SetBufferReturned")); + + __ASSERT_DEBUG(apBufferHeader, User::Panic(KOmxILPortPanicCategory, 1)); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->SetBufferReturned(apBufferHeader); + } + +void +COmxILPort::SetTransitionToEnabled() + { + DEBUG_PRINTF(_L8("COmxILPort::SetTransitionToEnabled")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->SetTransitionToEnabled(); + } + +void +COmxILPort::SetTransitionToDisabled() + { + DEBUG_PRINTF(_L8("COmxILPort::SetTransitionToDisabled")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->SetTransitionToDisabled(); + } + +void +COmxILPort::SetTransitionToDisabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILPort::SetTransitionToDisabledCompleted")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->SetTransitionToDisabledCompleted(); + } + +void +COmxILPort::SetTransitionToEnabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILPort::SetTransitionToEnabledCompleted")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->SetTransitionToEnabledCompleted(); + } + +OMX_ERRORTYPE +COmxILPort::StoreBufferMark(const OMX_MARKTYPE* apMark) + { + DEBUG_PRINTF(_L8("COmxILPort::StoreBufferMark")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->StoreBufferMark(apMark); + } + + +/** + This utility method may be called from the most derived port + class' destructor to delete any buffer header and or buffer that may remain + allocated in the port. This typically happens when the component is unloaded + without being properly transitioned from OMX_StateIdle to OMX_StateLoaded. + + */ +EXPORT_C void +COmxILPort::CleanUpPort() + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->CleanUpPort(); + } + +/** + This is to be overriden by concrete ports that either support more than + one role or that want to let the IL Client to reset the component to + some default state... + + @param aComponentRoleIndex The index of the role that is to be assumed by + the component. + + @return OMX_ERRORTYPE + */ +OMX_ERRORTYPE +COmxILPort::SetComponentRoleDefaults(TUint /*aComponentRoleIndex*/) + { + DEBUG_PRINTF(_L8("COmxILPort::SetComponentRoleDefaults")); + + return OMX_ErrorNotImplemented; + } + +/** + This is to be overriden by concrete ports that either support more than one + role or that want to let the IL Client to reset the component to some + default state... + + @param aPortSettingsIndex An implementation-specific identifier that the + implementation associates to the setting(s) that need(s) updating in the + port. + + @param aPortSettings A buffer descriptor that contains an + implementation-specific structure with the new setting(s) that need to + be updated in the port. + + @param [output] aEventForILClient An event that the port may choose to + deliver to the IL Client. This should be one of OMX_EventPortSettingsChanged + or OMX_EventPortFormatDetected. Use OMX_EventMax if no event need to be + sent. + */ +OMX_ERRORTYPE +COmxILPort::DoPortReconfiguration(TUint /* aPortSettingsIndex */, + const TDesC8& /* aPortSettings */, + OMX_EVENTTYPE& aEventForILClient) + { + DEBUG_PRINTF(_L8("COmxILPort::DoPortReconfiguration")); + + // This means no need to notify the IL Client... + aEventForILClient = OMX_EventMax; + + return OMX_ErrorNotImplemented; + } + +OMX_ERRORTYPE +COmxILPort::StoreBufferMark(OMX_HANDLETYPE& ipMarkTargetComponent, + OMX_PTR& ipMarkData) + { + DEBUG_PRINTF(_L8("COmxILPort::StoreBufferMark")); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->StoreBufferMark(ipMarkTargetComponent, ipMarkData); + } + +TBool +COmxILPort::HasAllBuffersAtHome() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + __ASSERT_ALWAYS(ipPortImpl->IsTunnelledAndBufferSupplier(), + User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->HasAllBuffersAtHome(); + } + +TBool +COmxILPort::IsBufferAtHome(OMX_BUFFERHEADERTYPE* apBufferHeader) const + { + DEBUG_PRINTF2(_L8("COmxILPort::IsBufferAtHome : [%X]"), apBufferHeader); + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsBufferAtHome(apBufferHeader); + } + + +/** + This method provides a mechanism for ports to place the port-specific + buffer allocation logic (typically used in an OMX_AllocateBuffer + scenario). + + @param aSizeBytes The size in bytes of the buffer to be allocated. + + @param [OUT] apPortSpecificBuffer A pointer to the memory area allocated by + the port. + + @param [OUT] apPortPrivate A pointer that refers to an optional + port-specific structure. + + @apPlatformPrivate[OUT] A pointer to an optional platform-specific + structure. + + @param apAppPrivate A pointer that refers to a buffer supplier-specific + structure. + + @return OMX_ERRORTYPE +*/ +OMX_ERRORTYPE +COmxILPort::DoBufferAllocation(OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& /* apPlatformPrivate */, + OMX_PTR /* apAppPrivate = 0 */) + { + DEBUG_PRINTF2(_L8("COmxILPort::DoBufferAllocation : aSizeBytes[%u]"), aSizeBytes); + + __ASSERT_DEBUG(aSizeBytes > 0, User::Panic(KOmxILPortPanicCategory, 1)); + + CMMFDescriptorBuffer* pDescBuffer = 0; + TRAPD(allocRes, pDescBuffer = CMMFDescriptorBuffer::NewL(aSizeBytes)); + if (KErrNone != allocRes) + { + return OMX_ErrorInsufficientResources; + } + + apPortSpecificBuffer = const_cast(pDescBuffer->Data().Ptr()); + apPortPrivate = static_cast(pDescBuffer); + + return OMX_ErrorNone; + + } + +/** + This method provides a mechanism for ports to place the port-specific + buffer deallocation logic (typically used in an OMX_FreeBuffer + scenario). + + @param apPortSpecificBuffer A pointer to the memory area to be deallocated + by the port. + + @param apPortPrivate A pointer that refers to a port-specific structure. + + @param apPlatformPrivate A pointer to an optional platform-specific + structure. + + @param apAppPrivate A pointer that refers to a buffer supplier-specific + structure. + +*/ +void +COmxILPort::DoBufferDeallocation(OMX_PTR /*apPortSpecificBuffer */, + OMX_PTR apPortPrivate, + OMX_PTR /* apPlatformPrivate */, + OMX_PTR /* apAppPrivate = 0 */) + { + DEBUG_PRINTF(_L8("COmxILPort::DoBufferDeallocation")); + + __ASSERT_DEBUG(apPortPrivate, User::Panic(KOmxILPortPanicCategory, 1)); + + delete reinterpret_cast(apPortPrivate); + + } + +/** + This method provides a mechanism for ports to place the port-specific buffer + wrapping logic (typically used in an OMX_UseBuffer scenario). + + @param aSizeBytes The size in bytes of the buffer to be wrapped. + + @param apBuffer A pointer received from the IL Client or another + component that references the allocated memory area . + + @param [OUT] apPortPrivate A pointer that refers to a port-specific + structure. + + @param [OUT] apPlatformPrivate A pointer to an optional platform-specific + structure. + + @param [OUT] apAppPrivate A pointer that refers to a buffer + supplier-specific structure. + + @return OMX_ERRORTYPE +*/ +OMX_ERRORTYPE +COmxILPort::DoBufferWrapping(OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& /* apPlatformPrivate */, + OMX_PTR /* apAppPrivate = 0 */) + { + DEBUG_PRINTF(_L8("COmxILPort::DoBufferWrapping")); + + __ASSERT_DEBUG(aSizeBytes > 0 && apBuffer, + User::Panic(KOmxILPortPanicCategory, 1)); + + CMMFBuffer* pMmfBuffer = 0; + TPtr8 ptr(apBuffer, aSizeBytes, aSizeBytes); + TRAPD(allocRes, pMmfBuffer = CMMFPtrBuffer::NewL(ptr)); + if (KErrNone != allocRes) + { + return OMX_ErrorInsufficientResources; + } + + apPortPrivate = pMmfBuffer; + + return OMX_ErrorNone; + + } + +/** + This method provides a mechanism for ports to place the port-specific buffer + unwrapping logic (typically used in an OMX_FreeBuffer scenario). + + @param apPortSpecificBuffer A pointer to the allocated memory area. + + @param apPortPrivate A pointer that refers to a port-specific structure. + + @param apPlatformPrivate A pointer to an optional platform-specific + structure. + + @param apAppPrivate A pointer that refers to a buffer supplier-specific + structure. + +*/ +void +COmxILPort::DoBufferUnwrapping(OMX_PTR /* apBuffer*/, + OMX_PTR appPortPrivate, + OMX_PTR /* apPlatformPrivate */, + OMX_PTR /* apAppPrivate = 0 */) + { + + DEBUG_PRINTF(_L8("COmxILPort::DoBufferUnwrapping")); + + __ASSERT_DEBUG(appPortPrivate, User::Panic(KOmxILPortPanicCategory, 1)); + + delete reinterpret_cast(appPortPrivate); + + } + +/** + This method gets called during tunnelled buffer allocation (i.e., + PopulateTunnel). This is to allow component implementations to override this + default implementation in a way that the pAppPrivate pointer parameter of + OMX_UseBuffer can be used to convey pPortPrivate or pPlatformPrivate to the + tunnelled component. + + @param aTunnelledComponent Handle to the tunnelled component + + @param [OUT] appBufferHdr The buffer header that will be allocated by the + tunnelled component + + @param aTunnelledPortIndex The index of the tunnelled port + + @param apPortPrivate pPortPrivate pointer as returned by DoBufferAllocation + + @param apPlatformPrivate pPlatformPrivate pointer as returned by + DoBufferAllocation + + @aSizeBytes The size in bytes of the to be allocated buffer + + @apBuffer A pointer to the allocated buffer + + @return OMX_ERRORTYPE + +*/ +OMX_ERRORTYPE +COmxILPort::DoOmxUseBuffer(OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR /* apPortPrivate */, + OMX_PTR /* apPlatformPrivate */, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer) + { + + DEBUG_PRINTF(_L8("COmxILPort::DoOmxUseBuffer")); + + return OMX_UseBuffer( + aTunnelledComponent, + appBufferHdr, + aTunnelledPortIndex, + 0, + aSizeBytes, + apBuffer); + + } + + +OMX_DIRTYPE +COmxILPort::Direction() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->Direction(); + } + +EXPORT_C TBool +COmxILPort::IsEnabled() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsEnabled(); + } + +TBool +COmxILPort::IsPopulated() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsPopulated(); + } + +TBool +COmxILPort::IsDePopulated() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsDePopulated(); + } + +TBool +COmxILPort::IsTunnelled() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsTunnelled(); + } + +TBool +COmxILPort::IsTunnelledAndBufferSupplier() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsTunnelledAndBufferSupplier(); + } + +TBool +COmxILPort::IsTransitioningToEnabled() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsTransitioningToEnabled(); + } + +TBool +COmxILPort::IsTransitioningToDisabled() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->IsTransitioningToDisabled(); + } + +EXPORT_C OMX_U32 +COmxILPort::Index() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->Index(); + } + +OMX_PORTDOMAINTYPE +COmxILPort::Domain() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->Domain(); + } + +OMX_U32 +COmxILPort::Count() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->Count(); + } + +OMX_BUFFERHEADERTYPE* const& +COmxILPort::operator[](TInt anIndex) const + { + return this->operator[](anIndex); + } + +OMX_BUFFERHEADERTYPE*& +COmxILPort::operator[](TInt anIndex) + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->operator[](anIndex); + } + + +OMX_U32 +COmxILPort::BufferMarkPropagationPort() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->BufferMarkPropagationPort(); + } + +EXPORT_C const OMX_PARAM_PORTDEFINITIONTYPE& COmxILPort::GetParamPortDefinition() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->GetParamPortDefinition(); + } + +EXPORT_C const OMX_HANDLETYPE& COmxILPort::GetTunnelledComponent() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->GetTunnelledComponent(); + } + +EXPORT_C const OMX_U32& COmxILPort::GetTunnelledPort() const + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->GetTunnelledPort(); + } + +EXPORT_C OMX_PARAM_PORTDEFINITIONTYPE& COmxILPort::GetParamPortDefinition() + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->GetParamPortDefinition(); + } + +EXPORT_C OMX_HANDLETYPE& COmxILPort::GetTunnelledComponent() + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->GetTunnelledComponent(); + } + +EXPORT_C OMX_U32& COmxILPort::GetTunnelledPort() + { + __ASSERT_ALWAYS(ipPortImpl, User::Panic(KOmxILPortPanicCategory, 1)); + return ipPortImpl->GetTunnelledPort(); + } + +EXPORT_C +TInt COmxILPort::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return CBase::Extension_(aExtensionId, a0, a1); + } + + + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1142 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include + +#include "log.h" +#include "omxilportimpl.h" +#include +#include + +const TInt COmxILPortImpl::KMaxBufferMarksQueueSize; + +COmxILPortImpl* COmxILPortImpl::NewL(const TOmxILCommonPortData& aCommonPortData, COmxILPort& aPort) + { + COmxILPortImpl* self = new (ELeave) COmxILPortImpl(aCommonPortData, aPort); + return self; + } + +COmxILPortImpl::COmxILPortImpl(const TOmxILCommonPortData& aCommonPortData, COmxILPort& aPort) + : + iTunnelledComponent(0), + iTunnelledPort(0), + iBufferHeaders(), + iBufferMarks(_FOFF(TBufferMarkInfo, iLink)), + iTransitionState(EPortNotTransitioning), + iBufferMarkPropagationPortIndex(aCommonPortData.iBufferMarkPropagationPortIndex), + aFirstUseBufferHasBeenReceived(OMX_FALSE), + iOmxILPort(aPort) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::COmxILPortImpl")); + + // Filll in OMX_PARAM_PORTDEFINITIONTYPE + iParamPortDefinition.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); + iParamPortDefinition.nVersion = aCommonPortData.iOmxVersion; + iParamPortDefinition.nPortIndex = aCommonPortData.iPortIndex; + iParamPortDefinition.eDir = aCommonPortData.iDirection; + iParamPortDefinition.nBufferCountActual = aCommonPortData.iBufferCountMin; + iParamPortDefinition.nBufferCountMin = aCommonPortData.iBufferCountMin; + iParamPortDefinition.nBufferSize = aCommonPortData.iBufferSizeMin; + iParamPortDefinition.bEnabled = OMX_TRUE; + iParamPortDefinition.bPopulated = OMX_FALSE; + iParamPortDefinition.eDomain = aCommonPortData.iPortDomain; + // NOTE: iParamPortDefinition.format must be finished up by concrete ports + iParamPortDefinition.bBuffersContiguous = aCommonPortData.iBuffersContiguous; + iParamPortDefinition.nBufferAlignment = aCommonPortData.iBufferAlignment; + + // Fill in OMX_PARAM_BUFFERSUPPLIERTYPE + iParamCompBufferSupplier.nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE); + iParamCompBufferSupplier.nVersion = aCommonPortData.iOmxVersion; + iParamCompBufferSupplier.nPortIndex = aCommonPortData.iPortIndex; + iParamCompBufferSupplier.eBufferSupplier = aCommonPortData.iBufferSupplier; + + } + +COmxILPortImpl::~COmxILPortImpl() + { + DEBUG_PRINTF(_L8("COmxILPortImpl::~COmxILPortImpl")); + +#ifdef _DEBUG + const TInt headerCount = iBufferHeaders.Count(); + if (headerCount > 0) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::~COmxILPortImpl :: ------------------------------- WARNING --------------------------------------- ")); + DEBUG_PRINTF2(_L8("COmxILPortImpl::~COmxILPortImpl :: [%d] Buffer headers still exist"), headerCount); + DEBUG_PRINTF(_L8("COmxILPortImpl::~COmxILPortImpl :: CleanUpPort() may be used from the most derived port class to delete them")); + DEBUG_PRINTF(_L8("COmxILPortImpl::~COmxILPortImpl :: ------------------------------- WARNING --------------------------------------- ")); + } +#endif + + iBufferHeaders.Close(); + iBufferMarks.ResetAndDestroy(); + + } + +OMX_ERRORTYPE +COmxILPortImpl::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILPortImpl::GetParameter")); + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamPortDefinition: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentParameterStructure, + sizeof(OMX_PARAM_PORTDEFINITIONTYPE)))) + { + return omxRetValue; + } + + OMX_PARAM_PORTDEFINITIONTYPE* pPortDefinition + = static_cast( + apComponentParameterStructure); + + *pPortDefinition = iParamPortDefinition; + } + break; + + case OMX_IndexParamCompBufferSupplier: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + apComponentParameterStructure, + sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)))) + { + return omxRetValue; + } + + OMX_PARAM_BUFFERSUPPLIERTYPE* pBufferSupplier + = static_cast( + apComponentParameterStructure); + + pBufferSupplier->eBufferSupplier = + iParamCompBufferSupplier.eBufferSupplier; + } + break; + + default: + { + return OMX_ErrorUnsupportedIndex; + } + }; + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortImpl::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::SetParameter")); + + aUpdateProcessingFunction = EFalse; + + + if (OMX_TRUE == aFirstUseBufferHasBeenReceived) + { + DEBUG_PRINTF2(_L8("COmxILPortImpl::SetParameter : PORT [%u] WARNING : port population already initiated, returning OMX_ErrorIncorrectStateOperation"), Index()); + // SetParameter is not allowed after the first OMX_UseBuffer has been + // received in the port, that is, the population of the port has + // already been initiated... + return OMX_ErrorIncorrectStateOperation; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + + switch(aParamIndex) + { + case OMX_IndexParamPortDefinition: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_PARAM_PORTDEFINITIONTYPE)))) + { + return omxRetValue; + } + + const OMX_PARAM_PORTDEFINITIONTYPE* pPortDefinition + = static_cast( + apComponentParameterStructure); + + // Port Format must be set by the concrete port... + if (OMX_ErrorNone != + (omxRetValue = + iOmxILPort.SetFormatInPortDefinition(*pPortDefinition, + aUpdateProcessingFunction))) + { + return omxRetValue; + } + + // Set here only the additional read-write parameters of + // OMX_PARAM_PORTDEFINITIONTYPE + if (iParamPortDefinition.nBufferCountActual != + pPortDefinition->nBufferCountActual) + { + if (pPortDefinition->nBufferCountActual < + iParamPortDefinition.nBufferCountMin) + { + return OMX_ErrorBadParameter; + } + DEBUG_PRINTF3(_L8("COmxILPortImpl::SetParameter : old.nBufferCountActual [%u] new.nBufferCountActual [%u]"), + iParamPortDefinition.nBufferCountActual, pPortDefinition->nBufferCountActual); + iParamPortDefinition.nBufferCountActual = + pPortDefinition->nBufferCountActual; + aUpdateProcessingFunction = ETrue; + } + + } + break; + + case OMX_IndexParamCompBufferSupplier: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE)))) + { + return omxRetValue; + } + + const OMX_PARAM_BUFFERSUPPLIERTYPE* pBufferSupplier + = static_cast( + apComponentParameterStructure); + + // OMX_BufferSupplyOutput is the last of the supported values as of + // v1.1.1 + if (iParamCompBufferSupplier.eBufferSupplier > OMX_BufferSupplyOutput) + { + return OMX_ErrorBadParameter; + } + + if (iParamCompBufferSupplier.eBufferSupplier != + pBufferSupplier->eBufferSupplier) + { + // The component providing the input port is responsible for + // signalling the tunnelled component about the buffer supplier + // override... + if (iTunnelledComponent && + iParamPortDefinition.eDir == OMX_DirInput) + { + OMX_PARAM_BUFFERSUPPLIERTYPE bufferSupplierType; + bufferSupplierType.nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE); + bufferSupplierType.nVersion = iParamPortDefinition.nVersion; + bufferSupplierType.nPortIndex = iTunnelledPort; + bufferSupplierType.eBufferSupplier = pBufferSupplier->eBufferSupplier; + OMX_ERRORTYPE retValue = OMX_ErrorUndefined; + if (OMX_ErrorNone != + (retValue = + OMX_SetParameter(iTunnelledComponent, + OMX_IndexParamCompBufferSupplier, + &bufferSupplierType)) ) + { + return retValue; + } + } + DEBUG_PRINTF3(_L8("COmxILPortImpl::SetParameter : old.eBufferSupplier [%u] new.eBufferSupplier [%u]"), + iParamCompBufferSupplier.eBufferSupplier, pBufferSupplier->eBufferSupplier); + iParamCompBufferSupplier.eBufferSupplier = + pBufferSupplier->eBufferSupplier; + } + + } + break; + default: + { + return OMX_ErrorUnsupportedIndex; + } + }; + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortImpl::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + DEBUG_PRINTF3(_L8("COmxILPort::PopulateBuffer : pBuffer[%X] PORT[%u]"), apBuffer, iParamPortDefinition.nPortIndex); + portPopulationCompleted = EFalse; + + if(aSizeBytes < iParamPortDefinition.nBufferSize) + { + return OMX_ErrorBadParameter; + } + + // Allocate the buffer header... + OMX_BUFFERHEADERTYPE* pHeader = new OMX_BUFFERHEADERTYPE; + *appBufferHdr = pHeader; + if (!pHeader) + { + return OMX_ErrorInsufficientResources; + } + + DEBUG_PRINTF2(_L8("COmxILPortImpl::PopulateBuffer : BUFFER [%X]"), pHeader); + + // Here, lets discriminate between apBuffer == 0 (AllocateBuffer) and + // apBuffer != 0 (UseBuffer) + TUint8* pPortSpecificBuffer = 0; + OMX_PTR pPortPrivate = 0; + OMX_PTR pPlatformPrivate = 0; + OMX_ERRORTYPE portSpecificErr = OMX_ErrorNone; + if (apBuffer) + { + //... (UseBuffer) Do any port-specific wrapping of the received buffer, + // if needed by the port.... + portSpecificErr = iOmxILPort.DoBufferWrapping(aSizeBytes, + apBuffer, + pPortPrivate, + pPlatformPrivate, + apAppPrivate); + + aFirstUseBufferHasBeenReceived = OMX_TRUE; + } + else + { + // ... (AllocateBuffer) Do the port-specific buffer allocation ... + portSpecificErr = iOmxILPort.DoBufferAllocation(aSizeBytes, + pPortSpecificBuffer, + pPortPrivate, + pPlatformPrivate, + apAppPrivate); + } + + if (OMX_ErrorNone != portSpecificErr) + { + delete *appBufferHdr; *appBufferHdr = 0; + return portSpecificErr; + } + + + // Add to local list of buffer headers... + if (KErrNone != + iBufferHeaders.Append( + TBufferInfo(pHeader, + (apBuffer ? + TBufferInfo::EBufferAway : + TBufferInfo::EBufferAtHome), + (apBuffer ? + TBufferInfo::EBufferNotOwned : + TBufferInfo::EBufferOwned), + apBuffer, + apAppPrivate, + pPlatformPrivate, + pPortPrivate))) + { + // Undo custom buffer allocation/wrapping + if (apBuffer) + { + iOmxILPort.DoBufferUnwrapping( + apBuffer, + pPortPrivate, + pPlatformPrivate, + apAppPrivate); + + } + else + { + iOmxILPort.DoBufferDeallocation( + pPortSpecificBuffer, + pPortPrivate, + pPlatformPrivate, + apAppPrivate); + } + delete *appBufferHdr; *appBufferHdr = NULL; + return OMX_ErrorInsufficientResources; + } + + + // Fill in the header... + pHeader->nSize = sizeof(OMX_BUFFERHEADERTYPE); + pHeader->nVersion = iParamPortDefinition.nVersion; + pHeader->pBuffer = apBuffer ? apBuffer : pPortSpecificBuffer; + pHeader->nAllocLen = aSizeBytes; + pHeader->nFilledLen = 0; + pHeader->nOffset = 0; + pHeader->pAppPrivate = apAppPrivate; + pHeader->pPlatformPrivate = pPlatformPrivate; + pHeader->hMarkTargetComponent = 0; + pHeader->pMarkData = 0; + pHeader->nTickCount = 0; + pHeader->nTimeStamp = 0; + pHeader->nFlags = 0; + + + if (OMX_DirInput == iParamPortDefinition.eDir) + { + pHeader->pInputPortPrivate = pPortPrivate; + pHeader->pOutputPortPrivate = 0; + pHeader->nInputPortIndex = iParamPortDefinition.nPortIndex; + pHeader->nOutputPortIndex = 0; + } + else + { + pHeader->pInputPortPrivate = 0; + pHeader->pOutputPortPrivate = pPortPrivate; + pHeader->nInputPortIndex = 0; + pHeader->nOutputPortIndex = iParamPortDefinition.nPortIndex; + } + + if (iParamPortDefinition.nBufferCountActual == iBufferHeaders.Count()) + { + iParamPortDefinition.bPopulated = OMX_TRUE; + portPopulationCompleted = ETrue; + } + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILPortImpl::FreeBuffer(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILPortImpl::FreeBuffer : BUFFER [%X]"), apBufferHeader); + + portDepopulationCompleted = EFalse; + + TInt headerIndex = 0; + if (KErrNotFound == + (headerIndex = + iBufferHeaders.Find(TBufferInfo(apBufferHeader), + TIdentityRelation( + &TBufferInfo::Compare)))) + { + return OMX_ErrorBadParameter; + } + + + OMX_PTR pPortPrivate = + OMX_DirInput == iParamPortDefinition.eDir ? + apBufferHeader->pInputPortPrivate : + apBufferHeader->pOutputPortPrivate; + + if (iBufferHeaders[headerIndex].IsBufferOwned()) + { + iOmxILPort.DoBufferDeallocation( + apBufferHeader->pBuffer, + pPortPrivate, + apBufferHeader->pPlatformPrivate, + apBufferHeader->pAppPrivate); + } + else + { + iOmxILPort.DoBufferUnwrapping( + apBufferHeader->pBuffer, + pPortPrivate, + apBufferHeader->pPlatformPrivate, + apBufferHeader->pAppPrivate); + } + + delete apBufferHeader; + iBufferHeaders.Remove(headerIndex); + + if (iBufferHeaders.Count() < iParamPortDefinition.nBufferCountActual) + { + iParamPortDefinition.bPopulated = OMX_FALSE; + } + + if (0 == iBufferHeaders.Count()) + { + portDepopulationCompleted = ETrue; + aFirstUseBufferHasBeenReceived = OMX_FALSE; + } + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILPortImpl::TunnelRequest(OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::TunnelRequest")); + + // Check whether the tunnel is being torn down + if (!aTunneledComp) + { + // Cancel existing tunnel setup, if any + iTunnelledComponent = 0; + return OMX_ErrorNone; + } + + // Check that we are receiving a valid tunnel setup structure + if (!apTunnelSetup) + { + return OMX_ErrorBadParameter; + } + + // STEP 0: Retrieve the port definition from the tunnelled component... + OMX_PARAM_PORTDEFINITIONTYPE paramPortDef; + paramPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); + paramPortDef.nVersion = iParamPortDefinition.nVersion; + paramPortDef.nPortIndex = aTunneledPort; + if (OMX_ErrorNone != + OMX_GetParameter(aTunneledComp, + OMX_IndexParamPortDefinition, + ¶mPortDef) ) + { + return OMX_ErrorUndefined; + } + + if (OMX_DirOutput == iParamPortDefinition.eDir) + { + // OMX_DirOutput + // + + // Step 1: Check that this output port is being tunnelled to an input + // port... + if (paramPortDef.eDir != OMX_DirInput) + { + return OMX_ErrorPortsNotCompatible; + } + + // Step 2: Fill in the tunnel setup structure received... + apTunnelSetup->nTunnelFlags = 0; + apTunnelSetup->eSupplier = iParamCompBufferSupplier.eBufferSupplier; + + iTunnelledComponent = aTunneledComp; + iTunnelledPort = aTunneledPort; + } + else + { + // OMX_DirInput + // + + // Check that this input port is being tunnelled to an output + // port... + if (paramPortDef.eDir != OMX_DirOutput) + { + return OMX_ErrorPortsNotCompatible; + } + + // Check that there is something consistent in the tunnel setup data + // received... + if ((apTunnelSetup->eSupplier != OMX_BufferSupplyUnspecified) && + (apTunnelSetup->eSupplier != OMX_BufferSupplyInput) && + (apTunnelSetup->eSupplier != OMX_BufferSupplyOutput)) + { + return OMX_ErrorBadParameter; + } + + // Set tunnelled component and port as they will be needed by + // IsTunnelledPortCompatible... + iTunnelledComponent = aTunneledComp; + iTunnelledPort = aTunneledPort; + + // Check domain-specific parameter compatibility (this is delegated + // to derived port classes)... + if (!iOmxILPort.IsTunnelledPortCompatible(paramPortDef)) + { + iTunnelledComponent = 0; + return OMX_ErrorPortsNotCompatible; + } + + // Now, try to get to an understanding here...Work out which port will + // be buffer supplier... + OMX_BUFFERSUPPLIERTYPE bufferSupplierDecision = + OMX_BufferSupplyUnspecified; + if (apTunnelSetup->nTunnelFlags & OMX_PORTTUNNELFLAG_READONLY || + ( (apTunnelSetup->eSupplier == OMX_BufferSupplyInput) && + (iParamCompBufferSupplier.eBufferSupplier == + OMX_BufferSupplyInput || + iParamCompBufferSupplier.eBufferSupplier == + OMX_BufferSupplyUnspecified) ) || + ( (apTunnelSetup->eSupplier == OMX_BufferSupplyUnspecified) && + (iParamCompBufferSupplier.eBufferSupplier == + OMX_BufferSupplyInput)) ) + { + bufferSupplierDecision = OMX_BufferSupplyInput; + } + else + { + bufferSupplierDecision = OMX_BufferSupplyOutput; + } + + // Set buffer supplier param in tunnelled port... + OMX_PARAM_BUFFERSUPPLIERTYPE bufferSupplierType; + bufferSupplierType.nSize = sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE); + bufferSupplierType.nVersion = iParamPortDefinition.nVersion; + bufferSupplierType.nPortIndex = aTunneledPort; + bufferSupplierType.eBufferSupplier = bufferSupplierDecision; + if (OMX_ErrorNone != + OMX_SetParameter(aTunneledComp, + OMX_IndexParamCompBufferSupplier, + &bufferSupplierType) ) + { + iTunnelledComponent = 0; + return OMX_ErrorPortsNotCompatible; + } + + apTunnelSetup->eSupplier = bufferSupplierDecision; + iParamCompBufferSupplier.eBufferSupplier = bufferSupplierDecision; + + } + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILPortImpl::PopulateTunnel(TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::PopulateTunnel")); + + __ASSERT_DEBUG(iBufferHeaders.Count() == 0, + User::Panic(KOmxILPortPanicCategory, 1)); + __ASSERT_DEBUG(IsTunnelledAndBufferSupplier(), + User::Panic(KOmxILPortPanicCategory, 1)); + + portPopulationCompleted = EFalse; + + // STEP 1: Obtain the number of buffers that the tunnelled port requires to + // be populated... Retrieve the port definition from the tunnelled + // component + OMX_PARAM_PORTDEFINITIONTYPE paramPortDef; + paramPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); + paramPortDef.nVersion = iParamPortDefinition.nVersion; + paramPortDef.nPortIndex = iTunnelledPort; + if (OMX_ErrorNone != + OMX_GetParameter(iTunnelledComponent, + OMX_IndexParamPortDefinition, + ¶mPortDef) ) + { + return OMX_ErrorUndefined; + } + + // Step 2: Both ports must have the same threshold value (number of buffers + // to be populated) before completing the transition to + // OMX_StateIdle...Otherwise the population process would complete earlier + // or never... + TUint numOfBuffersToPopulate = iParamPortDefinition.nBufferCountActual; + if(paramPortDef.nBufferCountActual != + iParamPortDefinition.nBufferCountActual) + { + numOfBuffersToPopulate = + Max(iParamPortDefinition.nBufferCountActual, + paramPortDef.nBufferCountActual); + if (iParamPortDefinition.nBufferCountActual < + numOfBuffersToPopulate) + { + // Update own buffer count requirements + DEBUG_PRINTF3(_L8("COmxILPortImpl::PopulateTunnel : Updated own nBufferCountActual - Old Value [%d] New Value [%d] "), + iParamPortDefinition.nBufferCountActual, numOfBuffersToPopulate); + iParamPortDefinition.nBufferCountActual = numOfBuffersToPopulate; + } + else + { + // Update peer's buffer count requirements + DEBUG_PRINTF3(_L8("COmxILPortImpl::PopulateTunnel : Updated peer's nBufferCountActual - Old Value [%d] New Value [%d] "), + paramPortDef.nBufferCountActual, numOfBuffersToPopulate); + paramPortDef.nBufferCountActual = numOfBuffersToPopulate; + if (OMX_ErrorNone != OMX_SetParameter(iTunnelledComponent, + OMX_IndexParamPortDefinition, + ¶mPortDef)) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::PopulateTunnel : Error setting nBufferCountActual in tunnelled component ")); + return OMX_ErrorUndefined; + } + } + } + + // STEP 3: Start population of the tunnel... + TUint sizeOfBuffersToPopulate = + iParamPortDefinition.nBufferSize >= paramPortDef.nBufferSize ? + iParamPortDefinition.nBufferSize : + paramPortDef.nBufferSize; + + OMX_BUFFERHEADERTYPE* pHeader = 0; + TUint8* pPortSpecificBuffer = 0; + OMX_PTR pPortPrivate = 0; + OMX_PTR pPlatformPrivate = 0; + OMX_ERRORTYPE portSpecificErr = OMX_ErrorNone; + for (TUint i=0; ipInputPortPrivate = pPortPrivate; + pHeader->nInputPortIndex = iParamPortDefinition.nPortIndex; + } + else // OMX_DirOutput == iParamPortDefinition.eDir + { + pHeader->pOutputPortPrivate = pPortPrivate; + pHeader->nOutputPortIndex = iParamPortDefinition.nPortIndex; + } + + // Add to local list of buffer headers... return if not sucessful... + if (KErrNone != + iBufferHeaders.Append( + TBufferInfo(pHeader, + TBufferInfo::EBufferAtHome, + TBufferInfo::EBufferOwned, + pPortSpecificBuffer, + 0, + pPlatformPrivate, + pPortPrivate))) + { + iOmxILPort.DoBufferDeallocation( + pPortSpecificBuffer, + pPortPrivate, + pPlatformPrivate); + + return OMX_ErrorInsufficientResources; + } + } + + iParamPortDefinition.bPopulated = OMX_TRUE; + portPopulationCompleted = ETrue; + + __ASSERT_DEBUG(iBufferHeaders.Count() == + iParamPortDefinition.nBufferCountActual, + User::Panic(KOmxILPortPanicCategory, 1)); + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILPortImpl::FreeTunnel(TBool& portDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::FreeTunnel")); + + __ASSERT_DEBUG(iBufferHeaders.Count() == + iParamPortDefinition.nBufferCountActual, + User::Panic(KOmxILPortPanicCategory, 1)); + + __ASSERT_DEBUG(IsTunnelledAndBufferSupplier(), + User::Panic(KOmxILPortPanicCategory, 1)); + + const TUint numBuffersToDepopulate = iBufferHeaders.Count(); + for (TUint i=0; ipBuffer; + OMX_PTR pPortPrivate = + OMX_DirInput == iParamPortDefinition.eDir ? + pBufferHeader->pInputPortPrivate : + pBufferHeader->pOutputPortPrivate; + OMX_PTR pAppPrivate = pBufferHeader->pAppPrivate; + OMX_PTR pPlatformPrivate = pBufferHeader->pPlatformPrivate; + + DEBUG_PRINTF2(_L8("COmxILPortImpl::FreeTunnel : BUFFER [%X]"), iBufferHeaders[i].GetHeader()); + + OMX_ERRORTYPE freeBufRes = OMX_FreeBuffer( + iTunnelledComponent, + iTunnelledPort, + pBufferHeader); + + // At this point, the actual buffer header should no longer exist... + pBufferHeader = 0; + + // NOTE that we don't check OMX_FreeBuffer returned error here. If + // something wrong happens at the tunnelled component side we'll + // continue here and try to free as many buffers as possible.... at + // least the state of this component will remain valid.... (we don't + // report errors coming from the tunnelled component as that is its + // responsibility....) + + iOmxILPort.DoBufferDeallocation( + pBuffer, + pPortPrivate, + pPlatformPrivate, + pAppPrivate); + } + + // Clear the local list of headers. Note that there's no need to delete the + // header as these have been allocated by the tunnelled port... + + iBufferHeaders.Reset(); + iParamPortDefinition.bPopulated = OMX_FALSE; + portDepopulationCompleted = ETrue; + + __ASSERT_DEBUG(iBufferHeaders.Count() == 0, + User::Panic(KOmxILPortPanicCategory, 1)); + + return OMX_ErrorNone; + + } + + + +TBool +COmxILPortImpl::SetBufferSent(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::SetBufferSent")); + + __ASSERT_DEBUG(apBufferHeader, User::Panic(KOmxILPortPanicCategory, 1)); + + aBufferMarkedWithOwnMark = EFalse; + + TInt index = 0; + if (KErrNotFound == + (index = + iBufferHeaders.Find(TBufferInfo(apBufferHeader), + TIdentityRelation( + &TBufferInfo::Compare)))) + { + return EFalse; + } + + iBufferHeaders[index].SetBufferAway(); + + if (!iBufferMarks.IsEmpty()) + { + // Check for existing marks in the buffer header... + if (apBufferHeader->hMarkTargetComponent) + { + // We queue the mark received within the buffer header if there are + // marks already to be delivered... it is mandatory to give a FIFO + // preference to the marks received by a port.. + if (iBufferMarks.Elements() < KMaxBufferMarksQueueSize) + { + // The buffer is marked already. Store the current mark at the end + // of the buffer mark list... + StoreBufferMark(apBufferHeader->hMarkTargetComponent, + apBufferHeader->pMarkData); + } + } + + // Use the first mark in the queue... + TBufferMarkInfo* pMark = iBufferMarks.First(); + apBufferHeader->hMarkTargetComponent = pMark->ipMarkTargetComponent; + apBufferHeader->pMarkData = pMark->ipMarkData; + aBufferMarkedWithOwnMark = pMark->iOwnMark; + iBufferMarks.Remove(*pMark); + delete pMark; + } + + return ETrue; + + } + +TBool +COmxILPortImpl::SetBufferReturned(OMX_BUFFERHEADERTYPE* apBufferHeader) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::SetBufferReturned")); + + __ASSERT_DEBUG(apBufferHeader, User::Panic(KOmxILPortPanicCategory, 1)); + + TInt index = 0; + if (KErrNotFound == + (index = + iBufferHeaders.Find(TBufferInfo(apBufferHeader), + TIdentityRelation( + &TBufferInfo::Compare)))) + { + return EFalse; + } + + iBufferHeaders[index].SetBufferAtHome(); + + return ETrue; + + } + +void +COmxILPortImpl::SetTransitionToEnabled() + { + DEBUG_PRINTF(_L8("COmxILPortImpl::SetTransitionToEnabled")); + + iTransitionState = EPortTransitioningToEnabled; + iParamPortDefinition.bEnabled = OMX_TRUE; + + } + +void +COmxILPortImpl::SetTransitionToDisabled() + { + DEBUG_PRINTF(_L8("COmxILPortImpl::SetTransitionToDisabled")); + + iTransitionState = EPortTransitioningToDisabled; + iParamPortDefinition.bEnabled = OMX_FALSE; + + } + +void +COmxILPortImpl::SetTransitionToDisabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILPortImpl::SetTransitionToDisabledCompleted")); + + iTransitionState = EPortNotTransitioning; + iParamPortDefinition.bEnabled = OMX_FALSE; + + } + +void +COmxILPortImpl::SetTransitionToEnabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILPortImpl::SetTransitionToEnabledCompleted")); + + iTransitionState = EPortNotTransitioning; + iParamPortDefinition.bEnabled = OMX_TRUE; + + } + +OMX_ERRORTYPE +COmxILPortImpl::StoreBufferMark(const OMX_MARKTYPE* apMark) + { + DEBUG_PRINTF(_L8("COmxILPortImpl::StoreBufferMark")); + TBufferMarkInfo* pTBufferMarkInfo = new TBufferMarkInfo(apMark); + if (!pTBufferMarkInfo) + { + return OMX_ErrorInsufficientResources; + } + + iBufferMarks.AddLast(*pTBufferMarkInfo); + + return OMX_ErrorNone; + + } + +/** + This utility method may be called from the most derived port + class' destructor to delete any buffer header and or buffer that may remain + allocated in the port. This typically happens when the component is unloaded + without being properly transitioned from OMX_StateIdle to OMX_StateLoaded. + + */ +void +COmxILPortImpl::CleanUpPort() + { + + // Do the clean-up here in case something went wrong and the component is + // being unloaded in a failure scenario... + const TInt headerCount = iBufferHeaders.Count(); + if (headerCount > 0) + { + if (!IsTunnelled()) + { + // A non-tunnelled port needs to delete always the header and needs + // to deallocate/unwrap the buffer depending on whether the buffer + // is owned or not... + + RPointerArray tempHeadersArray; + for (TInt i=0; i tempHeadersArray; + for (TInt i=0; i( + &TBufferInfo::Compare)))) + { + User::Panic(KOmxILPortPanicCategory, 1); + } + + DEBUG_PRINTF2(_L8("COmxILPortImpl::IsBufferAtHome : [%s]"), iBufferHeaders[headerIndex].IsBufferAtHome() ? "YES" : "NO"); + + return iBufferHeaders[headerIndex].IsBufferAtHome(); + + } + +TBool +COmxILPortImpl::TBufferInfo::Compare(const TBufferInfo& aBi1, + const TBufferInfo& aBi2) + { + return (aBi1.GetHeader() == aBi2.GetHeader() ? ETrue : EFalse); + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,375 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILPORTIMPL_H +#define OMXILPORTIMPL_H + +#include +#include +#include +#include + +/** + OpenMAX IL component port base implementation class. +*/ +class COmxILPortImpl : public CBase + { +public: + static const TInt KMaxBufferMarksQueueSize = 10; + static COmxILPortImpl* NewL(const TOmxILCommonPortData& aCommonPortData, COmxILPort& aPort); + ~COmxILPortImpl(); + + OMX_ERRORTYPE GetParameter( + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter( + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction); + + OMX_ERRORTYPE GetConfig( + OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + OMX_ERRORTYPE SetConfig( + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction); + + OMX_ERRORTYPE GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + OMX_ERRORTYPE PopulateBuffer( + OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted); + + OMX_ERRORTYPE TunnelRequest( + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE PopulateTunnel( + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeTunnel( + TBool& portDepopulationCompleted); + + TBool SetBufferSent( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark); + + TBool SetBufferReturned( + OMX_BUFFERHEADERTYPE* apBufferHeader); + + void SetTransitionToDisabled(); + + void SetTransitionToEnabled(); + + void SetTransitionToDisabledCompleted(); + + void SetTransitionToEnabledCompleted(); + + OMX_ERRORTYPE StoreBufferMark( + const OMX_MARKTYPE* pMark); + + OMX_ERRORTYPE SetComponentRoleDefaults( + TUint aComponentRoleIndex); + + OMX_ERRORTYPE DoPortReconfiguration( + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient); + + inline OMX_DIRTYPE Direction() const; + + inline TBool IsEnabled() const; + + inline TBool IsPopulated() const; + + inline TBool IsDePopulated() const; + + inline TBool IsTunnelled() const; + + inline TBool IsTunnelledAndBufferSupplier() const; + + virtual TBool HasAllBuffersAtHome() const; + + TBool IsTransitioningToEnabled() const; + + inline TBool IsTransitioningToDisabled() const; + + virtual TBool IsBufferAtHome( + OMX_BUFFERHEADERTYPE* apHeaderHeader) const; + + inline OMX_U32 Index() const; + + inline OMX_PORTDOMAINTYPE Domain() const; + + inline OMX_U32 Count() const; + + inline OMX_BUFFERHEADERTYPE* const& operator[](TInt anIndex) const; + + inline OMX_BUFFERHEADERTYPE*& operator[](TInt anIndex); + + inline OMX_U32 BufferMarkPropagationPort() const; + +protected: + + class TBufferMarkInfo; + + /** + Buffer mark info list + */ + class TBufferMarkInfoQue : + public TSglQue + { + + public: + + // Convenience typedef.... + typedef TSglQue Tq; + + public: + + inline explicit TBufferMarkInfoQue(TInt aOffset); + + inline TBufferMarkInfo* First() const; + + inline void AddLast(TBufferMarkInfo& aRef); + + inline void Remove(TBufferMarkInfo& aRef); + + inline TInt Elements() const; + + inline void ResetAndDestroy(); + + private: + + TBufferMarkInfoQue(); + void AddFirst(TBufferMarkInfo& aRef); + TBool IsFirst(const TBufferMarkInfo* aPtr) const; + TBool IsLast(const TBufferMarkInfo* aPtr) const; + + TBufferMarkInfo* Last() const; + + private: + + TInt iNumElements; + + }; + + + class TBufferInfo; + +private: + + enum TPortIntermediateState + { + EPortNotTransitioning, + EPortTransitioningToDisabled, + EPortTransitioningToEnabled + }; + + +protected: + + COmxILPortImpl(const TOmxILCommonPortData& aCommonPortData, COmxILPort& aPort); + +public: + template + inline OMX_ERRORTYPE GetParamStructureFromTunnel( + T& aComponentConfigStructure, OMX_INDEXTYPE aParamIndex) const; + + OMX_ERRORTYPE StoreBufferMark( + OMX_HANDLETYPE& ipMarkTargetComponent, + OMX_PTR& ipMarkData); + + void CleanUpPort(); + + inline const OMX_PARAM_PORTDEFINITIONTYPE& GetParamPortDefinition() const; + inline const OMX_HANDLETYPE& GetTunnelledComponent() const; + inline const OMX_U32& GetTunnelledPort() const; + inline OMX_PARAM_PORTDEFINITIONTYPE& GetParamPortDefinition(); + inline OMX_HANDLETYPE& GetTunnelledComponent(); + inline OMX_U32& GetTunnelledPort(); + +private: + + // Tunnelled component + OMX_HANDLETYPE iTunnelledComponent; + + // Tunnelled component's port + OMX_U32 iTunnelledPort; + + // Buffer headers store + RArray iBufferHeaders; + + // Buffer marks store + TBufferMarkInfoQue iBufferMarks; + + // Port's intermediate state to enabled or disabled + TPortIntermediateState iTransitionState; + + // Associated port that will be used to propagate buffer marks + OMX_U32 iBufferMarkPropagationPortIndex; + + // This is a flag that is set when the port receives the first + // OMX_UseBuffer (non-supplier ports). This will be used to know when + // SetParameter will be allowed + OMX_BOOL aFirstUseBufferHasBeenReceived; + + // OpenMAX IL port definition structure + OMX_PARAM_PORTDEFINITIONTYPE iParamPortDefinition; + + // OpenMAX IL buffer supplier structure + OMX_PARAM_BUFFERSUPPLIERTYPE iParamCompBufferSupplier; + + COmxILPort& iOmxILPort; + + }; + +/** + Buffer mark info structure +*/ +class COmxILPortImpl::TBufferMarkInfo + { + +public: + + inline explicit TBufferMarkInfo( + const OMX_MARKTYPE*& apMark, + TBool aOwnMark = ETrue); + + inline TBufferMarkInfo( + OMX_HANDLETYPE& apMarkTargetComponent, + OMX_PTR& apMarkData, + TBool aOwnMark = ETrue); + +public: + + OMX_HANDLETYPE ipMarkTargetComponent; + OMX_PTR ipMarkData; + TBool iOwnMark; + TSglQueLink iLink; + + }; + +/** + Buffer info structure +*/ +class COmxILPortImpl::TBufferInfo + { + +public: + + enum THeaderLocationProperty + { + EBufferAtHome = 0x01, + EBufferAway = 0x00 + }; + + enum THeaderOwnershipProperty + { + EBufferOwned = 0x02, + EBufferNotOwned = 0x00 + }; + +public: + + inline TBufferInfo(OMX_BUFFERHEADERTYPE* apHeader, + THeaderLocationProperty aLocation, + THeaderOwnershipProperty aOwnership, + OMX_U8* apBuffer, + OMX_PTR apApp, + OMX_PTR apPlatform, + OMX_PTR apPort); + + inline explicit TBufferInfo(OMX_BUFFERHEADERTYPE* apHeader); + + static TBool Compare(const TBufferInfo& aBi1, + const TBufferInfo& aBi2); + + inline const OMX_BUFFERHEADERTYPE* GetHeader() const; + + inline OMX_BUFFERHEADERTYPE* GetHeader(); + + inline operator OMX_BUFFERHEADERTYPE*&(); + + inline operator OMX_BUFFERHEADERTYPE* const&() const; + + inline OMX_U8* GetBufferPointer() const; + + inline OMX_U8* GetBufferPointer(); + + inline OMX_PTR GetPortPointer() const; + + inline OMX_PTR GetPortPointer(); + + inline OMX_PTR GetPlatformPointer() const; + + inline OMX_PTR GetPlatformPointer(); + + inline OMX_PTR GetAppPointer() const; + + inline OMX_PTR GetAppPointer(); + + inline void SetBufferAtHome(); + + inline void SetBufferAway(); + + inline void SetBufferOwned(); + + inline void SetBufferNotOwned(); + + inline TBool IsBufferAtHome() const; + + inline TBool IsBufferOwned() const; + +private: + + enum THeaderPropertyMask + { + EBufferAwayMask = 0xFE, + EBufferNotOwnedMask = 0xFD + }; + +private: + + OMX_BUFFERHEADERTYPE* ipHeader; + TUint8 iBufferProperties; + OMX_U8* ipBuffer; + OMX_PTR ipApp; + OMX_PTR ipPlatform; + OMX_PTR ipPort; + + }; + +#include "omxilportimpl.inl" +#endif // OMXILPORTIMPL_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportimpl.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportimpl.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,410 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + + + + + +inline OMX_DIRTYPE +COmxILPortImpl::Direction() const + { + return iParamPortDefinition.eDir; + } + +inline TBool +COmxILPortImpl::IsEnabled() const + { + return iParamPortDefinition.bEnabled; + } + +inline TBool +COmxILPortImpl::IsPopulated() const + { + return (OMX_TRUE == iParamPortDefinition.bPopulated ? ETrue : EFalse); + } + +inline TBool +COmxILPortImpl::IsDePopulated() const + { + return (iBufferHeaders.Count() == 0 ? ETrue : EFalse); + } + +inline TBool +COmxILPortImpl::IsTunnelled() const + { + return (iTunnelledComponent != 0 ? ETrue : EFalse); + } + +inline TBool +COmxILPortImpl::IsTunnelledAndBufferSupplier() const + { + TBool retValue = ( + iTunnelledComponent && + (((iParamCompBufferSupplier.eBufferSupplier == + OMX_BufferSupplyInput) + && + (iParamPortDefinition.eDir == OMX_DirInput)) + || + ((iParamCompBufferSupplier.eBufferSupplier == OMX_BufferSupplyOutput) + && + (iParamPortDefinition.eDir == OMX_DirOutput))) + ); + + return retValue; + + } + +inline TBool +COmxILPortImpl::IsTransitioningToEnabled() const + { + return (iTransitionState == EPortTransitioningToEnabled ? ETrue : EFalse); + } + +inline TBool +COmxILPortImpl::IsTransitioningToDisabled() const + { + return (iTransitionState == EPortTransitioningToDisabled ? ETrue : EFalse); + } + +inline OMX_U32 +COmxILPortImpl::Index() const + { + return iParamPortDefinition.nPortIndex; + } + +inline OMX_PORTDOMAINTYPE +COmxILPortImpl::Domain() const + { + return iParamPortDefinition.eDomain; + } + +inline OMX_U32 +COmxILPortImpl::Count() const + { + return iBufferHeaders.Count(); + } + +inline OMX_BUFFERHEADERTYPE* const& +COmxILPortImpl::operator[](TInt anIndex) const + { + return this->operator[](anIndex); + } + +inline OMX_BUFFERHEADERTYPE*& +COmxILPortImpl::operator[](TInt anIndex) + { + __ASSERT_ALWAYS((anIndex>=0 && anIndex +inline OMX_ERRORTYPE +COmxILPortImpl::GetParamStructureFromTunnel( + T& aComponentConfigStructure, OMX_INDEXTYPE aParamIndex) const + { + + __ASSERT_ALWAYS(iTunnelledComponent, + User::Panic(KOmxILPortPanicCategory, 1)); + + aComponentConfigStructure.nSize = sizeof(T); + aComponentConfigStructure.nVersion = TOmxILSpecVersion(); + aComponentConfigStructure.nPortIndex = iTunnelledPort; + + if (OMX_ErrorNone != + OMX_GetParameter(iTunnelledComponent, + aParamIndex, + &aComponentConfigStructure) ) + { + return OMX_ErrorUndefined; + } + + return OMX_ErrorNone; + + } + + + +inline +COmxILPortImpl::TBufferMarkInfo::TBufferMarkInfo( + const OMX_MARKTYPE*& apMark, + TBool aOwnMark /* = ETrue */) + : + ipMarkTargetComponent(apMark->hMarkTargetComponent), + ipMarkData(apMark->pMarkData), + iOwnMark(aOwnMark) + { + __ASSERT_DEBUG(ipMarkTargetComponent, + User::Panic(KOmxILPortPanicCategory, 1)); + } + +inline +COmxILPortImpl::TBufferMarkInfo::TBufferMarkInfo( + OMX_HANDLETYPE& apMarkTargetComponent, + OMX_PTR& apMarkData, + TBool aOwnMark /* = ETrue */) + : + ipMarkTargetComponent(apMarkTargetComponent), + ipMarkData(apMarkData), + iOwnMark(aOwnMark) + { + __ASSERT_DEBUG(ipMarkTargetComponent, + User::Panic(KOmxILPortPanicCategory, 1)); + } + +inline +COmxILPortImpl::TBufferMarkInfoQue::TBufferMarkInfoQue(TInt aOffset) + : + Tq(aOffset), + iNumElements(0) + { + } + +inline COmxILPortImpl::TBufferMarkInfo* +COmxILPortImpl::TBufferMarkInfoQue::First() const + { + return Tq::First(); + } + +inline void +COmxILPortImpl::TBufferMarkInfoQue::AddLast(COmxILPortImpl::TBufferMarkInfo& aRef) + { + Tq::AddLast(aRef); + ++iNumElements; + } + +inline void +COmxILPortImpl::TBufferMarkInfoQue::Remove(COmxILPortImpl::TBufferMarkInfo& aRef) + { + Tq::Remove(aRef); + --iNumElements; + } + +inline TInt +COmxILPortImpl::TBufferMarkInfoQue::Elements() const + { + return iNumElements; + } + +inline void +COmxILPortImpl::TBufferMarkInfoQue::ResetAndDestroy() + { + while (!Tq::IsEmpty()) + { + COmxILPortImpl::TBufferMarkInfo* pMark = Tq::First(); + __ASSERT_DEBUG(pMark, User::Panic(KOmxILPortPanicCategory, 1)); + Tq::Remove(*pMark); + delete pMark; + } + iNumElements = 0; + } + + +inline +COmxILPortImpl::TBufferInfo::TBufferInfo( + OMX_BUFFERHEADERTYPE* apHeader, + THeaderLocationProperty aLocation, + THeaderOwnershipProperty aOwnership, + OMX_U8* apBuffer, + OMX_PTR apApp, + OMX_PTR apPlatform, + OMX_PTR apPort) + : + ipHeader(apHeader), + iBufferProperties(0), + ipBuffer(apBuffer), + ipApp(apApp), + ipPlatform(apPlatform), + ipPort(apPort) + { + __ASSERT_DEBUG(ipHeader, User::Panic(KOmxILPortPanicCategory, 1)); + iBufferProperties = aLocation | aOwnership; + } + + +// This constructor should only be used for array look-ups +inline +COmxILPortImpl::TBufferInfo::TBufferInfo( + OMX_BUFFERHEADERTYPE* apHeader) + : + ipHeader(apHeader), + iBufferProperties(0), + ipBuffer(0), + ipApp(0), + ipPlatform(0), + ipPort(0) + { + __ASSERT_DEBUG(ipHeader, User::Panic(KOmxILPortPanicCategory, 1)); + iBufferProperties = EBufferAtHome | EBufferOwned; + } + + +inline const OMX_BUFFERHEADERTYPE* +COmxILPortImpl::TBufferInfo::GetHeader() const + { + return ipHeader; + } + +inline OMX_BUFFERHEADERTYPE* +COmxILPortImpl::TBufferInfo::GetHeader() + { + return ipHeader; + } + +inline +COmxILPortImpl::TBufferInfo::operator OMX_BUFFERHEADERTYPE*&() + { + return ipHeader; + } + +inline +COmxILPortImpl::TBufferInfo::operator OMX_BUFFERHEADERTYPE* const&() const + { + return ipHeader; + } + +inline OMX_U8* +COmxILPortImpl::TBufferInfo::GetBufferPointer() const + { + return ipBuffer; + } + +inline OMX_U8* +COmxILPortImpl::TBufferInfo::GetBufferPointer() + { + return ipBuffer; + } + +inline OMX_PTR +COmxILPortImpl::TBufferInfo::GetPortPointer() const + { + return ipPort; + } + +inline OMX_PTR +COmxILPortImpl::TBufferInfo::GetPortPointer() + { + return ipPort; + } + +inline OMX_PTR +COmxILPortImpl::TBufferInfo::GetPlatformPointer() const + { + return ipPlatform; + } + +inline OMX_PTR +COmxILPortImpl::TBufferInfo::GetPlatformPointer() + { + return ipPlatform; + } + +inline OMX_PTR +COmxILPortImpl::TBufferInfo::GetAppPointer() const + { + return ipApp; + } + +inline OMX_PTR +COmxILPortImpl::TBufferInfo::GetAppPointer() + { + return ipApp; + } + +inline void +COmxILPortImpl::TBufferInfo::SetBufferAtHome() + { + iBufferProperties |= EBufferAtHome; + } + +inline void +COmxILPortImpl::TBufferInfo::SetBufferAway() + { + iBufferProperties &= EBufferAwayMask; + } + +inline void +COmxILPortImpl::TBufferInfo::SetBufferOwned() + { + iBufferProperties |= EBufferOwned; + } + +inline void +COmxILPortImpl::TBufferInfo::SetBufferNotOwned() + { + iBufferProperties &= EBufferNotOwnedMask; + } + +inline TBool +COmxILPortImpl::TBufferInfo::IsBufferAtHome() const + { + return ((iBufferProperties & EBufferAtHome) != 0x0 ? ETrue : EFalse); + } + +inline TBool +COmxILPortImpl::TBufferInfo::IsBufferOwned() const + { + return ((iBufferProperties & EBufferOwned) != 0x0 ? ETrue : EFalse); + } + +inline const OMX_PARAM_PORTDEFINITIONTYPE& +COmxILPortImpl::GetParamPortDefinition() const + { + return iParamPortDefinition; + } + +inline const OMX_HANDLETYPE& +COmxILPortImpl::GetTunnelledComponent() const + { + return iTunnelledComponent; + } + +inline const OMX_U32& +COmxILPortImpl::GetTunnelledPort() const + { + return iTunnelledPort; + } + +inline OMX_PARAM_PORTDEFINITIONTYPE& +COmxILPortImpl::GetParamPortDefinition() + { + return iParamPortDefinition; + } + +inline OMX_HANDLETYPE& +COmxILPortImpl::GetTunnelledComponent() + { + return iTunnelledComponent; + } + +inline OMX_U32& +COmxILPortImpl::GetTunnelledPort() + { + return iTunnelledPort; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportmanager.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,2178 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include "omxilportmanager.h" +#include +#include "omxilcallbackmanager.h" +#include + + /** + Static NewL for two-phase construction + + @param aProcessingFunction The component's processing function + + @param aCallbacks The component's callback manager + + @param aOmxVersion The IL Spec version in use + + @param aNumberOfAudioPorts Number of audio ports in the component + + @param aStartAudioPortNumber The start index for audio ports + + @param aNumberOfImagePorts Number of image ports in the component + + @param aStartImagePortNumber The start index for image ports + + @param aNumberOfVideoPorts Number of video ports in the component + + @param aStartVideoPortNumber The start index for video ports + + @param aNumberOfOtherPorts Number of other ports in the component + + @param aStartOtherPortNumber The start index for other ports + + @param aImmediateReturnTimeBuffer This only applies to components with a + clock client port. Indicates whether the Port Manager must forward an + arriving clock buffer to the Callback Manager (ETrue) or to the + Processing Function (EFalse) . If the clock buffer is to be forwarded to + the Processing Function, this will happen using the BufferIndication + function of the component's PF. Otherwise, PF's MediaTimeIndication is + used instead. + */ +COmxILPortManager* +COmxILPortManager::NewL( + COmxILProcessingFunction& aProcessingFunction, + MOmxILCallbackManagerIf& aCallbacks, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer) + { + DEBUG_PRINTF(_L8("COmxILPortManager::NewL")); + + COmxILPortManager* self = + new (ELeave)COmxILPortManager( + aProcessingFunction, + aCallbacks); + + CleanupStack::PushL(self); + self->ConstructL(aProcessingFunction, + aCallbacks, + aOmxVersion, + aNumberOfAudioPorts, + aStartAudioPortNumber, + aNumberOfImagePorts, + aStartImagePortNumber, + aNumberOfVideoPorts, + aStartVideoPortNumber, + aNumberOfOtherPorts, + aStartOtherPortNumber, + aImmediateReturnTimeBuffer); + CleanupStack::Pop(self); + return self; + } + +void +COmxILPortManager::ConstructL( + COmxILProcessingFunction& /* aProcessingFunction */, + MOmxILCallbackManagerIf& /* aCallbacks */, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer) + { + DEBUG_PRINTF(_L8("COmxILPortManager::ConstructL")); + + iImmediateReturnTimeBuffer = aImmediateReturnTimeBuffer; + + iAudioParamInit.nSize = sizeof(OMX_PORT_PARAM_TYPE); + iAudioParamInit.nVersion = aOmxVersion; + iAudioParamInit.nPorts = aNumberOfAudioPorts; + iAudioParamInit.nStartPortNumber = aStartAudioPortNumber; + + iImageParamInit.nSize = sizeof(OMX_PORT_PARAM_TYPE); + iImageParamInit.nVersion = aOmxVersion; + iImageParamInit.nPorts = aNumberOfImagePorts; + iImageParamInit.nStartPortNumber = aStartImagePortNumber; + + iVideoParamInit.nSize = sizeof(OMX_PORT_PARAM_TYPE); + iVideoParamInit.nVersion = aOmxVersion; + iVideoParamInit.nPorts = aNumberOfVideoPorts; + iVideoParamInit.nStartPortNumber = aStartVideoPortNumber; + + iOtherParamInit.nSize = sizeof(OMX_PORT_PARAM_TYPE); + iOtherParamInit.nVersion = aOmxVersion; + iOtherParamInit.nPorts = aNumberOfOtherPorts; + iOtherParamInit.nStartPortNumber = aStartOtherPortNumber; + + + InsertParamIndexL(OMX_IndexParamAudioInit); + InsertParamIndexL(OMX_IndexParamImageInit); + InsertParamIndexL(OMX_IndexParamVideoInit); + InsertParamIndexL(OMX_IndexParamOtherInit); + + + if(iAudioParamInit.nStartPortNumber != 0) + { + User::Leave(KErrArgument); + } + + if (iImageParamInit.nPorts > 0) + { + if (iAudioParamInit.nPorts != + iImageParamInit.nStartPortNumber) + { + User::Leave(KErrArgument); + } + } + + if (iVideoParamInit.nPorts > 0) + { + if ((iAudioParamInit.nPorts + + iImageParamInit.nPorts) != + iVideoParamInit.nStartPortNumber) + { + User::Leave(KErrArgument); + } + } + + if (iOtherParamInit.nPorts > 0) + { + if ((iAudioParamInit.nPorts + + iImageParamInit.nPorts + + iVideoParamInit.nPorts) != + iOtherParamInit.nStartPortNumber) + { + User::Leave(KErrArgument); + } + } + + } + +COmxILPortManager::COmxILPortManager( + COmxILProcessingFunction& aProcessingFunction, + MOmxILCallbackManagerIf& aCallbacks) + : + iProcessingFunction(aProcessingFunction), + iCallbacks(aCallbacks), + iAllPorts() + { + DEBUG_PRINTF(_L8("COmxILPortManager::COmxILPortManager")); + + } + +COmxILPortManager::~COmxILPortManager() + { + DEBUG_PRINTF(_L8("COmxILPortManager::~COmxILPortManager")); + iAllPorts.ResetAndDestroy(); + iTimePorts.Close(); + } + +void +COmxILPortManager::AppendPortL(const COmxILPort* aPort) + { + DEBUG_PRINTF(_L8("COmxILPortManager::AppendPort")); + + const TInt portCount = iAllPorts.Count(); + OMX_PORTDOMAINTYPE portDomain = aPort->Domain(); + OMX_U32 startPortNumber = 0; + TBool timePort = EFalse; + + switch(portDomain) + { + case OMX_PortDomainAudio: + { + __ASSERT_ALWAYS(portCount >= 0, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + __ASSERT_ALWAYS(portCount < iAudioParamInit.nPorts, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + + startPortNumber = iAudioParamInit.nStartPortNumber; + + } + break; + + case OMX_PortDomainImage: + { + __ASSERT_ALWAYS(portCount >= iAudioParamInit.nPorts, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + __ASSERT_ALWAYS(portCount < + iAudioParamInit.nPorts + + iImageParamInit.nPorts, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + + startPortNumber = iImageParamInit.nStartPortNumber; + + } + break; + + case OMX_PortDomainVideo: + { + __ASSERT_ALWAYS(portCount >= + iAudioParamInit.nPorts + + iImageParamInit.nPorts, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + __ASSERT_ALWAYS(portCount < + iAudioParamInit.nPorts + + iImageParamInit.nPorts + + iVideoParamInit.nPorts, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + + startPortNumber = iVideoParamInit.nStartPortNumber; + + } + break; + + + case OMX_PortDomainOther: + { + __ASSERT_ALWAYS(portCount >= + iAudioParamInit.nPorts + + iImageParamInit.nPorts + + iVideoParamInit.nPorts, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + __ASSERT_ALWAYS(portCount < + iAudioParamInit.nPorts + + iImageParamInit.nPorts + + iVideoParamInit.nPorts + + iOtherParamInit.nPorts, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + + startPortNumber = iOtherParamInit.nStartPortNumber; + + OMX_OTHER_PARAM_PORTFORMATTYPE paramFormat; + paramFormat.nSize = sizeof(OMX_OTHER_PARAM_PORTFORMATTYPE); + paramFormat.nVersion = TOmxILSpecVersion(); + paramFormat.nPortIndex = aPort->Index(); + paramFormat.nIndex = 0; + + if ((aPort->GetParameter(OMX_IndexParamOtherPortFormat, ¶mFormat) == OMX_ErrorNone) && + paramFormat.eFormat == OMX_OTHER_FormatTime) + { + timePort = ETrue; + } + } + + break; + + default: + { + User::Panic(KOmxILPortManagerPanicCategory, 1); + } + }; + + if(portCount == startPortNumber) + { + iAllPorts.AppendL(aPort); + } + else + { + for (TInt i=startPortNumber; iIndex() >= aPort->Index()) + { + User::Panic(KOmxILPortManagerPanicCategory, 1); + } + } + iAllPorts.AppendL(aPort); + } + + + TRAPD(err, iTimePorts.AppendL(timePort)); + if (KErrNone != err) + { + iAllPorts.Remove(iAllPorts.Count()-1); + User::Leave(err); + } + } + +void COmxILPortManager::RemoveLastAppendedPort() + { + if (iAllPorts.Count()>0 && iTimePorts.Count()>0) + { + iAllPorts.Remove(iAllPorts.Count()-1); + iTimePorts.Remove(iTimePorts.Count()-1); + } + } + + +/** + This method is used at component's construction time, i.e., in a factory + method of the component. The main component object uses this method to add + the component's ports to its port manager instance. + + @param aPort The port instance to be added. + + @param aDirection The direction of the port being added. + + @ return A Symbian error code indicating if the function call was + successful. KErrNone on success, otherwise another of the system-wide error + codes. +*/ +TInt +COmxILPortManager::AddPort(const COmxILPort* aPort, + OMX_DIRTYPE aDirection) + { + DEBUG_PRINTF(_L8("COmxILPortManager::AddPort")); + + __ASSERT_ALWAYS(aPort, User::Panic(KOmxILPortManagerPanicCategory, 1)); + + if (iAllPorts.Count() >= (iAudioParamInit.nPorts + + iVideoParamInit.nPorts + + iImageParamInit.nPorts + + iOtherParamInit.nPorts)) + { + return KErrArgument; + } + + if (aPort->Direction() != aDirection) + { + return KErrArgument; + } + + if (iAllPorts.Find(aPort) != KErrNotFound) + { + return KErrArgument; + } + + OMX_ERRORTYPE omxRetValue = + aPort->GetLocalOmxParamIndexes(ManagedParamIndexes()); + if (OMX_ErrorNone == omxRetValue) + { + omxRetValue = aPort->GetLocalOmxConfigIndexes(ManagedConfigIndexes()); + } + + if (OMX_ErrorNone != omxRetValue) + { + if (OMX_ErrorInsufficientResources == omxRetValue) + { + return KErrNoMemory; + } + else + { + return KErrGeneral; + } + } + + TRAPD(err, AppendPortL(aPort)); + if (KErrNone != err) + { + return err; + } + + // Here, let's register this port into the call back manager so buffer + // marks can be propagated to the right port... + const OMX_U32 propagationPortIndex = aPort->BufferMarkPropagationPort(); + if (propagationPortIndex != COmxILPort::KBufferMarkPropagationPortNotNeeded) + { + omxRetValue = iCallbacks.RegisterBufferMarkPropagationPort(aPort->Index(), + propagationPortIndex); + } + + err = KErrNone; + if (OMX_ErrorNone != omxRetValue) + { + RemoveLastAppendedPort(); + switch (omxRetValue) + { + case OMX_ErrorInsufficientResources: + { + err = KErrNoMemory; + } + break; + default: + { + err = KErrGeneral; + } + }; + } + + return err; + + } + +TBool +COmxILPortManager::RemoveBuffersFromPfOrCm( + COmxILPort* apPort, OMX_BOOL aRemoveFromPfOnly /* = OMX_FALSE */) const + { + __ASSERT_DEBUG(apPort, User::Panic(KOmxILPortManagerPanicCategory, 1)); + DEBUG_PRINTF3(_L8("COmxILPortManager::RemoveBuffersFromPfOrCm: PORT[%d] aRemoveFromPfOnly[%s] "), + apPort->Index(), aRemoveFromPfOnly ? "TRUE" : "FALSE"); + + const TInt headerCount = apPort->Count(); + OMX_BUFFERHEADERTYPE* pHeader = 0; + TBool allHeadersRemovedFromPf = ETrue; + for (TInt j=0; jIsBufferAtHome(pHeader)) + { + // Tell the PF to remove this header from its queues... + if (!iProcessingFunction.BufferRemovalIndication( + pHeader, + apPort->Direction())) + { + if (OMX_FALSE == aRemoveFromPfOnly) + { + if (!iCallbacks.BufferRemovalIndication( + pHeader, + apPort->Direction())) + { + allHeadersRemovedFromPf = EFalse; + } + else + { + apPort->SetBufferReturned(pHeader); + // Make sure the buffer contents are cleared + TOmxILUtil::ClearBufferContents(pHeader); + } + } + } + else + { + apPort->SetBufferReturned(pHeader); + // Make sure the buffer contents are cleared + TOmxILUtil::ClearBufferContents(pHeader); + } + } + } + + return allHeadersRemovedFromPf; + + } + +OMX_ERRORTYPE +COmxILPortManager::GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILPortManager::GetParameter")); + + TInt index = FindParamIndex(aParamIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamAudioInit: + case OMX_IndexParamImageInit: + case OMX_IndexParamVideoInit: + case OMX_IndexParamOtherInit: + { + if (OMX_ErrorNone != + (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_PORT_PARAM_TYPE)))) + { + return omxRetValue; + } + + OMX_PORT_PARAM_TYPE* + pPortParamType + = static_cast( + apComponentParameterStructure); + + switch(aParamIndex) + { + case OMX_IndexParamAudioInit: + *pPortParamType = iAudioParamInit; + break; + case OMX_IndexParamImageInit: + *pPortParamType = iImageParamInit; + break; + case OMX_IndexParamVideoInit: + *pPortParamType = iVideoParamInit; + break; + case OMX_IndexParamOtherInit: + *pPortParamType = iOtherParamInit; + break; + } + + } + break; + + default: + { + // Obtain the port index + OMX_U32 portIndex; + if (OMX_ErrorNone != GetPortIndexFromOmxStruct( + apComponentParameterStructure, + portIndex)) + { + return OMX_ErrorBadPortIndex; + } + + // Now delegate to the specific port + return iAllPorts[portIndex]->GetParameter( + aParamIndex, + apComponentParameterStructure); + } + }; + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + OMX_BOOL aPortIsDisabled /* = OMX_FALSE */ ) + { + DEBUG_PRINTF(_L8("COmxILPortManager::SetParameter")); + + TInt index = FindParamIndex(aParamIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + // Obtain the port index + OMX_U32 portIndex; + if (OMX_ErrorNone != GetPortIndexFromOmxStruct( + apComponentParameterStructure, + portIndex)) + { + return OMX_ErrorBadPortIndex; + } + + DEBUG_PRINTF2(_L8("COmxILPortManager::SetParameter : PORT[%u]"), portIndex); + + // Grab the port here... + COmxILPort* pPort = iAllPorts[portIndex]; + + if (OMX_TRUE == aPortIsDisabled && + pPort->IsEnabled() && + !pPort->IsTransitioningToEnabled()) + { + // There is an indication from the FSM that the port must be disabled, + // otherwise, this is not allowed in the current state. + return OMX_ErrorIncorrectStateOperation; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamAudioInit: + case OMX_IndexParamVideoInit: + case OMX_IndexParamImageInit: + case OMX_IndexParamOtherInit: + { + // Don't allow changes in the OMX_PORT_PARAM_TYPE structure + return OMX_ErrorUnsupportedIndex; + } + default: + { + TBool updateProcessingFunction = EFalse; + omxRetValue = + pPort->SetParameter( + aParamIndex, + apComponentParameterStructure, + updateProcessingFunction); + + if (OMX_ErrorNone == omxRetValue) + { + if (updateProcessingFunction) + { + omxRetValue = iProcessingFunction.ParamIndication( + aParamIndex, + apComponentParameterStructure); + } + } + + } + }; + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILPortManager::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILPortManager::GetConfig")); + + TInt index = FindConfigIndex(aConfigIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + // Obtain the port index + OMX_U32 portIndex; + if (OMX_ErrorNone != GetPortIndexFromOmxStruct(apComponentConfigStructure, + portIndex)) + { + return OMX_ErrorBadPortIndex; + } + + // Now delegate to the specific port + return iAllPorts[portIndex]->GetConfig( + aConfigIndex, + apComponentConfigStructure); + + } + +OMX_ERRORTYPE +COmxILPortManager::SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure) + { + DEBUG_PRINTF(_L8("COmxILPortManager::SetConfig")); + +#ifdef _OMXIL_COMMON_IL516C_ON + + if (OMX_IndexConfigPortBufferReturnRequest == aConfigIndex) + { + OMX_U32 portIndex; + if (OMX_ErrorNone != GetPortIndexFromOmxStruct( + apComponentConfigStructure, + portIndex)) + { + return OMX_ErrorBadPortIndex; + } + DEBUG_PRINTF2(_L8("COmxILPortManager::SetConfig : PORT[%u] OMX_IndexConfigPortBufferReturnRequest"), portIndex); + + // Check the index of the port.. + if ((OMX_ALL != portIndex) && + (CheckPortIndex(portIndex) != OMX_ErrorNone)) + { + return OMX_ErrorBadPortIndex; + } + + // This error will be ignored... + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + if (portIndex != OMX_ALL) + { + omxRetValue = BufferEjectIndication(portIndex); + } + else + { + const TInt portCount = iAllPorts.Count(); + + for (TUint i = 0; i< portCount; ++i) + { + omxRetValue = BufferEjectIndication(iAllPorts[i]->Index()); + } + } + + return OMX_ErrorNone; + + } +#endif + + TInt index = FindConfigIndex(aConfigIndex); + if (KErrNotFound == index) + { + return OMX_ErrorUnsupportedIndex; + } + + // Obtain the port index + OMX_U32 portIndex; + if (OMX_ErrorNone != GetPortIndexFromOmxStruct(apComponentConfigStructure, + portIndex)) + { + return OMX_ErrorBadPortIndex; + } + + DEBUG_PRINTF2(_L8("COmxILPortManager::SetConfig : PORT[%u]"), portIndex); + + TBool updateProcessingFunction = EFalse; + OMX_ERRORTYPE omxRetValue = + iAllPorts[portIndex]->SetConfig( + aConfigIndex, + apComponentConfigStructure, + updateProcessingFunction); + + if (OMX_ErrorNone == omxRetValue) + { + if (updateProcessingFunction) + { + omxRetValue = iProcessingFunction.ConfigIndication( + aConfigIndex, + apComponentConfigStructure); + } + } + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILPortManager::GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const + { + DEBUG_PRINTF(_L8("COmxILPortManager::GetExtensionIndex")); + + // See if the extension index is supported by any of the ports... + const TInt portCount = iAllPorts.Count(); + OMX_ERRORTYPE retValue = OMX_ErrorNone; + for (TUint i = 0; i< portCount; ++i) + { + retValue = iAllPorts[i]->GetExtensionIndex(aParameterName, + apIndexType); + if (retValue != OMX_ErrorUnsupportedIndex) + { + return retValue; + } + } + + return OMX_ErrorUnsupportedIndex; + + } + +OMX_ERRORTYPE +COmxILPortManager::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted, + OMX_BOOL aPortIsDisabled /* = OMX_FALSE */ ) + { + DEBUG_PRINTF(_L8("COmxILPortManager::PopulateBuffer")); + + // Check the index of the port.. + if (CheckPortIndex(aPortIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + // Grab the port here... + COmxILPort* pPort = iAllPorts[aPortIndex]; + +#ifdef _OMXIL_COMMON_IL516C_ON + if (!apBuffer) + { + // Basically, if OMX_UseBuffer is used, the port must not be populated + // at this point, otherwise it is an error... + if (pPort->IsPopulated()) + { + return OMX_ErrorIncorrectStateOperation; + } + } + else + { + // ... AllocateBuffer... this is only allowed if the the IL Client has + // issued the command to idle already.. +#endif + + if (OMX_TRUE == aPortIsDisabled && + pPort->IsEnabled() && + !pPort->IsTransitioningToEnabled()) + { + // There is an indication from the FSM that the port must be disabled, + // otherwise, the buffer allocation is not allowed in the current + // state. Note that a port may be transitioning to enabled and in that + // case the buffer population must be allowed... + return OMX_ErrorIncorrectStateOperation; + } + +#ifdef _OMXIL_COMMON_IL516C_ON + } +#endif + + // Check that in case of tunnelling, this port is not buffer supplier... + if (pPort->IsTunnelledAndBufferSupplier()) + { + return OMX_ErrorBadPortIndex; + } + + // Now delegate to the port... + OMX_ERRORTYPE omxRetValue; + if (OMX_ErrorNone != (omxRetValue = pPort->PopulateBuffer( + appBufferHdr, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted))) + { + return omxRetValue; + } + + if (portPopulationCompleted && pPort->IsTransitioningToEnabled()) + { + // This is a case of port being enabled... Inform the port that it + // has been enabled.. + pPort->SetTransitionToEnabledCompleted(); + + // For each enabled port, the IL Client must be notified with an + // enabled completion event... + omxRetValue = iCallbacks.CommandCompleteNotification( + OMX_CommandPortEnable, pPort->Index()); + } + + return omxRetValue; + + } + + +OMX_ERRORTYPE +COmxILPortManager::FreeBuffer(OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted, + OMX_BOOL aPortIsDisabled /* = OMX_FALSE */) + { + DEBUG_PRINTF3(_L8("COmxILPortManager::FreeBuffer : PORT[%u] BUFFER [%X]"), aPortIndex, apBufferHeader); + + // Check the index of the port.. + if (CheckPortIndex(aPortIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + // Grab the port here... + COmxILPort* pPort = iAllPorts[aPortIndex]; + + // Check that in case of tunnelling, this port is not buffer supplier... + if (pPort->IsTunnelledAndBufferSupplier()) + { + return OMX_ErrorBadPortIndex; + } + + TBool errorPortUnpopulated = EFalse; + if (OMX_TRUE == aPortIsDisabled && + pPort->IsEnabled()) + { + // There is an indication from the FSM that the port should be + // disabled. If that's not the case, the buffer deallocation will raise + // an OMX_ErrorPortUnpopulated error in the current state. + + if (!pPort->IsBufferAtHome(apBufferHeader)) + { + // FreeBuffer will normally be called in a situation where we are + // not suppliers and the supplier already got the buffer. So the + // buffer won't be on our side almost never. + + if (!iTimePorts[aPortIndex] || !iImmediateReturnTimeBuffer) + { + // We'll tell the PF to remove this + // header from its queues, in case this is called in some strange + // situation (should not happen if the tunnelled component is well + // behaved)... + iProcessingFunction.BufferRemovalIndication( + apBufferHeader, + pPort->Direction()); + } + + // Set the returned flag as this buffer will not count as "away" + // anymore... + pPort->SetBufferReturned(apBufferHeader); + } + + // We have to send the Port Unpopulated Error... + errorPortUnpopulated = ETrue; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + // Now delegate to the port... + if (OMX_ErrorNone != (omxRetValue = pPort->FreeBuffer( + apBufferHeader, + portDepopulationCompleted))) + { + return omxRetValue; + } + + if (errorPortUnpopulated) + { + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.ErrorEventNotification(OMX_ErrorPortUnpopulated))) + { + return omxRetValue; + } + } + + + if (portDepopulationCompleted) + { + if (pPort->IsTransitioningToDisabled()) + { + // Here we must complete the OMX_CommandPortDisable command + + // Set the state of the port to disabled as the command has already + // completed... + pPort->SetTransitionToDisabledCompleted(); + + // For each disabled port, the IL Client must be notified + // with a disabled completion event... + omxRetValue = iCallbacks.CommandCompleteNotification( + OMX_CommandPortDisable, aPortIndex); + + // Clear this flag here. Otherwise, the FSM would inform the client + // of a successful transition to OMX_StateIdle which is not the + // case... + portDepopulationCompleted = EFalse; + } + } + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILPortManager::TunnelRequest(OMX_U32 aPortIndex, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup, + OMX_BOOL aPortIsDisabled /* = OMX_FALSE */) + { + DEBUG_PRINTF3(_L8("COmxILPortManager::TunnelRequest : aTunneledComp [%X] aTunneledPort [%d]"), aTunneledComp, aTunneledPort); + + // Check the index of the port.. + if (CheckPortIndex(aPortIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + // Grab the port here... + COmxILPort* pPort = iAllPorts[aPortIndex]; + + if (OMX_TRUE == aPortIsDisabled && + pPort->IsEnabled()) + { + // There is an indication from the FSM that the port must be disabled, + // otherwise, the tunnel request is not allowed in the current state. + return OMX_ErrorIncorrectStateOperation; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + // Check whether the tunnel is being torn down... + if (!aTunneledComp) + { + // Tell the port... + if (OMX_ErrorNone != + (omxRetValue = pPort->TunnelRequest( + aTunneledComp, + aTunneledPort, + apTunnelSetup))) + { + return omxRetValue; + } + + if (OMX_ErrorNone != + (omxRetValue = iCallbacks.DeregisterTunnelCallback(aPortIndex))) + { + // This is serious enough... + return OMX_ErrorInvalidComponent; + } + + // We are done here... + return OMX_ErrorNone; + } + + // Check whether the port is being re-tunnelled... + if (pPort->IsTunnelled()) + { + // Only two valid options here: + // 1.- The port is completely disabled... + // or... + // 2.- The port is enabled AND component in OMX_StateLoaded + if ((!pPort->IsEnabled() && + !pPort->IsTransitioningToEnabled() && + !pPort->IsTransitioningToDisabled()) + || + (pPort->IsEnabled() && !aPortIsDisabled)) + { + if (OMX_ErrorNone != + (omxRetValue = iCallbacks.DeregisterTunnelCallback(aPortIndex))) + { + return OMX_ErrorInvalidComponent; + } + } + else + { + return OMX_ErrorIncorrectStateOperation; + } + } + + // Delegate to the port... + if (OMX_ErrorNone != + (omxRetValue = pPort->TunnelRequest( + aTunneledComp, + aTunneledPort, + apTunnelSetup))) + { + return omxRetValue; + } + + // From this point on, the port will assume that a tunnel has been + // successfully created. If there is a problem at other end, the IL Client + // will clear the tunnel on this side using ComponentTunnelRequest with + // NULL handle parameter + + // Register the existence of a tunnel within the callback manager... + if (OMX_ErrorNone != + (omxRetValue = iCallbacks.RegisterTunnelCallback(aPortIndex, + pPort->Direction(), + aTunneledComp, + aTunneledPort))) + { + // This is serious enough... + return OMX_ErrorInvalidComponent; + } + + return OMX_ErrorNone; + + } + + +OMX_ERRORTYPE +COmxILPortManager::TunnellingBufferAllocation(TBool& aComponentPopulationCompleted, + TUint32 aPortIndex /* = OMX_ALL */) + { + DEBUG_PRINTF(_L8("COmxILPortManager::TunnellingBufferAllocation")); + + aComponentPopulationCompleted = EFalse; + + // Check the index of the port.. + if ((OMX_ALL != aPortIndex) && (CheckPortIndex(aPortIndex) != OMX_ErrorNone)) + { + return OMX_ErrorBadPortIndex; + } + + const TInt portCount = iAllPorts.Count(); + COmxILPort* pPort = 0; + OMX_U32 portIndex = 0; + TInt i=0; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + do + { + if (aPortIndex != OMX_ALL) + { + // Grab the port here... + pPort = iAllPorts[aPortIndex]; + portIndex = aPortIndex; + } + else + { + pPort = iAllPorts[i]; + portIndex = pPort->Index(); + } + + + if (pPort->IsEnabled() && + pPort->IsTunnelledAndBufferSupplier() && + !pPort->IsPopulated()) + { + TBool portPopulationCompleted = EFalse; + if (OMX_ErrorNone != + (omxRetValue = pPort->PopulateTunnel(portPopulationCompleted))) + { + // TODO: Check case of ports being enabled (error callback needed...) + return omxRetValue; + } + + if (portPopulationCompleted && pPort->IsTransitioningToEnabled()) + { + // This is a case of port being enabled... Inform the port that it + // has been enabled.. + pPort->SetTransitionToEnabledCompleted(); + + // For each enabled port, the IL Client must be notified with an + // enabled completion event... + if (OMX_ErrorNone != ( + omxRetValue = iCallbacks.CommandCompleteNotification( + OMX_CommandPortEnable, portIndex))) + { + return omxRetValue; + } + } + + } + + // Increment loop counter + ++i; + } + while (OMX_ALL == aPortIndex && i < portCount); + + if (AllPortsPopulated()) + { + DEBUG_PRINTF(_L8("COmxILPortManager::TunnellingBufferAllocation : AllPortsPopulated : [TRUE]")); + aComponentPopulationCompleted = ETrue; + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::TunnellingBufferDeallocation( + TBool& aComponentDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILPortManager::TunnellingBufferDeallocation")); + + aComponentDepopulationCompleted = EFalse; + + const TInt portCount = iAllPorts.Count(); + COmxILPort* pPort = 0; + TInt portDepopulationCounter = 0; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + TBool portDepopulationCompleted = EFalse; + for (TInt i=0; iIsEnabled() && pPort->IsTunnelledAndBufferSupplier()) + { + // TODO: Check that at this point, the ProcessingFunction must not + // hold any buffer header... + portDepopulationCompleted = EFalse; + if (OMX_ErrorNone != + (omxRetValue = pPort->FreeTunnel(portDepopulationCompleted))) + { + return omxRetValue; + } + + if (pPort->IsDePopulated()) + { + portDepopulationCounter++; + } + } + } + + if (AllPortsDePopulated()) + { + DEBUG_PRINTF(_L8("COmxILPortManager::TunnellingBufferDeallocation : AllPortsDepopulated : [TRUE]")); + aComponentDepopulationCompleted = ETrue; + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::InitiateTunnellingDataFlow( + OMX_U32 aPortIndex /* = OMX_ALL */, + OMX_BOOL aSuppliersAndNonSuppliers /* = OMX_FALSE */) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::InitiateTunnellingDataFlow : PORT[%d]"), aPortIndex); + + // Check the index of the port.. + if ((OMX_ALL != aPortIndex) && (CheckPortIndex(aPortIndex) != OMX_ErrorNone)) + { + return OMX_ErrorBadPortIndex; + } + + // This is an indication that the component is ready to start exchanging + // buffers... Supplier tunnelled ports must initiate the buffer exchange in + // the tunnel... + const TInt portCount = iAllPorts.Count(); + COmxILPort* pPort = 0; + OMX_U32 portIndex = 0; + TInt i=0; + do + { + if (aPortIndex != OMX_ALL) + { + // Grab the port here... + pPort = iAllPorts[aPortIndex]; + portIndex = aPortIndex; + } + else + { + pPort = iAllPorts[i]; + portIndex = pPort->Index(); + } + + if (pPort->IsEnabled() && + ((OMX_TRUE == aSuppliersAndNonSuppliers) || + pPort->IsTunnelledAndBufferSupplier())) + { + const TInt headerCount = pPort->Count(); + OMX_BUFFERHEADERTYPE* pHeader = 0; + OMX_DIRTYPE portDir = OMX_DirMax; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + for (TInt j=0; jIsBufferAtHome(pHeader)) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::InitiateTunnellingDataFlow : BUFFER HEADER[%X] is not at home"), + pHeader); + continue; + } + + portDir = pPort->Direction(); + __ASSERT_DEBUG((OMX_DirInput == portDir || + OMX_DirOutput == portDir), + User::Panic(KOmxILPortManagerPanicCategory, 1)); + + if (OMX_DirInput == portDir) + { + // Input port -> Send buffer to callback manager... + omxRetValue = + iCallbacks.BufferDoneNotification(pHeader, + portIndex, + portDir); + } + else + { + // Output port -> Send buffer to processing function... + omxRetValue = + iProcessingFunction.BufferIndication(pHeader, + portDir); + } + + if (omxRetValue != OMX_ErrorNone) + { + return omxRetValue; + } + + // Inform the port that one of its buffers has been sent + // away... + TBool bufferMarkedWithOwnMark = EFalse; + if (!pPort->SetBufferSent(pHeader, bufferMarkedWithOwnMark)) + { + // The buffer header was not found... + return OMX_ErrorBadParameter; + } + + // For each MarkBuffer command processed, the IL Client must be notified + // with an OMX_EventCommandComplete event... + if (bufferMarkedWithOwnMark) + { + if (OMX_ErrorNone != + (omxRetValue = iCallbacks.CommandCompleteNotification( + OMX_CommandMarkBuffer, portIndex))) + { + return omxRetValue; + } + } + + } // for (TInt j=0; jIsEnabled() && pPort->IsTunnelledAndBufferSupplier()) + + // Increment loop counter + ++i; + } + while(OMX_ALL == aPortIndex && i < portCount); + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::BufferIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection, + OMX_BOOL aPortIsDisabled /* = OMX_FALSE */) + { + + OMX_U32 portIndex = aDirection == OMX_DirInput ? + apBufferHeader->nInputPortIndex : apBufferHeader->nOutputPortIndex; + + DEBUG_PRINTF3(_L8("COmxILPortManager::BufferIndication : PORT[%u] BUFFER [%X] "), + portIndex, apBufferHeader); + + // Check the index of the port.. + if (CheckPortIndex(portIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + // Grab the port here... + COmxILPort* pPort = iAllPorts[portIndex]; + + // Check that port direction is the correct one... + if (pPort->Direction() != aDirection) + { + return OMX_ErrorBadPortIndex; + } + +#ifdef _OMXIL_COMMON_IL516C_ON + (void)aPortIsDisabled; + // Only restriction here is that the port must be populated + if (!pPort->IsPopulated()) + { + return OMX_ErrorIncorrectStateOperation; + } +#endif + +#ifndef _OMXIL_COMMON_IL516C_ON + if (!pPort->IsEnabled() && + !pPort->IsTransitioningToDisabled() && + !pPort->IsTransitioningToEnabled()) + { + return OMX_ErrorIncorrectStateOperation; + } + + // Check port enabled property... + if (OMX_TRUE == aPortIsDisabled && + pPort->IsEnabled()) + { + // There is an indication from the FSM that the port must be disabled, + // otherwise, the buffer indication is not allowed in the current + // state. + return OMX_ErrorIncorrectStateOperation; + } + +#endif + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + // Check whether this port is a buffer supplier... + if (pPort->IsTunnelledAndBufferSupplier() && + pPort->IsTransitioningToDisabled()) + { + // Set the state of the port to disabled as the command has already + // completed... + if (!pPort->SetBufferReturned(apBufferHeader)) + { + // The buffer header was not found... + return OMX_ErrorBadParameter; + } + + if (pPort->HasAllBuffersAtHome()) + { + // All buffers at home.. we can initiate here the + // depopulation of the tunnel... + TBool portDepopulationCompleted = EFalse; + if (OMX_ErrorNone != + (omxRetValue = pPort->FreeTunnel(portDepopulationCompleted))) + { + return omxRetValue; + } + + // Inform the port that the disabled command has + // completed... + pPort->SetTransitionToDisabledCompleted(); + + // For each disabled port, the IL Client must be notified + // with a port disabled completion event... + if (OMX_ErrorNone != + (omxRetValue = iCallbacks.CommandCompleteNotification( + OMX_CommandPortDisable, portIndex))) + { + return omxRetValue; + } + } + + // Make sure the buffer contents are cleared... + TOmxILUtil::ClearBufferContents(apBufferHeader); + + // ... we are done.. no need to send the buffer to the + // processing function... + return OMX_ErrorNone; + + } // if ((pPort->IsTunnelledAndBufferSupplier() && pPort->IsTransitioningToDisabled()) +#ifdef _OMXIL_COMMON_IL516C_ON + else if (pPort->IsTunnelled() && pPort->IsTransitioningToDisabled()) + { + // We get here if the port is tunnelled, non-supplier and is currently + // in the process of transitioning to disabled... To avoid Race + // condition #3, we need to check that we've received the request from + // the supplier to return its buffers... however, we don't check it for + // now, it is just easier to return the buffer now... + DEBUG_PRINTF3(_L8("COmxILPortManager::BufferIndication : PORT [%u] BUFFER [%X] : " + "WARNING This port is being disabled, " + "the buffer id being returned to the tunnelled component"), + portIndex, apBufferHeader); + omxRetValue = + iCallbacks.BufferDoneNotification(apBufferHeader, + portIndex, + aDirection); + // ... we are done.. + return OMX_ErrorNone; + } +#endif + + + // Inform the port that one of its buffers is going to be sent to the + // processing function (exception applies to OMX_PortDomainOther ports) ... + // The port will also mark this buffer if the port + // has pending marks to be signalled... The buffer marks are finally + // processed/propagated by the callback manager once the buffer has been + // consumed by the processing function... + TBool bufferMarkedWithOwnMark = EFalse; + if (!pPort->SetBufferSent(apBufferHeader, bufferMarkedWithOwnMark)) + { + return OMX_ErrorBadParameter; + } + + // For each MarkBuffer command processed, the IL Client must be notified + // with an OMX_EventCommandComplete event... + if (bufferMarkedWithOwnMark) + { + if (OMX_ErrorNone != + (omxRetValue = iCallbacks.CommandCompleteNotification( + OMX_CommandMarkBuffer, portIndex))) + { + return omxRetValue; + } + } + + if (iImmediateReturnTimeBuffer && iTimePorts[portIndex]) + { + // OMX_OTHER_FormatTime ports (such as COmxILClientClockPort) needs + // to return the buffer sooner to the buffer supplier component + OMX_TIME_MEDIATIMETYPE* pMediaTime = + reinterpret_cast(apBufferHeader->pBuffer); + + OMX_TIME_MEDIATIMETYPE timeInfo; + if (pMediaTime) + { + timeInfo = *pMediaTime; + } + + // Return the buffer (send the Buffer Done notification) via callback now. + apBufferHeader->nFilledLen = 0; + + OMX_ERRORTYPE err = iCallbacks.ClockBufferDoneNotification( + apBufferHeader, portIndex, aDirection); + + if (err != OMX_ErrorNone) + { + return err; + } + + if (pMediaTime) + { + // Send time update to the processing function + err = iProcessingFunction.MediaTimeIndication(timeInfo); + } + + __ASSERT_DEBUG(err != OMX_ErrorNotImplemented, + User::Panic(KOmxILPortManagerPanicCategory, 1)); + + return err; + } + + return iProcessingFunction.BufferIndication(apBufferHeader, + aDirection); + } + + +OMX_ERRORTYPE +COmxILPortManager::BufferReturnIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection, + TBool& aAllBuffersReturned) + { + + aAllBuffersReturned = EFalse; + + OMX_U32 portIndex = aDirection == OMX_DirInput ? + apBufferHeader->nInputPortIndex : apBufferHeader->nOutputPortIndex; + + DEBUG_PRINTF3(_L8("COmxILPortManager::BufferReturnIndication : PORT[%u] BUFFER [%X]"), + portIndex, apBufferHeader); + + // Check the index of the port.. + if (CheckPortIndex(portIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + // Grab the port here... + COmxILPort* pPort = iAllPorts[portIndex]; + + // Check that port direction is the correct one... + if (pPort->Direction() != aDirection) + { + return OMX_ErrorBadPortIndex; + } + + + if (!pPort->IsEnabled()) + { + return OMX_ErrorBadPortIndex; + } + + // Check that this port must be buffer supplier... + if (!pPort->IsTunnelledAndBufferSupplier()) + { + return OMX_ErrorBadPortIndex; + } + + // Inform the port that a buffer has returned... + if (!pPort->SetBufferReturned(apBufferHeader)) + { + // The buffer header was not found... + return OMX_ErrorBadParameter; + } + + // Make sure the buffer contents are cleared... + TOmxILUtil::ClearBufferContents(apBufferHeader); + + if (pPort->HasAllBuffersAtHome()) + { + aAllBuffersReturned = ETrue; + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::BufferFlushIndicationFlushCommand( + TUint32 aPortIndex, TBool aEjectBuffers /* = ETrue */) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::BufferFlushIndicationFlushCommand : PORT[%u]"), aPortIndex); + + // Check the index of the port.. + if ((OMX_ALL != aPortIndex) && (CheckPortIndex(aPortIndex) != OMX_ErrorNone)) + { + return OMX_ErrorBadPortIndex; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + RPointerArray portsToFlush; + RPointerArray portsToNotify; + const TInt portCount = iAllPorts.Count(); + COmxILPort* pPort = 0; + TInt i=0; + TBool flushSuccessful; + do + { + flushSuccessful = ETrue; + if (aPortIndex != OMX_ALL) + { + // Grab the port here... + pPort = iAllPorts[aPortIndex]; + } + else + { + pPort = iAllPorts[i]; + } + + if (pPort->IsEnabled() && pPort->Count()) + { + // If port is tunnelled: + // + // - Output ports buffers are sent to the processing function when + // flushed + // + // - Input ports buffers are sent upstream. + // + // If port is non-tunnelled: + // - Buffers are ejected always... + if (pPort->IsTunnelled()) + { + // Remove buffers from PF only... + RemoveBuffersFromPfOrCm(pPort, OMX_TRUE); + + if (aEjectBuffers) + { + // Now we need to send input buffers upstream and ouput + // buffers to the PF... this is done by + // InitiateTunnellingDataFlow + if ((omxRetValue = InitiateTunnellingDataFlow( + pPort->Index(), OMX_TRUE)) != OMX_ErrorNone) + { + // The flush has failed, we need to notify the IL Cient + // via EventHandler... + iCallbacks.ErrorEventNotification(omxRetValue); + flushSuccessful = EFalse; + } + } + } + else + { + // All other ports are simply flushed... + portsToFlush.Append(pPort); + } + } + // Notify flushing completed, even if there was nothing to + // flush... + if (flushSuccessful) + { + portsToNotify.Append(pPort); + } + + // Increment loop counter + ++i; + } + while(OMX_ALL == aPortIndex && i < portCount); + + const TInt flushCount = portsToFlush.Count(); + const TInt notifyCount = portsToNotify.Count(); + + + if (iAllPorts.Count() == flushCount) + { + omxRetValue = iProcessingFunction.BufferFlushingIndication( + OMX_ALL, + OMX_DirMax); + } + else + { + for (i=0; iIndex(), + pPort->Direction()); + } + } + + for (i=0; iIndex()); + } + + portsToFlush.Close(); + portsToNotify.Close(); + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILPortManager::BufferFlushIndicationPauseOrExeToIdleCommand( + TBool& aAllBuffersReturnedToSuppliers) + { + DEBUG_PRINTF(_L8("COmxILPortManager::BufferFlushIndicationPauseOrExeToIdleCommand")); + + aAllBuffersReturnedToSuppliers = EFalse; + + const TInt portCount = iAllPorts.Count(); + TBool foundBufferSupplierThatNeedsToWait = EFalse; + COmxILPort* pPort = 0; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + for (TInt i=0; iCount()) + { + if (pPort->IsTunnelledAndBufferSupplier() && + !pPort->HasAllBuffersAtHome()) + { + if (!RemoveBuffersFromPfOrCm(pPort)) + { + // This port will have to wait to get some of its buffers + // returned by the tunnelled port... + foundBufferSupplierThatNeedsToWait = ETrue; +#ifdef _OMXIL_COMMON_IL516C_ON + // Request buffer ejection from the tunnelled component + iCallbacks.EjectBuffersRequest(pPort->Index()); +#endif + } + continue; + } + +#ifdef _OMXIL_COMMON_IL516C_ON + if (!pPort->IsTunnelled()) + { +#endif + + if (OMX_ErrorNone != + (omxRetValue = iProcessingFunction.BufferFlushingIndication( + pPort->Index(), + pPort->Direction()))) + { + return omxRetValue; + } + +#ifdef _OMXIL_COMMON_IL516C_ON + } +#endif + + } + } + + if (!foundBufferSupplierThatNeedsToWait) + { + aAllBuffersReturnedToSuppliers = ETrue; + } + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::PortEnableIndication( + TUint32 aPortIndex, + TBool aIndicationIsFinal) + { + DEBUG_PRINTF3(_L8("COmxILPortManager::PortEnableIndication: PORT[%u] TRANSITIONISFINAL[%d]"), aPortIndex, aIndicationIsFinal); + + // Check the index of the port.. + if ((OMX_ALL != aPortIndex) && (CheckPortIndex(aPortIndex) != OMX_ErrorNone)) + { + return OMX_ErrorBadPortIndex; + } + + const TInt portCount = iAllPorts.Count(); + COmxILPort* pPort = 0; + OMX_U32 portIndex = 0; + TInt i=0; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + do + { + // We do this so we loop or not depending on the needs... + if (aPortIndex != OMX_ALL) + { + // Grab the port here... + pPort = iAllPorts[aPortIndex]; + portIndex = aPortIndex; + } + else + { + pPort = iAllPorts[i]; + portIndex = pPort->Index(); + } + + // If port is already enabled, just indicate that the enable command has + // completed successfully + if (pPort->IsEnabled()) + { + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.CommandCompleteNotification( + OMX_CommandPortEnable, portIndex))) + { + return omxRetValue; + } + + ++i; + continue; + } + + // First check that no-one port is currently transitioning to + // Enabled... + if (pPort->IsTransitioningToEnabled() || + pPort->IsTransitioningToDisabled()) + { + // Send an error event... The spec mandates that the nData2 and + // the pEventData are 0 and NULL respectively, but they could be + // used here to hand some information like the index of the port + // that has failed... + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.ErrorEventNotification(OMX_ErrorPortUnresponsiveDuringAllocation))) + { + return omxRetValue; + } + + if (OMX_ALL == aPortIndex) + { + ++i; + continue; + } + else + { + return OMX_ErrorUndefined; + } + } + + if (aIndicationIsFinal) + { + // Inform the port that it has been enabled.. + pPort->SetTransitionToEnabledCompleted(); + + // For each enabled port, the IL Client must be notified + // with an enabled completion event... + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.CommandCompleteNotification( + OMX_CommandPortEnable, portIndex))) + { + return omxRetValue; + } + + } + else + { + // Inform the port that it is being enabled.. + pPort->SetTransitionToEnabled(); + } + + // Increment loop counter + ++i; + } + while(OMX_ALL == aPortIndex && i < portCount); + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::PortDisableIndication( + TUint32 aPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::PortDisableIndication: PORT[%u] "), aPortIndex); + + // Check the index of the port.. + if ((OMX_ALL != aPortIndex) && (CheckPortIndex(aPortIndex) != OMX_ErrorNone)) + { + return OMX_ErrorBadPortIndex; + } + + const TInt portCount = iAllPorts.Count(); + COmxILPort* pPort = 0; + OMX_U32 portIndex = 0; + TInt i=0; + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + do + { + if (aPortIndex != OMX_ALL) + { + // Grab the port here... + pPort = iAllPorts[aPortIndex]; + portIndex = aPortIndex; + } + else + { + pPort = iAllPorts[i]; + portIndex = pPort->Index(); + } + + // If port is already disabled, just indicate that the disable command has + // completed successfully + if (!pPort->IsEnabled()) + { + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.CommandCompleteNotification( + OMX_CommandPortDisable, portIndex))) + { + return omxRetValue; + } + + ++i; + continue; + } + + // First check that no-one port is currently transitioning to + // Disabled... + if (pPort->IsTransitioningToDisabled() || + pPort->IsTransitioningToEnabled()) + { + // Send an error event... The spec mandates that the nData2 and + // the pEventData are 0 and NULL respectively, but they could be + // used here to hand some information like the index of the port + // that has failed... + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.ErrorEventNotification(OMX_ErrorPortUnresponsiveDuringAllocation))) + { + return omxRetValue; + } + + if (OMX_ALL == aPortIndex) + { + ++i; + continue; + } + else + { + return OMX_ErrorUndefined; + } + + } + + if (pPort->IsTunnelledAndBufferSupplier()) + { + if (!pPort->HasAllBuffersAtHome() && !RemoveBuffersFromPfOrCm(pPort)) + { + // Inform the port that it is being disabled + pPort->SetTransitionToDisabled(); + // This port will have to wait to get all its buffers + // returned by the tunnelled port... +#ifdef _OMXIL_COMMON_IL516C_ON + //... but request the ejection of the buffers first... + iCallbacks.EjectBuffersRequest(pPort->Index()); +#endif + } + else + { + // Buffer supplier with all buffers at home.. we can + // initiate here the depopulation of the tunnel... + + // This boolean is not used here ... + TBool portDepopulationCompleted = EFalse; + + // Better to ignore here any possible error in + // FreeTunnel... nothing we can do about it... + if (OMX_ErrorNone != + (omxRetValue = + pPort->FreeTunnel(portDepopulationCompleted))) + { + return omxRetValue; + } + + // Inform the port that the disabled command has + // completed... + pPort->SetTransitionToDisabledCompleted(); + + // For each disabled port, the IL Client must be notified + // with a disabled completion event... + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.CommandCompleteNotification( + OMX_CommandPortDisable, portIndex))) + { + return omxRetValue; + } + + } // else <- if (!pPort->HasAllBuffersAtHome()) + + } // if (pPort->IsTunnelledAndBufferSupplier()) + else + { + if (pPort->Count() > 0) + { + +#ifdef _OMXIL_COMMON_IL516C_ON + if (!pPort->IsTunnelled()) + { +#endif + + if (OMX_ErrorNone != + (omxRetValue = + iProcessingFunction.BufferFlushingIndication( + portIndex, + pPort->Direction()))) + { + return omxRetValue; + } + +#ifdef _OMXIL_COMMON_IL516C_ON + } +#endif + + // Inform the port that it is being disabled + pPort->SetTransitionToDisabled(); + } + else + { + // Inform the port that the disabled command has + // completed... + pPort->SetTransitionToDisabledCompleted(); + + // For each disabled port, the IL Client must be notified + // with a disabled completion event... + if (OMX_ErrorNone != + (omxRetValue = + iCallbacks.CommandCompleteNotification( + OMX_CommandPortDisable, portIndex))) + { + return omxRetValue; + } + } + + } + + // Increment loop counter + ++i; + } + while(OMX_ALL == aPortIndex && i < portCount); + + return OMX_ErrorNone; + + } + +OMX_ERRORTYPE +COmxILPortManager::BufferMarkIndication( + TUint32 aPortIndex, + OMX_PTR ipMarkData) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::BufferMarkIndication: PORT[%u] "), aPortIndex); + + // Check the index of the port.. + if (CheckPortIndex(aPortIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + const OMX_MARKTYPE* pMark = static_cast(ipMarkData); + + if (!pMark->hMarkTargetComponent) + { + return OMX_ErrorBadParameter; + } + + // Let's tell the port to store the mark so it can mark the next incoming + // buffer... + return iAllPorts[aPortIndex]->StoreBufferMark(pMark); + + } + +#ifdef _OMXIL_COMMON_IL516C_ON +OMX_ERRORTYPE +COmxILPortManager::BufferEjectIndication( + TUint32 aPortIndex) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::BufferEjectIndication: PORT[%u] "), aPortIndex); + + // Check the index of the port.. + if (CheckPortIndex(aPortIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + COmxILPort* pPort = iAllPorts[aPortIndex]; + + if (pPort->Count()) + { + omxRetValue = iProcessingFunction.BufferFlushingIndication( + pPort->Index(), + pPort->Direction()); + } + + return omxRetValue; + + } +#endif + +OMX_ERRORTYPE +COmxILPortManager::ComponentRoleIndication(TUint aComponentRoleIndex) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::ComponentRoleIndication : aComponentRoleIndex[%u]"), aComponentRoleIndex); + + // At this point, the IL Client wants to set the default role that the + // standard component is assuming. Therefore, the role defaults need to be + // reloaded into all ports and the processing function object. + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + const TInt portCount = iAllPorts.Count(); + for (TUint i = 0; i< portCount; ++i) + { + if (OMX_ErrorNone != + (omxRetValue = + iAllPorts[i]->SetComponentRoleDefaults(aComponentRoleIndex))) + { + return omxRetValue; + } + } + + return iProcessingFunction.ComponentRoleIndication(aComponentRoleIndex); + + } + +OMX_ERRORTYPE +COmxILPortManager::PortSettingsChangeIndication(OMX_U32 aPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient) + { + DEBUG_PRINTF2(_L8("COmxILPortManager::PortSettingsChangeIndication: PORT[%u] "), aPortIndex); + + // Check the index of the port.. + if (CheckPortIndex(aPortIndex) != OMX_ErrorNone) + { + return OMX_ErrorBadPortIndex; + } + + return iAllPorts[aPortIndex]->DoPortReconfiguration( + aPortSettingsIndex, aPortSettings, aEventForILClient); + + } + + +TBool +COmxILPortManager::AllPortsPopulated() const + { + + const TInt portCount = iAllPorts.Count(); + COmxILPort* pPort = 0; + for (TInt i=0; iIsEnabled()) + { + continue; + } + + if (!pPort->IsPopulated()) + { + DEBUG_PRINTF(_L8("COmxILPortManager::AllPortsPopulated : [FALSE]")); + return EFalse; + } + } + + DEBUG_PRINTF(_L8("COmxILPortManager::AllPortsPopulated : [TRUE]")); + return ETrue; + + } + +TBool +COmxILPortManager::AllPortsDePopulated() const + { + + const TInt portCount = iAllPorts.Count(); + for (TInt i=0; iIsDePopulated()) + { + DEBUG_PRINTF(_L8("COmxILPortManager::AllPortsDePopulated : [FALSE]")); + return EFalse; + } + } + + DEBUG_PRINTF(_L8("COmxILPortManager::AllPortsDePopulated : [TRUE]")); + return ETrue; + + } + +TBool +COmxILPortManager::AllBuffersAtHome() const + { + + const TInt portCount = iAllPorts.Count(); + for (TInt i=0; iIsTunnelledAndBufferSupplier()) + { + if (!iAllPorts[i]->HasAllBuffersAtHome()) + { + DEBUG_PRINTF(_L8("COmxILPortManager::AllBuffersAtHome : [FALSE]")); + return EFalse; + } + } + } + + DEBUG_PRINTF(_L8("COmxILPortManager::AllBuffersAtHome : [TRUE]")); + return ETrue; + + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportmanager.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,222 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILPORTMANAGER_H +#define OMXILPORTMANAGER_H + +#include + +#include +#include "omxilindexmanager.h" +#include "omxilportmanagerif.h" + +/** + Port Manager Panic category +*/ +_LIT(KOmxILPortManagerPanicCategory, "OmxILPortManager"); + + +// Forward declarations +class COmxILProcessingFunction; +class MOmxILCallbackManagerIf; + +/** + OpenMAX IL Port Manager. + + It keeps and manages a list of the ports configured in the component. The + Port Manager is used by the FSM object (@see COmxILFsm) to communicate with + the ports. + +*/ +NONSHARABLE_CLASS(COmxILPortManager) : public COmxILIndexManager, + public MOmxILPortManagerIf + { + +public: + + static COmxILPortManager* NewL( + COmxILProcessingFunction& aProcessingFunction, + MOmxILCallbackManagerIf& aCallbacks, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer = OMX_TRUE); + + ~COmxILPortManager(); + + TInt AddPort(const COmxILPort* aPort, + OMX_DIRTYPE aDirection); + + OMX_ERRORTYPE GetParameter( + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + OMX_BOOL aPortIsDisabled = OMX_FALSE); + + OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure); + + OMX_ERRORTYPE GetExtensionIndex(OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + OMX_ERRORTYPE PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted, + OMX_BOOL aPortIsDisabled = OMX_FALSE); + + OMX_ERRORTYPE FreeBuffer(OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted, + OMX_BOOL aPortIsDisabled = OMX_FALSE); + + OMX_ERRORTYPE TunnelRequest(OMX_U32 aPortIndex, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup, + OMX_BOOL aPortIsDisabled = OMX_FALSE); + + OMX_ERRORTYPE TunnellingBufferAllocation( + TBool& aComponentPopulationCompleted, + TUint32 aPortIndex = OMX_ALL); + + OMX_ERRORTYPE TunnellingBufferDeallocation( + TBool& aComponentDePopulationCompleted); + + OMX_ERRORTYPE InitiateTunnellingDataFlow( + OMX_U32 aPortIndex = OMX_ALL, + OMX_BOOL aSuppliersAndNonSuppliers = OMX_FALSE); + + OMX_ERRORTYPE BufferIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection, + OMX_BOOL aPortIsDisabled = OMX_FALSE); + + OMX_ERRORTYPE BufferReturnIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection, + TBool& aAllBuffersReturned); + + OMX_ERRORTYPE BufferFlushIndicationFlushCommand( + TUint32 aPortIndex, TBool aEjectBuffers = ETrue); + + OMX_ERRORTYPE BufferFlushIndicationPauseOrExeToIdleCommand( + TBool& aAllBuffersReturnedToSuppliers); + + OMX_ERRORTYPE PortEnableIndication( + TUint32 aPortIndex, + TBool aIndicationIsFinal); + + OMX_ERRORTYPE PortDisableIndication( + TUint32 aPortIndex); + + OMX_ERRORTYPE BufferMarkIndication(OMX_U32 aPortIndex, + OMX_PTR ipMarkData); + +#ifdef _OMXIL_COMMON_IL516C_ON + OMX_ERRORTYPE BufferEjectIndication( + TUint32 aPortIndex); +#endif + + OMX_ERRORTYPE ComponentRoleIndication(TUint aComponentRoleIndex); + + OMX_ERRORTYPE PortSettingsChangeIndication(OMX_U32 aPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient); + + // + // + // + TBool AllPortsPopulated() const; + + TBool AllPortsDePopulated() const; + + TBool AllBuffersAtHome() const; + + +private: + + COmxILPortManager(COmxILProcessingFunction& aProcessingFunction, + MOmxILCallbackManagerIf& aCallbacks); + + // From MOmxILPortManagerIf + void ConstructL(COmxILProcessingFunction& aProcessingFunction, + MOmxILCallbackManagerIf& aCallbacks, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer = OMX_TRUE); + + + void AppendPortL(const COmxILPort* aPort); + void RemoveLastAppendedPort(); + + inline OMX_ERRORTYPE CheckPortIndex(OMX_U32 aPortIndex) const; + + inline OMX_ERRORTYPE GetPortIndexFromOmxStruct( + const TAny*& apComponentParameterStructure, + OMX_U32& aIndex) const; + + inline OMX_ERRORTYPE GetPortIndexFromOmxStruct( + TAny*& apComponentParameterStructure, + OMX_U32& aIndex) const; + + TBool RemoveBuffersFromPfOrCm(COmxILPort* apPort, + OMX_BOOL aRemoveFromPfOnly = OMX_FALSE) const; + +private: + + COmxILProcessingFunction& iProcessingFunction; + MOmxILCallbackManagerIf& iCallbacks; + + RPointerArray iAllPorts; + RArray iTimePorts; // Indicate the corresponding port is OMX_OTHER_FormatTime + + OMX_PORT_PARAM_TYPE iAudioParamInit; + OMX_PORT_PARAM_TYPE iImageParamInit; + OMX_PORT_PARAM_TYPE iVideoParamInit; + OMX_PORT_PARAM_TYPE iOtherParamInit; + OMX_BOOL iImmediateReturnTimeBuffer; + }; + +#include "omxilportmanager.inl" + +#endif // OMXILPORTMANAGER_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportmanager.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportmanager.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,76 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +inline OMX_ERRORTYPE +COmxILPortManager::GetPortIndexFromOmxStruct( + TAny*& apComponentParameterStructure, + OMX_U32& aIndex) const + { + return GetPortIndexFromOmxStruct( + const_cast(apComponentParameterStructure), aIndex); + } + + +inline OMX_ERRORTYPE +COmxILPortManager::GetPortIndexFromOmxStruct( + const TAny*& apComponentParameterStructure, + OMX_U32& aIndex) const + { + OMX_U32* const pPortIndex = + reinterpret_cast( + const_cast(apComponentParameterStructure)) + + sizeof(OMX_U32) / sizeof(OMX_U32) + + sizeof(OMX_VERSIONTYPE) / sizeof(OMX_U32); + + if (OMX_ErrorNone != CheckPortIndex(*pPortIndex)) + { + return OMX_ErrorBadPortIndex; + } + + aIndex = *pPortIndex; + + return OMX_ErrorNone; + + } + + +/** + Checks that a port index is consistent with port information found in the + port's OMX_PORT_PARAM_TYPE structure, i.e., the number of ports in the + component. + + @param aPortIndex The port index to be checked. + + @return OMX_ErrorBadPortIndex in case of error. OMX_ErrorNone otherwise. +*/ +inline OMX_ERRORTYPE +COmxILPortManager::CheckPortIndex(OMX_U32 aPortIndex) const + { + + if (aPortIndex >= iAllPorts.Count()) + { + return OMX_ErrorBadPortIndex; + } + + return OMX_ErrorNone; + + } + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportmanagerif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportmanagerif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,542 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** +@file +@internalComponent +*/ + + +#ifndef OMXILPORTMANAGERIF_H +#define OMXILPORTMANAGERIF_H + +#include + +// Forward declarations +class COmxILProcessingFunction; +class MOmxILCallbackManagerIf; +class COmxILPort; + +/** + OpenMAX IL Port Manager Interface to be used by Port Manager + implementations. + */ +class MOmxILPortManagerIf + { + +public: + + virtual ~MOmxILPortManagerIf(); + + /** + This method is used at component's construction time, i.e., in a factory + method of the final component implementation. The main component object + uses this method to add the component's ports to its port manager + instance. This is the only method that needs to be exported by Port + Manager's implementations. All other Port Managers public methods are + for internal use in the component framework. + + @param aPort The pointer of the port instance to be added. + + @param aDirection The direction of the port being added. + + @return A Symbian error code indicating if the function call was + successful. KErrNone on success, otherwise another of the system-wide + error codes. + */ + virtual TInt AddPort(const COmxILPort* aPort, + OMX_DIRTYPE aDirection) = 0; + + +/** + Port Manager's interface for OpenMAX IL Standard API component + functions. These are for interal use in the component framework and should + not be exported by Port Manager implementations. + + */ + + + /** + Port Manager's version of the GetParameter OpenMAX IL component + API + + @param aParamIndex The index of the OpenMAX IL param structure. + + @param apComponentParameterStructure The pointer to the IL + client-allocated param structure to be filled by the Port Manager + (tipically delegated to the port) + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetParameter( + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const = 0; + + /** + Port Manager's version of the SetParameter OpenMAX IL component + API + + @param aParamIndex The index of the OpenMAX IL param structure. + + @param apComponentParameterStructure The pointer to the IL + client-allocated param structure to be set into the port + + @param aPortIsDisabled This is an indication from the FSM to the Port + Manager of whether the port should or should not be currently disabled + for this OpenMAX IL API to succeed. If aPortIsDisabled is OMX_TRUE and + the port is enabled this API is not allowed in the current state and the + Port Manager must return OMX_ErrorIncorrectStateOperation. Default value + is OMX_FALSE. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + OMX_BOOL aPortIsDisabled = OMX_FALSE) = 0; + + /** + Port Manager's version of the GetConfig OpenMAX IL component + API + + @param aParamIndex The index of the OpenMAX IL config structure. + + @param apComponentParameterStructure The pointer to the config structure + to be filled by the Port Manager (tipically delegated to the port) + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const = 0; + + /** + Port Manager's version of the SetConfig OpenMAX IL component + API + + @param aParamIndex The index of the OpenMAX IL config structure. + + @param apComponentParameterStructure The pointer to the config structure + to be set into the port + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure) = 0; + + /** + Port Manager's version of the GetExtensionIndex OpenMAX IL component + API + + @param aParameterName An OMX_STRING value that shall be less than 128 + characters long including the trailing null byte. The Port Manager will + translate this string into a configuration index. + + @param apIndexType A pointer to the OMX_INDEXTYPE structure that is to + receive the index value. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetExtensionIndex(OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const = 0; + + + /** + Port Manager's version of the AllocateBuffer/UseBuffer OpenMAX IL component + APIs + + @param appBufferHdr A pointer to a pointer of an OMX_BUFFERHEADERTYPE + structure that receives the pointer to the buffer header. + + @param aPortIndex The index of the port that will use the specified + buffer. + + @param apAppPrivate A pointer that refers to an implementation-specific + memory area that is under responsibility of the supplier of the buffer + + @param aSizeBytes The buffer size in bytes + + @param apBuffer A pointer to the memory buffer area to be used + + @param [out] aPortPopulationCompleted This is an indication from the + Port Manager to the FSM of whether the port population has completed or + not. + + @param aPortIsDisabled This is an indication from the FSM to the Port + Manager of whether the port should or should not be currently disabled + for this OpenMAX IL API to succeed. If aPortIsDisabled is OMX_TRUE and + the port is enabled this API is not allowed in the current state and the + Port Manager must return OMX_ErrorIncorrectStateOperation. Default value + is OMX_FALSE. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& aPortPopulationCompleted, + OMX_BOOL aPortIsDisabled = OMX_FALSE) = 0; + + /** + Port Manager's version of the FreeBuffer OpenMAX IL component + API + + @param aPortIndex The index of the port that is using the specified + buffer + + @param apBufferHeader A pointer to an OMX_BUFFERHEADERTYPE structure + + @param aPortDepopulationCompleted This is a g + + @param aPortIsDisabled This is an indication from the FSM to the Port + Manager of whether the port should or should not be currently disabled + for this OpenMAX IL API to succeed. If aPortIsDisabled is OMX_TRUE and + the port is enabled this API is not allowed in the current state and the + Port Manager must return OMX_ErrorIncorrectStateOperation. Default value + is OMX_FALSE. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE FreeBuffer(OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aPortDepopulationCompleted, + OMX_BOOL aPortIsDisabled = OMX_FALSE) = 0; + + /** + Port Manager's version of the EmptyThisBuffer/FillThisBuffer OpenMAX IL + component APIs. This is to be used by the FSM in any state except + substates OMX_StateExecuting to OMX_StateIdle and OMX_StatePause to + OMX_StateIdle, in which case BufferReturnIndication should be used. + + @param apBufferHeader A pointer to an OMX_BUFFERHEADERTYPE structure + + @param aDirection The direction of the port that received the + EmptyThisBuffer/FillThisBuffer call + + @param aPortIsDisabled This is an indication from the FSM to the Port + Manager of whether the port should or should not be currently disabled + for this OpenMAX IL API to succeed. If aPortIsDisabled is OMX_TRUE and + the port is enabled this API is not allowed in the current state and the + Port Manager must return OMX_ErrorIncorrectStateOperation. Default value + is OMX_FALSE. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection, + OMX_BOOL aPortIsDisabled = OMX_FALSE) = 0; + + /** + Port Manager's version of the EmptyThisBuffer/FillThisBuffer OpenMAX IL + component APIs. This is to be used by the FSM when the component is in + substates OMX_StateExecuting to OMX_StateIdle and OMX_StatePause to + OMX_StateIdle. + + @param apBufferHeader A pointer to an OMX_BUFFERHEADERTYPE structure + + @param aDirection The direction of the port that received the + EmptyThisBuffer/FillThisBuffer call + + @param [out] aAllBuffersReturned ETrue if all buffers have already been + returned to ports managed by the Port Manager. This is an indication to + the FSM that the component is ready to be complete the transition to + OMX_StateIdle. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferReturnIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection, + TBool& aAllBuffersReturned) = 0; + + /** + Port Manager's version of the ComponentTunnelRequest OpenMAX IL + component API. This is to be used by the FSM when the component is in + substates OMX_StateExecuting to OMX_StateIdle and OMX_StatePause to + OMX_StateIdle. + + @param aPortIndex The index of the local port that is going to be tunnelled + + @param aTunneledComp The handle of the other component that participates + in the tunnel. When this parameter is NULL, the port specified in aPortIndex + should be configured for non-tunneled communication with the IL client. + + @param aTunneledPort The index of the remote port to be tunnelled with + + @param apTunnelSetup The structure that contains data for the tunneling + negotiation between components. + + @param aPortIsDisabled This is an indication from the FSM to the Port + Manager of whether the port should or should not be currently disabled + for this OpenMAX IL API to succeed. If aPortIsDisabled is OMX_TRUE and + the port is enabled this API is not allowed in the current state and the + Port Manager must return OMX_ErrorIncorrectStateOperation. Default value + is OMX_FALSE. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE TunnelRequest(OMX_U32 aPortIndex, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup, + OMX_BOOL aPortIsDisabled = OMX_FALSE) = 0; + + +/** + Other Port Manager's interface, with no direct mapping to OpenMAX IL + APIs. These are also for interal use in the component framework and should + not be exported by Port Manager implementations. + + */ + + /** + This is and indication from the FSM to the Port Manager that the + component is transitioning from OMX_StateLoaded to OMX_StateIdle and + that the Port Manager shall initiate the allocation of buffers in + tunnelled supplier ports. + + @param [out] aComponentPopulationCompleted This is an indication from + the Port Manager to the FSM of whether the population has completed in + all ports, suppliers and non-suppliers. + + @param aPortIndex The index of the port to start populating. OMX_ALL by default. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE TunnellingBufferAllocation( + TBool& aComponentPopulationCompleted, + TUint32 aPortIndex = OMX_ALL) = 0; + + /** + This is and indication from the FSM to the Port Manager that the + component is transitioning to from OMX_StateExecuting or OMX_StatePause + to OMX_StateIdle and that the Port Manager shall initiate the de-allocation + of buffers in tunnelled supplier ports. + + @param [out] aComponentDePopulationCompleted This is an indication from + the Port Manager to the FSM of whether the de-population has completed in + all ports, suppliers and non-suppliers. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE TunnellingBufferDeallocation( + TBool& aComponentDePopulationCompleted) = 0; + + /** + This is and indication from the FSM to the Port Manager that the + component is transitioning to from OMX_StateIdle to OMX_StatePause or + OMX_StateExecuting and that the Port Manager shall initiate the data + flow in the tunnel (supplier input ports buffers are sent to the Callback Manager + and supplier ouput ports buffers to the Processing Function) + + @param aPortIndex The index of the port that this function applies + to. OMX_ALL if applies to all tunnelled supplier ports in the component. + + @param aSuppliersAndNonSuppliers This overrides the default behaviour of + this function, i.e., initiating the data flow for the supplier + ports. This is an indication to the Port Manager that non-supplier ports + should be included too. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE InitiateTunnellingDataFlow( + OMX_U32 aPortIndex = OMX_ALL, + OMX_BOOL aSuppliersAndNonSuppliers = OMX_FALSE) = 0; + + + /** + This is and indication from the FSM to the Port Manager that the + component has received a command to flush buffers. + + @param aPortIndex The index of the port that this function applies + to. OMX_ALL if applies to all tunnelled supplier ports in the component. + + @param aEjectBuffers This is an indication to the Port Manager of + whether owned buffers should be circulated or not as a consequence of + flushing. The default is ETrue (buffers are ejected, ie sent to the + Processing Function or the Callback Manager as needed). The FSM may + override this default behaviour by using EFalse, e.g. if a flush command + is received when the component is already in OMX_StateIdle state. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferFlushIndicationFlushCommand( + TUint32 aPortIndex, TBool aEjectBuffers = ETrue) = 0; + + /** + This is and indication from the FSM to the Port Manager that the + component needs to flush buffers as a consequence of a transition to + OMX_StateIdle from OMX_StateExecuting or OMX_StatePause. + + @param [out] aAllBuffersReturnedToSuppliers This is an indication from + the Port Manager to the FSM that all buffers have been sent/received + to/from suppliers/non-suppliers and that the component is ready to + complete the transition to OMX_StateIdle. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferFlushIndicationPauseOrExeToIdleCommand( + TBool& aAllBuffersReturnedToSuppliers) = 0; + + /** + This is and indication from the FSM to the Port Manager that it needs to + enable some port. + + @param aPortIndex The index of the port to be enabled. OMX_ALL if all ports. + + @param aIndicationIsFinal When this is ETrue, this is an indication from + the FSM to the Port Manager that the current state of the component does + not require the allocation of buffers (e.g. OMX_StateLoaded) and the + port should complete the transition to enabled and forward the command + complete event to the IL Client. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE PortEnableIndication( + TUint32 aPortIndex, + TBool aIndicationIsFinal) = 0; + + /** + This is and indication from the FSM to the Port Manager that it needs to + disable some port. + + @param aPortIndex The index of the port to be disabled. OMX_ALL if all ports. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE PortDisableIndication( + TUint32 aPortIndex) = 0; + + /** + This is and indication from the FSM to the Port Manager that there is a + buffer mark command to be applied to some port. + + @param aPortIndex The index of the port that receives the buffer mark command. + + @param ipMarkData The pointer to the buffer mark data + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferMarkIndication(OMX_U32 aPortIndex, + OMX_PTR ipMarkData) = 0; + + /** + This is an indication to the Port Manager that there is a request to + change the role of the component and that the component's ports need to + be adjusted to it. + + @param aComponentRoleIndex This is the index from the internal list of + roles supported by the component + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE ComponentRoleIndication( + TUint aComponentRoleIndex) = 0; + + /** + This is an indication to the Port Manager that there is a port that + needs to be reconfigured. + + @param aPortIndex The index of the port to be reconfigured. + + @param aPortSettingsIndex This is an index of the port structure to be + reconfigured + + @param aPortSettings This is a descriptor that contains the information + to be passed to the port that is to be reconfigured + + @param [out] aEventForILClient This is the event returned by the port + after reconfiguration so the caller can forward that to the IL Client. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE PortSettingsChangeIndication( + OMX_U32 aPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient) = 0; + + /** + Returns ETrue is all ports are currently populated + */ + virtual TBool AllPortsPopulated() const = 0; + + /** + Returns ETrue is all ports are currently depopulated + */ + virtual TBool AllPortsDePopulated() const = 0; + + /** + Returns ETrue is all buffer headers are currently with the Port Manager + */ + virtual TBool AllBuffersAtHome() const = 0; + + +private: + + /** + Virtual constructor. This is mostly for reference. Port Managers should + follow the below contruction interface. + + @param aProcessingFunction The component's processing function + + @param aCallbacks The component's callback manager + + @param aOmxVersion The IL Spec version in use + + @param aNumberOfAudioPorts Number of audio ports in the component + + @param aStartAudioPortNumber The start index for audio ports + + @param aNumberOfImagePorts Number of image ports in the component + + @param aStartImagePortNumber The start index for image ports + + @param aNumberOfVideoPorts Number of video ports in the component + + @param aStartVideoPortNumber The start index for video ports + + @param aNumberOfOtherPorts Number of other ports in the component + + @param aStartOtherPortNumber The start index for other ports + + @param aImmediateReturnTimeBuffer This only applies to components with a + clock client port. Indicates whether the Port Manager must forward an + arriving clock buffer to the Callback Manager (ETrue) or to the + Processing Function (EFalse) . If the clock buffer is to be forwarded to + the Processing Function, this will happen using the BufferIndication + function of the component's PF. Otherwise, PF's MediaTimeIndication is + used instead. + */ + virtual void ConstructL(COmxILProcessingFunction& aProcessingFunction, + MOmxILCallbackManagerIf& aCallbacks, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer = OMX_TRUE) = 0; + + }; + +#include "omxilportmanagerif.inl" + +#endif // OMXILPORTMANAGERIF_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilportmanagerif.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilportmanagerif.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,24 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** +@file +@internalComponent +*/ + +inline MOmxILPortManagerIf::~MOmxILPortManagerIf() + { + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilprocessingfunction.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilprocessingfunction.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,72 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include + + +EXPORT_C +COmxILProcessingFunction::COmxILProcessingFunction( + MOmxILCallbackNotificationIf& aCallbacks) + : + iCallbacks(aCallbacks) + { + DEBUG_PRINTF(_L8("COmxILProcessingFunction::COmxILProcessingFunction")); + + } + +EXPORT_C +COmxILProcessingFunction::~COmxILProcessingFunction() + { + DEBUG_PRINTF(_L8("COmxILProcessingFunction::~COmxILProcessingFunction")); + + } + +/** + This is an indication from the framework that the IL Client wants to set the + default role that a standard component is assuming. Therefore, the role + defaults need to be reloaded into all ports and the Processing + Function. This method is the indication to the processing function that the + role defaults have been set into the component ports. A component not + claiming support of any of the standard component roles does not need to + override this method. + + @param aComponentRoleIndex An integer associated to the new component role. + + @return OMX_ERRORTYPE + */ +EXPORT_C OMX_ERRORTYPE +COmxILProcessingFunction::ComponentRoleIndication(TUint /* aComponentRoleIndex */) + { + return OMX_ErrorNotImplemented; + } + +EXPORT_C +OMX_ERRORTYPE COmxILProcessingFunction::MediaTimeIndication(const OMX_TIME_MEDIATIMETYPE& ) + { + return OMX_ErrorNotImplemented; + } + +EXPORT_C +TInt COmxILProcessingFunction::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return CBase::Extension_(aExtensionId, a0, a1); + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilspecversion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilspecversion.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,81 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include + +const TUint8 TOmxILSpecVersion::KSpecVersionMajor; +const TUint8 TOmxILSpecVersion::KSpecVersionMinor; +const TUint8 TOmxILSpecVersion::KSpecVersionRevision; +const TUint8 TOmxILSpecVersion::KSpecVersionStep; + +EXPORT_C +TOmxILVersion::TOmxILVersion(TUint8 aMajor, + TUint8 aMinor, + TUint8 aRev, + TUint8 aStep) + { + iSpecVersion.s.nVersionMajor = aMajor; + iSpecVersion.s.nVersionMinor = aMinor; + iSpecVersion.s.nRevision = aRev; + iSpecVersion.s.nStep = aStep; + } + +EXPORT_C +TOmxILVersion::operator OMX_VERSIONTYPE&() + { + return iSpecVersion; + } + +#ifdef _OMXIL_COMMON_SPEC_VERSION_CHECKS_ON +TBool +TOmxILVersion::operator!=( + const OMX_VERSIONTYPE& aVer) const + { + return !operator==(aVer); + } + +TBool +TOmxILVersion::operator==( + const OMX_VERSIONTYPE& aVer) const + { + if (iSpecVersion.s.nVersionMajor == aVer.s.nVersionMajor && + iSpecVersion.s.nVersionMinor == aVer.s.nVersionMinor && + iSpecVersion.s.nRevision == aVer.s.nRevision && + iSpecVersion.s.nStep == aVer.s.nStep) + { + return ETrue; + } + return EFalse; + } +#endif + +EXPORT_C +TOmxILSpecVersion::TOmxILSpecVersion() + : + TOmxILVersion(KSpecVersionMajor, + KSpecVersionMinor, + KSpecVersionRevision, + KSpecVersionStep) + { + } + + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilstate.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1998 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include "log.h" +#include "omxilstate.h" +#include "omxilfsm.h" +#include +#include "omxilcommand.h" +#include +#include "omxilcallbackmanager.h" + + +OMX_ERRORTYPE +COmxILFsm::COmxILState::GetParameter( + const COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILState::GetParameter")); + + // This API can be used independently of the current state of the + // component. Let's try first the Port Manager to check if the index is + // known there + OMX_ERRORTYPE retValue = + aFsm.iPortManager.GetParameter(aParamIndex, + apComponentParameterStructure); + + if (OMX_ErrorUnsupportedIndex == retValue) + { + // Otherwise, try Config Manager... + retValue = aFsm.iConfigManager.GetParameter( + aParamIndex, + apComponentParameterStructure); + } + + return retValue; + + } + +// This SetParameter version must be used in the following states: +// - OMX_StateIdle, +// - OMX_StateExecuting, +// - OMX_StatePaused, and +// +OMX_ERRORTYPE +COmxILFsm::COmxILState::SetParameter( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILState::SetParameter")); + + OMX_ERRORTYPE retValue = + aFsm.iPortManager.SetParameter( + aParamIndex, + apComponentParameterStructure, + OMX_TRUE // Port must be disabled + ); + + if (OMX_ErrorUnsupportedIndex == retValue) + { + // Try Config Manager now... + retValue = aFsm.iConfigManager.SetParameter( + aParamIndex, + apComponentParameterStructure, + OMX_FALSE // run-time + ); + } + + return retValue; + + } + +// This SetParameter version must be used in the following states: +// - OMX_StateLoaded and derived states, +// - OMX_StateWaitForResources +// +OMX_ERRORTYPE +COmxILFsm::COmxILState::SetParameterV2( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILState::SetParameterV2")); + + OMX_ERRORTYPE retValue = + aFsm.iPortManager.SetParameter(aParamIndex, + apComponentParameterStructure); + + if (OMX_ErrorUnsupportedIndex == retValue) + { + // Try Config Manager now... + retValue = aFsm.iConfigManager.SetParameter( + aParamIndex, + apComponentParameterStructure); + } + + return retValue; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILState::GetConfig( + const COmxILFsm& aFsm, + OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILState::GetConfig")); + + OMX_ERRORTYPE retValue = + aFsm.iPortManager.GetConfig(aConfigIndex, + apComponentConfigStructure); + + if (OMX_ErrorUnsupportedIndex == retValue) + { + // Try Config Manager now... + retValue = aFsm.iConfigManager.GetConfig( + aConfigIndex, + apComponentConfigStructure); + } + + return retValue; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILState::SetConfig(COmxILFsm& aFsm, + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure) + { + DEBUG_PRINTF(_L8("COmxILState::SetConfig")); + + OMX_ERRORTYPE retValue = + aFsm.iPortManager.SetConfig(aConfigIndex, + apComponentConfigStructure); + + if (OMX_ErrorUnsupportedIndex == retValue) + { + // Try Config Manager now... + retValue = aFsm.iConfigManager.SetConfig( + aConfigIndex, + apComponentConfigStructure); + } + + return retValue; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILState::GetExtensionIndex(const COmxILFsm& aFsm, + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const + { + DEBUG_PRINTF(_L8("COmxILState::GetExtensionIndex")); + + OMX_ERRORTYPE retValue = + aFsm.iPortManager.GetExtensionIndex(aParameterName, + apIndexType); + + if (OMX_ErrorUnsupportedIndex == retValue) + { + // Try Config Manager now... + retValue = aFsm.iConfigManager.GetExtensionIndex( + aParameterName, + apIndexType); + } + + return retValue; + + } + +// +// +// + +OMX_ERRORTYPE +COmxILFsm::COmxILState::CommandFlush(COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILState::CommandFlush")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandFlush, + User::Panic(KOmxILFsmPanicCategory, 1)); + + return aFsm.iPortManager.BufferFlushIndicationFlushCommand( + aCommand.iParam1); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILState::CommandPortDisable(COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILState::CommandPortDisable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortDisable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // First, flush all buffers in the port(s) that is(are) to be disabled. + return aFsm.iPortManager.PortDisableIndication( + aCommand.iParam1); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILState::CommandPortEnable(COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILState::CommandPortEnable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + TBool indicationIsFinal = EFalse; + return aFsm.iPortManager.PortEnableIndication( + aCommand.iParam1, + indicationIsFinal); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILState::CommandMarkBuffer(COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILState::CommandMarkBuffer")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandMarkBuffer, + User::Panic(KOmxILFsmPanicCategory, 1)); + + if (!aCommand.ipCommandData) + { + return OMX_ErrorBadParameter; + } + + return aFsm.iPortManager.BufferMarkIndication(aCommand.iParam1, + aCommand.ipCommandData); + + } + +// +// COmxILStateInvalid +// +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::GetParameter( + const COmxILFsm& /*aFsm*/, + OMX_INDEXTYPE /*aParamIndex*/, + TAny* /*apComponentParameterStructure*/) const + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::GetParameter")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::SetParameter( + COmxILFsm& /*aFsm*/, + OMX_INDEXTYPE /*aParamIndex*/, + const TAny* /*apComponentParameterStructure*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::SetParameter")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::GetConfig( + const COmxILFsm& /*aFsm*/, + OMX_INDEXTYPE /*aConfigIndex*/, + TAny* /*apComponentConfigStructure*/) const + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::GetConfig")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::SetConfig( + COmxILFsm& /*aFsm*/, + OMX_INDEXTYPE /*aConfigIndex*/, + const TAny* /*apComponentConfigStructure*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::SetConfig")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::GetExtensionIndex( + const COmxILFsm& /*aFsm*/, + OMX_STRING /*aParameterName*/, + OMX_INDEXTYPE* /*apIndexType*/) const + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::GetExtensionIndex")); + return OMX_ErrorInvalidState; + } + +OMX_STATETYPE +COmxILFsm::COmxILStateInvalid::GetState() const + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::GetState")); + return OMX_StateInvalid; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::ComponentTunnelRequest( + COmxILFsm& /*aFsm*/, + OMX_U32 /*aPort*/, + OMX_HANDLETYPE /*aTunneledComp*/, + OMX_U32 /*aTunneledPort*/, + OMX_TUNNELSETUPTYPE* /*apTunnelSetup*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::ComponentTunnelRequest")); + + return OMX_ErrorInvalidState; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::PopulateBuffer( + COmxILFsm& /*aFsm*/, + OMX_BUFFERHEADERTYPE** /*appBufferHdr*/, + OMX_U32 /*aPortIndex*/, + OMX_PTR /*apAppPrivate*/, + OMX_U32 /*aSizeBytes*/, + OMX_U8* /*apBuffer*/, + TBool& /*portPopulationCompleted*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::PopulateBuffer")); + + return OMX_ErrorInvalidState; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::FreeBuffer")); + + return COmxILState::FreeBufferV2( + aFsm, + aPortIndex, + apBuffer, + aPortDepopulationCompleted); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::EmptyThisBuffer( + COmxILFsm& /*aFsm*/, + OMX_BUFFERHEADERTYPE* /*apBuffer*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::EmptyThisBuffer")); + + return OMX_ErrorInvalidState; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::FillThisBuffer( + COmxILFsm& /*aFsm*/, + OMX_BUFFERHEADERTYPE* /*apBuffer*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::FillThisBuffer")); + + return OMX_ErrorInvalidState; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::CommandStateSet( + COmxILFsm& /*aFsm*/, + const TOmxILCommand& /*aCommand*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandStateSet")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::CommandFlush( + COmxILFsm& /*aFsm*/, + const TOmxILCommand& /*aCommand*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandFlush")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::CommandPortEnable( + COmxILFsm& /*aFsm*/, + const TOmxILCommand& /*aCommand*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandPortEnable")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::CommandPortDisable( + COmxILFsm& /*aFsm*/, + const TOmxILCommand& /*aCommand*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandPortDisable")); + return OMX_ErrorInvalidState; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateInvalid::CommandMarkBuffer( + COmxILFsm& /*aFsm*/, + const TOmxILCommand& /*aCommand*/) + { + DEBUG_PRINTF(_L8("COmxILStateInvalid::CommandMarkBuffer")); + return OMX_ErrorInvalidState; + } + +// +// COmxILStateLoaded +// +OMX_STATETYPE +COmxILFsm::COmxILStateLoaded::GetState() const + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::GetState")); + return OMX_StateLoaded; + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::SetParameter( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::SetParameter")); + + return COmxILState::SetParameterV2(aFsm, + aParamIndex, + apComponentParameterStructure); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::PopulateBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::PopulateBuffer")); + + +#ifdef _OMXIL_COMMON_IL516C_ON + + if (!apBuffer) + { + // ... AllocateBuffer + // + // At this point, the command requesting the transition from Loaded to + // Idle has not been received yet.. (see + // COmxILStateLoadedToIdle). Therefore, this can only be successful if + // the port is disabled + return COmxILState::PopulateBuffer(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + } + else + { + //... UseBuffer... + OMX_ERRORTYPE omxError = + COmxILState::PopulateBufferV2(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + if (apBuffer && OMX_ErrorNone == omxError) + { + DEBUG_PRINTF2(_L8("COmxILStateLoaded::PopulateBuffer : PORT [%u] : Buffer population occurring in OMX_StateLoaded"), aPortIndex); + } + return omxError; + } +#else + + // At this point, the command requesting the transition from Loaded to Idle + // has not been received yet.. (see COmxILStateLoadedToIdle). Therefore, + // this can only be successful if the port is disabled + return COmxILState::PopulateBuffer(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); +#endif + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::FreeBuffer")); + + return COmxILState::FreeBuffer(aFsm, + aPortIndex, + apBuffer, + aPortDepopulationCompleted); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::EmptyThisBuffer")); + +#ifdef _OMXIL_COMMON_IL516C_ON + return COmxILState::EmptyThisBufferV2(aFsm, + apBuffer); +#endif + + return COmxILState::EmptyThisBuffer(aFsm, + apBuffer); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::FillThisBuffer")); + +#ifdef _OMXIL_COMMON_IL516C_ON + return COmxILState::FillThisBufferV2(aFsm, + apBuffer); +#endif + + return COmxILState::FillThisBuffer(aFsm, + apBuffer); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::ComponentTunnelRequest( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::ComponentTunnelRequest")); + + return COmxILState::ComponentTunnelRequestV2(aFsm, + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // The only two transitions allowed are : + // - OMX_StateIdle and + // - OMX_StateWaitForResources. + TStateIndex nextState = EStateMax; + switch(aCommand.iParam1) + { + case OMX_StateIdle: + { + nextState = ESubStateLoadedToIdle; + } + break; + case OMX_StateWaitForResources: + { + nextState = EStateWaitForResources; + } + break; + case OMX_StateLoaded: + { + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value.. + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + + }; + + // Initial checks OK. The component is commanded to make a transition to + // OMX_StateIdle or OMX_StateWaitForResources. + OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (ESubStateLoadedToIdle == nextState) + { + // Lets tell port manager in case there are buffer supplier tunnelled ports + TBool componentPopulationCompleted = EFalse; + omxRetValue = + aFsm.iPortManager.TunnellingBufferAllocation( + componentPopulationCompleted); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (componentPopulationCompleted) + { + // Complete here the transition to OMX_StateIdle + omxRetValue = aFsm.FsmTransition(EStateIdle); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that port population has completed + // sucessfully + omxRetValue = + aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateIdle); + } + + } + + } + else + { + // Notify the IL client that the transition to + // OMX_StateWaitForResources has completed sucessfully + omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateWaitForResources); + + } + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoaded::CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateLoaded::CommandPortEnable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + TBool indicationIsFinal = ETrue; + return aFsm.iPortManager.PortEnableIndication( + aCommand.iParam1, + indicationIsFinal); + + } + + +// +// COmxILStateLoadedToIdle +// +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoadedToIdle::PopulateBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::PopulateBuffer")); + + OMX_ERRORTYPE omxError = + COmxILState::PopulateBufferV2(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + + if (apBuffer && OMX_ErrorNone == omxError) + { + DEBUG_PRINTF2(_L8("COmxILStateLoadedToIdle::PopulateBuffer : PORT [%u] : Buffer population occurring in state LoadedToIdle"), aPortIndex); + } + + return omxError; + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoadedToIdle::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + switch(aCommand.iParam1) + { + case OMX_StateWaitForResources: + { + // Not implemented for now... + return OMX_ErrorNotImplemented; + } + case OMX_StateLoaded: + { + // Here, return "same state" as the transition to OMX_StateLoaded has + // not completed yet. + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + }; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateLoadedToIdle::CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateLoadedToIdle::CommandPortEnable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + TBool indicationIsFinal = EFalse; + OMX_ERRORTYPE omxRetValue = + aFsm.iPortManager.PortEnableIndication( + aCommand.iParam1, + indicationIsFinal); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + // Lets tell port manager in case the port being enabled is a tunnel + // supplier... + TBool componentPopulationCompleted = EFalse; + omxRetValue = + aFsm.iPortManager.TunnellingBufferAllocation( + componentPopulationCompleted, aCommand.iParam1); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + // Let's do this check here although this situation is going to be very + // unlikely... + if (componentPopulationCompleted) + { + // Complete here the transition to OMX_StateIdle + omxRetValue = aFsm.FsmTransition(EStateIdle); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that port population has completed sucessfully + aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateIdle); + } + + } + + return omxRetValue; + + } + + +// +// COmxILStateWaitForResources +// +OMX_STATETYPE +COmxILFsm::COmxILStateWaitForResources::GetState() const + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::GetState")); + return OMX_StateWaitForResources; + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::SetParameter( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::SetParameter")); + + return COmxILState::SetParameterV2(aFsm, + aParamIndex, + apComponentParameterStructure); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::PopulateBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::PopulateBuffer")); + + // NOTE that according to the spec, PopulateBuffer could be used here even + // if the port is enabled. However, for now the transition from + // OMX_StateWaitForResouces -> OMX_StateIdle is not supported, therefore + // buffer population is only allowed for disabled ports. This should be + // changed once Resource Management functionality is available and this + // state is revisited. + return COmxILState::PopulateBuffer(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::FreeBuffer( + COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::FreeBuffer")); + + return COmxILState::FreeBuffer(aFsm, + aPortIndex, + apBuffer, + aPortDepopulationCompleted); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::EmptyThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::EmptyThisBuffer")); + +#ifdef _OMXIL_COMMON_IL516C_ON + return COmxILState::EmptyThisBufferV2(aFsm, + apBuffer); +#endif + + return COmxILState::EmptyThisBuffer(aFsm, + apBuffer); + + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::FillThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::FillThisBuffer")); + +#ifdef _OMXIL_COMMON_IL516C_ON + return COmxILState::FillThisBufferV2(aFsm, + apBuffer); +#endif + + return COmxILState::FillThisBuffer(aFsm, + apBuffer); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::ComponentTunnelRequest( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::ComponentTunnelRequest")); + + return COmxILState::ComponentTunnelRequest(aFsm, + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // Transition to OMX_StateIdle not implemented for now... + TStateIndex nextState = EStateMax; + switch(aCommand.iParam1) + { + case OMX_StateLoaded: + { + nextState = EStateLoaded; + } + break; + case OMX_StateWaitForResources: + { + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + }; + + // Initial checks OK. The component is commanded to make a transition to + // OMX_StateLoaded + OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that the transition to + // OMX_StateLoaded has completed sucessfully + omxRetValue = + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateLoaded); + } + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateWaitForResources::CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateWaitForResources::CommandPortEnable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // NOTE: Here, we only care about the port enabled flag. Transition from + // OMX_StateWaitForResources to OMX_StateIdle is not implemented at this + // stage until a Resource Manager is available. Whenever a Resource Manager + // becomes available, a COmxILStateWaitForResourcesToIdle substate should + // be implemented to handle the allocation of buffers mandated by the + // standard when a port is enabled in this transition. + TBool indicationIsFinal = ETrue; + return aFsm.iPortManager.PortEnableIndication( + aCommand.iParam1, + indicationIsFinal); + + } + + +// +// COmxILStateIdle +// +OMX_STATETYPE +COmxILFsm::COmxILStateIdle::GetState() const + { + DEBUG_PRINTF(_L8("COmxILStateIdle::GetState")); + return OMX_StateIdle; + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::SetParameter( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::SetParameter")); + + return COmxILState::SetParameter(aFsm, + aParamIndex, + apComponentParameterStructure); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::PopulateBuffer")); + + // At this point, no buffer population can take place unless the port is disabled + return COmxILState::PopulateBuffer(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::FreeBuffer")); + + // At this point, the command requesting the transition from Idle to Loaded + // has not been received yet.. (see COmxILStateIdleToLoaded). Therefore, + // this can only be successful if the port is disabled + return COmxILState::FreeBuffer(aFsm, + aPortIndex, + apBuffer, + aPortDepopulationCompleted); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::EmptyThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::EmptyThisBuffer")); + + return COmxILState::EmptyThisBufferV2(aFsm, + apBuffer); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::FillThisBuffer")); + + return COmxILState::FillThisBufferV2(aFsm, + apBuffer); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::ComponentTunnelRequest( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::ComponentTunnelRequest")); + + return COmxILState::ComponentTunnelRequest(aFsm, + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + TStateIndex nextState = EStateInvalid; + switch(aCommand.iParam1) + { + case OMX_StateLoaded: + { + nextState = ESubStateIdleToLoaded; + } + break; + case OMX_StateExecuting: + { + nextState = EStateExecuting; + } + break; + case OMX_StatePause: + { + nextState = EStatePause; + } + break; + case OMX_StateIdle: + { + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + }; + + // Initial command checks OK + + // Commit transition to the valid state + OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (ESubStateIdleToLoaded == nextState) + { + // Lets tell port manager in case there are tunnelled ports... + TBool componentDepopulationCompleted = EFalse; + omxRetValue = + aFsm.iPortManager.TunnellingBufferDeallocation( + componentDepopulationCompleted); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (componentDepopulationCompleted) + { + // Complete here the transition to OMX_StateLoaded + omxRetValue = aFsm.FsmTransition(EStateLoaded); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that port population has completed sucessfully + omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateLoaded); + } + } + + } + else + { + // Notify the IL client that the transition to the valid state + // OMX_StatePause or OMX_StateExecuting has completed sucessfully + omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification( + static_cast(aCommand.iParam1)); + + if (OMX_ErrorNone == omxRetValue) + { + // Fire up the tunnelled buffer exchange, if any tunnelled ports are + // found in the component... + omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow(); + } + + } + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::CommandFlush(COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::CommandFlush")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandFlush, + User::Panic(KOmxILFsmPanicCategory, 1)); + + return aFsm.iPortManager.BufferFlushIndicationFlushCommand( + aCommand.iParam1, OMX_FALSE); // Do not eject buffers + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdle::CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateIdle::CommandPortEnable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // In this state, the port allocation has finished for enabled + // ports. However, a port is being enabled here. The port being enabled + // must populate (if tunnel supplier) or be populated (if non-tunnel + // supplier or IL Client communication) + TBool indicationIsFinal = EFalse; + OMX_ERRORTYPE omxRetValue = + aFsm.iPortManager.PortEnableIndication( + aCommand.iParam1, + indicationIsFinal); + + if (OMX_ErrorNone == omxRetValue) + { + // From section 3.2.2.6, "If the IL client enables a port while the + // component is in any state other than OMX_StateLoaded or + // OMX_WaitForResources, then that port shall allocate its buffers via + // the same call sequence used on a transition from OMX_StateLoaded to + // OMX_StateIdle." + + // Lets tell port manager in case the port being enabled is a tunnel + // supplier... + TBool componentPopulationCompleted = EFalse; + omxRetValue = + aFsm.iPortManager.TunnellingBufferAllocation( + componentPopulationCompleted, aCommand.iParam1); + } + + return omxRetValue; + + } + + +// +// COmxILStateIdleToLoaded +// +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdleToLoaded::FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateIdleToLoaded::FreeBuffer")); + + return COmxILState::FreeBufferV2(aFsm, + aPortIndex, + apBuffer, + aPortDepopulationCompleted); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateIdleToLoaded::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateIdleToLoaded::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + switch (aCommand.iParam1) + { + case OMX_StateIdle: + { + // Here, return "same state" as the transition to OMX_StateLoaded has + // not completed yet. + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + __ASSERT_ALWAYS(0, User::Panic(KOmxILFsmPanicCategory, 1)); + } + }; + + return OMX_ErrorNone; + + } + + +// +// COmxILStateExecuting +// +OMX_STATETYPE +COmxILFsm::COmxILStateExecuting::GetState() const + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::GetState")); + return OMX_StateExecuting; + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::SetParameter(COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::SetParameter")); + + return COmxILState::SetParameter(aFsm, + aParamIndex, + apComponentParameterStructure); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::PopulateBuffer")); + + return COmxILState::PopulateBuffer(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::FreeBuffer")); + + return COmxILState::FreeBuffer(aFsm, + aPortIndex, + apBuffer, + aPortDepopulationCompleted); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::EmptyThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::EmptyThisBuffer")); + + return COmxILState::EmptyThisBufferV2(aFsm, + apBuffer); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::FillThisBuffer")); + + return COmxILState::FillThisBufferV2(aFsm, + apBuffer); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::ComponentTunnelRequest( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::ComponentTunnelRequest")); + + return COmxILState::ComponentTunnelRequest(aFsm, + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + TStateIndex nextState = EStateMax; + switch(aCommand.iParam1) + { + case OMX_StateIdle: + { + nextState = ESubStateExecutingToIdle; + } + break; + case OMX_StatePause: + { + nextState = EStatePause; + } + break; + case OMX_StateExecuting: + { + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + }; + + + // Initial checks OK. The component is commanded to make a transition to + // ESubStateExecutingToIdle substate or OMX_StatePause. + OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (ESubStateExecutingToIdle == nextState) + { + // Lets tell port manager since at this point it is mandated that all + // buffers must be returned to their suppliers (IL Client and/or + // tunnelled components). + TBool allBuffersReturnedToSuppliers = EFalse; + omxRetValue = + aFsm.iPortManager.BufferFlushIndicationPauseOrExeToIdleCommand( + allBuffersReturnedToSuppliers); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (allBuffersReturnedToSuppliers) + { + // Complete here the transition to OMX_StateIdle + omxRetValue = aFsm.FsmTransition(EStateIdle); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that port population has completed sucessfully + omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateIdle); + } + } + + } + else + { + // Notify the IL client that the transition to OMX_StatePause has + // completed sucessfully + omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StatePause); + + } + + return omxRetValue; + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecuting::CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateExecuting::CommandPortEnable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // In this state, the port allocation has finished for enabled + // ports. However, a port is being enabled here. The port being enabled + // must populate (if tunnel supplier) or be populated (if non-tunnel + // supplier or IL Client communication) + TBool indicationIsFinal = EFalse; + OMX_ERRORTYPE omxRetValue = + aFsm.iPortManager.PortEnableIndication( + aCommand.iParam1, + indicationIsFinal); + + if (OMX_ErrorNone == omxRetValue) + { + // From section 3.2.2.6, "If the IL client enables a port while the + // component is in any state other than OMX_StateLoaded or + // OMX_WaitForResources, then that port shall allocate its buffers via + // the same call sequence used on a transition from OMX_StateLoaded to + // OMX_StateIdle. If the IL client enables while the component is in + // the OMX_Executing state, then that port shall begin transferring + // buffers" + + // Lets tell port manager in case the port being enabled is a tunnel + // supplier... + TBool componentPopulationCompleted = EFalse; + omxRetValue = + aFsm.iPortManager.TunnellingBufferAllocation( + componentPopulationCompleted, aCommand.iParam1); + + // No need to use here componentPopulationCompleted. A port is being + // enabled in OMX_StateExecuting. If the port is a supplier, after + // being re-enabled it should start the buffer allocation phase, + // regardless of the population state of other ports in the component. + if (OMX_ErrorNone == omxRetValue) + { + // Fire up the tunnelled buffer exchange in the enabled port... + omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow( + aCommand.iParam1); + } + } + + return omxRetValue; + + } + + +// +// MOmxILPauseOrExecutingToIdle +// +OMX_ERRORTYPE +COmxILFsm::MOmxILPauseOrExecutingToIdle::ReturnThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer, + OMX_DIRTYPE aDirection) + { + DEBUG_PRINTF(_L8("MOmxILPauseOrExecutingToIdle::ReturnThisBuffer")); + + TBool allBuffersReturned = EFalse; + OMX_ERRORTYPE omxRetValue = + aFsm.iPortManager.BufferReturnIndication( + apBuffer, + aDirection, + allBuffersReturned + ); + + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (allBuffersReturned && + aFsm.iPortManager.AllBuffersAtHome()) + { + // Complete here the transition to OMX_StateIdle + omxRetValue = aFsm.FsmTransition(EStateIdle); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that transition to Idle has completed + // sucessfully + omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateIdle); + } + } + + return omxRetValue; + + } + + + +// +// COmxILStateExecutingToIdle +// +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecutingToIdle::EmptyThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::EmptyThisBuffer")); + + return ReturnThisBuffer(aFsm, + apBuffer, + OMX_DirInput); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecutingToIdle::FillThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::FillThisBuffer")); + + return ReturnThisBuffer(aFsm, + apBuffer, + OMX_DirOutput); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStateExecutingToIdle::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStateExecutingToIdle::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + switch(aCommand.iParam1) + { + case OMX_StateExecuting: + { + // Here, return "same state" as the transition to OMX_StateIdle has + // not completed yet. + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + }; + + } + + +// +// COmxILStatePause +// +OMX_STATETYPE +COmxILFsm::COmxILStatePause::GetState() const + { + DEBUG_PRINTF(_L8("COmxILStatePause::GetState")); + return OMX_StatePause; + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::SetParameter( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) + { + DEBUG_PRINTF(_L8("COmxILStatePause::SetParameter")); + + return COmxILState::SetParameter(aFsm, + aParamIndex, + apComponentParameterStructure); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::PopulateBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStatePause::PopulateBuffer")); + + return COmxILState::PopulateBuffer(aFsm, + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILStatePause::FreeBuffer")); + + return COmxILState::FreeBuffer(aFsm, + aPortIndex, + apBuffer, + aPortDepopulationCompleted); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::EmptyThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStatePause::EmptyThisBuffer")); + + return COmxILState::EmptyThisBufferV2(aFsm, + apBuffer); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStatePause::FillThisBuffer")); + + return COmxILState::FillThisBufferV2(aFsm, + apBuffer); + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::ComponentTunnelRequest( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILStatePause::ComponentTunnelRequest")); + + return COmxILState::ComponentTunnelRequest(aFsm, + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStatePause::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + TStateIndex nextState = EStateInvalid; + switch(aCommand.iParam1) + { + case OMX_StateIdle: + { + nextState = ESubStatePauseToIdle; + } + break; + case OMX_StateExecuting: + { + nextState = EStateExecuting; + } + break; + case OMX_StatePause: + { + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + }; + + // Initial command checks OK. The component is commanded to make a + // transition to ESubStatePauseToIdle substate or OMX_StateExecuting. + // Commit transition to the valid state + OMX_ERRORTYPE omxRetValue = aFsm.FsmTransition(nextState); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (ESubStatePauseToIdle == nextState) + { + // Lets tell port manager since at this point it is mandated that all + // buffers must be returned to their suppliers (IL Client and/or + // tunnelled components). + TBool allBuffersReturnedToSuppliers = EFalse; + omxRetValue = + aFsm.iPortManager.BufferFlushIndicationPauseOrExeToIdleCommand( + allBuffersReturnedToSuppliers); + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + if (allBuffersReturnedToSuppliers) + { + // Complete here the transition to OMX_StateIdle + omxRetValue = aFsm.FsmTransition(EStateIdle); + if (OMX_ErrorNone == omxRetValue) + { + // Notify the IL client that port population has completed sucessfully + aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateIdle); + } + } + + } + else + { + // Notify the IL client that the transition to OMX_StateExecuting has + // completed sucessfully + omxRetValue = aFsm.iCallbacks.TransitionCompleteNotification( + OMX_StateExecuting); + + if (OMX_ErrorNone == omxRetValue) + { + // Fire up the tunnelled buffer exchange, if any tunnelled ports are + // found in the component... + omxRetValue = aFsm.iPortManager.InitiateTunnellingDataFlow(); + } + + } + + return omxRetValue; + + } + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePause::CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStatePause::CommandPortEnable")); + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandPortEnable, + User::Panic(KOmxILFsmPanicCategory, 1)); + + // In this state, the port allocation has finished for enabled + // ports. However, a port is being enabled here. The port being enabled + // must populate (if tunnel supplier) or be populated (if non-tunnel + // supplier or IL Client communication) + TBool indicationIsFinal = EFalse; + OMX_ERRORTYPE omxRetValue = aFsm.iPortManager.PortEnableIndication( + aCommand.iParam1, + indicationIsFinal); + + if (OMX_ErrorNone == omxRetValue) + { + // From section 3.2.2.6, "If the IL client enables a port while the + // component is in any state other than OMX_StateLoaded or + // OMX_WaitForResources, then that port shall allocate its buffers via + // the same call sequence used on a transition from OMX_StateLoaded to + // OMX_StateIdle." + + // Lets tell port manager in case the port being enabled is a tunnel + // supplier... + TBool componentPopulationCompleted = EFalse; + omxRetValue = + aFsm.iPortManager.TunnellingBufferAllocation( + componentPopulationCompleted, aCommand.iParam1); + + } + + return omxRetValue; + + } + + +// +// COmxILStatePauseToIdle +// +OMX_ERRORTYPE +COmxILFsm::COmxILStatePauseToIdle::EmptyThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::EmptyThisBuffer")); + + return ReturnThisBuffer(aFsm, + apBuffer, + OMX_DirInput); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePauseToIdle::FillThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::FillThisBuffer")); + + return ReturnThisBuffer(aFsm, + apBuffer, + OMX_DirOutput); + + } + + +OMX_ERRORTYPE +COmxILFsm::COmxILStatePauseToIdle::CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) + { + DEBUG_PRINTF(_L8("COmxILStatePauseToIdle::CommandStateSet")); + + __ASSERT_DEBUG(aCommand.iCommandType == OMX_CommandStateSet, + User::Panic(KOmxILFsmPanicCategory, 1)); + + switch(aCommand.iParam1) + { + case OMX_StatePause: + { + // Here, return "same state" as the transition to OMX_StateIdle has not + // completed yet. + return OMX_ErrorSameState; + } + case OMX_StateInvalid: + { + // Notify the IL client... ignore the ret value... + aFsm.iCallbacks.TransitionCompleteNotification(OMX_StateInvalid); + // Invalidate component + return OMX_ErrorInvalidState; + } + default: + { + return OMX_ErrorIncorrectStateTransition; + } + }; + + } + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilstate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilstate.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,748 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILSTATE_H +#define OMXILSTATE_H + +#include +#include +#include +#include "omxilfsm.h" +#include "omxilportmanagerif.h" + +// Forward declarations +class TOmxILCommand; + +/** + Base class for concrete OpenMAX IL state objects (State Pattern) +*/ +class COmxILFsm::COmxILState : public CBase + { + +public: + + // + // Events, a.k.a. OpenMAX IL API calls + // + + virtual OMX_ERRORTYPE GetParameter( + const COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + /** + State-specific version of the OpenMAX IL SetParameter API. + + @param [in] aFsm The main FSM context class that delegates the events to the + state classes. + + @param [in] aParamIndex The index of the structure that is to be filled. + + @param [in] apComponentParameterStructure A pointer to the IL structure. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetParameter( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) = 0; + + virtual OMX_ERRORTYPE GetConfig( + const COmxILFsm& aFsm, + OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + virtual OMX_ERRORTYPE SetConfig( + COmxILFsm& aFsm, + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure); + + virtual OMX_ERRORTYPE GetExtensionIndex( + const COmxILFsm& aFsm, + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + /** + State-specific version of the OpenMAX IL GetState API. + + @return OMX_STATETYPE + */ + virtual OMX_STATETYPE GetState() const = 0; + + /** + State-specific version of the OpenMAX IL ComponentTunnelRequest API. + + @param [in] aFsm The main FSM context class that delegates the events to + the state classes. + + @param [in] aPort Used to select the port on the component to be used + for tunneling. + + @param [in] aTunneledComp Handle of the component to tunnel with. + + @param [in] aTunneledPort Indicates the port the component should tunnel + with. + + @param [in] aTunnelSetup Pointer to the tunnel setup structure. + + @return OMX_ERRORTYPE + */ + inline virtual OMX_ERRORTYPE ComponentTunnelRequest( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) = 0; + + /** + State-specific version of the PopulateBuffer method used by the FSM + object to implement the OpenMAX IL AllocateBuffer/UseBuffer APIs. + + @param [in] aFsm The main FSM context class that delegates the events + to the state classes. + + @param [out] appBufferHdr A pointer to a pointer of an + OMX_BUFFERHEADERTYPE structure that receives the pointer to the buffer + header. + + @param [in] aPortIndex The index of the port that will use the + specified buffer. This index is relative to the component that owns the + port. + + @param [in] apAppPrivate A pointer that refers to an + implementation-specific memory area that is under responsibility of the + supplier of the buffer. + + @param [in] aSizeBytes The buffer size in bytes. + + @param [in] apBuffer A pointer to the memory buffer area to be used. + + @param [out] portPopulationCompleted Used to signal the FSM object the + the port population has completed. + + @return OMX_ERRORTYPE + */ + inline virtual OMX_ERRORTYPE PopulateBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) = 0; + + /** + State-specific version of the OpenMAX IL FreeBuffer API. + + @param [in] aFsm The main FSM context class that delegates the events + to the state classes. + + @param [in] aPortIndex The index of the port that is using the + specified buffer. + + @param [in] apBuffer A pointer to an OMX_BUFFERHEADERTYPE structure + used to provide or receive the pointer to the buffer header. + + @param [out] aPortDepopulationCompleted Used to signal the FSM object + the the port population has completed. + + @return OMX_ERRORTYPE + */ + inline virtual OMX_ERRORTYPE FreeBuffer( + COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) = 0; + + /** + State-specific version of the OpenMAX IL EmptyThisBuffer API. + + @param [in] aFsm The main FSM context class that delegates the events + to the state classes. + + @param [in] apBuffer A pointer to an OMX_BUFFERHEADERTYPE structure that is + used to receive the pointer to the buffer header. The buffer header + shall specify the index of the input port that receives the buffer. + + @return OMX_ERRORTYPE + */ + inline virtual OMX_ERRORTYPE EmptyThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) = 0; + + /** + State-specific version of the OpenMAX IL FillThisBuffer API. + + @param [in] aFsm The main FSM context class that delegates the events + to the state classes. + + @param [in] apBuffer A pointer to an OMX_BUFFERHEADERTYPE structure + that is used to receive the pointer to the buffer header. The buffer + header shall specify the index of the input port that receives the + buffer. + + @return OMX_ERRORTYPE + */ + inline virtual OMX_ERRORTYPE FillThisBuffer( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) = 0; + + /** + State-specific version of the method used by the FSM object to + implement the OpenMAX IL OMX_CommandStateSet command. + + @param [in] aFsm The main FSM context class that delegates the events + to the state classes. + + @param [in] aCommand A TOmxILCommand object used to carry the command + parameters. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) = 0; + + virtual OMX_ERRORTYPE CommandFlush( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + /** + State-specific version of the method used by the FSM object to + implement the OpenMAX IL OMX_CommandPortEnable command. + + @param [in] aFsm The main FSM context class that delegates the events + to the state classes. + + @param [in] aCommand A TOmxILCommand object used to carry the command + parameters. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand) = 0; + + virtual OMX_ERRORTYPE CommandPortDisable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + virtual OMX_ERRORTYPE CommandMarkBuffer( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + +protected: + + virtual OMX_ERRORTYPE SetParameterV2( + COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + inline virtual OMX_ERRORTYPE PopulateBufferV2( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + inline virtual OMX_ERRORTYPE FreeBufferV2( + COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + inline virtual OMX_ERRORTYPE ComponentTunnelRequestV2( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + inline virtual OMX_ERRORTYPE EmptyThisBufferV2( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + inline virtual OMX_ERRORTYPE FillThisBufferV2( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + }; + + +/** + Concrete class that implements the OpenMAX IL OMX_StateInvalid state +*/ +class COmxILFsm::COmxILStateInvalid : public COmxILFsm::COmxILState + { + +public: + + OMX_ERRORTYPE GetParameter(const COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE GetConfig(const COmxILFsm& aFsm, + OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + OMX_ERRORTYPE SetConfig(COmxILFsm& aFsm, + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure); + + OMX_ERRORTYPE GetExtensionIndex(const COmxILFsm& aFsm, + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + OMX_STATETYPE GetState() const; + + OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandFlush( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortDisable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandMarkBuffer( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the OpenMAX IL OMX_StateLoaded state +*/ +class COmxILFsm::COmxILStateLoaded : public COmxILFsm::COmxILState + { + +public: + + OMX_STATETYPE GetState() const; + + OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + + +/** + Concrete class that implements the intermediate state OMX_StateLoaded -> + OMX_StateIdle. +*/ +class COmxILFsm::COmxILStateLoadedToIdle : public COmxILFsm::COmxILStateLoaded + { + +public: + + + OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the OpenMAX IL OMX_StateWaitForResources + state + + NOTE: This state is here only to provide the basic functionality of + transitioning form OMX_StateLoaded to OMX_StateWaitForResources and + viceversa. Transition from OMX_StateWaitForResources to OMX_StateIdle is not + implemented at this stage since a Resource Manager is not present + yet. Whenever a Resource Manager becomes available, a + COmxILStateWaitForResourcesToIdle substate should be implemented to handle + the allocation of buffers mandated by the standard in this transition. + +*/ +class COmxILFsm::COmxILStateWaitForResources : public COmxILFsm::COmxILState + { + +public: + + OMX_STATETYPE GetState() const; + + OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the OpenMAX IL COmxILStateIdle state +*/ +class COmxILFsm::COmxILStateIdle : public COmxILFsm::COmxILState + { + +public: + + OMX_STATETYPE GetState() const; + + OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandFlush( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the intermediate state OMX_StateIdle -> + OMX_StateLoaded. +*/ +class COmxILFsm::COmxILStateIdleToLoaded : public COmxILFsm::COmxILStateIdle + { + +public: + + OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the OpenMAX IL COmxILStateExecuting state +*/ +class COmxILFsm::COmxILStateExecuting : public COmxILFsm::COmxILState + { + +public: + + OMX_STATETYPE GetState() const; + + OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Class used to abstract the commonalities of the transitions from + OMX_StatePause or OMX_StateExecuting to OMX_StateIdle. +*/ +class COmxILFsm::MOmxILPauseOrExecutingToIdle + { + +protected: + + OMX_ERRORTYPE ReturnThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer, + OMX_DIRTYPE aDirection); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the intermediate state OMX_StateExecuting -> + OMX_StateIdle. +*/ +class COmxILFsm::COmxILStateExecutingToIdle : + public COmxILFsm::COmxILStateExecuting, + private COmxILFsm::MOmxILPauseOrExecutingToIdle + + { + +public: + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the OpenMAX IL COmxILStatePause state +*/ +class COmxILFsm::COmxILStatePause : public COmxILFsm::COmxILState + { + +public: + + OMX_STATETYPE GetState() const; + + OMX_ERRORTYPE SetParameter(COmxILFsm& aFsm, + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure); + + OMX_ERRORTYPE PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + OMX_ERRORTYPE FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted); + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE ComponentTunnelRequest(COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + OMX_ERRORTYPE CommandPortEnable( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +/** + Concrete class that implements the intermediate state OMX_StatePause -> + OMX_StateIdle. +*/ +class COmxILFsm::COmxILStatePauseToIdle + : public COmxILFsm::COmxILStatePause, + private COmxILFsm::MOmxILPauseOrExecutingToIdle + { + +public: + + OMX_ERRORTYPE EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer); + + OMX_ERRORTYPE CommandStateSet( + COmxILFsm& aFsm, + const TOmxILCommand& aCommand); + + }; + +#include "omxilstate.inl" + +#endif // OMXILSTATE_H + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilstate.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilstate.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,213 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + + +// ComponentTunnelRequest must be used in the following states: +// - Any state, (but the port will have to be disabled) +// +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::ComponentTunnelRequest( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + return aFsm.iPortManager.TunnelRequest( + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup, + OMX_TRUE // Port must be disabled + ); + } + +// ComponentTunnelRequestV2 must be used in the following states: +// - OMX_StateLoaded +// +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::ComponentTunnelRequestV2( + COmxILFsm& aFsm, + OMX_U32 aPort, + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + return aFsm.iPortManager.TunnelRequest( + aPort, + aTunneledComp, + aTunneledPort, + apTunnelSetup, + OMX_FALSE // Port does not need to be disabled + ); + } + +// This PopulateBuffer version must be used in the following states: +// - OMX_StateIdle, +// - OMX_StateExecuting, +// - OMX_StatePaused +// +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::PopulateBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + return aFsm.iPortManager.PopulateBuffer( + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted, + OMX_TRUE // Port must be disabled + ); + } + +// This PopulateBuffer version must be used in the following states: +// - OMX_StateLoaded, +// - OMX_StateWaitForResources +// +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::PopulateBufferV2( + COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aPortIndex, + OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted) + { + return aFsm.iPortManager.PopulateBuffer( + appBufferHdr, + aPortIndex, + apAppPrivate, + aSizeBytes, + apBuffer, + portPopulationCompleted, + OMX_FALSE // Port does not need to be disabled + ); + } + + +// This FreeBuffer version is used in the following states: +// - OMX_StateLoaded, +// - OMX_StateWaitForResources +// - OMX_StateExecuting, +// - OMX_StatePaused, +// AND the port must be disabled +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::FreeBuffer(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + return aFsm.iPortManager.FreeBuffer( + aPortIndex, + apBuffer, + aPortDepopulationCompleted, + OMX_TRUE // Port should be disabled, otherwise + // OMX_ErrorPortUnpopulated might be sent + ); + } + +// This FreeBuffer version is used in the following states: +// - OMX_StateIdle, +// +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::FreeBufferV2(COmxILFsm& aFsm, + OMX_U32 aPortIndex, + OMX_BUFFERHEADERTYPE* apBuffer, + TBool& aPortDepopulationCompleted) + { + return aFsm.iPortManager.FreeBuffer( + aPortIndex, + apBuffer, + aPortDepopulationCompleted, + OMX_FALSE // Port does not need to be disabled + ); + } + +// This EmptyThisBuffer version must be used in the following states: +// - OMX_StateLoaded, +// - OMX_StateWaitForResources +// AND the port must be disabled +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::EmptyThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + return aFsm.iPortManager.BufferIndication( + apBuffer, + OMX_DirInput, + OMX_TRUE // Port must be disabled + ); + } + +// This EmptyThisBuffer version must be used in the following states: +// - OMX_StateIdle, +// - OMX_StateExecuting, +// - OMX_StatePaused +// +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::EmptyThisBufferV2(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + return aFsm.iPortManager.BufferIndication( + apBuffer, + OMX_DirInput, + OMX_FALSE // Port does not need to be disabled + ); + } + +// This FillThisBuffer version must be used in the following states: +// - OMX_StateLoaded, +// - OMX_StateWaitForResources +// AND the port must be disabled +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::FillThisBuffer(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + return aFsm.iPortManager.BufferIndication( + apBuffer, + OMX_DirOutput, + OMX_TRUE // Port must be disabled + ); + } + +// This FillThisBuffer version must be used in the following states: +// - OMX_StateIdle, +// - OMX_StateExecuting, +// - OMX_StatePaused +// +inline OMX_ERRORTYPE +COmxILFsm::COmxILState::FillThisBufferV2(COmxILFsm& aFsm, + OMX_BUFFERHEADERTYPE* apBuffer) + { + return aFsm.iPortManager.BufferIndication( + apBuffer, + OMX_DirOutput, + OMX_FALSE // Port does not need to be disabled + ); + } + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilutil.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,109 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + + +#include +#include + +/** + This method checks that the size of an OpenMAX IL data structure is + correct. It also checks that the OpenMAX IL version stated in the structure + is the same as the one returned by TOmxILSpecVersion() (at the time of + writting this is 1.1.1). In this version of the component framework, + backward compatibility in not supported for OpenMAX IL structures. + + @param apHeader An OpenMAX IL data structure. + + @param aSize sizeof(OMXIL structure) + + @return OMX_ErrorVersionMismatch if the version is not + 1.1.1. OMX_ErrorBadParameter if versions are the same but the nSize is + different. OMX_ErrorNone otherwise + */ +EXPORT_C OMX_ERRORTYPE +TOmxILUtil::CheckOmxStructSizeAndVersion(OMX_PTR apHeader, OMX_U32 aSize) + { + + if (!apHeader || aSize == 0) + { + return OMX_ErrorBadParameter; + } + +#ifdef _OMXIL_COMMON_SPEC_VERSION_CHECKS_ON + + OMX_U32* const pStructSize = + reinterpret_cast(apHeader); + + // In an OpenMAX IL structure the nSize and nVersion fields are used to + // detect the difference in spec versions. + OMX_VERSIONTYPE* const pOmxVersion = + reinterpret_cast( + pStructSize + (sizeof(OMX_U32)/sizeof(OMX_U32))); + + if ( (TOmxILSpecVersion() != *pOmxVersion)&&(TOmxILVersion(OMX_VERSION_MAJOR, OMX_VERSION_MINOR, 1, OMX_VERSION_STEP) != *pOmxVersion) ) + + { + return OMX_ErrorVersionMismatch; + } + + // If the spec versions are the same, then the struct sizes must be the + // same too... + if (*pStructSize != aSize) + { + return OMX_ErrorBadParameter; + } + +#endif // _OMXIL_COMMON_SPEC_VERSION_CHECKS_ON + + return OMX_ErrorNone; + + } + +/** + This method simply resets the following fields in the OMX IL 1.1.x buffer header: + nFilledLen + hMarkTargetComponent + pMarkData + nTickCount + nTimeStamp + nFlags + + @param apBufferHeader An OpenMAX IL buffer header structure. + + */ +EXPORT_C void +TOmxILUtil::ClearBufferContents( + OMX_BUFFERHEADERTYPE* apBufferHeader) + { + + if (!apBufferHeader) + { + return; + } + + apBufferHeader->nFilledLen = 0; + apBufferHeader->hMarkTargetComponent = 0; + apBufferHeader->pMarkData = 0; + apBufferHeader->nTickCount = 0; + apBufferHeader->nTimeStamp = 0; + apBufferHeader->nFlags = 0; + + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilvideoport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilvideoport.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,427 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#include +#include +#include "log.h" +#include "omxilvideoportimpl.h" + +EXPORT_C +COmxILVideoPort::COmxILVideoPort() + { + DEBUG_PRINTF(_L8("COmxILVideoPort::COmxILVideoPort")); + } + +EXPORT_C +void COmxILVideoPort::ConstructL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedVideoFormats, + const RArray& aSupportedColorFormats) + { + COmxILPort::ConstructL(aCommonPortData); //create COmxILPortImpl + ipVideoPortImpl=COmxILVideoPortImpl::NewL(aSupportedVideoFormats, aSupportedColorFormats, aCommonPortData); //create COmxILVideoPortImpl + } + +EXPORT_C +COmxILVideoPort::~COmxILVideoPort() + { + DEBUG_PRINTF(_L8("COmxILVideoPort::~COmxILVideoPort")); + delete ipVideoPortImpl; + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::GetLocalOmxParamIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILVideoPort::GetLocalOmxParamIndexes")); + + // Always collect local indexes from parent + OMX_ERRORTYPE omxRetValue = COmxILPort::GetLocalOmxParamIndexes(aIndexArray); + + if (OMX_ErrorNone != omxRetValue) + { + return omxRetValue; + } + + TInt err = aIndexArray.InsertInOrder(OMX_IndexParamVideoPortFormat); + + // Note that index duplication is OK. + if (KErrNone != err && KErrAlreadyExists != err) + { + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorNone; + + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::GetLocalOmxConfigIndexes(RArray& aIndexArray) const + { + DEBUG_PRINTF(_L8("COmxILVideoPort::GetLocalOmxConfigIndexes")); + + // Always collect local indexes from parent + return COmxILPort::GetLocalOmxConfigIndexes(aIndexArray); + + } + +EXPORT_C OMX_ERRORTYPE COmxILVideoPort::GetParameter(OMX_INDEXTYPE aParamIndex, TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILVideoPort::GetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamVideoPortFormat: + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + omxRetValue=ipVideoPortImpl->GetParameter(aParamIndex, apComponentParameterStructure); + break; + } + default: + { + // Try the parent's indexes + omxRetValue=COmxILPort::GetParameter(aParamIndex, apComponentParameterStructure); + } + }; + return omxRetValue; + } + +EXPORT_C OMX_ERRORTYPE COmxILVideoPort::SetParameter(OMX_INDEXTYPE aParamIndex, const TAny* apComponentParameterStructure, TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamVideoPortFormat: + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + omxRetValue=ipVideoPortImpl->SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + break; + } + default: + { + // Try the parent's indexes + omxRetValue=COmxILPort::SetParameter(aParamIndex, apComponentParameterStructure, aUpdateProcessingFunction); + } + }; + return omxRetValue; + } + +EXPORT_C TBool COmxILVideoPort::UpdateColorFormat(OMX_COLOR_FORMATTYPE& aOldColor, OMX_COLOR_FORMATTYPE aNewColor, TBool& aUpdated) + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->UpdateColorFormat(aOldColor, aNewColor, aUpdated); + } + +EXPORT_C TBool COmxILVideoPort::UpdateCodingType(OMX_VIDEO_CODINGTYPE& aOldCodingType, OMX_VIDEO_CODINGTYPE aNewCodingType, TBool& aUpdated) + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->UpdateCodingType(aOldCodingType, aNewCodingType, aUpdated); + } + +EXPORT_C RArray& COmxILVideoPort::GetSupportedVideoFormats() + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->GetSupportedVideoFormats(); + + } + +EXPORT_C RArray& COmxILVideoPort::GetSupportedColorFormats() + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->GetSupportedColorFormats(); + } + + +EXPORT_C OMX_VIDEO_PARAM_PORTFORMATTYPE& COmxILVideoPort::GetParamVideoPortFormat() + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->GetParamVideoPortFormat(); + } + +EXPORT_C const RArray& COmxILVideoPort::GetSupportedVideoFormats() const + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->GetSupportedVideoFormats(); + + } + +EXPORT_C const RArray& COmxILVideoPort::GetSupportedColorFormats() const + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->GetSupportedColorFormats(); + } + + +EXPORT_C const OMX_VIDEO_PARAM_PORTFORMATTYPE& COmxILVideoPort::GetParamVideoPortFormat() const + { + __ASSERT_ALWAYS(ipVideoPortImpl, User::Panic(KOmxILVideoPortPanicCategory, 1)); + return ipVideoPortImpl->GetParamVideoPortFormat(); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const + { + DEBUG_PRINTF(_L8("COmxILPort::GetConfig")); + return COmxILPort::GetConfig(aConfigIndex, + apComponentConfigStructure); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILPort::SetConfig")); + return COmxILPort::SetConfig(aConfigIndex, + apComponentConfigStructure, + aUpdateProcessingFunction); + + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::GetExtensionIndex(OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const + { + return COmxILPort::GetExtensionIndex(aParameterName, + apIndexType); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::PopulateBuffer(OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& aPortPopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILVideoPort::PopulateBuffer : pBuffer [%X]"), apBuffer); + return COmxILPort::PopulateBuffer(appBufferHdr, + apAppPrivate, + aSizeBytes, + apBuffer, + aPortPopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::FreeBuffer(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aPortDepopulationCompleted) + { + DEBUG_PRINTF2(_L8("COmxILVideoPort::FreeBuffer : BUFFER [%X]"), apBufferHeader); + return COmxILPort::FreeBuffer(apBufferHeader, aPortDepopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::TunnelRequest(OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::TunnelRequest")); + return COmxILPort::TunnelRequest(aTunneledComp, + aTunneledPort, + apTunnelSetup); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::PopulateTunnel(TBool& portPopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::PopulateTunnel")); + return COmxILPort::PopulateTunnel(portPopulationCompleted); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::FreeTunnel(TBool& portDepopulationCompleted) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::FreeTunnel")); + return COmxILPort::FreeTunnel(portDepopulationCompleted); + } + +EXPORT_C TBool +COmxILVideoPort::SetBufferSent(OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetBufferSent")); + return COmxILPort::SetBufferSent(apBufferHeader, + aBufferMarkedWithOwnMark); + } + +EXPORT_C TBool +COmxILVideoPort::SetBufferReturned(OMX_BUFFERHEADERTYPE* apBufferHeader) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetBufferReturned")); + return COmxILPort::SetBufferReturned(apBufferHeader); + } + +EXPORT_C void +COmxILVideoPort::SetTransitionToEnabled() + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetTransitionToEnabled")); + return COmxILPort::SetTransitionToEnabled(); + } + +EXPORT_C void +COmxILVideoPort::SetTransitionToDisabled() + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetTransitionToDisabled")); + return COmxILPort::SetTransitionToDisabled(); + } + +EXPORT_C void +COmxILVideoPort::SetTransitionToDisabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetTransitionToDisabledCompleted")); + return COmxILPort::SetTransitionToDisabledCompleted(); + } + +EXPORT_C void +COmxILVideoPort::SetTransitionToEnabledCompleted() + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetTransitionToEnabledCompleted")); + return COmxILPort::SetTransitionToEnabledCompleted(); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::StoreBufferMark(const OMX_MARKTYPE* apMark) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::StoreBufferMark")); + return COmxILPort::StoreBufferMark(apMark); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::SetComponentRoleDefaults(TUint aComponentRoleIndex) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::SetComponentRoleDefaults")); + + return COmxILPort::SetComponentRoleDefaults(aComponentRoleIndex); + } + +EXPORT_C TBool +COmxILVideoPort::HasAllBuffersAtHome() const + { + return COmxILPort::HasAllBuffersAtHome(); + } + +EXPORT_C TBool +COmxILVideoPort::IsBufferAtHome(OMX_BUFFERHEADERTYPE* apBufferHeader) const + { + DEBUG_PRINTF2(_L8("COmxILVideoPort::IsBufferAtHome : [%X]"), apBufferHeader); + return COmxILPort::IsBufferAtHome(apBufferHeader); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::DoPortReconfiguration(TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::DoPortReconfiguration")); + + return COmxILPort::DoPortReconfiguration(aPortSettingsIndex, + aPortSettings, + aEventForILClient); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::DoBufferAllocation(OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF2(_L8("COmxILVideoPort::DoBufferAllocation : aSizeBytes[%u]"), aSizeBytes); + return COmxILPort::DoBufferAllocation(aSizeBytes, + apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILVideoPort::DoBufferDeallocation(OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::DoBufferDeallocation")); + return COmxILPort::DoBufferDeallocation(apPortSpecificBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::DoBufferWrapping(OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate) + { + DEBUG_PRINTF(_L8("COmxILVideoPort::DoBufferWrapping")); + return COmxILPort::DoBufferWrapping(aSizeBytes, + apBuffer, + apPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C void +COmxILVideoPort::DoBufferUnwrapping(OMX_PTR apBuffer, + OMX_PTR appPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate) + { + + DEBUG_PRINTF(_L8("COmxILVideoPort::DoBufferUnwrapping")); + return COmxILPort::DoBufferUnwrapping(apBuffer, + appPortPrivate, + apPlatformPrivate, + apAppPrivate); + } + +EXPORT_C OMX_ERRORTYPE +COmxILVideoPort::DoOmxUseBuffer(OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer) + { + + DEBUG_PRINTF(_L8("COmxILVideoPort::DoOmxUseBuffer")); + return COmxILPort::DoOmxUseBuffer(aTunnelledComponent, + appBufferHdr, + aTunnelledPortIndex, + apPortPrivate, + apPlatformPrivate, + aSizeBytes, + apBuffer); + } + + +EXPORT_C +TInt COmxILVideoPort::Extension_(TUint aExtensionId, TAny *&a0, TAny *a1) + { + return COmxILPort::Extension_(aExtensionId, a0, a1); + } + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilvideoportimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilvideoportimpl.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,209 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ +#include "log.h" +#include "omxilvideoportimpl.h" +#include +#include + +COmxILVideoPortImpl* COmxILVideoPortImpl::NewL(const RArray& aSupportedVideoFormats, + const RArray& aSupportedColorFormats, + const TOmxILCommonPortData& aCommonPortData) + { + COmxILVideoPortImpl* self = new (ELeave) COmxILVideoPortImpl(); + CleanupStack::PushL(self); + self->ConstructL(aSupportedVideoFormats, aSupportedColorFormats, aCommonPortData); + CleanupStack::Pop(); + return self; + } + +void COmxILVideoPortImpl::ConstructL(const RArray& aSupportedVideoFormats, + const RArray& aSupportedColorFormats, + const TOmxILCommonPortData& aCommonPortData) + { + + TUint count = aSupportedVideoFormats.Count(); + for (TInt i = 0; i < count; i++) + { + iSupportedVideoFormats.AppendL(aSupportedVideoFormats[i]); + } + + count = aSupportedColorFormats.Count(); + for (TInt i = 0; i < count; i++) + { + iSupportedColorFormats.AppendL(aSupportedColorFormats[i]); + } + + TInt numVideoFormats = iSupportedVideoFormats.Count(); + TInt numColorFormats = iSupportedColorFormats.Count(); + iParamVideoPortFormat.nSize = sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE); + iParamVideoPortFormat.nVersion = aCommonPortData.iOmxVersion; + iParamVideoPortFormat.nPortIndex = aCommonPortData.iPortIndex; + iParamVideoPortFormat.nIndex = numVideoFormats ? numVideoFormats - 1 : 0; + iParamVideoPortFormat.eCompressionFormat = numVideoFormats ? iSupportedVideoFormats[0] : OMX_VIDEO_CodingUnused; + iParamVideoPortFormat.eColorFormat = numColorFormats ? iSupportedColorFormats[0] : OMX_COLOR_FormatUnused; + iParamVideoPortFormat.xFramerate = 0;//aCommonPortData.xFramerate???; + } + +COmxILVideoPortImpl::COmxILVideoPortImpl() + { + DEBUG_PRINTF(_L8("COmxILVideoPortImpl::COmxILVideoPortImpl")); + } + +COmxILVideoPortImpl::~COmxILVideoPortImpl() + { + DEBUG_PRINTF(_L8("COmxILVideoPortImpl::~COmxILVideoPortImpl")); + iSupportedVideoFormats.Close(); + iSupportedColorFormats.Close(); + } + +OMX_ERRORTYPE COmxILVideoPortImpl::GetParameter(OMX_INDEXTYPE aParamIndex, TAny* apComponentParameterStructure) const + { + DEBUG_PRINTF(_L8("COmxILVideoPortImpl::GetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + + switch(aParamIndex) + { + case OMX_IndexParamVideoPortFormat: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE)))) + { + return omxRetValue; + } + + OMX_VIDEO_PARAM_PORTFORMATTYPE* videoPortDefinition = static_cast(apComponentParameterStructure); + + if(OMX_VIDEO_CodingUnused == iParamVideoPortFormat.eCompressionFormat) + { + if (videoPortDefinition->nIndex >= iSupportedColorFormats.Count()) + { + return OMX_ErrorNoMore; + } + videoPortDefinition->eColorFormat = iSupportedColorFormats[videoPortDefinition->nIndex]; + } + else + { + if (videoPortDefinition->nIndex >= iSupportedVideoFormats.Count()) + { + return OMX_ErrorNoMore; + } + videoPortDefinition->eCompressionFormat = iSupportedVideoFormats[videoPortDefinition->nIndex]; + } + videoPortDefinition->xFramerate = iParamVideoPortFormat.xFramerate; + break; + } + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILVideoPortPanicCategory, 1)); + }; + + return OMX_ErrorNone; + } + +OMX_ERRORTYPE COmxILVideoPortImpl::SetParameter(OMX_INDEXTYPE aParamIndex, const TAny* apComponentParameterStructure, TBool& aUpdateProcessingFunction) + { + DEBUG_PRINTF(_L8("COmxILVideoPortImpl::SetParameter")); + OMX_ERRORTYPE omxRetValue = OMX_ErrorNone; + switch(aParamIndex) + { + case OMX_IndexParamVideoPortFormat: + { + if (OMX_ErrorNone != (omxRetValue = + TOmxILUtil::CheckOmxStructSizeAndVersion( + const_cast(apComponentParameterStructure), + sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE)))) + { + return omxRetValue; + } + + const OMX_VIDEO_PARAM_PORTFORMATTYPE *componentParameterStructure = static_cast(apComponentParameterStructure); + + if (!UpdateColorFormat(iParamVideoPortFormat.eColorFormat, componentParameterStructure->eColorFormat, aUpdateProcessingFunction)) + { + return OMX_ErrorUnsupportedSetting; + } + + if (!UpdateCodingType(iParamVideoPortFormat.eCompressionFormat, componentParameterStructure->eCompressionFormat, aUpdateProcessingFunction)) + { + return OMX_ErrorUnsupportedSetting; + } + + if(iParamVideoPortFormat.eCompressionFormat == OMX_VIDEO_CodingUnused) + { + if(iParamVideoPortFormat.xFramerate != componentParameterStructure->xFramerate) + { + iParamVideoPortFormat.xFramerate = componentParameterStructure->xFramerate; + aUpdateProcessingFunction = ETrue; + } + } + break; + } + default: + __ASSERT_ALWAYS(EFalse, User::Panic(KOmxILVideoPortPanicCategory, 1)); + }; + return OMX_ErrorNone; + } + +TBool COmxILVideoPortImpl::UpdateColorFormat(OMX_COLOR_FORMATTYPE& aOldColor, OMX_COLOR_FORMATTYPE aNewColor, TBool& aUpdated) + { + if (aNewColor != aOldColor) + { + if(iSupportedColorFormats.Find(aNewColor) == KErrNotFound) + { + return EFalse; + } + aOldColor = aNewColor; + aUpdated = ETrue; + } + + return ETrue; + } + +TBool COmxILVideoPortImpl::UpdateCodingType(OMX_VIDEO_CODINGTYPE& aOldCodingType, OMX_VIDEO_CODINGTYPE aNewCodingType, TBool& aUpdated) + { + if (aNewCodingType != aOldCodingType) + { + if(iSupportedVideoFormats.Find(aNewCodingType) == KErrNotFound) + { + return EFalse; + } + aOldCodingType = aNewCodingType; + aUpdated = ETrue; + } + + return ETrue; + } + +RArray& COmxILVideoPortImpl::GetSupportedVideoFormats() + { + return iSupportedVideoFormats; + } + +RArray& COmxILVideoPortImpl::GetSupportedColorFormats() + { + return iSupportedColorFormats; + } + +OMX_VIDEO_PARAM_PORTFORMATTYPE& COmxILVideoPortImpl::GetParamVideoPortFormat() + { + return iParamVideoPortFormat; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/omxilvideoportimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/omxilvideoportimpl.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,66 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalTechnology +*/ + +#ifndef OMXILVIDEOPORTIMPL_H +#define OMXILVIDEOPORTIMPL_H + +#include + +#include +#include +#include + +#include + +class COmxILVideoPortImpl : public CBase + { +public: + static COmxILVideoPortImpl* NewL(const RArray& aSupportedVideoFormats, + const RArray& aSupportedColorFormatsconst, + const TOmxILCommonPortData& aCommonPortData); + ~COmxILVideoPortImpl(); + + OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction); + + TBool UpdateColorFormat(OMX_COLOR_FORMATTYPE& aOldColor, OMX_COLOR_FORMATTYPE aNewColor, TBool& aUpdated); + TBool UpdateCodingType(OMX_VIDEO_CODINGTYPE& aOldCodingType, OMX_VIDEO_CODINGTYPE aNewCodingType, TBool& aUpdated); + RArray& GetSupportedVideoFormats(); + RArray& GetSupportedColorFormats(); + OMX_VIDEO_PARAM_PORTFORMATTYPE& GetParamVideoPortFormat(); +private: + COmxILVideoPortImpl(); + void ConstructL(const RArray& aSupportedVideoFormats, + const RArray& aSupportedColorFormats, + const TOmxILCommonPortData& aCommonPortData); + +private: + RArray iSupportedVideoFormats; + RArray iSupportedColorFormats; + RArray iSupportedFrameRates; + OMX_VIDEO_PARAM_PORTFORMATTYPE iParamVideoPortFormat; + }; + +#endif // OMXILVIDEOPORT_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/primsgqueue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/primsgqueue.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,87 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef PRIMSGQUEUE_H +#define PRIMSGQUEUE_H + +#include +#include + +/** + RPriMsgQueue panic category +*/ +_LIT(RPriMsgQueuePanicCategory, "RPriMsgQueue"); + +/** + A priority-based message queue similar to RMsQueue . + + This templated class provides the behaviour for managing an asynchronous + queue of messages, ordered by descending priority order, where the template + parameter defines the message type. Note that this message queue is intended + to be used with pointer types only. Also, message types are assumed to have + a member with the following signature : TInt Priority() + + */ +template +class RPriMsgQueue + { + +public: + + inline TInt CreateLocal(TInt aSize, TOwnerType aType=EOwnerProcess); + inline TInt Handle() const; + inline TInt Send(const T& aMsg); + inline TInt Receive(T& aMsg); + inline void Close(); + inline void NotifyDataAvailable(TRequestStatus& aStatus); + inline void CancelDataAvailable(); + +protected: + + class TFrontQueueElement + { + + public: + + inline explicit TFrontQueueElement(const TAny* apInfo); + inline TFrontQueueElement(const TAny* apInfo, TInt aPriority); + + public: + + const TAny* ipInfo; + TPriQueLink iLink; + + }; + +protected: + + inline TInt DrainBackQueue(); + +protected: + + RMsgQueueBase iBackQueue; + TPriQue iFrontQueue; + + }; + +#include "primsgqueue.inl" + +#endif // PRIMSGQUEUE_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcomplib/src/primsgqueue.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcomplib/src/primsgqueue.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,156 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + + +template +inline RPriMsgQueue::TFrontQueueElement::TFrontQueueElement( + const TAny* apInfo) + : + ipInfo(apInfo) + { + iLink.iPriority = 0; + } + +template +inline RPriMsgQueue::TFrontQueueElement::TFrontQueueElement( + const TAny* apInfo, TInt aPriority) + : + ipInfo(apInfo) + { + iLink.iPriority = aPriority; + } + +template +inline TInt RPriMsgQueue::CreateLocal(TInt aSize, TOwnerType aOwner) + { + iFrontQueue.SetOffset(_FOFF(TFrontQueueElement, iLink)); + return iBackQueue.CreateLocal(aSize, sizeof(T), aOwner); + } + +template +inline TInt RPriMsgQueue::Handle() const + { + return iBackQueue.Handle(); + } + +template +inline TInt RPriMsgQueue::Send(const T& aMsg) + { + ASSERT(aMsg); + return iBackQueue.Send(&aMsg, sizeof(T)); + } + +template +inline TInt RPriMsgQueue::Receive(T& aMsg) + { + TInt err = DrainBackQueue(); + if (KErrNone == err) + { + if (iFrontQueue.IsEmpty()) + { + return KErrUnderflow; + } + + TFrontQueueElement* pElement = iFrontQueue.First(); + __ASSERT_DEBUG(pElement != 0, + User::Panic(RPriMsgQueuePanicCategory, 1)); + pElement->iLink.Deque(); + aMsg = reinterpret_cast(const_cast(pElement->ipInfo)); + delete pElement; + } + + return err; + + } + +template +inline void RPriMsgQueue::Close() + { + + // Back queue should be empty by now, but just in case... + + // Here we expect a pointer type!... + T pElement; + while (iBackQueue.Receive(&pElement, sizeof(T)) == KErrNone) + { + delete pElement; + pElement = 0; + } + iBackQueue.Close(); + + // Front queue should be empty by now, but just in case... + TFrontQueueElement* pFQElement = 0; + while (!iFrontQueue.IsEmpty()) + { + pFQElement = iFrontQueue.First(); + __ASSERT_DEBUG(pFQElement != 0, + User::Panic(RPriMsgQueuePanicCategory, 1)); + pFQElement->iLink.Deque(); + pElement = reinterpret_cast(const_cast(pFQElement->ipInfo)); + delete pElement; + delete pFQElement; + } + + } + +template +inline void RPriMsgQueue::NotifyDataAvailable(TRequestStatus& aStatus) + { + iBackQueue.NotifyDataAvailable(aStatus); + } + +template +inline void RPriMsgQueue::CancelDataAvailable() + { + iBackQueue.CancelDataAvailable(); + } + +template +TInt RPriMsgQueue::DrainBackQueue() + { + + // Here we expect a pointer type!... + T pElement; + while (iBackQueue.Receive(&pElement, sizeof(T)) == KErrNone) + { + TFrontQueueElement* pElem = + new TFrontQueueElement(pElement, pElement->Priority()); + + // This double attempt at allocation is done in order to allow OOM + // tests to pass, as there is no way to report an error to the client + // if we lose a RegisterCallbacks message in an OOM situation + if (!pElem) + { + pElem = new TFrontQueueElement(pElement, pElement->Priority()); + } + + if (!pElem) + { + // This command will get lost, but at least it won't be leaked + delete pElement; + return KErrNoMemory; + } + iFrontQueue.Add(*pElem); + } + + return KErrNone; + + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/bwins/omxilcoreclient.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/bwins/omxilcoreclient.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,11 @@ +EXPORTS + OMX_ComponentNameEnum @ 1 NONAME + OMX_Deinit @ 2 NONAME + OMX_FreeHandle @ 3 NONAME + OMX_GetComponentsOfRole @ 4 NONAME + OMX_GetContentPipe @ 5 NONAME + OMX_GetHandle @ 6 NONAME + OMX_GetRolesOfComponent @ 7 NONAME + OMX_Init @ 8 NONAME + OMX_SetupTunnel @ 9 NONAME + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/bwins/omxilcoreserver.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/bwins/omxilcoreserver.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,11 @@ +EXPORTS + ?ComponentNameEnum@COmxILCore@@QAE?AW4OMX_ERRORTYPE@@PADKK@Z @ 1 NONAME ; enum OMX_ERRORTYPE COmxILCore::ComponentNameEnum(char *, unsigned long, unsigned long) + ?ConstructOmxILCoreServerName@@YAHAAVTDes16@@@Z @ 2 NONAME ABSENT ; int ConstructOmxILCoreServerName(class TDes16 &) + ?FreeHandle@COmxILCore@@QBE?AW4OMX_ERRORTYPE@@PAX@Z @ 3 NONAME ; enum OMX_ERRORTYPE COmxILCore::FreeHandle(void *) const + ?GetComponentsOfRole@COmxILCore@@QAE?AW4OMX_ERRORTYPE@@PADPAKPAPAE@Z @ 4 NONAME ; enum OMX_ERRORTYPE COmxILCore::GetComponentsOfRole(char *, unsigned long *, unsigned char * *) + ?GetContentPipe@COmxILCore@@QAE?AW4OMX_ERRORTYPE@@PAPAXPAD@Z @ 5 NONAME ; enum OMX_ERRORTYPE COmxILCore::GetContentPipe(void * *, char *) + ?GetRolesOfComponent@COmxILCore@@QAE?AW4OMX_ERRORTYPE@@PADPAKPAPAE@Z @ 6 NONAME ; enum OMX_ERRORTYPE COmxILCore::GetRolesOfComponent(char *, unsigned long *, unsigned char * *) + ?LoadComponent@COmxILCore@@QAE?AW4OMX_ERRORTYPE@@PADPAPAXPAXPAUOMX_CALLBACKTYPE@@@Z @ 7 NONAME ; enum OMX_ERRORTYPE COmxILCore::LoadComponent(char *, void * *, void *, struct OMX_CALLBACKTYPE *) + ?SetupTunnel@COmxILCore@@SA?AW4OMX_ERRORTYPE@@PAXK0K@Z @ 8 NONAME ; enum OMX_ERRORTYPE COmxILCore::SetupTunnel(void *, unsigned long, void *, unsigned long) + ?StartOmxILCoreServer@@YAHPAK@Z @ 9 NONAME ; int StartOmxILCoreServer(unsigned long *) + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/eabi/omxilcoreclient.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/eabi/omxilcoreclient.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,11 @@ +EXPORTS + OMX_ComponentNameEnum @ 1 NONAME + OMX_Deinit @ 2 NONAME + OMX_FreeHandle @ 3 NONAME + OMX_GetComponentsOfRole @ 4 NONAME + OMX_GetContentPipe @ 5 NONAME + OMX_GetHandle @ 6 NONAME + OMX_GetRolesOfComponent @ 7 NONAME + OMX_Init @ 8 NONAME + OMX_SetupTunnel @ 9 NONAME + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/eabi/omxilcoreserver.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/eabi/omxilcoreserver.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,11 @@ +EXPORTS + _Z20StartOmxILCoreServerPm @ 1 NONAME + _Z28ConstructOmxILCoreServerNameR6TDes16 @ 2 NONAME ABSENT + _ZN10COmxILCore11SetupTunnelEPvmS0_m @ 3 NONAME + _ZN10COmxILCore13LoadComponentEPcPPvS1_P16OMX_CALLBACKTYPE @ 4 NONAME + _ZN10COmxILCore14GetContentPipeEPPvPc @ 5 NONAME + _ZN10COmxILCore17ComponentNameEnumEPcmm @ 6 NONAME + _ZN10COmxILCore19GetComponentsOfRoleEPcPmPPh @ 7 NONAME + _ZN10COmxILCore19GetRolesOfComponentEPcPmPPh @ 8 NONAME + _ZNK10COmxILCore10FreeHandleEPv @ 9 NONAME + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,33 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_PLATFORMS +BASEDEFAULT + +PRJ_MMPFILES +// Core and Loader +../mmpfiles/omxilsymbianloaderif.mmp +../mmpfiles/omxilsymbiancontentpipeif.mmp +../mmpfiles/omxilcoreserver.mmp +../mmpfiles/omxilcoreclient.mmp + + + + +PRJ_EXPORTS + +// Romkit include files +omxilcore.iby /epoc32/rom/include/omxilcore.iby + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/group/omxilcore.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/group/omxilcore.iby Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,26 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILCORE_IBY +#define OMXILCORE_IBY + +// OMX IL Core +file=ABI_DIR\BUILD_DIR\omxilcoreserver.dll System\Libs\omxilcoreserver.dll +file=ABI_DIR\BUILD_DIR\omxilcoreclient.dll System\Libs\omxilcoreclient.dll + +// Temp include of loader to maintain compatibility +#include + +#endif // OMXILCORE_IBY diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/mmpfiles/OSTOMXILFrameworkTrace.mmh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/mmpfiles/OSTOMXILFrameworkTrace.mmh Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,45 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// @file +// @SYMPurpose omxilcomponentif.lib Library used by the OMX Core to +// allow an OMX component to be loaded as an ECom plugin. +// +// + +#ifndef SHAREDOSTOMXILFRAMEWORKTRACE_HRH +#define SHAREDOSTOMXILFRAMEWORKTRACE_HRH + + +// ******* enables OMX-IL performance traces *********** +//#define ENABLE_OMXIL_TRACE_OSTV1 +//#define ENABLE_OMXIL_TRACE_OSTV2 +// ******************************************************* + +#ifdef ENABLE_OMXIL_TRACE_OSTV2 +MACRO SYMBIAN_PERF_TRACE_OMX_IL +#define SYMBIAN_PERF_TRACE_OMX_IL +#endif + +#ifdef ENABLE_OMXIL_TRACE_OSTV1 +MACRO SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 +#define SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + // comment out to stub out all tracepoint +#define SYMBIAN_INCLUDE_EXECUTABLE_TRACE + #include +#endif // SYMBIAN_PERF_TRACE_OMX_IL + +#endif //SHAREDOSTOMXILFRAMEWORKTRACE_HRH diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/mmpfiles/omxilcoreclient.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/mmpfiles/omxilcoreclient.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,52 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "OSTOMXILFrameworkTrace.mmh" +#include "../src/core/omxiluids.hrh" + +TARGET omxilcoreclient.dll +TARGETTYPE dll +UID KSharedLibraryUidDefine KUidOmxILCoreClientDll + +VENDORID 0x70000001 +CAPABILITY ALL -TCB + +MACRO __OMX_EXPORTS + +SOURCEPATH ../src/omxilcoreclient +SOURCE omxilcoreclientsession.cpp + +USERINCLUDE ../src/omxilcoreserver +USERINCLUDE ../src/core + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +LIBRARY euser.lib +LIBRARY estor.lib +LIBRARY omxilcoreserver.lib + +#ifdef WINS +LIBRARY ewsd.lib // For Process Local Storage on Emulator only +#else +EPOCALLOWDLLDATA +#endif + + +// MACRO _OMXIL_CORECLIENT_DEBUG_TRACING_ON + +DEFFILE omxilcoreclient.def +NOSTRICTDEF + +SMPSAFE diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/mmpfiles/omxilcoreserver.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/mmpfiles/omxilcoreserver.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,59 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "OSTOMXILFrameworkTrace.mmh" +#include "../src/core/omxiluids.hrh" + +TARGET omxilcoreserver.dll +TARGETTYPE dll +UID 0x1000008D KUidOmxILCoreServerDll + +VENDORID 0x70000001 +CAPABILITY ALL -TCB + +SOURCEPATH ../src/omxilcoreserver +SOURCE omxilcoreserver.cpp +SOURCE omxilcoreserversession.cpp + +SOURCEPATH ../src/core +SOURCE omxilcore.cpp + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL +SOURCE omxilcomponentapiperformancetrace.cpp +#endif + + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 +SOURCE omxilcomponentapiperformancetrace.cpp +#endif + +USERINCLUDE ../src/core + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +OS_LAYER_ESTLIB_SYSTEMINCLUDE + + +LIBRARY euser.lib +LIBRARY ecom.lib +LIBRARY inetprotutil.lib +LIBRARY estlib.lib + +// MACRO _OMXIL_CORESERVER_DEBUG_TRACING_ON + +DEFFILE omxilcoreserver.def +NOSTRICTDEF + +SMPSAFE diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/mmpfiles/omxilsymbiancontentpipeif.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/mmpfiles/omxilsymbiancontentpipeif.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,28 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "../src/core/omxiluids.hrh" + +TARGET omxilsymbiancontentpipeif.lib +TARGETTYPE LIB +UID KUidOmxILSymbianContentPipeIfLib +VENDORID 0x70000001 + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +SOURCEPATH ../src/core +SOURCE omxilsymbiancontentpipeif.cpp + +SMPSAFE diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/mmpfiles/omxilsymbianloaderif.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/mmpfiles/omxilsymbianloaderif.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,28 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "../src/core/omxiluids.hrh" + +TARGET omxilsymbianloaderif.lib +TARGETTYPE LIB +UID KUidOmxILLoaderLib +VENDORID 0x70000001 + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +SOURCEPATH ../src/core +SOURCE omxilsymbianloaderif.cpp + +SMPSAFE diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/OSTOMXILFrameworkTrace.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/OSTOMXILFrameworkTrace.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,219 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __OSTOMXILFRAMEWORKTRACE_H +#define __OSTOMXILFRAMEWORKTRACE_H + +/** +Enable this macro to compile in the OMX-IL peformance trace points that trace out all the performance +use-cases. +*/ + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + +/* + * ComponentId Default + * must be defined before + * Include this header file from exe specific header file that defines EXECUTABLE_DEFAULT_COMPONENTID + */ + +#include +#include + +#define MAKESTRING(str) (#str) +#define BLANK_STR (& (_L8("") ) ) + + +const TUint ADDITIONAL_INFO_SIZE = 100; + +const TClassificationAll EPerFormanceTraceClassification = ESystemCharacteristicMetrics; +const static TComponentId KTracePerformanceTraceUID= 0x100039e4; + +/** +This defines trace attributes to be used by trace points within OMX-IL. +*/ +namespace Ost_OMXIL_Performance + { + + // Enumerates all the OMX commands that are traced for performance, + enum OMX_PERFORMANCE_USECASES + { + E_Init = 0, + E_DeInit, + E_GetHandle, + E_GetParam, + E_SetParam, + E_SendCommand, + E_SetupTunnel, + E_GetConfig, + E_SetConfig, + E_FreeHandle, + E_Event, + E_GetContentPipe, + E_GetComponentsOfRole, + E_GetRolesOfComponent, + E_ComponentNameEnum, + E_AllocateBuffer, + E_EmptyThisBuffer, + E_ComponentTunnelRequest, + E_FillThisBuffer, + E_FreeBuffer, + E_UseBuffer, + E_GetComponentVersion, + E_GetExtensionIndex, + E_ComponentDeInit, + E_SetCallbacks, + E_EmptyBufferDone, + E_FillBufferDone + }; + + /* This defines the format of the performance trace packets + * %d :TTraceID + * %s :OMX_PERFORMANCE_USE_CASES (this is still a C style string at the moment) + * %d :ErrorCode + * %S :Additional information [Optional] + */ + _LIT8(K_OMX_PerformanceTraceFormat,"%u;%s;%u;%S"); + + + /* This defines the format of the performance trace packets (minimum) usually used for OMX-IL API start + * %d :TTraceID + * %s :OMX_PERFORMANCE_USE_CASES (this is still a C style string at the moment) + */ + _LIT8(K_OMX_PerformanceTraceFormatMin,"%u;%s;"); + + /* This defines the format of the performance trace packets to mark use case start and End + * %d :TTraceID + * %S :OMX_PERFORMANCE_USE_CASES + */ + _LIT8(K_OMX_UseCasePerformanceTraceFormat, "%u;%S"); + + + //****************** Additional information trace packet format **************** + /* This defines the format of the performance trace packets + * %s :role + * %u :number of components + */ + _LIT8(K_RoleInfo,"%s;%u"); + + /* This defines format of the additional information section of the EMeasurementEnd:E_GetHandle + * get handle packet + * %u :Component Handle + * %s :component Name + + */ + _LIT8(K_HandleInfo, "%u;%s"); + + /* This defines format of the additional information section of the EMeasurementEnd:E_SendCommand + * get handle packet + * %u :Component Handle + * %d :Command + * %d :aParam1 + */ + _LIT8(K_OMXSendCommandInfo, "%u;%u;%u"); + + + /* This defines format of the additional information section of the EMeasurementEnd:E_GetHandle + * get handle packet + * %u : component + * %d : OmxIndex Type + * + * NOTE: This shares additional info packet format as EMeasurementEnd:SetParameter + * This shares additional info packet format as EMeasurementEnd:GetConfig + * This shares additional info packet format as EMeasurementEnd:SetConfig + */ + _LIT8(K_GetParameterInfo, "%u;%u"); + + + /* This defines format of the additional information section of the EMeasurementEnd:E_Event + * get handle packet + * %u :Component Handle + * %u :Event + * %u :aParam1 + * %u :aParam2 + */ + _LIT8(K_OMXEventNotificationInfo, "%u;%u;%u;%u"); + + + + /* This defines format of the additional information section of the EMeasurementEnd:K_TunnelSetupInfo + * get handle packet + * %u :Source Component Handle + * %u :source port + * %u :Sink Component Handle + * %u :sink port + */ + _LIT8(K_TunnelSetupInfo, "%u;%u;%u;%u"); + + + /* This defines format of the additional information section of the EMeasurementEnd:E_FreeHandle + * get handle packet + * %u :Component Handle + */ + _LIT8(K_HandleOnlyInfo, "%u"); + + + enum TTraceId + { + /** + This format is used in all performance trace packets generated by OMX-IL + + SymTraceFormatString "%d;%s;%s" + */ + EMeasurementStart = KInitialClientFormat, + + /** + This format is used in performance trace packets generated by OMX-IL + SymTraceFormatString "%d;%s;%s" + */ + EMeasurementEnd, + + /** + This format is used in performance trace packets generated by OMX-IL to mark + Where the higher level test. started from. + + SymTraceFormatString "%d;%s" + */ + EUseCaseStart, + + /** + This format is used in performance trace packets generated by OMX-IL to mark + Where the higher level test ends. + + + SymTraceFormatString "%d;%s" + */ + EUseCaseEnd, + + + /** + Provided to allow the following compile time assert. + */ + ETraceIdHighWaterMark, + }; + __ASSERT_COMPILE(ETraceIdHighWaterMark <= KMaxTraceId + 1); + + } // end of namespace OstComponentOSTDemo + + +// Normal PC and ContextId Defaults +// Note these are the same as the ones provided by OST +#define EXECUTABLE_DEFAULT_HAS_THREAD_IDENTIFICATION EAddThreadIdentification +#define EXECUTABLE_DEFAULT_HAS_PC ENoPc +#include + + +#endif //SYMBIAN_PERF_TRACE_OMX_IL +#endif //OSTOMXILFRAMEWORKTRACE_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/log.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/log.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,146 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __SWI_LOG_H__ +#define __SWI_LOG_H__ + +#include + +class TTruncateOverflowHandler16 : public TDes16Overflow + { + public: + virtual void Overflow( TDes16& aDes ); + }; + +inline void TTruncateOverflowHandler16::Overflow( TDes16& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +class TTruncateOverflowHandler8 : public TDes8Overflow + { + public: + virtual void Overflow( TDes8& aDes ); + }; + +inline void TTruncateOverflowHandler8::Overflow( TDes8& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +namespace DSD +{ + +#ifdef _DEBUG + +#ifdef _OMXIL_CORESERVER_DEBUG_TRACING_ON + +#define DEBUG_PRINTF(a) {DSD::DebugPrintf(__LINE__, __FILE__, a);} +#define DEBUG_PRINTF2(a, b) {DSD::DebugPrintf(__LINE__, __FILE__, a, b);} +#define DEBUG_PRINTF3(a, b, c) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c);} +#define DEBUG_PRINTF4(a, b, c, d) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d);} +#define DEBUG_PRINTF5(a, b, c, d, e) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d, e);} + +#define DEBUG_CODE_SECTION(a) TRAP_IGNORE({ a; }) + +// UTF-8 overload of the DebufPrintf method. Should be used by default, +// since it's cheaper both in CPU cycles and stack space. + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler8 overflowHandler8; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<1024> buffer; + _LIT8(KSwiLogPrefix, "[ core ] "); + _LIT8(KSwiLineFileFormat, "TID[%d] : [%s:%d] -- "); + buffer.Append(KSwiLogPrefix); + RThread thread; + TUint threadId = thread.Id(); + thread.Close(); + RProcess proc; + TFileName fName = proc.FileName(); + proc.Close(); + buffer.AppendFormat(KSwiLineFileFormat, threadId, aFile, aLine); + buffer.AppendFormatList(aFormat, list ,&overflowHandler8 ); + buffer.Append(_L8("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } + +// Unicode DebufPrintf overload + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler16 overflowHandler16; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<256> header; + _LIT8(KSwiLogPrefix, "[ core ] "); + _LIT8(KSwiLineFileFormat, "%Ld Line: % 5d, File: %s -- "); + header.Append(KSwiLogPrefix); + header.AppendFormat(KSwiLineFileFormat, now.Int64(), aLine, aFile); + + TBuf<1024> buffer; + buffer.Copy(header); + buffer.AppendFormatList(aFormat, list ,&overflowHandler16); + buffer.Append(_L("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + + +} // namespace DSD + +#endif // __SWI_LOG_H__ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxilcomponentapiperformancetrace.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxilcomponentapiperformancetrace.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1174 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This class is provides performance trace wrappers around OpenMax IL APIs. +* This class shall not be instantiated. +* +*/ + +#include "omxilcomponentapiperformancetrace.h" +#include + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 +#include "..\..\traces\OstTraceDefinitions.h" + +#ifdef OST_TRACE_COMPILER_IN_USE +#include "omxilComponentapiperformancetraceTraces.h" +#endif + +#endif + + + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_GetConfig( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_INDEXTYPE anIndex, + OMX_INOUT OMX_PTR apComponentConfigStructure) + { + OMX_ERRORTYPE error = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetConfig1, "GetConfig >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetConfig) ); +#endif + + if(ahComponent) + { + OMX_COMPONENTTYPE* pComp = ResolveCallsToComponent(ahComponent); + error = pComp->GetConfig(pComp, anIndex, apComponentConfigStructure); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 GetConfigInfo; + // uses the shares same additional information format as the GetParameter measurement End format. + GetConfigInfo.Format(Ost_OMXIL_Performance::K_GetParameterInfo , ahComponent, anIndex); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetConfig), error ,&GetConfigInfo); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt4(TRACE_API, _GetConfig2, "GetConfig < ReturnVal=%{OMX_ERRORTYPE} Component=%p Index=%{OMX_INDEXTYPE} pComponentConfigStructure=%p", + (TUint)error, ahComponent, (TUint)anIndex, apComponentConfigStructure); + if (apComponentConfigStructure) + { + OMX_U32* const pStructSize = + reinterpret_cast(apComponentConfigStructure); + OstTraceData(TRACE_API_DUMP_STRUCT, _GetConfig3, "Config Struct: %{hex8[]}", apComponentConfigStructure, (TUint)(*pStructSize)) ; + } +#endif + + return error; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_SetConfig( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_INDEXTYPE anIndex, + OMX_IN OMX_PTR apComponentConfigStructure) + { + OMX_ERRORTYPE error = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _SetConfig1, "SetConfig >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_SetConfig) ); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE* pComp = ResolveCallsToComponent(ahComponent); + error = pComp->SetConfig(pComp, anIndex, apComponentConfigStructure); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 SetConfigInfo; + // uses the shares same additional information format as the GetParameter measurement End format. + SetConfigInfo.Format(Ost_OMXIL_Performance::K_GetParameterInfo , ahComponent, anIndex); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_SetConfig), error ,&SetConfigInfo); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt4(TRACE_API, _SetConfig2, "SetConfig < ReturnVal=%{OMX_ERRORTYPE} Component=%p Index=%{OMX_INDEXTYPE} pComponentConfigStructure=%p", + (TUint)error, ahComponent, (TUint)anIndex, apComponentConfigStructure) ; + if (apComponentConfigStructure) + { + OMX_U32* const pStructSize = + reinterpret_cast(apComponentConfigStructure); + + OstTraceData(TRACE_API_DUMP_STRUCT, _SetConfig3, "Config Struct: %{hex8[]}", apComponentConfigStructure, (TUint)(*pStructSize)) ; + } + +#endif + + return error; +} + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_GetState( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_OUT OMX_STATETYPE* apState) + { + OMX_ERRORTYPE error = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetState1, "GetState >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetState)); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE* pComp = ResolveCallsToComponent(ahComponent); + error = pComp->GetState(pComp, apState); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 SetStateInfo; + // uses the shares same additional information format as the GetParameter measurement End format. + SetStateInfo.Format(Ost_OMXIL_Performance::K_GetParameterInfo , ahComponent, apState); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetState), error ,&SetStateInfo); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt3( TRACE_API, _GetState2, "GetState < ReturnVal=%{OMX_ERRORTYPE} Component=%p pState=%{OMX_STATETYPE}", + (TUint)error, ahComponent, (TUint)(apState)? *apState:0 ); +#endif + + return error; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_GetParameter( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_INDEXTYPE anParamIndex, + OMX_INOUT OMX_PTR aComponentParameterStructure) +{ + OMX_ERRORTYPE error = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetParameter1, "GetParameter >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetParam)); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE* pComp = ResolveCallsToComponent(ahComponent); + error = pComp->GetParameter(pComp, anParamIndex, aComponentParameterStructure); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + // uses the shares same additional information format as the GetParameter measurement End format. + TBuf8 GetParamerInfo; + GetParamerInfo.Format(Ost_OMXIL_Performance::K_GetParameterInfo , ahComponent, anParamIndex); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetParam), error ,&GetParamerInfo); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + if (anParamIndex == OMX_IndexParamPortDefinition) + { + OMX_PARAM_PORTDEFINITIONTYPE* portPtr = static_cast(aComponentParameterStructure); + + OstTraceExt5( TRACE_API, _GetParameter2, "GetParameter(OMX_IndexParamPortDefinition) < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPortIndex=%u nBufferCountActual=%u nBufferSize=%u", + (TUint)error, ahComponent, (TUint)(portPtr->nPortIndex), (TUint)(portPtr->nBufferCountActual), (TUint)(portPtr->nBufferSize)); + } + else if (anParamIndex == OMX_IndexParamCompBufferSupplier) + { + OMX_PARAM_BUFFERSUPPLIERTYPE* bufPtr = static_cast(aComponentParameterStructure); + OstTraceExt4( TRACE_API, _GetParameter3, "GetParameter(OMX_IndexParamCompBufferSupplier) < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPortIndex=%u eBufferSupplier=%{OMX_BUFFERSUPPLIERTYPE}", + (TUint)error, ahComponent, (TUint)(bufPtr->nPortIndex), (TUint)(bufPtr->eBufferSupplier)); + } + else if (anParamIndex > OMX_IndexKhronosExtensions) + { + OstTraceExt4( TRACE_API, _GetParameter4, "GetParameter(Vendor specific index)< ReturnVal=%{OMX_ERRORTYPE} Component=%p nParamIndex=%u aComponentParameterStructure=%p", + (TUint)error, ahComponent, (TUint)(anParamIndex), aComponentParameterStructure ); + } + else + { + OstTraceExt4( TRACE_API, _GetParameter5, "GetParameter < ReturnVal=%{OMX_ERRORTYPE} Component=%p nParamIndex=%{OMX_INDEXTYPE} aComponentParameterStructure=%p", + (TUint)error, ahComponent, (TUint)(anParamIndex), aComponentParameterStructure ); + } + if (aComponentParameterStructure) + { + OMX_U32* const pStructSize = + reinterpret_cast(aComponentParameterStructure); + OstTraceData(TRACE_API_DUMP_STRUCT, _GetParameter6, "Param Struct: %{hex8[]}", aComponentParameterStructure, (TUint)(*pStructSize)) ; + } +#endif + + return error; +} + + +OMX_ERRORTYPE OMXILAPITraceWrapper::PrepareTraceStructuresL( OMX_INOUT OMX_HANDLETYPE& aClientHandle, + OMX_INOUT OMX_CALLBACKTYPE*& aTraceCallBack, + COMPONENT_REF*& aCompRefToClient, + COMPONENT_REF*& aCompRefToTrace) + { + + // create a new OMX_COMPONENTTYPE that will be handed to the client + aClientHandle = reinterpret_cast( new (ELeave) OMX_COMPONENTTYPE ); + + CleanupStack::PushL(aClientHandle); + aTraceCallBack = new (ELeave)OMX_CALLBACKTYPE; + CleanupStack::PushL(aTraceCallBack); + // create the structure to glue the clients Handle and the callback + aCompRefToClient = new (ELeave) COMPONENT_REF; + CleanupStack::PushL(aCompRefToClient); + aCompRefToTrace = new (ELeave) COMPONENT_REF; + + + CleanupStack::Pop(3, aClientHandle); + + //populate the callback structure with the Trace functions + aTraceCallBack->EventHandler = Trace_EventHandler; + aTraceCallBack->EmptyBufferDone = Trace_EmptyBufferDone; + aTraceCallBack->FillBufferDone = Trace_FillBufferDone; + + return OMX_ErrorNone; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::UndoPrepareTraceStructures( OMX_INOUT OMX_HANDLETYPE& aClientHandle, + OMX_INOUT OMX_CALLBACKTYPE*& aTraceCallBack, + COMPONENT_REF*& aCompRefToClient, + COMPONENT_REF*& aCompRefToTrace) + { + // + + delete aTraceCallBack; + aTraceCallBack= NULL; + delete aClientHandle; + aClientHandle= NULL; + delete aCompRefToClient; + aCompRefToClient=NULL; + delete aCompRefToTrace ; + aCompRefToTrace=NULL; + return OMX_ErrorNone; + } + +TInt OMXILAPITraceWrapper::PatchStructures( OMX_IN OMX_HANDLETYPE ahClientComp, + OMX_IN OMX_CALLBACKTYPE* apClientCallBack, + OMX_IN OMX_HANDLETYPE ahTraceComp, + OMX_INOUT OMX_CALLBACKTYPE* apTraceCallBack, + COMPONENT_REF*& aCompRefToClient, + COMPONENT_REF*& aCompRefToTrace) + { + + OMX_COMPONENTTYPE *pClientComp = reinterpret_cast< OMX_COMPONENTTYPE *>(ahClientComp); + OMX_COMPONENTTYPE *pTraceComp = reinterpret_cast< OMX_COMPONENTTYPE *>(ahTraceComp); + + aCompRefToClient->pComponentIF = pClientComp; + aCompRefToClient->pCallbacks = apClientCallBack; + + aCompRefToTrace->pComponentIF = pTraceComp; + aCompRefToTrace->pCallbacks = apTraceCallBack; + + // the client component reference is stored in the Trace Handle's pApplicationPrivate + pTraceComp->pApplicationPrivate = reinterpret_cast(aCompRefToClient); + + pClientComp->nSize = sizeof(OMX_COMPONENTTYPE); + pClientComp->nVersion = pTraceComp->nVersion; + // the trace component reference is stored in the client's Handle pComponentPrivate + pClientComp->pComponentPrivate = reinterpret_cast(aCompRefToTrace); + + + /* Set function pointers to wrapper functions */ + pClientComp->AllocateBuffer = OMXILAPITraceWrapper::Trace_AllocateBuffer; + pClientComp->ComponentTunnelRequest = OMXILAPITraceWrapper::Trace_ComponentTunnelRequest; + pClientComp->EmptyThisBuffer = OMXILAPITraceWrapper::Trace_EmptyThisBuffer; + pClientComp->FillThisBuffer = OMXILAPITraceWrapper::Trace_FillThisBuffer; + pClientComp->FreeBuffer = OMXILAPITraceWrapper::Trace_FreeBuffer; + pClientComp->GetComponentVersion = OMXILAPITraceWrapper::Trace_GetComponentVersionL; + pClientComp->GetExtensionIndex = OMXILAPITraceWrapper::Trace_GetExtensionIndexL; + pClientComp->ComponentDeInit = OMXILAPITraceWrapper::Trace_ComponentDeInit; + pClientComp->SetCallbacks = OMXILAPITraceWrapper::Trace_SetCallbacks; + pClientComp->UseBuffer = OMXILAPITraceWrapper::Trace_UseBuffer; + + pClientComp->GetConfig = OMXILAPITraceWrapper::Trace_GetConfig; + pClientComp->GetParameter = OMXILAPITraceWrapper::Trace_GetParameter; + pClientComp->GetState = OMXILAPITraceWrapper::Trace_GetState; + pClientComp->SendCommand = OMXILAPITraceWrapper::Trace_SendCommand; + pClientComp->SetConfig = OMXILAPITraceWrapper::Trace_SetConfig; + pClientComp->SetParameter = OMXILAPITraceWrapper::Trace_SetParameter; + + pClientComp->UseEGLImage = OMXILAPITraceWrapper::Trace_UseEGLImage; + pClientComp->ComponentRoleEnum = OMXILAPITraceWrapper::Trace_ComponentRoleEnum; + + return KErrNone; + } + +TInt OMXILAPITraceWrapper::ComponentTracerDestroy(OMX_IN OMX_HANDLETYPE ahClientComp) + { + // resolve the wrapper callbacks used by the component and delete it + COMPONENT_REF* pTraceCompRef = reinterpret_cast ((reinterpret_cast(ahClientComp))->pComponentPrivate ); + delete pTraceCompRef->pCallbacks; + + //resolve and delete the OMX_COMPONENTTYPE structure passed to the client + COMPONENT_REF* pClientCompRef = reinterpret_cast ((pTraceCompRef->pComponentIF)->pApplicationPrivate); + delete ahClientComp; + + // delete the glues + delete pClientCompRef; + pClientCompRef=NULL; + delete pTraceCompRef; + pTraceCompRef=NULL; + + return KErrNone; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_SetParameter( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_INDEXTYPE anIndex, + OMX_IN OMX_PTR aComponentParameterStructure) + { +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _SetParameter1, "SetParameter >" ); +#endif + + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_SetParam) ); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->SetParameter(pComp, anIndex, aComponentParameterStructure); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 setParamerInfo; + setParamerInfo.Format(Ost_OMXIL_Performance::K_GetParameterInfo , ahComponent, anIndex); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_SetParam), omxError ,&setParamerInfo); + +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + if (anIndex == OMX_IndexParamPortDefinition) + { + OMX_PARAM_PORTDEFINITIONTYPE* portPtr = static_cast(aComponentParameterStructure); + + OstTraceExt5( TRACE_API, _SetParameter2, "SetParameter(OMX_IndexParamPortDefinition) < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPortIndex=%u nBufferCountActual=%u nBufferSize=%u", + (TUint)omxError, ahComponent, (TUint)(portPtr->nPortIndex), (TUint)(portPtr->nBufferCountActual), (TUint)(portPtr->nBufferSize)); + } + else if (anIndex == OMX_IndexParamCompBufferSupplier) + { + OMX_PARAM_BUFFERSUPPLIERTYPE* bufPtr = static_cast(aComponentParameterStructure); + OstTraceExt4( TRACE_API, _SetParameter3, "SetParameter(OMX_IndexParamCompBufferSupplier) < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPortIndex=%u eBufferSupplier=%{OMX_BUFFERSUPPLIERTYPE}", + (TUint)omxError, ahComponent, (TUint)(bufPtr->nPortIndex), (TUint)(bufPtr->eBufferSupplier)); + } + else if (anIndex > OMX_IndexKhronosExtensions) + { + OstTraceExt4( TRACE_API, _SetParameter4, "SetParameter(Vendor specific index) < ReturnVal=%u Component=%p nParamIndex=%u aComponentParameterStructure=%p", + (TUint)omxError, ahComponent, (TUint)(anIndex), aComponentParameterStructure ); + } + else + { + OstTraceExt4( TRACE_API, _SetParameter5, "SetParameter < ReturnVal=%u Component=%p nParamIndex=%{OMX_INDEXTYPE} aComponentParameterStructure=%p", + (TUint)omxError, ahComponent, (TUint)(anIndex), aComponentParameterStructure ); + } + + if (aComponentParameterStructure) + { + OMX_U32* const pStructSize = + reinterpret_cast(aComponentParameterStructure); + OstTraceData(TRACE_API_DUMP_STRUCT, _SetParameter6, "Param Struct: %{hex8[]}", aComponentParameterStructure, (TUint)(*pStructSize)) ; + } +#endif + + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_SendCommand( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_COMMANDTYPE aCmd, + OMX_IN OMX_U32 anParam1, + OMX_IN OMX_PTR apCmdData) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _SendCommand1, "SendCommand >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_SendCommand)); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->SendCommand(pComp, aCmd, anParam1, apCmdData); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 SendCmdInfo; + SendCmdInfo.Format(Ost_OMXIL_Performance::K_OMXSendCommandInfo, ahComponent, aCmd, anParam1); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_SendCommand), omxError ,&SendCmdInfo); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + switch (aCmd) + { + case OMX_CommandStateSet: + { + OstTraceExt5( TRACE_API, _SendCommand2, + "SendCommand < ReturnVal=%{OMX_ERRORTYPE} Component=%p aCmd=%{OMX_COMMANDTYPE} anParam1=%{OMX_STATETYPE} apCmdData=%p", + (TUint)omxError, ahComponent, (TUint)aCmd, (TUint)anParam1, apCmdData); + } + break; + case OMX_CommandFlush: + case OMX_CommandPortDisable: + case OMX_CommandPortEnable: + case OMX_CommandMarkBuffer: + { + if (anParam1 == OMX_ALL) + { + OstTraceExt4( TRACE_API, _SendCommand3, + "SendCommand < ReturnVal=%{OMX_ERRORTYPE} Component=%p aCmd=%{OMX_COMMANDTYPE} anParam1=OMX_ALL apCmdData=%p", + (TUint)omxError, ahComponent, (TUint)aCmd, apCmdData); + } + else + { + OstTraceExt5( TRACE_API, _SendCommand4, + "SendCommand < ReturnVal=%{OMX_ERRORTYPE} Component=%p aCmd=%{OMX_COMMANDTYPE} anParam1=%u apCmdData=%p", + (TUint)omxError, ahComponent, (TUint)aCmd, (TUint)anParam1, apCmdData); + } + } + break; + default: + { + OstTraceExt5( TRACE_API, _SendCommand6, + "SendCommand < ReturnVal=%{OMX_ERRORTYPE} Component=%p aCmd=%{OMX_COMMANDTYPE} anParam1=%u apCmdData=%p", + (TUint)omxError, ahComponent, (TUint)aCmd, (TUint)anParam1, apCmdData); + } + }; +#endif + + return omxError; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_AllocateBuffer( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_INOUT OMX_BUFFERHEADERTYPE** apBuffer, + OMX_IN OMX_U32 anPortIndex, + OMX_IN OMX_PTR apAppPrivate, + OMX_IN OMX_U32 anSizeBytes) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API_BUFFER, _AllocateBuffer1, "AllocateBuffer >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_AllocateBuffer)); +#endif + + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->AllocateBuffer(pComp, apBuffer, anPortIndex, apAppPrivate, anSizeBytes); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_AllocateBuffer), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt5( TRACE_API_BUFFER, _AllocateBuffer2, "AllocateBuffer < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPortIndex=%u pBuffer=%p nSizeBytes=%u ", + (TUint)omxError, ahComponent, (TUint)anPortIndex, (apBuffer)? *apBuffer:0, (TUint)anSizeBytes ); +#endif + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_EmptyThisBuffer( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_BUFFERHEADERTYPE* apBuffer) + { + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API_BUFFER, _EmptyThisBuffer1, "EmptyThisBuffer >" ); +#endif + OMX_ERRORTYPE omxError =OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_EmptyThisBuffer)); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->EmptyThisBuffer(pComp, apBuffer); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_EmptyThisBuffer), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + if (apBuffer) + { + OstTraceExt5( TRACE_API_BUFFER, _EmptyThisBuffer2, + "EmptyThisBuffer < ReturnVal=%{OMX_ERRORTYPE} Component=%p pBufferHeader=%p nPortIndex=%u nFilledLen=%u", + (TUint)omxError, ahComponent, apBuffer, (TUint)apBuffer->nOutputPortIndex, (TUint)apBuffer->nFilledLen ); + OstTraceData(TRACE_API_DUMP_STRUCT, _EmptyThisBuffer3, + "Buffer Header Struct: %{hex8[]}", + apBuffer, (TUint)(apBuffer->nSize)) ; + } +#endif + + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_ComponentTunnelRequest( + OMX_IN OMX_HANDLETYPE ahComp, + OMX_IN OMX_U32 anPort, + OMX_IN OMX_HANDLETYPE ahTunneledComp, + OMX_IN OMX_U32 anTunneledPort, + OMX_INOUT OMX_TUNNELSETUPTYPE* apTunnelSetup) + { + OMX_ERRORTYPE omxError =OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _ComponentTunnelRequest1, "ComponentTunnelRequest >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_ComponentTunnelRequest)); +#endif + if(ahComp) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComp); + omxError = pComp->ComponentTunnelRequest(pComp, anPort, ahTunneledComp, anTunneledPort, apTunnelSetup); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComp ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_ComponentTunnelRequest), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt5( TRACE_API, _ComponentTunnelRequest2, "ComponentTunnelRequest < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPort=%u hTunneledComp=%u nTunneledPort=%u", + (TUint)omxError, ahComp, (TUint)anPort, ahTunneledComp, (TUint)anTunneledPort ); +#endif + + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_FillThisBuffer( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_BUFFERHEADERTYPE* apBuffer) + { + + OMX_ERRORTYPE omxError =OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API_BUFFER, _FillThisBuffer1, "FillThisBuffer >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_FillThisBuffer)); +#endif + + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->FillThisBuffer(pComp, apBuffer); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_FillThisBuffer), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + if (apBuffer) + { + OstTraceExt5( TRACE_API_BUFFER, _FillThisBuffer2, + "FillThisBuffer < ReturnVal=%{OMX_ERRORTYPE} Component=%p pBufferHeader=%p nPortIndex=%u nFilledLen=%u", + (TUint)omxError, ahComponent, apBuffer, (TUint)apBuffer->nOutputPortIndex, (TUint)apBuffer->nFilledLen ); + OstTraceData(TRACE_API_DUMP_STRUCT, _FillThisBuffer3, + "Buffer Header Struct: %{hex8[]}", + apBuffer, (TUint)(apBuffer->nSize)) ; + } +#endif + return omxError; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_FreeBuffer( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_U32 anPortIndex, + OMX_IN OMX_BUFFERHEADERTYPE* apBuffer) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API_BUFFER, _FreeBuffer1, "FreeBuffer >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_FreeBuffer)); +#endif + + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->FreeBuffer(pComp, anPortIndex, apBuffer); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_FreeBuffer), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + if (apBuffer) + { + OstTraceExt4( TRACE_API_BUFFER, _FreeBuffer2, "FreeBuffer < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPortIndex=%u pBufferHeader=%p", + (TUint)omxError,ahComponent, (TUint)anPortIndex ,apBuffer ); + OstTraceData(TRACE_API_DUMP_STRUCT, _FreeBuffer3, + "Buffer Header Struct: %{hex8[]}", + apBuffer, (TUint)(apBuffer->nSize)) ; + } +#endif + + return omxError; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_UseBuffer( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_INOUT OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_IN OMX_U32 anPortIndex, + OMX_IN OMX_PTR apAppPrivate, + OMX_IN OMX_U32 anSizeBytes, + OMX_IN OMX_U8* apBuffer) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API_BUFFER, _UseBuffer1, "UseBuffer >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_UseBuffer)); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->UseBuffer(pComp, appBufferHdr, anPortIndex, apAppPrivate, anSizeBytes, apBuffer); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_UseBuffer), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt5( TRACE_API_BUFFER, _UseBuffer2, "UseBuffer < ReturnVal=%{OMX_ERRORTYPE} Component=%p nPortIndex=%u pBuffer=%p nSizeBytes=%u ", + (TUint)omxError, ahComponent, (TUint)anPortIndex, (apBuffer)? *apBuffer:0, (TUint)anSizeBytes ); +#endif + + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_GetComponentVersionL( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_OUT OMX_STRING apComponentName, + OMX_OUT OMX_VERSIONTYPE* apComponentVersion, + OMX_OUT OMX_VERSIONTYPE* apSpecVersion, + OMX_OUT OMX_UUIDTYPE* apComponentUUID) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetComponentVersion1, "GetComponentVersion >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetComponentVersion)); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->GetComponentVersion(pComp, apComponentName, apComponentVersion, apSpecVersion, apComponentUUID); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetComponentVersion), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + RBuf8 ComponentInfo; + ComponentInfo.CleanupClosePushL(); + + TPtrC8 componentNamePtr(const_cast(reinterpret_cast(apComponentName))); + + TInt len = componentNamePtr.Length(); + + if (len < 0) + { + CleanupStack::PopAndDestroy(&ComponentInfo); + return OMX_ErrorInvalidComponent; + } + + if (ComponentInfo.Create(len)) + { + CleanupStack::PopAndDestroy(&ComponentInfo); + return OMX_ErrorInsufficientResources; + } + + ComponentInfo = reinterpret_cast(apComponentName); + OstTraceExt5( TRACE_API, _GetComponentVersion2, "GetComponentVersion < ReturnVal=%u Component=%p pComponentName=%s pComponentVersion=%u, pSpecVersion=%u", + (TUint)omxError, ahComponent, ComponentInfo, (TUint)((apComponentVersion)? apComponentVersion->nVersion:0), (TUint)((apSpecVersion)?apSpecVersion->nVersion:0) ); + CleanupStack::PopAndDestroy(&ComponentInfo); +#endif + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_ComponentDeInit( + OMX_IN OMX_HANDLETYPE ahComponent) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _ComponentDeInit1, "ComponentDeInit >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_ComponentDeInit)); +#endif + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->ComponentDeInit(pComp); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_ComponentDeInit), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt1( TRACE_API, _ComponentDeInit2, "ComponentDeInit < hComponent=%p", ahComponent ); +#endif + return omxError; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_GetExtensionIndexL( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_STRING acParameterName, + OMX_OUT OMX_INDEXTYPE* apIndexType) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetExtensionIndex1, "GetExtensionIndex >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetExtensionIndex)); +#endif + + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp-> GetExtensionIndex(pComp, acParameterName, apIndexType); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetExtensionIndex), omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + RBuf8 ParamInfo; + + ParamInfo.CleanupClosePushL(); + + TPtrC8 parameterNamePtr(const_cast(reinterpret_cast(acParameterName))); + + TInt len = parameterNamePtr.Length(); + + if (len < 0) + { + CleanupStack::PopAndDestroy(&ParamInfo); + return OMX_ErrorInvalidComponent; + } + + if (ParamInfo.Create(len)) + { + CleanupStack::PopAndDestroy(&ParamInfo); + return OMX_ErrorInsufficientResources; + } + + ParamInfo = reinterpret_cast(acParameterName); + + OstTraceExt4( TRACE_API, _GetExtensionIndex2, "GetComponentVersion < ReturnVal=%x Component=%p pComponentName=%s pIndexType=%{OMX_INDEXTYPE}", + (TUint)omxError, ahComponent, ParamInfo, (TUint)((apIndexType)? apIndexType:0) ); + + CleanupStack::PopAndDestroy(&ParamInfo); +#endif + + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_SetCallbacks( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_CALLBACKTYPE* apCallbacks, + OMX_IN OMX_PTR apAppData) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _SetCallbacks1, "SetCallbacks >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_SetCallbacks)); +#endif + + if(ahComponent) + { + // need to access the reference to the internal trace inteface + COMPONENT_REF* pTraceCompRef = reinterpret_cast(reinterpret_cast(ahComponent)->pComponentPrivate ) ; + + // now access the client's interface and repopulate its callback + COMPONENT_REF* pClientCompRef = reinterpret_cast(pTraceCompRef->pComponentIF->pApplicationPrivate); + + pClientCompRef->pCallbacks->EmptyBufferDone = apCallbacks->EmptyBufferDone; + pClientCompRef->pCallbacks->EventHandler = apCallbacks->EventHandler; + pClientCompRef->pCallbacks->FillBufferDone = apCallbacks->FillBufferDone; + + // send pAppData to the component. The callback sent to the component does not change as this is internally + // maintained , the client has no visibility of this trace wrapper interface callback + omxError = pTraceCompRef->pComponentIF->SetCallbacks(pTraceCompRef->pComponentIF, pTraceCompRef->pCallbacks, apAppData); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, ahComponent ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_SetCallbacks), 0 ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt4( TRACE_API, _SetCallbacks2, "SetCallbacks < ReturnVal=%{OMX_ERRORTYPE} Component=%p pCallbacks=%p pAppData=%p", + (TUint)omxError,ahComponent, apCallbacks ,apAppData ); +#endif + + return omxError; + } + + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_EventHandler( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_IN OMX_PTR apAppData, + OMX_IN OMX_EVENTTYPE aeEvent, + OMX_IN OMX_U32 anData1, + OMX_IN OMX_U32 anData2, + OMX_IN OMX_PTR apEventData) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + COMPONENT_REF* pCompRef = NULL; + OMX_COMPONENTTYPE* hComponent = NULL; + + if(ahComponent) + { + pCompRef = ResolveCallsFromComponent(ahComponent); + + if (pCompRef) + { + hComponent = pCompRef->pComponentIF; + omxError = OMX_ErrorNone; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 CmdNotificationInfo; + CmdNotificationInfo.Format(Ost_OMXIL_Performance::K_OMXEventNotificationInfo, hComponent, aeEvent, anData1, anData2 ); + OstPrintf(TTraceContext(KTracePerformanceTraceUID,ESystemCharacteristicMetrics), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_Event),omxError ,&CmdNotificationInfo); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + switch(aeEvent) + { + case OMX_EventCmdComplete: + { + if (anData1 == OMX_CommandStateSet) + { + OstTraceExt5( TRACE_API, _EventHandler2, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%{OMX_COMMANDTYPE} nData2=%{OMX_STATETYPE}", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1, (TUint)anData2 ); + } + else if (anData1 == OMX_CommandPortDisable || anData1 == OMX_CommandPortEnable || anData1 == OMX_CommandFlush) + { + if (anData2 == OMX_ALL) + { + OstTraceExt4( TRACE_API, _EventHandler3, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%{OMX_COMMANDTYPE} nData2=OMX_ALL", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1 ); + } + else + { + OstTraceExt5( TRACE_API, _EventHandler4, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%{OMX_COMMANDTYPE} nData2=%u", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1, (TUint)anData2 ); + } + } + else + { + OstTraceExt5( TRACE_API, _EventHandler5, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%{OMX_COMMANDTYPE} nData2=%u", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1, (TUint)anData2 ); + } + } + break; + case OMX_EventError: + { + OstTraceExt5( TRACE_API, _EventHandler6, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%{OMX_ERRORTYPE} nData2=%u", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1, (TUint)anData2 ); + } + break; + case OMX_EventMark: + { + OstTraceExt4( TRACE_API, _EventHandler7, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} pEventData=%p", + (TUint)omxError,hComponent,(TUint)aeEvent, apEventData ); + } + break; + case OMX_EventPortSettingsChanged: + { + OstTraceExt5( TRACE_API, _EventHandler8, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%u nData2=%u", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1, (TUint)anData2 ); + } + break; + case OMX_EventBufferFlag: + { + OstTraceExt5( TRACE_API, _EventHandler9, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%u nData2=%x", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1, (TUint)anData2 ); + } + break; + default: + { + OstTraceExt5( TRACE_API, _EventHandler10, + "EventHandler < ReturnVal=%{OMX_ERRORTYPE} Component=%p eEvent=%{OMX_EVENTTYPE} anData1=%u nData2=%u", + (TUint)omxError,hComponent,(TUint)aeEvent,(TUint)anData1, (TUint)anData2 ); + } + }; +#endif + } + } + + if(ahComponent) + { + omxError = pCompRef->pCallbacks->EventHandler(hComponent, apAppData, aeEvent, anData1, anData2, apEventData); + } + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_EmptyBufferDone( + OMX_OUT OMX_HANDLETYPE ahComponent, + OMX_OUT OMX_PTR apAppData, + OMX_OUT OMX_BUFFERHEADERTYPE* apBuffer) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + COMPONENT_REF* pCompRef = NULL; + OMX_COMPONENTTYPE* hComponent = NULL; + + if(ahComponent) + { + pCompRef = ResolveCallsFromComponent(ahComponent); + + if (pCompRef) + { + hComponent = pCompRef->pComponentIF; + omxError = OMX_ErrorNone; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt4( TRACE_API_BUFFER, _EmptyBufferDone2, + "EmptyBufferDone < ReturnVal=%{OMX_ERRORTYPE} Component=%p apAppData=%p apBufferHeader=%p", + (TUint)omxError,hComponent,apAppData, apBuffer ); + if (apBuffer) + { + OstTraceData(TRACE_API_DUMP_STRUCT, _EmptyBufferDone3, + "Buffer Header Struct: %{hex8[]}", + apBuffer, (TUint)(apBuffer->nSize)) ; + } +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, hComponent); + OstPrintf(TTraceContext(KTracePerformanceTraceUID,ESystemCharacteristicMetrics), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_EmptyBufferDone),omxError ,&Info); +#endif + } + + } + + if(ahComponent) + { + omxError = pCompRef->pCallbacks->EmptyBufferDone(hComponent, apAppData, apBuffer); + } + + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_FillBufferDone( + OMX_OUT OMX_HANDLETYPE ahComponent, + OMX_OUT OMX_PTR apAppData, + OMX_OUT OMX_BUFFERHEADERTYPE* apBuffer) +{ + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; + COMPONENT_REF* pCompRef = NULL; + OMX_COMPONENTTYPE* hComponent = NULL; + + if(ahComponent) + { + pCompRef = ResolveCallsFromComponent(ahComponent); + + if (pCompRef) + { + hComponent = pCompRef->pComponentIF; + omxError = OMX_ErrorNone; + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + + TBuf8 Info; + Info.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo, hComponent); + OstPrintf(TTraceContext(KTracePerformanceTraceUID,ESystemCharacteristicMetrics), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_FillBufferDone),omxError ,&Info); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt4( TRACE_API_BUFFER, _FillBufferDone2, + "FillBufferDone < ReturnVal=%{OMX_ERRORTYPE} Component=%p apAppData=%p apBufferHeader=%p", + (TUint)omxError, hComponent,apAppData, apBuffer ); + if (apBuffer) + { + OstTraceData(TRACE_API_DUMP_STRUCT, _FillBufferDone3, + "Buffer Header Struct: %{hex8[]}", + apBuffer, (TUint)(apBuffer->nSize)) ; + } +#endif + } + } + + if(ahComponent) + { + omxError = pCompRef->pCallbacks->FillBufferDone(pCompRef->pComponentIF, apAppData, apBuffer); + } + return omxError; +} + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_UseEGLImage( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_INOUT OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_IN OMX_U32 aPortIndex, + OMX_IN OMX_PTR apAppPrivate, + OMX_IN void* aeglImage) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _UseEGLImage1, "UseEGLImage >" ); +#endif + + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->UseEGLImage(ahComponent, appBufferHdr, aPortIndex, apAppPrivate, aeglImage ); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt5( TRACE_API, _UseEGLImage2, "UseEGLImage < ReturnVal=%{OMX_ERRORTYPE} Component=%p appBufferHdr=%p nIndex=%u aeglImage=%p", + (TUint)omxError, ahComponent, (appBufferHdr)?*appBufferHdr: 0, (TUint)aPortIndex, aeglImage ); +#endif + return omxError; + } + +OMX_ERRORTYPE OMXILAPITraceWrapper::Trace_ComponentRoleEnum( + OMX_IN OMX_HANDLETYPE ahComponent, + OMX_OUT OMX_U8 *aRole, + OMX_IN OMX_U32 aIndex) + { + OMX_ERRORTYPE omxError = OMX_ErrorBadParameter; +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _ComponentRoleEnum1, "ComponentRoleEnum >" ); +#endif + + if(ahComponent) + { + OMX_COMPONENTTYPE *pComp = ResolveCallsToComponent(ahComponent); + omxError = pComp->ComponentRoleEnum(pComp, aRole, aIndex); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt4( TRACE_API, _ComponentRoleEnum2, "ComponentRoleEnum < ReturnVal=%{OMX_ERRORTYPE} Component=%p cRole=%p nIndex=%u ", + (TUint)omxError, ahComponent, aRole, (TUint)aIndex ); +#endif + return omxError; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxilcomponentapiperformancetrace.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxilcomponentapiperformancetrace.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,144 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This class is provides performance trace wrappers around OpenMax IL APIs. +* This class shall not be instantiated. +* +*/ + + +#ifndef __OMXILCOMPONENTAPIPERFORMANCETRACE_H +#define __OMXILCOMPONENTAPIPERFORMANCETRACE_H + +#include +#include +#include +#include +#include +#include "OSTOMXILFrameworkTrace.h" + + +struct COMPONENT_REF + { + OMX_COMPONENTTYPE* pComponentIF; + OMX_CALLBACKTYPE* pCallbacks; + }; + +/** +@publishedAll +@released + +This class is provides performance trace wrappers around OpenMax IL APIs. +This class shall not be instantiated. +*/ +class OMXILAPITraceWrapper + { +private: + // This class shall not be instantiated or inherited + OMXILAPITraceWrapper (); + OMXILAPITraceWrapper(OMXILAPITraceWrapper& tracewrapper); + +public: + static OMX_ERRORTYPE Trace_ComponentDeInit(OMX_IN OMX_HANDLETYPE hComponent); + static OMX_ERRORTYPE Trace_SetCallbacks(OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_CALLBACKTYPE* apCallbacks,OMX_IN OMX_PTR apAppData); + static OMX_ERRORTYPE Trace_GetExtensionIndexL(OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_STRING acParameterName,OMX_OUT OMX_INDEXTYPE* apIndexType); + static OMX_ERRORTYPE Trace_GetComponentVersionL(OMX_IN OMX_HANDLETYPE ahComponent,OMX_OUT OMX_STRING apComponentName,OMX_OUT OMX_VERSIONTYPE* apComponentVersion,OMX_OUT OMX_VERSIONTYPE* apSpecVersion, OMX_OUT OMX_UUIDTYPE* apComponentUUID); + static OMX_ERRORTYPE Trace_UseBuffer(OMX_IN OMX_HANDLETYPE ahComponent, OMX_INOUT OMX_BUFFERHEADERTYPE** appBufferHdr,OMX_IN OMX_U32 anPortIndex, OMX_IN OMX_PTR apAppPrivate, OMX_IN OMX_U32 anSizeBytes,OMX_IN OMX_U8* apBuffer); + static OMX_ERRORTYPE Trace_FreeBuffer(OMX_IN OMX_HANDLETYPE ahComponent, OMX_IN OMX_U32 anPortIndex,OMX_IN OMX_BUFFERHEADERTYPE* apBuffer); + static OMX_ERRORTYPE Trace_FillThisBuffer(OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_BUFFERHEADERTYPE* apBuffer); + static OMX_ERRORTYPE Trace_ComponentTunnelRequest(OMX_IN OMX_HANDLETYPE ahComp,OMX_IN OMX_U32 anPort,OMX_IN OMX_HANDLETYPE ahTunneledComp,OMX_IN OMX_U32 anTunneledPort,OMX_INOUT OMX_TUNNELSETUPTYPE* apTunnelSetup); + static OMX_ERRORTYPE Trace_EmptyThisBuffer( OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_BUFFERHEADERTYPE* apBuffer); + static OMX_ERRORTYPE Trace_AllocateBuffer(OMX_IN OMX_HANDLETYPE ahComponent,OMX_INOUT OMX_BUFFERHEADERTYPE** apBuffer,OMX_IN OMX_U32 anPortIndex,OMX_IN OMX_PTR apAppPrivate,OMX_IN OMX_U32 anSizeBytes); + static OMX_ERRORTYPE Trace_FillBufferDone(OMX_OUT OMX_HANDLETYPE ahComponent,OMX_OUT OMX_PTR apAppData,OMX_OUT OMX_BUFFERHEADERTYPE* apBuffer); + static OMX_ERRORTYPE Trace_GetConfig(OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_INDEXTYPE anIndex,OMX_INOUT OMX_PTR apComponentConfigStructure); + static OMX_ERRORTYPE Trace_SetConfig(OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_INDEXTYPE anIndex,OMX_IN OMX_PTR apComponentConfigStructure); + static OMX_ERRORTYPE Trace_GetState(OMX_IN OMX_HANDLETYPE ahComponent,OMX_OUT OMX_STATETYPE* apState); + static OMX_ERRORTYPE Trace_SendCommand(OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_COMMANDTYPE aCmd,OMX_IN OMX_U32 anParam1,OMX_IN OMX_PTR apCmdData); + static OMX_ERRORTYPE Trace_EmptyBufferDone(OMX_OUT OMX_HANDLETYPE ahComponent,OMX_OUT OMX_PTR pAppData,OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer); + static OMX_ERRORTYPE Trace_EventHandler(OMX_IN OMX_HANDLETYPE ahComponent,OMX_IN OMX_PTR apAppData,OMX_IN OMX_EVENTTYPE aeEvent,OMX_IN OMX_U32 anData1,OMX_IN OMX_U32 anData2,OMX_IN OMX_PTR apEventData); + static OMX_ERRORTYPE Trace_SetParameter( OMX_IN OMX_HANDLETYPE ahComponent, OMX_IN OMX_INDEXTYPE anIndex, OMX_IN OMX_PTR aComponentParameterStructure); + static OMX_ERRORTYPE Trace_GetParameter( OMX_IN OMX_HANDLETYPE ahComponent, OMX_IN OMX_INDEXTYPE anParamIndex,OMX_INOUT OMX_PTR aComponentParameterStructure); + static OMX_ERRORTYPE Trace_UseEGLImage( OMX_IN OMX_HANDLETYPE ahComponent, OMX_INOUT OMX_BUFFERHEADERTYPE** appBufferHdr,OMX_IN OMX_U32 aPortIndex,OMX_IN OMX_PTR apAppPrivate,OMX_IN void* aeglImage); + static OMX_ERRORTYPE Trace_ComponentRoleEnum (OMX_IN OMX_HANDLETYPE ahComponent, OMX_OUT OMX_U8 *aRole, OMX_IN OMX_U32 aIndex); + + /** + Creates all the objects required to make the tracetrampoline work + + @param aClientHandle Trace component handle will be passed passed to the client + @param aTraceCallBack Trace callback structure that is passed to the component + @param aCompRefToClient Keeps track of the real callback and component handle structure + @param aCompRefToTrace Keeps track of the trace callback and component handle structure + */ + + static OMX_ERRORTYPE PrepareTraceStructuresL( OMX_INOUT OMX_HANDLETYPE& aClientHandle, OMX_INOUT OMX_CALLBACKTYPE*& aTraceCallBack, COMPONENT_REF*& aCompRefToClient, COMPONENT_REF*& aCompRefToTrace); + + /** + Cleans up all the objects created for the trace trampoline + + @param aClientHandle Trace component handle that is passed to the client + @param aTraceCallBack Trace callback structure that is passed to the component + @param aCompRefToClient Keeps track of the real callback and component handle structure + @param aCompRefToTrace Keeps track of the trace callback and component handle structure + */ + static OMX_ERRORTYPE UndoPrepareTraceStructures( OMX_INOUT OMX_HANDLETYPE& aClientHandle, OMX_INOUT OMX_CALLBACKTYPE*& aTraceCallBack, COMPONENT_REF*& aCompRefToClient, COMPONENT_REF*& aCompRefToTrace); + + /** + Create a map of the Trace wrapper interface OMX_COMPONENTTYPE handle + OMX_CALLBACKTYPE and the client's + OMX_COMPONENTTYPE handle + OMX_CALLBACKTYPE + + OMX_COMPONENTTYPE:pComponentPrivate is required by the component + OMX_COMPONENTTYPE:pApplicationPrivate is required by the application + This function stores the reference(COMPONENT_REF) to the real OMX_COMPONENTTYPE handle + OMX_CALLBACKTYPE + in the client's OMX_COMPONENTTYPE:pComponentPrivate. + It also stores the clients OMX_COMPONENTTYPE and OMX_CALLBACKTYPE structures which point to the Trace wrapper function pointers + in the Trace Interface's pApplicationPrivate. + + @param ahClientComp original component handle from client + @param apClientCallBack original callback structure from Client + @param ahTraceComp Trace component handle that is passed to the client + @param apTraceCallBack Trace callback structure that is passed to the component + @param aCompRefToClient Keeps track of the real callback and component handle structure + @param aCompRefToTrace Keeps track of the trace callback and component handle structure + */ + static TInt PatchStructures( OMX_IN OMX_HANDLETYPE ahClientComp, OMX_IN OMX_CALLBACKTYPE* apClientCallBack, OMX_IN OMX_HANDLETYPE ahTraceComp, OMX_INOUT OMX_CALLBACKTYPE* apTraceCallBack,COMPONENT_REF*& aCompRefToClient, COMPONENT_REF*& aCompRefToTrace); + + + /** + + The function destroys the extra object that were created for the function tracing. Before the destruction + it has to resolve the resolve the real component handle from the trace component handle. + + @param ahClientComp ahTraceComp Trace component handle that was passed to the client + */ + static TInt ComponentTracerDestroy(OMX_IN OMX_HANDLETYPE ahClientComp); + + /** + This function resolves the bridge between the client's handle to a trace wrapper OMX_COMPONENTTYPE + structure and the real OMX_HANDLETYPE structure populated by the component. + + @param ahComponent Trace component handle that was passed to the client + */ + inline static OMX_COMPONENTTYPE* ResolveCallsToComponent(OMX_IN OMX_HANDLETYPE ahComponent); + + /** + This function resolves the bridge between the components's handle to a trace wrapper OMX_CALLBACKTYPE structure + and the real clients OMX_CALLBACKTYPE structure + + @param ahComponent component handle that was passed to the component + */ + inline static COMPONENT_REF* ResolveCallsFromComponent(OMX_IN OMX_HANDLETYPE ahComponent); + }; + +#include "omxilcomponentapiperformancetrace.inl" + +#endif //__OMXILCOMPONENTAPIPERFORMANCETRACE_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxilcomponentapiperformancetrace.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxilcomponentapiperformancetrace.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,41 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Inline fuction used is OMXILAPITraceWrapper class +* +*/ + + + +#ifndef __OMXILCOMPONENTAPIPERFORMANCETRACE_INL +#define __OMXILCOMPONENTAPIPERFORMANCETRACE_INL + +inline OMX_COMPONENTTYPE* OMXILAPITraceWrapper::ResolveCallsToComponent(OMX_IN OMX_HANDLETYPE ahComponent) + { + OMX_COMPONENTTYPE* pComp = NULL; + if(ahComponent) + { + COMPONENT_REF* pTRaceRef = reinterpret_cast ((reinterpret_cast(ahComponent))->pComponentPrivate ); + pComp = pTRaceRef->pComponentIF; + } + return pComp; + } + +inline COMPONENT_REF* OMXILAPITraceWrapper::ResolveCallsFromComponent(OMX_IN OMX_HANDLETYPE ahComponent) + { + ASSERT(ahComponent); + return reinterpret_cast ((reinterpret_cast(ahComponent))->pApplicationPrivate ); + } + + +#endif //__OMXILCOMPONENTAPIPERFORMANCETRACE_INL diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxilcore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxilcore.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1182 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// +#include +#include +#include +#include +#include +#include + +#include "log.h" +#include "omxilcore.h" +#include "omxiluids.hrh" +#include +#include +#include +#include + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 +#define ENABLE_OMXIL_TRACING +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL +#define ENABLE_OMXIL_TRACING +#endif + + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 +#include "..\..\traces\OstTraceDefinitions.h" + +#ifdef OST_TRACE_COMPILER_IN_USE +#include "OmxilcoreTraces.h" +#endif + +#endif + +#ifdef ENABLE_OMXIL_TRACING +#include "OmxilComponentAPIPerformanceTrace.h" +#endif + + + +#ifdef _DEBUG +// This used only in debug build, for now... +_LIT(KOmxILCorePanic, "OmxILCore Panic"); +#endif + +const TInt KLoadersGranularity = 1; +const TInt KContentPipesGranularity = 1; + +const TUint8 COmxILCore::iSpecVersionMajor; +const TUint8 COmxILCore::iSpecVersionMinor; +const TUint8 COmxILCore::iSpecVersionRevision; +const TUint8 COmxILCore::iSpecVersionStep; + + +COmxILCore::COmxILCore() + : + iLoaders(KLoadersGranularity), + iContentPipes(KContentPipesGranularity) + { + DEBUG_PRINTF(_L8("COmxILCore::COmxILCore")); + } + +COmxILCore::~COmxILCore() + { + DEBUG_PRINTF(_L8("COmxILCore::~COmxILCore")); + } + +OMX_ERRORTYPE COmxILCore::ListLoaders() + { + DEBUG_PRINTF(_L8("COmxILCore::ListLoaders")); + + RImplInfoPtrArray ecomArray; + OMX_ERRORTYPE omxError = OMX_ErrorNone; + TInt error = KErrNone; + TRAP(error, REComSession::ListImplementationsL( + TUid::Uid(KUidOmxILLoaderInterface),ecomArray)); + + if(KErrNone == error) + { + const TInt ecomCount = ecomArray.Count(); + const TInt loadersCount = iLoaders.Count(); + + // We only consider a situation where loader plugins are added to the + // system... + if(ecomCount > loadersCount) + { + TOmxLoaderInfo loader; + CImplementationInformation* info; + TInt indexLoaders; + for(TInt index=0; indexImplementationUid()!= + iLoaders[indexLoaders].iUid); + ++indexLoaders ) + {} + + if(indexLoaders>=loadersCount) + { + loader.iUid = info->ImplementationUid(); + loader.iLoader = NULL; + + // We load loader plugins here, instead of "on-demand"... + omxError = LoadAndInitLoader(loader.iUid, + loader.iLoader); + if (OMX_ErrorNone == omxError) + { + error = iLoaders.Append(loader); + if(KErrNone != error) + { + __ASSERT_DEBUG(loader.iLoader != NULL, + User::Panic(KOmxILCorePanic, 1)); + OMX_LOADERTYPE* omx_loader = + reinterpret_cast(loader.iLoader->Handle()); + __ASSERT_DEBUG(omx_loader != NULL, + User::Panic(KOmxILCorePanic, 1)); + omx_loader->UnInitializeComponentLoader(omx_loader); + delete loader.iLoader; + break; + } + } + else + { + DEBUG_PRINTF3(_L8("COmxILCore::ListLoaders : Loader [%d] returned OMX Error [%d]"), index, omxError); + // Check whether there's any point on continuing with + // the next loader... + if (OMX_ErrorInsufficientResources == omxError) + { + error=KErrNoMemory; + break; + } + else + { + DEBUG_PRINTF3(_L8("COmxILCore::ListLoaders : Loader [%d] returned OMX Error [%d] Ignoring error code as it's no considered critical!"), index, omxError); + omxError=OMX_ErrorNone; //ignore any non-critical errors + } + } + } + } + } + + } + + if (KErrNone != error) + { + if (KErrNoMemory == error) + { + omxError = OMX_ErrorInsufficientResources; + } + else + { + // We should return an OMX error that at least is allowed by the + // spec during OMX_Init() + omxError = OMX_ErrorTimeout; + } + } + + ecomArray.ResetAndDestroy(); + return omxError; + } + +TBool VerifyComponentName(const OMX_STRING aComponentName) + { + const TInt KComponentNamePrefixLen = 4; + return strncmp(aComponentName,"OMX.", KComponentNamePrefixLen) == 0; + } +EXPORT_C OMX_ERRORTYPE COmxILCore::LoadComponent( + const OMX_STRING aComponentName, + OMX_HANDLETYPE* aHandle, + OMX_PTR aAppData, + OMX_CALLBACKTYPE* aCallBacks) + { + OMX_CALLBACKTYPE* pLocCallBacks = aCallBacks; + OMX_ERRORTYPE error = OMX_ErrorNone; + DEBUG_PRINTF(_L8("COmxILCore::LoadComponent")); + +#ifdef ENABLE_OMXIL_TRACING + OMX_HANDLETYPE hClientHandle ; + TBool IsPrepareTraceStructuresLFailure=EFalse; + COMPONENT_REF* pCompRefToClient; + COMPONENT_REF* pCompRefToTrace; +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _LoadComponent1, "OMX_GetHandle >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetHandle)); +#endif + + + if(error == OMX_ErrorNone) + { + if(!aHandle || !aComponentName) + { + error = OMX_ErrorBadParameter; + } + else + { + if( !VerifyComponentName(aComponentName)) + { + error = OMX_ErrorInvalidComponentName; + } + else + { +#ifdef ENABLE_OMXIL_TRACING + TRAPD(Err, OMXILAPITraceWrapper::PrepareTraceStructuresL(hClientHandle, pLocCallBacks, pCompRefToClient, pCompRefToTrace) ); + if(Err != KErrNone) + { + IsPrepareTraceStructuresLFailure = ETrue; + error = OMX_ErrorInsufficientResources; + } +#endif + } + } + } + + if(error == OMX_ErrorNone) + { + error = OMX_ErrorComponentNotFound; + OMX_LOADERTYPE* loader; + + const TInt count = iLoaders.Count(); + for( TInt index=0; index( + iLoaders[index].iLoader->Handle()); + __ASSERT_DEBUG(loader != NULL, User::Panic(KOmxILCorePanic, 1)); + error = loader->LoadComponent(loader, aHandle, + aComponentName, + aAppData, pLocCallBacks); + // if loading the component succeeded we can return else we disregard + // the error on this loader and search for the component with the next + // loader. If this is the last loader the error will be returned at + // the bottom of the function. We return also if there are no resoruces + // available... + if( OMX_ErrorNone == error || OMX_ErrorInsufficientResources == error) + { + break; + } + } + } +#ifdef ENABLE_OMXIL_TRACING + if(error == OMX_ErrorNone) + { + OMXILAPITraceWrapper::PatchStructures(hClientHandle, aCallBacks, *aHandle, pLocCallBacks, pCompRefToClient, pCompRefToTrace); + *aHandle = hClientHandle; + } + else + { + if(!IsPrepareTraceStructuresLFailure) + { + // this means the component was not loaded, do cleanup + OMXILAPITraceWrapper::UndoPrepareTraceStructures(hClientHandle, pLocCallBacks, pCompRefToClient, pCompRefToTrace); + } + } +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 HandleInfomation; + + HandleInfomation.Format(Ost_OMXIL_Performance::K_HandleInfo, (aHandle)?(*aHandle):0, (!aHandle || !aComponentName)?"" :aComponentName); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetHandle), error ,&HandleInfomation); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + TPtrC8 ComponentInfo(const_cast(reinterpret_cast(aComponentName))); + OstTraceExt5( TRACE_API, _LoadComponent2, "OMX_GetHandle < ReturnVal=%{OMX_ERRORTYPE} Component=%p aComponentName=%s pAppData=%p aCallBacks=%p", + (TUint)error, *aHandle, ComponentInfo, aAppData, aCallBacks ); + +#endif + + return error; + } + +OMX_ERRORTYPE COmxILCore::LoadAndInitLoader( + const TUid& aUid, COmxComponentLoaderIf*& aLoader) + { + DEBUG_PRINTF(_L8("COmxILCore::LoadAndInitLoader")); + + COmxComponentLoaderIf* loader = NULL; + TRAPD(err, loader = COmxComponentLoaderIf::CreateImplementationL(aUid)); + if(err != KErrNone) + { + if (err == KErrNoMemory) + { + return OMX_ErrorInsufficientResources; + } + return OMX_ErrorInvalidComponent; + } + + OMX_HANDLETYPE handle = loader->Handle(); + if (!handle) + { + delete loader; + return OMX_ErrorUndefined; + } + + OMX_LOADERTYPE* omx_loader = reinterpret_cast(handle); + __ASSERT_DEBUG(omx_loader != NULL, User::Panic(KOmxILCorePanic, 1)); + OMX_ERRORTYPE error = omx_loader->InitializeComponentLoader(omx_loader); + if(error != OMX_ErrorNone) + { + // We should call UnInitializeComponentLoader before deletion, just in + // case...returned error is irrelevant now... + omx_loader->UnInitializeComponentLoader(omx_loader); + delete loader; + return error; + } + + aLoader = loader; + return error; + } + +void COmxILCore::DeinitCore() + { + DEBUG_PRINTF(_L8("COmxILCore::DeinitCore")); + + TInt index; + COmxComponentLoaderIf* loader; + + const TInt KLoaderCount = iLoaders.Count(); + for( index = 0; indexHandle(); + OMX_LOADERTYPE* omx_loader = + reinterpret_cast(handle); + __ASSERT_DEBUG(omx_loader != NULL, + User::Panic(KOmxILCorePanic, 1)); + OMX_ERRORTYPE error = + omx_loader->UnInitializeComponentLoader(omx_loader); + delete loader; + } + } + iLoaders.Close(); + iContentPipes.ResetAndDestroy(); + } + + +EXPORT_C OMX_ERRORTYPE COmxILCore::ComponentNameEnum( + OMX_STRING aComponentName, + OMX_U32 aNameLength, + const OMX_U32 aIndex) + { + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _ComponentNameEnum1, "OMX_ComponentNameEnum >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_ComponentNameEnum)); +#endif + + DEBUG_PRINTF(_L8("COmxILCore::ComponentNameEnum")); + + OMX_ERRORTYPE error = OMX_ErrorNone; + + if( aNameLength == 0 || aComponentName == NULL ) + { + error= OMX_ErrorBadParameter; + } + else + { + const TInt KLoadersCount = iLoaders.Count(); + if (KLoadersCount == 0) + { + // There are no loaders in the system... + DEBUG_PRINTF2(_L8("COmxILCore::ComponentNameEnum (index = %d) : No loaders present..."), aIndex); + error = OMX_ErrorNoMore; + } + else + { + const TInt KIndexForPopulateList = 0; + // if aIndex is 0 (i.e. KIndexForPopulateList) the redescovery of + // components is triggered in the client library + if( aIndex == KIndexForPopulateList ) + { + TBool found=EFalse; + char tempComponentName[OMX_MAX_STRINGNAME_SIZE]; + + // each loader should rediscover its components + for( TInt index=0; index < KLoadersCount; ++index ) + { + OMX_LOADERTYPE* loader = reinterpret_cast( + iLoaders[index].iLoader->Handle()); + __ASSERT_DEBUG(loader != NULL, User::Panic(KOmxILCorePanic, 1)); + + // Index 0 means two things according to the standard: core (through its loader(s)) has to discover components (populate component list) + // and also the component name at 0 index has to be returned + // As there are multiple loaders present and there is no information which loader has any components + // we must go through all loaders inputting 0 index and see which loaders returns anything at index 0 first + // Once we've found the 0 index we can just ignore any component names returned from subsequent calls to loaders + error = loader->ComponentNameEnum(loader, + tempComponentName, + aNameLength,aIndex); + if(OMX_ErrorNone==error) + { + if(!found)//component hasn't been found yet + { + strncpy(aComponentName, tempComponentName, aNameLength - 1); + found=ETrue; //now it's found + } + } + else + { + // We must continue with the next loader if the current loader + // has no components... or if there is some other error + // condition in the current loader... + if( OMX_ErrorNoMore == error ) + { + DEBUG_PRINTF2(_L8("COmxILCore::ComponentNameEnum (index = 0) : Loader [%d] has 0 components..."), index); + } + else + { + // In case the loader returned with some other error condition, + // we log the situation... + DEBUG_PRINTF3(_L8("COmxILCore::ComponentNameEnum (index = 0) : Loader [%d] returned OMX error [%d].. ignoring loader..."), index, error); + // Check whether there's any point on continuing with the + // next loader... + if (OMX_ErrorInsufficientResources == error) + { + error = OMX_ErrorInsufficientResources; + break; + } + } + } + } + error= (found ? OMX_ErrorNone : OMX_ErrorNoMore); + } + else + { + RArray componentCountPerLoader; + TInt err=KErrNone; + + //init componentCountPerLoader array with -1; this array tells how many components a particular loader has + for(TInt loaderIndex=0; loaderIndex < KLoadersCount; ++loaderIndex) + { + //first check if loader is available + if( iLoaders[loaderIndex].iLoader == NULL ) + { + // We are considering here that ComponentNameEnum with index = + // 0 must have been called previously... the spec is not + // completely clear here...We return ErrorNotReady although + // this is not a legal return code for this IL Core function... + componentCountPerLoader.Close(); + error = OMX_ErrorNotReady; + break; + } + err=componentCountPerLoader.Append(-1); + switch(err) + { + case KErrNone: + //do nothing + error = OMX_ErrorNone; + break; + case KErrNoMemory: + componentCountPerLoader.Close(); + error = OMX_ErrorInsufficientResources; + break; + default: + componentCountPerLoader.Close(); + error = OMX_ErrorUndefined; + } + if(error != OMX_ErrorNone) + { + break; + } + } + + if(error == OMX_ErrorNone) + { + for(TInt loaderIndex=0; loaderIndex < KLoadersCount; ++loaderIndex) + { + //fist acquire the actual loader + OMX_LOADERTYPE* loader = reinterpret_cast(iLoaders[loaderIndex].iLoader->Handle()); + __ASSERT_DEBUG(loader != NULL, User::Panic(KOmxILCorePanic, 1)); + + //then count how many components the previous loaders have in total + //obviously for the first loader this loop won't do anything (ie: for loaderIndex==0) + //for the second loader it will count the first loader's component count, etc.... + TInt totalComponentCount(0); + for(TInt l=0; lComponentNameEnum(loader, + aComponentName, + aNameLength, relativeIndex); + TBool IsReturn = ETrue; + switch(error) + { + case OMX_ErrorNone: + //this loader has component at this index (ie: at relativeIndex) + componentCountPerLoader.Close(); //free array before return + break; + + case OMX_ErrorNoMore: + if((KLoadersCount-1)==loaderIndex) //if this is the last loader then the component at this index index obviously does not exist + { + componentCountPerLoader.Close(); //free array before return + break; + } + //this loader has not this many components, so find out how many it actually has + //and then update the correponding item in the componentCountPerLoader array + if(0==relativeIndex)//if this loader has no component at index 0, then it has no components at all + { + componentCountPerLoader[loaderIndex]=0; + IsReturn = EFalse; + break; + } + + for(TInt m=relativeIndex-1; m>=0;--m) //try to figure the first available index (counting down) + { + OMX_ERRORTYPE tempError = loader->ComponentNameEnum(loader, + aComponentName, + aNameLength, m); + if(OMX_ErrorNone==tempError) + { + //this is the first index (counting down) where this loader has component + componentCountPerLoader[loaderIndex]=m+1; //eg: index==4, then component count is 5 (because of zero based indexing) + IsReturn = EFalse; + break; + } + else if(OMX_ErrorInsufficientResources==tempError) + { + //critical error; free array before return + componentCountPerLoader.Close(); + error = OMX_ErrorInsufficientResources; + break; + } + //ignore any non-critical error (ie: other than OMX_ErrorInsufficientResources) and go one index down + } + + //if after the last loop (ie: m==0) the count was still not set for some reasons, then set to zero + if(!IsReturn && (-1==componentCountPerLoader[loaderIndex] )) + { + componentCountPerLoader[loaderIndex]=0; + } + break; + case OMX_ErrorInsufficientResources: + componentCountPerLoader.Close(); //free array before return + break; + default: + //some unknown error happened to the loader therefore we can't count how many component it has, assume zero + DEBUG_PRINTF4(_L8("COmxILCore::ComponentNameEnum (index = %d) : Loader [%d] returned OMX error [%d].. ignoring loader (ie: assuming ZERO components)..."), aIndex, loaderIndex, error); + componentCountPerLoader[loaderIndex]=0; + IsReturn = EFalse; + break; + } + + if(IsReturn) + { + break; + } + + }//end of for + + } // error == OMX_ErrorNone + componentCountPerLoader.Close(); //free array before return + } // else + } + } + + if (OMX_ErrorInsufficientResources == error) + { + error = OMX_ErrorUndefined; + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8<1> Infomation; + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_ComponentNameEnum),error ,&Infomation); +#endif + + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + TPtrC8 componentNamePtr(const_cast(reinterpret_cast(aComponentName))); + OstTraceExt4( TRACE_API, _ComponentNameEnum2, "OMX_ComponentNameEnum < ReturnVal=%{OMX_ERRORTYPE} aComponentName=%s aNameLength=%u aIndex=%u", + (TUint)error, componentNamePtr, (TUint)aNameLength, (TUint)aIndex ); + +#endif + + return error; + } + + +EXPORT_C OMX_ERRORTYPE COmxILCore::FreeHandle(OMX_HANDLETYPE aComponent) const + { + DEBUG_PRINTF2(_L8("COmxILCore::FreeHandle : Component Handle [%X]"), aComponent); + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _FreeHandle1, "OMX_FreeHandle >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_FreeHandle)); +#endif + OMX_ERRORTYPE error = OMX_ErrorNone; + if( aComponent == NULL ) + { + error = OMX_ErrorBadParameter; + } + else + { + +#ifdef ENABLE_OMXIL_TRACING + // resolve the handle to be passed to the component + OMX_HANDLETYPE ComponentTemp = OMXILAPITraceWrapper::ResolveCallsToComponent(aComponent); + // delete the temporatry reference objects + OMXILAPITraceWrapper::ComponentTracerDestroy(aComponent); + aComponent = ComponentTemp; +#endif + OMX_LOADERTYPE* loader; + error = OMX_ErrorComponentNotFound; + + const TInt KLoadersCount = iLoaders.Count(); + for(TInt index=0; index < KLoadersCount; ++index) + { + // Check this just in case the loader has not been initialized yet... + if(iLoaders[index].iLoader != NULL) + { + loader = reinterpret_cast(iLoaders[index].iLoader->Handle()); + __ASSERT_DEBUG(loader != NULL, User::Panic(KOmxILCorePanic, 1)); + error = loader->UnloadComponent(loader, aComponent); + if( OMX_ErrorNone == error ) + { + // Success case... otherwise, continue with next loader... + break; + } + #ifdef _DEBUG + if( OMX_ErrorComponentNotFound != error ) + { + // Another error occured... log the situation... + DEBUG_PRINTF3(_L8("COmxILCore::FreeHandle : Loader [%d] returned OMX error [%d].. continuing with next loader..."), index, error); + } + #endif + } + } + } + + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt2( TRACE_API, _FreeHandle2, "OMX_FreeHandle < ReturnVal=%x Component=%p", + (TUint)error, aComponent ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 FreeHandleInfo; + FreeHandleInfo.Format(Ost_OMXIL_Performance::K_HandleOnlyInfo , aComponent); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_FreeHandle), error,&FreeHandleInfo); +#endif + + + return error; + } + +EXPORT_C OMX_ERRORTYPE COmxILCore::SetupTunnel(OMX_HANDLETYPE aHandleOutput, + OMX_U32 aPortOutput, + OMX_HANDLETYPE aHandleInput, + OMX_U32 aPortInput) + { + DEBUG_PRINTF(_L8("COmxILCore::SetupTunnel")); + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _SetupTunnel1, "OMX_SetupTunnel >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_SetupTunnel)); +#endif + OMX_ERRORTYPE error = OMX_ErrorNone; + if (!aHandleOutput && !aHandleInput ) + { + error= OMX_ErrorBadParameter; + } + else + { + OMX_COMPONENTTYPE *componentInput, *componentOutput; + componentInput = reinterpret_cast(aHandleInput); + componentOutput = reinterpret_cast(aHandleOutput); + + OMX_TUNNELSETUPTYPE tunnelSetup; + OMX_PARAM_PORTDEFINITIONTYPE portDefinitionType; + + tunnelSetup.nTunnelFlags = 0; + tunnelSetup.eSupplier = OMX_BufferSupplyUnspecified; + + if(componentOutput) + { + // Check that the output port is actually an output port + portDefinitionType.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); + portDefinitionType.nVersion.s.nVersionMajor = COmxILCore::iSpecVersionMajor; + portDefinitionType.nVersion.s.nVersionMinor = COmxILCore::iSpecVersionMinor; + portDefinitionType.nVersion.s.nRevision = COmxILCore::iSpecVersionRevision; + portDefinitionType.nVersion.s.nStep = COmxILCore::iSpecVersionStep; + portDefinitionType.nPortIndex = aPortOutput; + if (OMX_ErrorNone != (error = componentOutput->GetParameter( + componentOutput, + OMX_IndexParamPortDefinition, + &portDefinitionType))) + { + error = TOmxILCoreUtils::ConvertErrorGetParameterToSetupTunnel(error); + } + else + { + if (OMX_DirOutput != portDefinitionType.eDir) + { + error = OMX_ErrorBadParameter; + } + else + { + error = componentOutput->ComponentTunnelRequest(componentOutput, + aPortOutput, + componentInput, + aPortInput, + &tunnelSetup); + + } + } + + + } + + if(error == OMX_ErrorNone && componentInput) + { + // Check that the input port is actually an input port. Set again the + // structure values just in case they were overwritten in the previous + // GetParameter call... + portDefinitionType.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); + portDefinitionType.nVersion.s.nVersionMajor = COmxILCore::iSpecVersionMajor; + portDefinitionType.nVersion.s.nVersionMinor = COmxILCore::iSpecVersionMinor; + portDefinitionType.nVersion.s.nRevision = COmxILCore::iSpecVersionRevision; + portDefinitionType.nVersion.s.nStep = COmxILCore::iSpecVersionStep; + portDefinitionType.nPortIndex = aPortInput; + if (OMX_ErrorNone != (error = componentInput->GetParameter( + componentInput, + OMX_IndexParamPortDefinition, + &portDefinitionType))) + { + error = TOmxILCoreUtils::ConvertErrorGetParameterToSetupTunnel(error); + } + else + { + if (OMX_DirInput != portDefinitionType.eDir) + { + error= OMX_ErrorBadParameter; + } + else + { + error = componentInput->ComponentTunnelRequest(componentInput, + aPortInput, + componentOutput, + aPortOutput, + &tunnelSetup); + + } + + if(OMX_ErrorNone != error) + { + if(componentOutput) + { + if( OMX_ErrorNone != componentOutput->ComponentTunnelRequest( + componentOutput, + aPortOutput, + NULL, + 0, + &tunnelSetup) ) + { + error = OMX_ErrorUndefined; + } + } + } + } + } + } + + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 TunnelInfomation; + TunnelInfomation.Format(Ost_OMXIL_Performance::K_TunnelSetupInfo, aHandleOutput, aPortOutput, aHandleInput, aPortInput); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_SetupTunnel), error ,&TunnelInfomation); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTraceExt5( TRACE_API, _SetupTunnel2, "OMX_SetupTunnel < ReturnVal=%{OMX_ERRORTYPE} aHandleOutput=%p aPortOutput=%u aHandleInput=%p aPortInput=%u", + (TUint)error, aHandleOutput, (TUint) aPortOutput, aHandleInput, (TUint)aPortInput ); +#endif + return error; + } + +EXPORT_C OMX_ERRORTYPE COmxILCore::GetContentPipe( + OMX_HANDLETYPE *aPipe,const OMX_STRING aURI) + { + DEBUG_PRINTF(_L8("COmxILCore::GetContentPipe")); + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetContentPipe1, "OMX_GetContentPipe >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetContentPipe)); +#endif + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if( aURI == NULL ) + { + omxError = OMX_ErrorBadParameter; + } + else + { + RImplInfoPtrArray ecomArray; + TRAPD(error,REComSession::ListImplementationsL( + TUid::Uid(KUidOmxILContentPipeIf), ecomArray)); + if( error != KErrNone ) + { + ecomArray.ResetAndDestroy(); + omxError= OMX_ErrorUndefined; + } + else + { + const TInt KEcomArrayCount = ecomArray.Count(); + if(!KEcomArrayCount) + { + ecomArray.Close(); + omxError= OMX_ErrorBadParameter; + } + else + { + HBufC8* convert = NULL; + TPtr8 luri(reinterpret_cast(aURI), strlen(aURI), strlen(aURI)); + + TRAPD(error, (convert = HBufC8::NewL(strlen(aURI)))); + if( error != KErrNone ) + { + ecomArray.ResetAndDestroy(); + omxError = OMX_ErrorUndefined; + } + else + { + TUriParser8 parser;// Uri parser object + TInt result; + // Extract the scheme component from the parsed URI + const TDesC8& scheme = parser.Extract(EUriScheme); + + *convert = luri; + result = parser.Parse(*convert);// parse the Uri descriptor + if( result != KErrNone ) + { + ecomArray.ResetAndDestroy(); + omxError = OMX_ErrorBadParameter; + } + else + { + TInt index; + CImplementationInformation* info; + COmxILContentPipeIf* cpipe = NULL; + omxError = OMX_ErrorBadParameter; + for(index=0; index < KEcomArrayCount; ++index) + { + info = ecomArray[index]; + if(info->DataType().Find(scheme) != KErrNotFound ) + { + //found + TRAPD(error, cpipe = COmxILContentPipeIf::CreateImplementationL( + info->ImplementationUid())); + if(error != KErrNone) + { + omxError = OMX_ErrorUndefined; + break; + } + error = cpipe->GetHandle(aPipe); + if(error != KErrNone) + { + omxError = OMX_ErrorUndefined; + break; + } + + error = iContentPipes.Append(cpipe); + if(error != KErrNone) + { + omxError = OMX_ErrorUndefined; + break; + } + + omxError = OMX_ErrorNone; + break; + } + } + + if (OMX_ErrorNone != omxError) + { + delete cpipe; + aPipe = NULL; + } + } + } + // + delete convert; + } + } + ecomArray.ResetAndDestroy(); + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 HandleInfomation; + HandleInfomation.Format(Ost_OMXIL_Performance::K_HandleInfo, ( (aPipe)? *aPipe :0 ), aURI); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetContentPipe), omxError ,&HandleInfomation); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + TPtrC8 URIPtr(const_cast(reinterpret_cast(aURI))); + OstTraceExt3( TRACE_API, _GetContentPipe2, "OMX_GetContentPipe < ReturnVal=%{OMX_ERRORTYPE} aPipe=%p, aURI=%s", + (TUint)omxError, (aPipe)? *aPipe :0 , URIPtr ); + +#endif + return omxError; + } + +EXPORT_C OMX_ERRORTYPE COmxILCore::GetComponentsOfRole ( + const OMX_STRING aRole, OMX_U32 *aNumComps, OMX_U8 **aCompNames) + { + DEBUG_PRINTF(_L8("COmxILCore::GetComponentsOfRole")); + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetComponentsOfRole1, "OMX_GetComponentsOfRole >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetComponentsOfRole)); +#endif + + OMX_ERRORTYPE error = OMX_ErrorNone; + if (aNumComps == NULL) + { + error = OMX_ErrorBadParameter; + } + else + { + if (aCompNames != NULL && *aNumComps == 0) + { + error = OMX_ErrorBadParameter; + } + else + { + OMX_LOADERTYPE* loader; + error = OMX_ErrorComponentNotFound; + OMX_U32 numAllComps = 0; + OMX_U32 maxNumComps = *aNumComps; + OMX_U32 tempNumComps = maxNumComps; + OMX_U8 **compNames = aCompNames; + + const TInt KLoadersCount = iLoaders.Count(); + for(TInt index=0; index < KLoadersCount; ++index) + { + loader = reinterpret_cast( + iLoaders[index].iLoader->Handle()); + __ASSERT_DEBUG(loader != NULL, User::Panic(KOmxILCorePanic, 1)); + error = loader->GetComponentsOfRole(loader, + aRole, + &tempNumComps, + compNames); + if(OMX_ErrorNone == error) + { + numAllComps += tempNumComps; + if(aCompNames != NULL && KLoadersCount > 1) + { + // Update tempNumComps in case there is a next iteration... + tempNumComps = maxNumComps - tempNumComps; + if (numAllComps >= maxNumComps) + { + if (numAllComps > maxNumComps) + { + DEBUG_PRINTF2(_L8("COmxILCore::GetComponentsOfRole : Loader [%d] returned a bad number of component roles... correcting"), index); + numAllComps = maxNumComps; + } + + // The array of component names is full... + break; + } + + compNames = &(aCompNames[numAllComps]); + if (*compNames == NULL) + { + *aNumComps = 0; + error = OMX_ErrorBadParameter; + break; + } + } // if(aCompNames != NULL && KLoadersCount > 1) + } // if(OMX_ErrorNone == error) + } // for(TInt index=0; index < KLoadersCount; ++index) + + // Update the number of components value to be returned to the client... + *aNumComps = numAllComps; + } + } + if (error == OMX_ErrorInsufficientResources) + { + error = OMX_ErrorUndefined; + } + + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Infomation; + Infomation.Format(Ost_OMXIL_Performance::K_RoleInfo, aRole, (aNumComps)?*aNumComps:0); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetComponentsOfRole), error ,&Infomation); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + TPtrC8 RolePtr(const_cast(reinterpret_cast(aRole))); + OstTraceExt3( TRACE_API, _GetComponentsOfRole2, "OMX_GetComponentsOfRole < ReturnVal=%{OMX_ERRORTYPE} aRoleInfo=%s aNumComps=%u", + (TUint)error, RolePtr, (TUint)((aNumComps)?*aNumComps:0)); + +#endif + + return error; + } + +EXPORT_C OMX_ERRORTYPE COmxILCore::GetRolesOfComponent ( + const OMX_STRING aCompName, OMX_U32 *aNumRoles, OMX_U8 **aRoles) + { + DEBUG_PRINTF(_L8("COmxILCore::GetRolesOfComponent")); + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _GetRolesOfComponent1, "OMX_GetRolesOfComponent >" ); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_GetRolesOfComponent)); +#endif + + OMX_ERRORTYPE error = OMX_ErrorNone; + + if (aNumRoles == NULL) + { + error = OMX_ErrorBadParameter; + } + else + { + if (aRoles != NULL && *aNumRoles == 0) + { + error = OMX_ErrorBadParameter; + } + else + { + if( !VerifyComponentName(aCompName)) + { + error = OMX_ErrorInvalidComponentName; + } + else + { + TInt numRolesCopy = *aNumRoles; + OMX_LOADERTYPE* loader; + error = OMX_ErrorComponentNotFound; + const TInt KLoadersCount = iLoaders.Count(); + for(TInt index=0; index < KLoadersCount; ++index) + { + loader = reinterpret_cast( + iLoaders[index].iLoader->Handle()); + __ASSERT_DEBUG(loader != NULL, User::Panic(KOmxILCorePanic, 1)); + error = loader->GetRolesOfComponent(loader, + aCompName, + aNumRoles, + aRoles); + if(OMX_ErrorNone == error) + { + if ((aRoles != NULL) && (*aNumRoles > numRolesCopy)) + { + // Just in case... + DEBUG_PRINTF2(_L8("COmxILCore::GetRolesOfComponent : Loader [%d] returned a bad number of roles... correcting"), index); + *aNumRoles = numRolesCopy; + } + break; + } + + if((index+1 < KLoadersCount) && (aRoles != NULL)) + { + // If we have other loaders after this, reset aNumRoles to the + // value suplied by the client. + *aNumRoles = numRolesCopy; + } + } + } + } + } + + // Make sure that even if loader does not conform to the set of errors required by the standard, we will + if (KErrNone != error && (OMX_ErrorUndefined != error && OMX_ErrorInvalidComponentName != error && + OMX_ErrorInvalidComponent != error && OMX_ErrorBadParameter != error) ) + { + error = OMX_ErrorUndefined; + } + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8 Infomation; + Infomation.Format(Ost_OMXIL_Performance::K_RoleInfo, aCompName, (aNumRoles)?*aNumRoles:0); + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_GetRolesOfComponent), error ,&Infomation); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + TPtrC8 CompNamePtr(const_cast(reinterpret_cast(aCompName))); + OstTraceExt3( TRACE_API, _GetRolesOfComponent2, "OMX_GetRolesOfComponent < ReturnVal=%{OMX_ERRORTYPE} aCompName=%s aNumRoles=%u", + (TUint)error, CompNamePtr, (TUint)((aNumRoles)?*aNumRoles:0)); +#endif + + return error; + } + +/** + Converts an error returned by GetParameter to a permitted error to be + returned by OMX_SetupTunnel. + + @param aGetParameterError An error code returned by the GetParameter API + + @return An OMX_ERRORTYPE from the list of permitted errors in + OMX_SetupTunnel +*/ +OMX_ERRORTYPE TOmxILCoreUtils::ConvertErrorGetParameterToSetupTunnel( + OMX_ERRORTYPE aGetParameterError) + { + switch(aGetParameterError) + { + // These are the common errors allowed in GetParameter and + // OMX_SetupTunnel + case OMX_ErrorInvalidComponent: + case OMX_ErrorBadParameter: + case OMX_ErrorInvalidState: + case OMX_ErrorVersionMismatch: + case OMX_ErrorTimeout: + case OMX_ErrorBadPortIndex: + return aGetParameterError; + + // These are the errors supported by GetParameter and not supported by + // OMX_SetupTunnel + case OMX_ErrorUndefined: + case OMX_ErrorNoMore: + case OMX_ErrorNotReady: + case OMX_ErrorUnsupportedIndex: + case OMX_ErrorSeperateTablesUsed: + default: + // Return something that is actually allowed... + return OMX_ErrorBadParameter; + }; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxilcore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxilcore.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,89 @@ +// +// Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILCORE_H +#define OMXILCORE_H + +#include +#include + +// Forward declarations +class COmxComponentLoaderIf; +class COmxILContentPipeIf; + +NONSHARABLE_CLASS(COmxILCore): public CBase + { +public: + + static const TUint8 iSpecVersionMajor = OMX_VERSION_MAJOR; + static const TUint8 iSpecVersionMinor = OMX_VERSION_MINOR; + static const TUint8 iSpecVersionRevision = OMX_VERSION_REVISION; + static const TUint8 iSpecVersionStep = OMX_VERSION_STEP; + +public: + + COmxILCore(); + ~COmxILCore(); + + OMX_ERRORTYPE ListLoaders(); + void DeinitCore(); + IMPORT_C OMX_ERRORTYPE LoadComponent(const OMX_STRING aComponentName, OMX_HANDLETYPE* aHandle, OMX_PTR aAppData,OMX_CALLBACKTYPE* aCallBacks); + IMPORT_C OMX_ERRORTYPE ComponentNameEnum(OMX_STRING aComponentName, OMX_U32 aNameLength, const OMX_U32 aIndex); + IMPORT_C OMX_ERRORTYPE FreeHandle(OMX_HANDLETYPE aComponent) const; + IMPORT_C static OMX_ERRORTYPE SetupTunnel(OMX_HANDLETYPE aHandleOutput, OMX_U32 aPortOutput, + OMX_HANDLETYPE aHandleInput, OMX_U32 aPortInput); + IMPORT_C OMX_ERRORTYPE GetContentPipe(OMX_HANDLETYPE* aPipe,const OMX_STRING aURI); + IMPORT_C OMX_ERRORTYPE GetComponentsOfRole ( const OMX_STRING aRole, OMX_U32* aNumComps, OMX_U8** aCompNames ); + IMPORT_C OMX_ERRORTYPE GetRolesOfComponent ( const OMX_STRING aCompName, OMX_U32* aNumRoles, OMX_U8** aRoles); + +private: + + class TOmxLoaderInfo + { + public: + TOmxLoaderInfo(); + public: + TUid iUid; + COmxComponentLoaderIf* iLoader; + }; + +private: + + OMX_ERRORTYPE LoadAndInitLoader(const TUid& aUid, COmxComponentLoaderIf*& aLoader); + +private: + RArray iLoaders; + RPointerArray iContentPipes; + }; + +inline COmxILCore::TOmxLoaderInfo::TOmxLoaderInfo(): + iUid(TUid::Uid(0)),iLoader(NULL) + { + } + +/** + Utility functions + */ +class TOmxILCoreUtils + { +public: + + static OMX_ERRORTYPE ConvertErrorGetParameterToSetupTunnel( + OMX_ERRORTYPE aGetParameterError); + + }; + +#endif /* OMXILCORE_H */ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxilsymbiancontentpipeif.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxilsymbiancontentpipeif.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,85 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include + +/** + Content pipe entry point + This function initialises the CP_PIPETYPE structure and return it in its first argument + + @return KErrNone if successful, otherwise another system-wide error codes + @param aContentPipe Returns a pointer to the content pipe handle + + @publishedPartner + @prototype +*/ +TInt ContentPipeInit(OMX_HANDLETYPE* aContentPipe); + +/** + Content pipe exit point + This function deinitialises the CP_PIPETYPE structure passed as first argument + + @return KErrNone if successful, otherwise another system-wide error codes + @param aContentPipe A pointer to the content pipe handle that will be deinitialised + + @publishedPartner + @prototype +*/ +TInt ContentPipeDeInit(OMX_HANDLETYPE aContentPipe); + +/** + Constructor +*/ +COmxILSymbianContentPipeIf::COmxILSymbianContentPipeIf() + { + } + +/** + Constructs a new instance of COmxILSymbianContentPipeIf. + @return COmxILSymbianContentPipeIf* A pointer to the newly constructed COmxILSymbianContentPipeIf. + + @internalTechnology +*/ +COmxILSymbianContentPipeIf* COmxILSymbianContentPipeIf::NewL() + { + return new(ELeave)COmxILSymbianContentPipeIf; + } + +/** + Destructor + + @internalTechnology +*/ +COmxILSymbianContentPipeIf::~COmxILSymbianContentPipeIf() + { + ContentPipeDeInit(iHandle); + } + +TInt COmxILSymbianContentPipeIf::GetHandle(OMX_HANDLETYPE* aContentPipe) + { + if(iHandle) + { // Content Pipe already created + *aContentPipe = iHandle; + return KErrNone; + } + + TInt err = ContentPipeInit(aContentPipe); + if(err == KErrNone) + { + iHandle = reinterpret_cast(*aContentPipe); + } + return err; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxilsymbianloaderif.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxilsymbianloaderif.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,98 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +/** +Entry point routine that Component Loaders have to implement to populate the actual +structure represented by the handle passed as argument. +@param aLoader + The handle to the OMX_LOADERTYPE structure to be populated. +@return An OpenMAX defined error. OMX_ErrorNone if successful. + +@publishedPartner +@prototype +*/ +OMX_ERRORTYPE OMX_LoaderSetup(OMX_HANDLETYPE aLoader); + +/** +Constructor of this interface. +*/ +COmxSymbianLoaderIf::COmxSymbianLoaderIf() + { + } + +/** +Static method to create this interface. +The actual OMX_LOADERTYPE structure should be allocated and populated as part +of the construction of this interface. + +@return A pointer to the newly constructed COmxSymbianLoaderIf. + +@internalTechnology +*/ +COmxSymbianLoaderIf* COmxSymbianLoaderIf::NewL() + { + COmxSymbianLoaderIf* self = new(ELeave)COmxSymbianLoaderIf; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +/** +Constructs and populates the OMX_LOADERTYPE structure encapsulated within this interface. +*/ +void COmxSymbianLoaderIf::ConstructL() + { + iHandle = new(ELeave)OMX_LOADERTYPE; + + OMX_ERRORTYPE error = OMX_ErrorInsufficientResources; + error = ::OMX_LoaderSetup(iHandle); + + if ( error != OMX_ErrorNone ) + { + if( error == OMX_ErrorInsufficientResources ) + { + User::Leave(KErrNoMemory); + } + else + { + User::Leave(KErrGeneral); + } + } + } + +/** +Destructor of this interface. +Deletes this loader's OMX_LOADERTYPE structure. + +@internalTechnology +*/ +COmxSymbianLoaderIf::~COmxSymbianLoaderIf() + { + delete iHandle; + } + +/** +Gets the valid handle of the already populated OMX_LOADERTYPE struct. + +@return The loader's handle +*/ +OMX_HANDLETYPE COmxSymbianLoaderIf::Handle() + { + return iHandle; + } + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/core/omxiluids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/core/omxiluids.hrh Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,34 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILUIDS_HRH +#define OMXILUIDS_HRH + +#define KSharedLibraryUidDefine 0x1000008D +#define KUidECOM 0x10009D8D + +// OpenMax IL Core client library +#define KUidOmxILCoreClientDll 0x1028349C + +// OpenMax IL Core server library +#define KUidOmxILCoreServerDll 0x10285D1E + +// OpenMax IL Loader Static Library +#define KUidOmxILLoaderLib 0x1028349E + +// Symbian OpenMax IL Content Pipe Interface +#define KUidOmxILSymbianContentPipeIfLib 0x102834B8 + +#endif /*OMXILUIDS_HRH*/ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreclient/log.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreclient/log.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,145 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __SWI_LOG_H__ +#define __SWI_LOG_H__ + +#include + +namespace DSD +{ + +class TTruncateOverflowHandler16 : public TDes16Overflow + { + public: + virtual void Overflow( TDes16& aDes ); + }; + +inline void TTruncateOverflowHandler16::Overflow( TDes16& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +class TTruncateOverflowHandler8 : public TDes8Overflow + { + public: + virtual void Overflow( TDes8& aDes ); + }; + +inline void TTruncateOverflowHandler8::Overflow( TDes8& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +#ifdef _DEBUG + +#ifdef _OMXIL_CORECLIENT_DEBUG_TRACING_ON + +#define DEBUG_PRINTF(a) {DSD::DebugPrintf(__LINE__, __FILE__, a);} +#define DEBUG_PRINTF2(a, b) {DSD::DebugPrintf(__LINE__, __FILE__, a, b);} +#define DEBUG_PRINTF3(a, b, c) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c);} +#define DEBUG_PRINTF4(a, b, c, d) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d);} +#define DEBUG_PRINTF5(a, b, c, d, e) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d, e);} + +#define DEBUG_CODE_SECTION(a) TRAP_IGNORE({ a; }) + +// UTF-8 overload of the DebufPrintf method. Should be used by default, +// since it's cheaper both in CPU cycles and stack space. + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler8 overflowHandler8; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<1024> buffer; + _LIT8(KSwiLogPrefix, "[corecl] "); + _LIT8(KSwiLineFileFormat, "TID[%d] : [%s:%d] -- "); + buffer.Append(KSwiLogPrefix); + RThread thread; + TUint threadId = thread.Id(); + thread.Close(); + RProcess proc; + TFileName fName = proc.FileName(); + proc.Close(); + buffer.AppendFormat(KSwiLineFileFormat, threadId, aFile, aLine); + buffer.AppendFormatList(aFormat, list ,&overflowHandler8 ); + buffer.Append(_L8("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } + +// Unicode DebufPrintf overload + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler16 overflowHandler16; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<256> header; + _LIT8(KSwiLogPrefix, "[corecl] "); + _LIT8(KSwiLineFileFormat, "%Ld Line: % 5d, File: %s -- "); + header.Append(KSwiLogPrefix); + header.AppendFormat(KSwiLineFileFormat, now.Int64(), aLine, aFile); + + TBuf<1024> buffer; + buffer.Copy(header); + buffer.AppendFormatList(aFormat, list ,&overflowHandler16); + buffer.Append(_L("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + +} // namespace DSD + +#endif // __SWI_LOG_H__ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreclient/omxilcoreclientsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreclient/omxilcoreclientsession.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1272 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include + +#include "log.h" +#include "omxilcoreclientsession.h" +#include "omxilcoreclientserver.h" +#include "omxilcore.h" + +#ifdef __WINSCW__ +#include +#include "../core/omxiluids.hrh" +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL +#include "OSTOMXILFrameworkTrace.h" +#endif + + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + +#include "../../traces/OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "omxilcoreclientsessionTraces.h" +#endif +#endif + + +_LIT(KOmxILCoreClientPanic, "OmxILCoreClient Panic"); +const TInt KOpenSeverSessionMaxRetries = 3; + +namespace + { +/* + This class is used to provide a global cache of a reference to the COmxILCore + object. A mutex is provided to serialize the access to the IL Core + reference. A global object of this class is intended to be used only through + the IL Core Client library which in turn is used by any thread in the process + that needs to access the OpenMAX IL Core services. + +*/ + class XGlobalILCoreCache + { + public: + inline XGlobalILCoreCache(); + inline ~XGlobalILCoreCache(); + + inline static XGlobalILCoreCache* IlCoreCache(); + inline void SetILCore(COmxILCore* aILCore); + inline COmxILCore* ILCore(); + + inline RServer2 &ServerHandle(); + inline TInt SetServerHandle(TUint32 aServerHandle); + + inline void Lock(); + inline void Unlock(); + + private: + + RMutex iMutex; + TInt iError; + COmxILCore* iILCore; + RServer2 iServerHandle; + }; + +#ifndef __WINSCW__ +XGlobalILCoreCache gGlobalILCoreCache; +#endif + + } // unnamed namespace + +XGlobalILCoreCache* XGlobalILCoreCache::IlCoreCache() + { +#ifdef __WINSCW__ + const TUid KUidOmxILCoreClientDllUid = { KUidOmxILCoreClientDll }; + XGlobalILCoreCache* pGlobalIlCoreCache = 0; + if (NULL == (pGlobalIlCoreCache = + Pls(KUidOmxILCoreClientDllUid, NULL))) + { + return NULL; + } + + XGlobalILCoreCache& gGlobalILCoreCache = *pGlobalIlCoreCache; +#endif + return (gGlobalILCoreCache.iError == KErrNone) ? &gGlobalILCoreCache : NULL; + } + +inline XGlobalILCoreCache::XGlobalILCoreCache() + : iMutex(), iError(KErrNone), iILCore(NULL), iServerHandle() + { + DEBUG_PRINTF(_L8("XGlobalILCoreCache::XGlobalILCoreCache")); + iError = iMutex.CreateLocal(EOwnerProcess); + } + +inline XGlobalILCoreCache::~XGlobalILCoreCache() + { + DEBUG_PRINTF(_L8("XGlobalILCoreCache::~XGlobalILCoreCache")); + iMutex.Close(); + iServerHandle.Close(); + } + +inline COmxILCore* XGlobalILCoreCache::ILCore() + { + __ASSERT_ALWAYS(iError == KErrNone, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + + return iILCore; + } + +inline void XGlobalILCoreCache::SetILCore(COmxILCore* aILCore) + { + __ASSERT_ALWAYS(iError == KErrNone, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + __ASSERT_ALWAYS(iMutex.IsHeld(), + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + + iILCore = aILCore; + } + +inline RServer2 &XGlobalILCoreCache::ServerHandle() + { + return iServerHandle; + } + +inline TInt XGlobalILCoreCache::SetServerHandle(TUint32 aServerHandle) + { + iServerHandle.Close(); + iServerHandle.SetHandle(aServerHandle); + return KErrNone; + } + +inline void XGlobalILCoreCache::Lock() + { + __ASSERT_ALWAYS(iError == KErrNone, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + iMutex.Wait(); + } + +inline void XGlobalILCoreCache::Unlock() + { + __ASSERT_ALWAYS(iError == KErrNone, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + __ASSERT_ALWAYS(iMutex.IsHeld(), + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + iMutex.Signal(); + } + + +ROmxILCoreClientSession::ROmxILCoreClientSession() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::ROmxILCoreClientSession")); + } + +/** + * + */ +ROmxILCoreClientSession::~ROmxILCoreClientSession() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::~ROmxILCoreClientSession")); + + } + +/** + Starts the separate IL Core server thread if not already started + + @return KErrAlreadyExists if the IL Core server has already been + started. System-wide error if the creation of the session with the IL Core + server did not succeed. +*/ +TInt ROmxILCoreClientSession::Connect() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::Connect")); + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_Init)); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _Connect1, "OMX_Init >" ); +#endif + + TInt err = KErrNotFound; + XGlobalILCoreCache *glbCache = XGlobalILCoreCache::IlCoreCache(); + if(!glbCache) + { + err = KErrGeneral; + } + else + { + if(glbCache->ServerHandle().Handle() != KNullHandle) + { + err = CreateSession(glbCache->ServerHandle(), TVersion(1,0,0)); + } + + if(err == KErrNotFound) + { + // Server not running + TUint32 serverHandle = KNullHandle; + if (KErrNone == (err = StartOmxILCoreServer(&serverHandle))) + { + if (KErrNone == (err = glbCache->SetServerHandle(serverHandle) )) + { + if(glbCache->ServerHandle().Handle() == KNullHandle) + { + err = KErrNotFound; + } + else + { + err = CreateSession(glbCache->ServerHandle(), TVersion(1,0,0)); + } + } + } + } + else + { + // The server exists already... close the session and return... + RHandleBase::Close(); + err = KErrAlreadyExists; + } + } + +#if defined(SYMBIAN_PERF_TRACE_OMX_IL) || defined(SYMBIAN_PERF_TRACE_OMX_IL_OSTV1) + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if(KErrNone != err) + { + omxError = OMX_ErrorUndefined; + } +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBufC8<1> InitStr; + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_Init),omxError,&InitStr); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace1( TRACE_API, _Connect2, "OMX_Init < ReturnVal=%u", omxError ); +#endif + + return err; + + } + +/** + Opens a session to the IL Core server thread that should already be started + + @return KErrNone if successful, otherwise one of the other system-wide error + codes +*/ +TInt ROmxILCoreClientSession::Open() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::Open")); + + XGlobalILCoreCache *glbCache = XGlobalILCoreCache::IlCoreCache(); + if(glbCache->ServerHandle().Handle() == KNullHandle) + { + return KErrNotFound; + } + return CreateSession(glbCache->ServerHandle(), TVersion(1,0,0)); + + } + +/** + Closes the session to the IL Core server thread. +*/ +void ROmxILCoreClientSession::Close() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::Close")); + + RHandleBase::Close(); + + } + +/** + Requests initialization of the OpenMAX IL Core loaders. + + @return OMX_ERRORTYPE + */ +OMX_ERRORTYPE ROmxILCoreClientSession::ListLoaders() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::ListLoaders")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + TIpcArgs arg(&pckg0); + SendReceive(EOmxILCoreListLoaders, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + +/** + Requests de-initialization of the OpenMAX IL core. It closes the session to + the IL Core server. + + @return OMX_ERRORTYPE + */ +OMX_ERRORTYPE ROmxILCoreClientSession::DeinitAndClose() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::DeinitAndClose")); +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormatMin, + Ost_OMXIL_Performance::EMeasurementStart, MAKESTRING(E_DeInit)); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace0( TRACE_API, _DeinitAndClose1, "OMX_Deinit >" ); +#endif + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + // Param 1 + TUint64 serverThreadId = 0; + TPckgBuf pckg1; + + TIpcArgs arg(&pckg0, &pckg1); + SendReceive(EOmxILCoreDeinit, arg); + + // Extract the output values returned from the server. + err = pckg0(); + serverThreadId = pckg1(); + + RHandleBase::Close(); + + // Release server handle so it will exit cleanly. + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + + pGlobalILCoreCache->SetServerHandle(KNullHandle); + + RThread serverThread; + TInt ret = serverThread.Open(TThreadId(serverThreadId)); + + if ((KErrNone == ret) && (serverThread.Handle() != KNullHandle)) + { + DEBUG_PRINTF2(_L8("ROmxILCoreClientSession::DeinitAndClose : serverThread.Handle =[%d]"), serverThread.Handle()); + TBool logoffFailed = EFalse; + TRequestStatus logoffStatus; + serverThread.Logon(logoffStatus); + + if (logoffStatus == KErrNoMemory) + { + logoffFailed = ETrue; + } + + if (!logoffFailed) + { + if (logoffStatus == KRequestPending) + { + User::WaitForRequest(logoffStatus); + } + else + { + serverThread.LogonCancel(logoffStatus); + User::WaitForRequest(logoffStatus); + } + } + else + { + serverThread.Kill(KErrDied); + } + } + + serverThread.Close(); + +#if defined(SYMBIAN_PERF_TRACE_OMX_IL) || defined(SYMBIAN_PERF_TRACE_OMX_IL_OSTV1) + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if(KErrNone != err) + { + omxError = OMX_ErrorUndefined; + } +#endif +#ifdef SYMBIAN_PERF_TRACE_OMX_IL + TBuf8<1> DeInitStr; + OstPrintf(TTraceContext(KTracePerformanceTraceUID, EPerFormanceTraceClassification), Ost_OMXIL_Performance::K_OMX_PerformanceTraceFormat, + Ost_OMXIL_Performance::EMeasurementEnd, MAKESTRING(E_DeInit), omxError,&DeInitStr); +#endif + +#ifdef SYMBIAN_PERF_TRACE_OMX_IL_OSTV1 + OstTrace1( TRACE_API, _DeinitAndClose2, "OMX_Deinit < ReturnVal=%u", omxError ); +#endif + + return err; + + } + + +/** + Obtains the IL Core pointer stored in the IL Core thread. + + @return COmxILCore& + + */ +COmxILCore& ROmxILCoreClientSession::ILCore() + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::ILCore")); + + // Param 0 + TPckgBuf pckg0; + + TPckgBuf pckg1; + + TIpcArgs arg(&pckg0, &pckg1); + SendReceive(EOmxILCoreGetILCore, arg); + + // Extract the output values returned from the server. + // OMX error is not relevant... + __ASSERT_ALWAYS(pckg1() != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + + return *pckg1(); + + } + + +/** + Requests OMX_ComponentNameEnum to the OpenMAX IL core. + + @return OMX_ERRORTYPE + + */ +OMX_ERRORTYPE ROmxILCoreClientSession::ComponentNameEnum( + OMX_STRING cComponentName, + OMX_U32 nNameLength, + OMX_U32 nIndex) + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::ComponentNameEnum")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + // Param 1 + TComponentNameEnum arg1; + arg1.cComponentName = cComponentName; + arg1.nNameLength = nNameLength; + arg1.nIndex = nIndex; + + TIpcArgs arg(&pckg0, &arg1); + SendReceive(EOmxILCoreComponentNameEnum, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + +/** + Requests OMX_GetHandle to the OpenMAX IL core. + + @return OMX_ERRORTYPE + + */ +OMX_ERRORTYPE ROmxILCoreClientSession::GetHandle( + OMX_HANDLETYPE* pHandle, + OMX_STRING cComponentName, + OMX_PTR pAppData, + OMX_CALLBACKTYPE* pCallBacks) + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::GetHandle")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + + // Param 1 + TGetHandle arg1; + arg1.pHandle = pHandle; + arg1.cComponentName = cComponentName; + arg1.pAppData = pAppData; + arg1.pCallBacks = pCallBacks; + + TIpcArgs arg(&pckg0, &arg1); + SendReceive(EOmxILCoreGetHandle, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + +/** + Requests OMX_FreeHandle to the OpenMAX IL core. + + @return OMX_ERRORTYPE + + */ +OMX_ERRORTYPE ROmxILCoreClientSession::FreeHandle( + OMX_HANDLETYPE hComponent) + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::FreeHandle")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + TIpcArgs arg(&pckg0, hComponent); + SendReceive(EOmxILCoreFreeHandle, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + +/** + Requests OMX_SetupTunnel to the OpenMAX IL core. + + @return OMX_ERRORTYPE + + */ +OMX_ERRORTYPE ROmxILCoreClientSession::SetupTunnel( + OMX_HANDLETYPE hOutput, + OMX_U32 nPortOutput, + OMX_HANDLETYPE hInput, + OMX_U32 nPortInput) + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::SetupTunnel")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + TSetupTunnel arg1; + arg1.hOutput = hOutput; + arg1.nPortOutput = nPortOutput; + arg1.hInput = hInput; + arg1.nPortInput = nPortInput; + + TIpcArgs arg(&pckg0, &arg1); + SendReceive(EOmxILCoreSetupTunnel, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + +/** + Requests OMX_GetContentPipe to the OpenMAX IL core. + + @return OMX_ERRORTYPE + + */ +OMX_ERRORTYPE ROmxILCoreClientSession::GetContentPipe( + OMX_HANDLETYPE* hPipe, + OMX_STRING szURI) + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::GetContentPipe")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + // Param 1 + TGetContentPipe arg1; + arg1.hPipe = hPipe; + arg1.szURI = szURI; + + TIpcArgs arg(&pckg0, &arg1); + SendReceive(EOmxILCoreGetContentPipe, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + +/** + Requests OMX_GetComponentsOfRole to the OpenMAX IL core. + + @return OMX_ERRORTYPE + + */ +OMX_ERRORTYPE ROmxILCoreClientSession::GetComponentsOfRole( + OMX_STRING role, + OMX_U32* pNumComps, + OMX_U8** compNames) + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::GetComponentsOfRole")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + TGetComponentsOfRole arg1; + arg1.role = role; + arg1.pNumComps = pNumComps; + arg1.compNames = compNames; + + TIpcArgs arg(&pckg0, &arg1); + SendReceive(EOmxILCoreGetComponentsOfRole, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + +/** + Requests OMX_GetRolesOfComponent to the OpenMAX IL core. + + @return OMX_ERRORTYPE + + */ +OMX_ERRORTYPE ROmxILCoreClientSession::GetRolesOfComponent( + OMX_STRING compName, + OMX_U32 *pNumRoles, + OMX_U8 **roles) + { + DEBUG_PRINTF(_L8("ROmxILCoreClientSession::GetRolesOfComponent")); + + // Param 0 + OMX_ERRORTYPE err = OMX_ErrorNone; + TPckgBuf pckg0; + + TGetRolesOfComponent arg1; + arg1.compName = compName; + arg1.pNumRoles = pNumRoles; + arg1.roles = roles; + + TIpcArgs arg(&pckg0, &arg1); + SendReceive(EOmxILCoreGetRolesOfComponent, arg); + + // Extract the output values returned from the server. + err = pckg0(); + return err; + + } + + +// +// OMX IL Operations... +// + +/** + The OMX_Init method initializes the OpenMAX IL core. OMX_Init shall be the + first call made into OpenMAX IL and should be executed only one time without + an intervening OMX_Deinit call. If OMX_Init is called twice, OMX_ErrorNone + is returned but the init request is ignored. + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init() + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OMX_Init may be called several times, only the first time must have an + // effect.... + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if (pGlobalILCoreCache->ILCore() != NULL) + { + omxError = OMX_ErrorNone; + } + else + { + // Connect will create the server side thread the first time it is + // called... The IL Core object will be instantiated at the sever + // side... + ROmxILCoreClientSession coresession; + TInt err = coresession.Connect(); + // There should not exist a client thread already created at this + // point... + __ASSERT_ALWAYS(err != KErrAlreadyExists, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + if (KErrNone == err) + { + // Obtain the ILCore from the server side... + COmxILCore& ilCore = coresession.ILCore(); + //... and cache it globally so the client library doesn't need to + // access the server every time the IL Core is needed... + pGlobalILCoreCache->SetILCore(&ilCore); + + // This will call COmxILCore::ListLoaders()...We want to initialize + // loader ecom plugins in the IL Core thread, so we can make sure + // they get destroyed in the same thread, the IL Core thread. + omxError = coresession.ListLoaders(); + } + else + { + // This is to make sure we return something that conforms with + // table 3-9 in the spec. + switch(err) + { + case KErrTimedOut: + { + omxError = OMX_ErrorTimeout; + } + break; + case KErrNoMemory: + default: + { + omxError = OMX_ErrorInsufficientResources; + } + }; + } + coresession.Close(); + + if (omxError != OMX_ErrorNone) + { + ROmxILCoreClientSession coresession; + TInt openRetryCounter = KOpenSeverSessionMaxRetries; + TInt err = KErrNone; + // Try to connect to the server several times... + do + { + err = coresession.Open(); + } + while(KErrNone != err && --openRetryCounter > 0); + + if (KErrNone == err) + { + // IL Core deinitialization in the server thread to make sure that + // loader plugins are destroyed in the same thread... + coresession.DeinitAndClose(); + // At this point, the IL Core has been successfully + // deinitialized...remove the cached reference... + pGlobalILCoreCache->SetILCore(NULL); + } + + coresession.Close(); + } + } + + pGlobalILCoreCache->Unlock(); + return omxError; + + } + +/** + The OMX_Deinit method de-initializes the OpenMAX core. OMX_Deinit should be + the last call made into the OpenMAX core after all OpenMAX-related resources have + been released + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit() + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OMX_Deinit may be called several times.... only the first time will + // remove the IL Core and the remaining ones must simply have no effect... + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if (pGlobalILCoreCache->ILCore() == NULL) + { + omxError = OMX_ErrorNone; + } + else + { + ROmxILCoreClientSession coresession; + TInt openRetryCounter = KOpenSeverSessionMaxRetries; + TInt err = KErrNone; + // Try to connect to the server several times... + do + { + err = coresession.Open(); + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + } + while(KErrNone != err && --openRetryCounter > 0); + + if (KErrNone == err) + { + // IL Core deinitialization in the server thread to make sure that + // loader plugins are destroyed in the same thread... + omxError = coresession.DeinitAndClose(); + // At this point, the IL Core has been successfully + // deinitialized...remove the cached reference... + if (omxError == OMX_ErrorNone) + { + pGlobalILCoreCache->SetILCore(NULL); + } + } + else + { + // This is to make sure we return something that conforms with + // table 3-9 in the spec. + switch(err) + { + case KErrTimedOut: + { + omxError = OMX_ErrorTimeout; + } + break; + default: + { + omxError = OMX_ErrorNone; + } + }; + } + + coresession.Close(); + } + + pGlobalILCoreCache->Unlock(); + return omxError; + + } + +/** + The OMX_ComponentNameEnum method will enumerate through all the names of + recognized components in the system to detect all the components in the system + run-time. + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum( + OMX_OUT OMX_STRING cComponentName, + OMX_IN OMX_U32 nNameLength, + OMX_IN OMX_U32 nIndex) + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OpenMAX IL mandates that OMX_Init must be the first OMX call made into + // the IL Core... + __ASSERT_ALWAYS(pGlobalILCoreCache->ILCore() != NULL, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + + ROmxILCoreClientSession coresession; + OMX_ERRORTYPE omxError = OMX_ErrorNone; + TInt err = coresession.Open(); + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + // As mandated by the spec, we list and initialize loaders if the index is + // 0. + if (0 == nIndex && KErrNone == err) + { + // Ignore if any error... + coresession.ListLoaders(); + } + + if (CActiveScheduler::Current()) + { + COmxILCore& ilCore = *pGlobalILCoreCache->ILCore(); + omxError = ilCore.ComponentNameEnum( + cComponentName, + nNameLength, + nIndex); + } + else + { + if (KErrNone == err) + { + omxError = coresession.ComponentNameEnum( + cComponentName, + nNameLength, + nIndex); + } + else + { + omxError = OMX_ErrorUndefined; + } + + } + + coresession.Close(); + pGlobalILCoreCache->Unlock(); + return omxError; + + } + +/** + The OMX_GetHandle method will locate the component specified by the + component name given, load that component into memory, and validate it. + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle( + OMX_OUT OMX_HANDLETYPE* pHandle, + OMX_IN OMX_STRING cComponentName, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_CALLBACKTYPE* pCallBacks) + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OpenMAX IL mandates that OMX_Init must be the first OMX call made into + // the IL Core... + __ASSERT_ALWAYS(pGlobalILCoreCache->ILCore() != NULL, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if (CActiveScheduler::Current()) + { + COmxILCore& ilCore = *pGlobalILCoreCache->ILCore(); + omxError = ilCore.LoadComponent( + cComponentName, + pHandle, + pAppData, + pCallBacks); + } + else + { + ROmxILCoreClientSession coresession; + TInt err = coresession.Open(); + // OMX_Init must be the first OMX call + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + + if (KErrNone == err) + { + omxError = coresession.GetHandle( + pHandle, + cComponentName, + pAppData, + pCallBacks); + } + else + { + omxError = OMX_ErrorUndefined; + } + + coresession.Close(); + } + + pGlobalILCoreCache->Unlock(); + return omxError; + + } + +/** + The OMX_FreeHandle method will free a handle allocated by the OMX_GetHandle + method. + + @return OMX_ERRORTYPE +*/ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle( + OMX_IN OMX_HANDLETYPE hComponent) + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OpenMAX IL mandates that OMX_Init must be the first OMX call made into + // the IL Core... + __ASSERT_ALWAYS(pGlobalILCoreCache->ILCore() != NULL, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if (CActiveScheduler::Current()) + { + COmxILCore& ilCore = *pGlobalILCoreCache->ILCore(); + omxError = ilCore.FreeHandle(hComponent); + } + else + { + ROmxILCoreClientSession coresession; + TInt err = coresession.Open(); + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + if (KErrNone == err) + { + omxError = coresession.FreeHandle(hComponent); + } + else + { + omxError = OMX_ErrorUndefined; + } + + coresession.Close(); + } + + pGlobalILCoreCache->Unlock(); + return omxError; + + } + +/** + The OMX_SetupTunnel method sets up tunneled communication between an output + port and an input port. + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel( + OMX_IN OMX_HANDLETYPE hOutput, + OMX_IN OMX_U32 nPortOutput, + OMX_IN OMX_HANDLETYPE hInput, + OMX_IN OMX_U32 nPortInput) + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OpenMAX IL mandates that OMX_Init must be the first OMX call made into + // the IL Core... + __ASSERT_ALWAYS(pGlobalILCoreCache->ILCore() != NULL, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + // SetupTunnel is reentrant and thus thread-safe, so no need to lock the + // IL Core instance... + pGlobalILCoreCache->Unlock(); + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if (CActiveScheduler::Current()) + { + omxError = COmxILCore::SetupTunnel( + hOutput, + nPortOutput, + hInput, + nPortInput); + } + else + { + ROmxILCoreClientSession coresession; + TInt err = coresession.Open(); + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + if (KErrNone == err) + { + omxError = coresession.SetupTunnel( + hOutput, + nPortOutput, + hInput, + nPortInput); + } + else + { + // This is to make sure we return something that conforms with + // table 3-9 in the spec. Cannot return OMX_ErrorUndefined + omxError = OMX_ErrorTimeout; + } + + coresession.Close(); + } + return omxError; + + } + +/** + The OMX_GetContentPipe method returns a content pipe capable of manipulating a + given piece of content as (specified via URI) + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_GetContentPipe( + OMX_OUT OMX_HANDLETYPE* hPipe, + OMX_IN OMX_STRING szURI) + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OpenMAX IL mandates that OMX_Init must be the first OMX call made into + // the IL Core... + __ASSERT_ALWAYS(pGlobalILCoreCache->ILCore() != NULL, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if (CActiveScheduler::Current()) + { + COmxILCore& ilCore = *pGlobalILCoreCache->ILCore(); + omxError = ilCore.GetContentPipe( + hPipe, + szURI); + } + else + { + ROmxILCoreClientSession coresession; + TInt err = coresession.Open(); + // OMX_Init needs to be the first OMX call + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + if (KErrNone == err) + { + omxError = coresession.GetContentPipe( + hPipe, + szURI); + } + else + { + omxError = OMX_ErrorUndefined; + } + + coresession.Close(); + } + + pGlobalILCoreCache->Unlock(); + return omxError; + + } + +/** + The OMX_GetComponentsOfRole function that enables the IL client to query the + names of all installed components that support a given role. + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole ( + OMX_IN OMX_STRING role, + OMX_INOUT OMX_U32* pNumComps, + OMX_INOUT OMX_U8** compNames) + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OpenMAX IL mandates that OMX_Init must be the first OMX call made into + // the IL Core... + __ASSERT_ALWAYS(pGlobalILCoreCache->ILCore() != NULL, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + ROmxILCoreClientSession coresession; + OMX_ERRORTYPE omxError = OMX_ErrorNone; + TInt err = coresession.Open(); + // OMX_Init needs to be the first OMX call + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + // The OMX IL spec does not mandate this, but it probably should. We list + // and initialize loaders here too, if we can. + if (KErrNone == err) + { + // Ignore if any error... + coresession.ListLoaders(); + } + + if (CActiveScheduler::Current()) + { + COmxILCore& ilCore = *pGlobalILCoreCache->ILCore(); + omxError = ilCore.GetComponentsOfRole( + role, + pNumComps, + compNames); + } + else + { + + if (KErrNone == err) + { + omxError = coresession.GetComponentsOfRole( + role, + pNumComps, + compNames); + } + else + { + omxError = OMX_ErrorUndefined; + } + + } + + coresession.Close(); + pGlobalILCoreCache->Unlock(); + return omxError; + + } + +/** + The function that enables the IL client to query all the roles fulfilled by + a given a component. + + @return OMX_ERRORTYPE + */ +OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent ( + OMX_IN OMX_STRING compName, + OMX_INOUT OMX_U32* pNumRoles, + OMX_OUT OMX_U8** roles) + { + XGlobalILCoreCache* pGlobalILCoreCache = XGlobalILCoreCache::IlCoreCache(); + __ASSERT_ALWAYS(pGlobalILCoreCache != NULL, + User::Panic(KOmxILCoreClientPanic, KErrNotReady)); + pGlobalILCoreCache->Lock(); + + // OpenMAX IL mandates that OMX_Init must be the first OMX call made into + // the IL Core... + __ASSERT_ALWAYS(pGlobalILCoreCache->ILCore() != NULL, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + ROmxILCoreClientSession coresession; + TInt err = coresession.Open(); + // OMX_Init needs to be the first OMX call + __ASSERT_ALWAYS(KErrNotFound != err, + User::Panic(KOmxILCoreClientPanic, + KErrNotReady)); + + // The OMX IL spec does not mandate this, but it probably should. We list + // and initialize loaders here too, if we can. + if (KErrNone == err) + { + // Ignore if any error... + coresession.ListLoaders(); + } + + OMX_ERRORTYPE omxError = OMX_ErrorNone; + if (CActiveScheduler::Current()) + { + COmxILCore& ilCore = *pGlobalILCoreCache->ILCore(); + omxError = ilCore.GetRolesOfComponent( + compName, + pNumRoles, + roles); + } + else + { + + if (KErrNone == err) + { + omxError = coresession.GetRolesOfComponent( + compName, + pNumRoles, + roles); + } + else + { + omxError = OMX_ErrorUndefined; + } + + } + + coresession.Close(); + pGlobalILCoreCache->Unlock(); + return omxError; + + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreclient/omxilcoreclientsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreclient/omxilcoreclientsession.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,88 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// omilcoreclientsession.h +// +// + +#ifndef OMXILCORECLIENTSESSION_H +#define OMXILCORECLIENTSESSION_H + +#include +#include "omxilcoreclientserver.h" + +class COmxILCore; + +/** + Client-side of a an IL Client - IL Core communication + */ +NONSHARABLE_CLASS(ROmxILCoreClientSession) : public RSessionBase + { + +public: + + ROmxILCoreClientSession(); + ~ROmxILCoreClientSession(); + + TInt Connect(); + TInt Open(); + void Close(); + + // Retrieves an IL Core reference from the IL Core thread + COmxILCore& ILCore(); + + // + // OMX IL Operations... + // + + OMX_ERRORTYPE ListLoaders(); + + OMX_ERRORTYPE DeinitAndClose(); + + OMX_ERRORTYPE ComponentNameEnum( + OMX_STRING cComponentName, + OMX_U32 nNameLength, + OMX_U32 nIndex); + + OMX_ERRORTYPE GetHandle( + OMX_HANDLETYPE* pHandle, + OMX_STRING cComponentName, + OMX_PTR pAppData, + OMX_CALLBACKTYPE* pCallBacks); + + OMX_ERRORTYPE FreeHandle( + OMX_HANDLETYPE hComponent); + + OMX_ERRORTYPE SetupTunnel( + OMX_HANDLETYPE hOutput, + OMX_U32 nPortOutput, + OMX_HANDLETYPE hInput, + OMX_U32 nPortInput); + + OMX_ERRORTYPE GetContentPipe( + OMX_HANDLETYPE *hPipe, + OMX_STRING szURI); + + OMX_ERRORTYPE GetComponentsOfRole ( + OMX_STRING role, + OMX_U32 *pNumComps, + OMX_U8 **compNames); + + OMX_ERRORTYPE GetRolesOfComponent ( + OMX_STRING compName, + OMX_U32 *pNumRoles, + OMX_U8 **roles); + + }; + +#endif // OMXILCORECLIENTSESSION_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreserver/log.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreserver/log.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,146 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __SWI_LOG_H__ +#define __SWI_LOG_H__ + +#include + +namespace DSD +{ + +class TTruncateOverflowHandler16 : public TDes16Overflow + { + public: + virtual void Overflow( TDes16& aDes ); + }; + +inline void TTruncateOverflowHandler16::Overflow( TDes16& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +class TTruncateOverflowHandler8 : public TDes8Overflow + { + public: + virtual void Overflow( TDes8& aDes ); + }; + +inline void TTruncateOverflowHandler8::Overflow( TDes8& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +#ifdef _DEBUG + +#ifdef _OMXIL_CORESERVER_DEBUG_TRACING_ON + +#define DEBUG_PRINTF(a) {DSD::DebugPrintf(__LINE__, __FILE__, a);} +#define DEBUG_PRINTF2(a, b) {DSD::DebugPrintf(__LINE__, __FILE__, a, b);} +#define DEBUG_PRINTF3(a, b, c) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c);} +#define DEBUG_PRINTF4(a, b, c, d) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d);} +#define DEBUG_PRINTF5(a, b, c, d, e) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d, e);} + +#define DEBUG_CODE_SECTION(a) TRAP_IGNORE({ a; }) + +// UTF-8 overload of the DebufPrintf method. Should be used by default, +// since it's cheaper both in CPU cycles and stack space. + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler8 overflowHandler8; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<1024> buffer; + _LIT8(KSwiLogPrefix, "[coresv] "); + _LIT8(KSwiLineFileFormat, "TID[%d] : [%s:%d] -- "); + buffer.Append(KSwiLogPrefix); + RThread thread; + TUint threadId = thread.Id(); + thread.Close(); + RProcess proc; + TFileName fName = proc.FileName(); + proc.Close(); + buffer.AppendFormat(KSwiLineFileFormat, threadId, aFile, aLine); + buffer.AppendFormatList(aFormat, list ,&overflowHandler8 ); + buffer.Append(_L8("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } + +// Unicode DebufPrintf overload + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler16 overflowHandler16; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<256> header; + _LIT8(KSwiLogPrefix, "[coresv] "); + _LIT8(KSwiLineFileFormat, "%Ld Line: % 5d, File: %s -- "); + header.Append(KSwiLogPrefix); + header.AppendFormat(KSwiLineFileFormat, now.Int64(), aLine, aFile); + + TBuf<1024> buffer; + buffer.Copy(header); + buffer.AppendFormatList(aFormat, list ,&overflowHandler16); + buffer.Append(_L("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + + +} // namespace DSD + +#endif // __SWI_LOG_H__ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreclientserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreclientserver.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,103 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILCORECLIENTSERVER_H +#define OMXILCORECLIENTSERVER_H + +#include +#include + +_LIT(KOmxILCoreServerName,"OmxILCoreServer"); + +// A larger stack is used due to Bellagio loader which uses ANSI C calls (fopen etc.). These calls require a large stack, and panic on ARM platforms if a default 8 KB stack is used +const TInt KOmxILCoreServerStackSize=0x4000; // 16KB + +const TUint KOmxILCoreServerVersion = 1; +const TUint KOmxILCoreServerMinorVersionNumber = 0; +const TUint KOmxILCoreServerBuildVersionNumber = 0; + +// Function opcodes for client to server messaging +enum TOmxILCoreClientToServerMessages + { + EOmxILCoreListLoaders = 0, + EOmxILCoreDeinit, + EOmxILCoreGetILCore, + EOmxILCoreComponentNameEnum, + EOmxILCoreGetHandle, + EOmxILCoreFreeHandle, + EOmxILCoreSetupTunnel, + EOmxILCoreGetContentPipe, + EOmxILCoreGetComponentsOfRole, + EOmxILCoreGetRolesOfComponent + }; + +enum TOmxILCoreServerState + { + EOmxILCoreServerStateIdle = 0 + }; + + +class TComponentNameEnum + { +public: + OMX_STRING cComponentName; + OMX_U32 nNameLength; + OMX_U32 nIndex; + }; + +class TGetHandle + { +public: + OMX_HANDLETYPE* pHandle; + OMX_STRING cComponentName; + OMX_PTR pAppData; + OMX_CALLBACKTYPE* pCallBacks; + }; + +class TSetupTunnel + { +public: + OMX_HANDLETYPE hOutput; + OMX_U32 nPortOutput; + OMX_HANDLETYPE hInput; + OMX_U32 nPortInput; + }; + +class TGetContentPipe + { +public: + OMX_HANDLETYPE* hPipe; + OMX_STRING szURI; + }; + +class TGetComponentsOfRole + { +public: + OMX_STRING role; + OMX_U32 *pNumComps; + OMX_U8 **compNames; + }; + +class TGetRolesOfComponent + { +public: + OMX_STRING compName; + OMX_U32 *pNumRoles; + OMX_U8 **roles; + }; + +IMPORT_C TInt StartOmxILCoreServer(TUint32 *aServerHandle); + +#endif // OMXILCORECLIENTSERVER_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserver.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,310 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "log.h" +#include "omxilcoreserver.h" +#include "omxilcoreserversession.h" +#include "omxilcoreclientserver.h" +#include "omxilcore.h" +#include + + +/** + * Constructor + */ +COmxILCoreServer::COmxILCoreServer() +: CServer2(EPriorityStandard) + { + DEBUG_PRINTF(_L8("COmxILCoreServer::COmxILCoreServer")); + Cancel(); + } + +/** + * Destructor. + */ +COmxILCoreServer::~COmxILCoreServer() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::~COmxILCoreServer")); + delete ipOmxILCore; + delete ipStopCallback; + } + +/** + * Constructs, and returns a pointer to, a new COmxILCoreServer object. + * Leaves on failure. + * @return COmxILCoreServer* A pointer to newly created utlitly object. + */ +COmxILCoreServer* COmxILCoreServer::NewL() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::NewL")); + COmxILCoreServer* self = NewLC(); + CleanupStack::Pop(self); + return self; + } + +/** + * Constructs, leaves object on the cleanup stack, and returns a pointer + * to, a new OMX IL Core Server object. + * Leaves on failure. + * @return COmxILCoreServer* A pointer to newly created utlitly object. + */ +COmxILCoreServer* COmxILCoreServer::NewLC() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::NewLC")); + COmxILCoreServer* self = new(ELeave) COmxILCoreServer; + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +/** + Symbian 2nd phase constructor. + */ +void COmxILCoreServer::ConstructL() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::ConstructL")); + + // Create the OpenMAX IL Core + ipOmxILCore = new (ELeave) COmxILCore; + + // Create the server termination callback object... + TCallBack callbackStop (COmxILCoreServer::StopServer, this); + ipStopCallback = + new (ELeave) CAsyncCallBack (callbackStop, CActive::EPriorityLow); + + } + +/** + From CServer2. Creates a server-side client session object. Creates a new + session. This function may leave with one of the system-wide error codes. + + @param const TVersion& aVersion The version number of the session. + + @param const RMessage2& aMessage + + @return A pointer to the new session. + */ +CSession2* COmxILCoreServer::NewSessionL(const TVersion& aVersion, + const RMessage2& aMessage) const + { + + RThread clientThread; + aMessage.Client(clientThread); + RProcess clientProcess; + clientThread.Process(clientProcess); + RProcess thisProcess; + + DEBUG_PRINTF3(_L8("COmxILCoreServer::NewSessionL : this process [%d] - client process [%d]"), thisProcess.Id().operator TUint(), clientProcess.Id().operator TUint()); + + // Only allow sessions from clients running in the server process + if (thisProcess.Id() != clientProcess.Id()) + { + clientThread.Close(); + clientProcess.Close(); + thisProcess.Close(); + User::Leave(KErrAccessDenied); + } + + clientThread.Close(); + clientProcess.Close(); + thisProcess.Close(); + + if(!User::QueryVersionSupported(TVersion(KOmxILCoreServerVersion, + KOmxILCoreServerMinorVersionNumber, + KOmxILCoreServerBuildVersionNumber), + aVersion)) + { + User::Leave(KErrNotSupported); + } + + if (iDeinitInProgress) + { + User::Leave(KErrNotReady); + } + + COmxILCoreServerSession* omxilcoreSession = + COmxILCoreServerSession::NewL(*ipOmxILCore, + const_cast(*this)); + + return omxilcoreSession; + } + +TInt COmxILCoreServer::StopServer(TAny* aPtr) + { + DEBUG_PRINTF(_L8("COmxILCoreServer::StopServer")); + COmxILCoreServer* self = + static_cast (aPtr); + self->DoStopServer(); + return KErrNone; + + } + +void COmxILCoreServer::DoStopServer() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::DoStopServer")); + CActiveScheduler::Stop(); + } + + +void COmxILCoreServer::SetDeinitInProgress() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::SetDeinitInProgress")); + + iDeinitInProgress = ETrue; + + } + +void COmxILCoreServer::SessionOpened() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::SessionOpened")); + + iSessionCounter++; + + } + + +void COmxILCoreServer::SessionClosed() + { + DEBUG_PRINTF(_L8("COmxILCoreServer::SessionClosed")); + + iSessionCounter--; + + if (iSessionCounter == 0 && iDeinitInProgress) + { + DEBUG_PRINTF(_L8("COmxILCoreServer::SessionClosed : iSessionCounter = 0 and DeinitInProgress = TRUE")); + ipStopCallback->Call(); + } + + } + + +TInt COmxILCoreServer::ThreadFunctionL(TAny* aServerHandle) + { + // create an active scheduler and server + CActiveScheduler* sched = new (ELeave) CActiveScheduler; + CleanupStack::PushL(sched); + + //Install the active scheduler + CActiveScheduler::Install(sched); + + COmxILCoreServer* server = COmxILCoreServer::NewL(); + CleanupStack::PushL(server); + + // Start the server + TInt err = server->Start(KNullDesC); + if (err != KErrNone) + { + return err; + } + + RServer2 serverHandle = server->Server(); + User::LeaveIfError(serverHandle.Duplicate(RThread(), EOwnerProcess)); + // Return the handle of the server to function which created us. + *reinterpret_cast(aServerHandle) = serverHandle.Handle(); + + // Let everyone know that we are ready to + // deal with requests. + RThread::Rendezvous(KErrNone); + + // And start fielding requests from client(s). + CActiveScheduler::Start(); + + CleanupStack::PopAndDestroy(2, sched); // sched, server + + return KErrNone; + } + +/** + Create the thread that will act as the server. + +*/ +TInt COmxILCoreServer::ThreadFunction(TAny* aServerHandle) + { + DEBUG_PRINTF(_L8("COmxILCoreServer::ThreadFunction")); + // get clean-up stack + CTrapCleanup* cleanup = CTrapCleanup::New(); + if (cleanup == NULL) + { + return KErrNoMemory; + } + + TRAPD( err, ThreadFunctionL(aServerHandle) ); + + REComSession::FinalClose(); + + delete cleanup; + DEBUG_PRINTF(_L8("COmxILCoreServer::ThreadFunction: returning")); + return err; + } + +/** + Create the thread that will act as the server. This function is exported + from the DLL and called by the client. + +*/ +EXPORT_C TInt StartOmxILCoreServer(TUint32 *aServerHandle) + { + DEBUG_PRINTF(_L8("StartOmxILCoreServer")); + + TInt res = KErrNone; + RThread serverThread; + + // Create the thread for the server. + res = serverThread.Create(KNullDesC, + COmxILCoreServer::ThreadFunction, + KOmxILCoreServerStackSize, + &User::Heap(), + aServerHandle); + + if (res==KErrNone) + { + DEBUG_PRINTF(_L8("StartOmxILCoreServer : Thread created")); + TRequestStatus rendezvousStatus; + + serverThread.SetPriority(EPriorityNormal); + + // Synchronise with the server + serverThread.Rendezvous(rendezvousStatus); + if (rendezvousStatus != KRequestPending) + { + serverThread.Kill(KErrDied); + } + else + { + serverThread.Resume(); + } + + User::WaitForRequest(rendezvousStatus); + if(rendezvousStatus != KErrNone) + { + res = rendezvousStatus.Int(); + } + + } + else + { + // The thread could not be created.. + DEBUG_PRINTF2(_L8("StartOmxILCoreServer : Thread Creation error [%d]"), res); + res = KErrGeneral; + } + + serverThread.Close(); + + return res; + + } + +// End of file diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserver.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,72 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILCORESERVER_H +#define OMXILCORESERVER_H + +#include +#include +#include "omxilcoreclientserver.h" + +class COmxILCore; +class COmxILCoreServerSession; + + +NONSHARABLE_CLASS( COmxILCoreServer ): public CServer2 + { +public: + + static COmxILCoreServer* NewL(); + static COmxILCoreServer* NewLC(); + ~COmxILCoreServer(); + +public: + // The thread function executed by the server + static TInt ThreadFunction(TAny* aServerHandle); + + // Creates a new session with the server; the function + // implements the pure virtutal function + // defined in class CServer2 + CSession2* NewSessionL(const TVersion& aVersion,const RMessage2& aMessage) const; + + void SetDeinitInProgress(); + + void SessionClosed(); + + void SessionOpened(); + +private : + + COmxILCoreServer(); + void ConstructL(); + + // The thread function executed by the server + static TInt ThreadFunctionL(TAny* aServerHandle); + + static TInt StopServer(TAny* aPtr); + + // Function to stop the IL Core server + void DoStopServer(); + +private : + + COmxILCore* ipOmxILCore; + CAsyncCallBack* ipStopCallback; + TBool iDeinitInProgress; + TUint iSessionCounter; + + }; + +#endif //OMXILCORESERVER_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserversession.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,263 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "log.h" +#include "omxilcore.h" +#include "omxilcoreserver.h" +#include "omxilcoreserversession.h" + + +_LIT(KOmxILCoreServerPanic, "OmxILCoreServer Panic"); + +/** + * By default Symbian 2nd phase constructor is private. + */ +COmxILCoreServerSession::COmxILCoreServerSession(COmxILCore& aCore, COmxILCoreServer& aCoreServer) + : + iCore(aCore), + iCoreServer(aCoreServer) + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::COmxILCoreServerSession")); + + // Inform the server that this session is opening + aCoreServer.SessionOpened(); + + } + +/** + * Destructor + */ +COmxILCoreServerSession::~COmxILCoreServerSession() + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::~COmxILCoreServerSession")); + + // Inform the server that this session is closed + iCoreServer.SessionClosed(); + + } + +/** + * Constructs, and returns a pointer to, a new COmxILCoreServerSession object. + * Leaves on failure. + * @return COmxILCoreServerSession* A pointer to newly created utlitly object. + */ +COmxILCoreServerSession* COmxILCoreServerSession::NewL(COmxILCore& aCore, COmxILCoreServer& aCoreServer) + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::NewL")); + + COmxILCoreServerSession* self = new(ELeave) COmxILCoreServerSession(aCore, aCoreServer); + return self; + } + +/** + * from CSession2 + * @param aMessage - Function and data for the session + */ +void COmxILCoreServerSession::ServiceL(const RMessage2& aMessage) + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::ServiceL")); + + TRAPD( errL, DispatchMessageL(aMessage) ); + + if( errL != KErrNone ) + { + ASSERT(0); + } + } + +/** + * Dispatch the message received from ServeL + * @param aMessage - Function and data for the session + * @return error code + * @leave in case of writeL leave or request leave + */ +TInt COmxILCoreServerSession::DispatchMessageL(const RMessage2& aMessage) + { + + TInt error = KErrNone; + OMX_ERRORTYPE omxError = OMX_ErrorNone; + + TOmxILCoreClientToServerMessages messageFunction = + static_cast(aMessage.Function()); + __ASSERT_ALWAYS(messageFunction <= EOmxILCoreGetRolesOfComponent, + User::Panic(KOmxILCoreServerPanic, 0)); + + switch(messageFunction) + { + case EOmxILCoreListLoaders: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreListLoaders")); + omxError = iCore.ListLoaders(); + } + break; + + case EOmxILCoreDeinit: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreDeinit")); + + // Flag the deinitialization ... + iCoreServer.SetDeinitInProgress(); + iCore.DeinitCore(); + + // Write server thread id + RThread thisThread; + TPckgBuf p(thisThread.Id().Id()); + aMessage.WriteL(1,p); + thisThread.Close(); + } + break; + + case EOmxILCoreGetILCore: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreGetILCore")); + + // Write IL Core reference... + TPckgBuf p(&iCore); + aMessage.WriteL(1,p); + + } + break; + + case EOmxILCoreComponentNameEnum: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreComponentNameEnum")); + + TComponentNameEnum* pArg = + static_cast( + const_cast(aMessage.Ptr1())); + __ASSERT_DEBUG(pArg, User::Panic(KOmxILCoreServerPanic, 0)); + + omxError = iCore.ComponentNameEnum( + pArg->cComponentName, + pArg->nNameLength, + pArg->nIndex); + } + break; + + case EOmxILCoreGetHandle: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreGetHandle")); + + TGetHandle* pArg = + static_cast( + const_cast(aMessage.Ptr1())); + __ASSERT_DEBUG(pArg, User::Panic(KOmxILCoreServerPanic, 0)); + + omxError = iCore.LoadComponent( + pArg->cComponentName, + pArg->pHandle, + pArg->pAppData, + pArg->pCallBacks); + + } + break; + + case EOmxILCoreFreeHandle: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreFreeHandle")); + + OMX_HANDLETYPE* hComponent = + static_cast( + const_cast(aMessage.Ptr1())); + + omxError = iCore.FreeHandle(hComponent); + + } + break; + + case EOmxILCoreSetupTunnel: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreSetupTunnel")); + + TSetupTunnel* pArg = + static_cast( + const_cast(aMessage.Ptr1())); + __ASSERT_DEBUG(pArg, User::Panic(KOmxILCoreServerPanic, 0)); + + omxError = COmxILCore::SetupTunnel( + pArg->hOutput, + pArg->nPortOutput, + pArg->hInput, + pArg->nPortInput); + + } + break; + + case EOmxILCoreGetContentPipe: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreGetContentPipe")); + + TGetContentPipe* pArg = + static_cast( + const_cast(aMessage.Ptr1())); + __ASSERT_DEBUG(pArg, User::Panic(KOmxILCoreServerPanic, 0)); + + omxError = iCore.GetContentPipe( + pArg->hPipe, + pArg->szURI); + + } + break; + + case EOmxILCoreGetComponentsOfRole: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreGetComponentsOfRole")); + + TGetComponentsOfRole* pArg = + static_cast( + const_cast(aMessage.Ptr1())); + __ASSERT_DEBUG(pArg, User::Panic(KOmxILCoreServerPanic, 0)); + + omxError = iCore.GetComponentsOfRole( + pArg->role, + pArg->pNumComps, + pArg->compNames); + + } + break; + + case EOmxILCoreGetRolesOfComponent: + { + DEBUG_PRINTF(_L8("COmxILCoreServerSession::DispatchMessageL : EOmxILCoreGetRolesOfComponent")); + + TGetRolesOfComponent* pArg = + static_cast( + const_cast(aMessage.Ptr1())); + __ASSERT_DEBUG(pArg, User::Panic(KOmxILCoreServerPanic, 0)); + + omxError = iCore.GetRolesOfComponent( + pArg->compName, + pArg->pNumRoles, + pArg->roles); + + } + break; + + default: + { + // Unknown Message + error = KErrNotSupported; + } + break; + }; + + // Write OMX result + TPckgBuf p(omxError); + aMessage.WriteL(0,p); + + aMessage.Complete(error); + + return error; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserversession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/src/omxilcoreserver/omxilcoreserversession.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,45 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILCORESERVERSESSION_H +#define OMXILCORESERVERSESSION_H + +#include +#include "omxilcoreclientserver.h" + +class COmxILCore; + +NONSHARABLE_CLASS(COmxILCoreServerSession) : public CSession2 + { +public: + static COmxILCoreServerSession* NewL(COmxILCore& aCore, COmxILCoreServer& aCoreServer); + + ~COmxILCoreServerSession(); + + // from CSession2 + void ServiceL(const RMessage2& aMessage); + +private: + COmxILCoreServerSession(COmxILCore& aCore, COmxILCoreServer& aCoreServer); + TInt DispatchMessageL(const RMessage2& aMessage); + +private: + + COmxILCore& iCore; + COmxILCoreServer& iCoreServer; + + }; + +#endif // OMXILCORESERVERSESSION_H diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/traces/OstTraceDefinitions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/traces/OstTraceDefinitions.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,22 @@ +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +//#define OST_TRACE_COMPILER_IN_USE +#include +#endif diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/traces/fixed_id.definitions --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/traces/fixed_id.definitions Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,593 @@ +#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt. +[GROUP]TRACE_API=0x6 +[GROUP]TRACE_API_BUFFER=0x6b +[GROUP]TRACE_API_DUMP_STRUCT=0x6a +[TRACE]TRACE_API[0x6]__ComponentDeInit1=0x6a1 +[TRACE]TRACE_API[0x6]__ComponentDeInit2=0x6a2 +[TRACE]TRACE_API[0x6]__ComponentNameEnum1=0x6b6 +[TRACE]TRACE_API[0x6]__ComponentNameEnum2=0x6b7 +[TRACE]TRACE_API[0x6]__ComponentRoleEnum1=0x6b2 +[TRACE]TRACE_API[0x6]__ComponentRoleEnum2=0x6b3 +[TRACE]TRACE_API[0x6]__ComponentTunnelRequest1=0x69d +[TRACE]TRACE_API[0x6]__ComponentTunnelRequest2=0x69e +[TRACE]TRACE_API[0x6]__EventHandler10=0x6af +[TRACE]TRACE_API[0x6]__EventHandler2=0x6a7 +[TRACE]TRACE_API[0x6]__EventHandler3=0x6a8 +[TRACE]TRACE_API[0x6]__EventHandler4=0x6a9 +[TRACE]TRACE_API[0x6]__EventHandler5=0x6aa +[TRACE]TRACE_API[0x6]__EventHandler6=0x6ab +[TRACE]TRACE_API[0x6]__EventHandler7=0x6ac +[TRACE]TRACE_API[0x6]__EventHandler8=0x6ad +[TRACE]TRACE_API[0x6]__EventHandler9=0x6ae +[TRACE]TRACE_API[0x6]__FreeHandle1=0x6b8 +[TRACE]TRACE_API[0x6]__FreeHandle2=0x6b9 +[TRACE]TRACE_API[0x6]__GetComponentVersion1=0x69f +[TRACE]TRACE_API[0x6]__GetComponentVersion2=0x6a0 +[TRACE]TRACE_API[0x6]__GetComponentsOfRole1=0x6be +[TRACE]TRACE_API[0x6]__GetComponentsOfRole2=0x6bf +[TRACE]TRACE_API[0x6]__GetConfig1=0x688 +[TRACE]TRACE_API[0x6]__GetConfig2=0x689 +[TRACE]TRACE_API[0x6]__GetContentPipe1=0x6bc +[TRACE]TRACE_API[0x6]__GetContentPipe2=0x6bd +[TRACE]TRACE_API[0x6]__GetExtensionIndex1=0x6a3 +[TRACE]TRACE_API[0x6]__GetExtensionIndex2=0x6a4 +[TRACE]TRACE_API[0x6]__GetParameter1=0x68e +[TRACE]TRACE_API[0x6]__GetParameter2=0x68f +[TRACE]TRACE_API[0x6]__GetParameter3=0x690 +[TRACE]TRACE_API[0x6]__GetParameter4=0x691 +[TRACE]TRACE_API[0x6]__GetParameter5=0x692 +[TRACE]TRACE_API[0x6]__GetRolesOfComponent1=0x6c0 +[TRACE]TRACE_API[0x6]__GetRolesOfComponent2=0x6c1 +[TRACE]TRACE_API[0x6]__GetState1=0x68c +[TRACE]TRACE_API[0x6]__GetState2=0x68d +[TRACE]TRACE_API[0x6]__LoadComponent1=0x6b4 +[TRACE]TRACE_API[0x6]__LoadComponent2=0x6b5 +[TRACE]TRACE_API[0x6]__SendCommand1=0x698 +[TRACE]TRACE_API[0x6]__SendCommand2=0x699 +[TRACE]TRACE_API[0x6]__SendCommand3=0x69a +[TRACE]TRACE_API[0x6]__SendCommand4=0x69b +[TRACE]TRACE_API[0x6]__SendCommand6=0x69c +[TRACE]TRACE_API[0x6]__SetCallbacks1=0x6a5 +[TRACE]TRACE_API[0x6]__SetCallbacks2=0x6a6 +[TRACE]TRACE_API[0x6]__SetConfig1=0x68a +[TRACE]TRACE_API[0x6]__SetConfig2=0x68b +[TRACE]TRACE_API[0x6]__SetParameter1=0x693 +[TRACE]TRACE_API[0x6]__SetParameter2=0x694 +[TRACE]TRACE_API[0x6]__SetParameter3=0x695 +[TRACE]TRACE_API[0x6]__SetParameter4=0x696 +[TRACE]TRACE_API[0x6]__SetParameter5=0x697 +[TRACE]TRACE_API[0x6]__SetupTunnel1=0x6ba +[TRACE]TRACE_API[0x6]__SetupTunnel2=0x6bb +[TRACE]TRACE_API[0x6]__UseEGLImage1=0x6b0 +[TRACE]TRACE_API[0x6]__UseEGLImage2=0x6b1 +[TRACE]TRACE_API_BUFFER[0x6B]__AllocateBuffer1=0x1 +[TRACE]TRACE_API_BUFFER[0x6B]__AllocateBuffer2=0x2 +[TRACE]TRACE_API_BUFFER[0x6B]__EmptyBufferDone2=0xb +[TRACE]TRACE_API_BUFFER[0x6B]__EmptyThisBuffer1=0x3 +[TRACE]TRACE_API_BUFFER[0x6B]__EmptyThisBuffer2=0x4 +[TRACE]TRACE_API_BUFFER[0x6B]__FillBufferDone2=0xc +[TRACE]TRACE_API_BUFFER[0x6B]__FillThisBuffer1=0x5 +[TRACE]TRACE_API_BUFFER[0x6B]__FillThisBuffer2=0x6 +[TRACE]TRACE_API_BUFFER[0x6B]__FreeBuffer1=0x7 +[TRACE]TRACE_API_BUFFER[0x6B]__FreeBuffer2=0x8 +[TRACE]TRACE_API_BUFFER[0x6B]__UseBuffer1=0x9 +[TRACE]TRACE_API_BUFFER[0x6B]__UseBuffer2=0xa +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__EmptyBufferDone3=0x8 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__EmptyThisBuffer3=0x5 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__FillBufferDone3=0x9 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__FillThisBuffer3=0x6 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__FreeBuffer3=0x7 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__GetConfig3=0x1 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__GetParameter6=0x3 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__SetConfig3=0x2 +[TRACE]TRACE_API_DUMP_STRUCT[0x6A]__SetParameter6=0x4 +[[OBSOLETE]]ETE]][TRACE]TRACE_API_BUFFER[0x55]__FillBufferDone2=0xc +[[OBSOLETE]]ETE]][TRACE]TRACE_API_BUFFER[0x57]__FillBufferDone2=0xc +[[OBSOLETE]][0x4E]__FreeBuffer1=0x7 +[[OBSOLETE]][GROUP]TRACE_API_BUFFER=0x69 +[[OBSOLETE]][GROUP]TRACE_API_DUMP_STRUCT=0x68 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentDeInit1=0x663 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentDeInit2=0x664 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentNameEnum1=0x678 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentNameEnum2=0x679 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentRoleEnum1=0x674 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentRoleEnum2=0x675 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentTunnelRequest1=0x65f +[[OBSOLETE]][TRACE]TRACE_API[0x6]__ComponentTunnelRequest2=0x660 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__Connect1=0x684 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__Connect2=0x685 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__DeinitAndClose1=0x686 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__DeinitAndClose2=0x687 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler10=0x671 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler2=0x669 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler3=0x66a +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler4=0x66b +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler5=0x66c +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler6=0x66d +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler7=0x66e +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler8=0x66f +[[OBSOLETE]][TRACE]TRACE_API[0x6]__EventHandler9=0x670 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__FreeHandle1=0x67a +[[OBSOLETE]][TRACE]TRACE_API[0x6]__FreeHandle2=0x67b +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetComponentVersion1=0x661 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetComponentVersion2=0x662 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetComponentsOfRole1=0x680 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetComponentsOfRole2=0x681 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetConfig1=0x64a +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetConfig2=0x64b +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetContentPipe1=0x67e +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetContentPipe2=0x67f +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetExtensionIndex1=0x665 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetExtensionIndex2=0x666 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetParameter1=0x650 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetParameter2=0x651 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetParameter3=0x652 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetParameter4=0x653 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetParameter5=0x654 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetRolesOfComponent1=0x682 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetRolesOfComponent2=0x683 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetState1=0x64e +[[OBSOLETE]][TRACE]TRACE_API[0x6]__GetState2=0x64f +[[OBSOLETE]][TRACE]TRACE_API[0x6]__LoadComponent1=0x676 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__LoadComponent2=0x677 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SendCommand1=0x65a +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SendCommand2=0x65b +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SendCommand3=0x65c +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SendCommand4=0x65d +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SendCommand5=0x529 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SendCommand6=0x65e +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetCallbacks1=0x667 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetCallbacks2=0x668 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetConfig1=0x64c +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetConfig2=0x64d +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetParameter1=0x655 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetParameter2=0x656 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetParameter3=0x657 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetParameter4=0x658 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetParameter5=0x659 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetParameter6=0x45c +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetParameter7=0x524 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetupTunnel1=0x67c +[[OBSOLETE]][TRACE]TRACE_API[0x6]__SetupTunnel2=0x67d +[[OBSOLETE]][TRACE]TRACE_API[0x6]__UseEGLImage1=0x672 +[[OBSOLETE]][TRACE]TRACE_API[0x6]__UseEGLImage2=0x673 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x40]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x41]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x42]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x43]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x44]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x45]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x46]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x47]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x48]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x49]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4A]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4B]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4D]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4E]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x4F]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x50]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x51]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x52]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x53]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x54]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x55]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x56]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x57]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__FillThisBuffer2=0xd +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x58]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5B]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5D]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x5F]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x61]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x62]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x64]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x67]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__AllocateBuffer1=0x1 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__AllocateBuffer2=0x2 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__EmptyBufferDone2=0xb +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__EmptyThisBuffer1=0x3 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__EmptyThisBuffer2=0x4 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__EmptyThisBuffer4=0xd +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__FillBufferDone2=0xc +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__FillThisBuffer1=0x5 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__FillThisBuffer2=0x6 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__FreeBuffer1=0x7 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__FreeBuffer2=0x8 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__UseBuffer1=0x9 +[[OBSOLETE]][TRACE]TRACE_API_BUFFER[0x69]__UseBuffer2=0xa +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x59]__EmptyThisBuffer3=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x59]__FillThisBuffer3=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x59]__SetConfig3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x59]__SetParameter6=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5A]__EmptyThisBuffer3=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5A]__FillThisBuffer3=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5A]__SetConfig3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5A]__SetParameter6=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5C]__EmptyThisBuffer3=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5C]__FillThisBuffer3=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5C]__SetConfig3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5C]__SetParameter6=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__EmptyBufferDone3=0x8 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__EmptyThisBuffer3=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__FillBufferDone3=0x9 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__FillThisBuffer3=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__FreeBuffer3=0x7 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__GetConfig3=0x5 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__GetParameter6=0x6 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__SetConfig3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x5E]__SetParameter6=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__EmptyBufferDone3=0x8 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__EmptyThisBuffer3=0x5 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__FillBufferDone3=0x9 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__FillThisBuffer3=0x6 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__FreeBuffer3=0x7 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__GetConfig3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__GetParameter6=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__SetConfig3=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x60]__SetParameter6=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x63]__GetConfig3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x63]__SetConfig3=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x65]__EmptyBufferDone3=0x5 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x65]__EmptyThisBuffer3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x65]__FillBufferDone3=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x65]__GetParameter6=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x65]__SetParameter6=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x66]__EmptyBufferDone3=0x6 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x66]__EmptyThisBuffer3=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x66]__FillBufferDone3=0x7 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x66]__FillThisBuffer3=0x5 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x66]__GetParameter6=0x2 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x66]__SetConfig3=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x66]__SetParameter6=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__EmptyBufferDone3=0x6 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__EmptyThisBuffer3=0x3 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__FillBufferDone3=0x7 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__FillThisBuffer3=0x4 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__FreeBuffer3=0x5 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__GetConfig3=0x8 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__GetParameter6=0x1 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__SetConfig3=0x9 +[[OBSOLETE]][TRACE]TRACE_API_DUMP_STRUCT[0x68]__SetParameter6=0x2 +[[OBSOLETE]][[OBSACE_API_BUFFER[0x44]__EmptyBufferDone2=0xb +[[OBSOLETE]]ter6=0x2 diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilcore/traces/trace.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilcore/traces/trace.properties Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,256 @@ + + + +OMX_IndexComponentStartUnused +OMX_IndexParamPriorityMgmt +OMX_IndexParamAudioInit +OMX_IndexParamImageInit +OMX_IndexParamVideoInit +OMX_IndexParamOtherInit +OMX_IndexParamNumAvailableStreams +OMX_IndexParamActiveStream +OMX_IndexParamSuspensionPolicy +OMX_IndexParamComponentSuspended +OMX_IndexConfigCapturing +OMX_IndexConfigCaptureMode +OMX_IndexAutoPauseAfterCapture +OMX_IndexParamContentURI +OMX_IndexParamCustomContentPipe +OMX_IndexParamDisableResourceConcealment +OMX_IndexConfigMetadataItemCount +OMX_IndexConfigContainerNodeCount +OMX_IndexConfigMetadataItem +OMX_IndexConfigCounterNodeID +OMX_IndexParamMetadataFilterType +OMX_IndexParamMetadataKeyFilter +OMX_IndexConfigPriorityMgmt +OMX_IndexParamStandardComponentRole +OMX_IndexPortStartUnused +OMX_IndexParamPortDefinition +OMX_IndexParamCompBufferSupplier +OMX_IndexReservedStartUnused +OMX_IndexAudioStartUnused +OMX_IndexParamAudioPortFormat +OMX_IndexParamAudioPcm +OMX_IndexParamAudioAac +OMX_IndexParamAudioRa +OMX_IndexParamAudioMp3 +OMX_IndexParamAudioAdpcm +OMX_IndexParamAudioG723 +OMX_IndexParamAudioG729 +OMX_IndexParamAudioAmr +OMX_IndexParamAudioWma +OMX_IndexParamAudioSbc +OMX_IndexParamAudioMidi +OMX_IndexParamAudioGsm_FR +OMX_IndexParamAudioMidiLoadUserSound +OMX_IndexParamAudioG726 +OMX_IndexParamAudioGsm_EFR +OMX_IndexParamAudioGsm_HR +OMX_IndexParamAudioPdc_FR +OMX_IndexParamAudioPdc_EFR +OMX_IndexParamAudioPdc_HR +OMX_IndexParamAudioTdma_FR +OMX_IndexParamAudioTdma_EFR +OMX_IndexParamAudioQcelp8 +OMX_IndexParamAudioQcelp13 +OMX_IndexParamAudioEvrc +OMX_IndexParamAudioSmv +OMX_IndexParamAudioVorbis +OMX_IndexConfigAudioMidiImmediateEvent +OMX_IndexConfigAudioMidiControl +OMX_IndexConfigAudioMidiSoundBankProgram +OMX_IndexConfigAudioMidiStatus +OMX_IndexConfigAudioMidiMetaEvent +OMX_IndexConfigAudioMidiMetaEventData +OMX_IndexConfigAudioVolume +OMX_IndexConfigAudioBalance +OMX_IndexConfigAudioChannelMute +OMX_IndexConfigAudioMute +OMX_IndexConfigAudioLoudness +OMX_IndexConfigAudioEchoCancelation +OMX_IndexConfigAudioNoiseReduction +OMX_IndexConfigAudioBass +OMX_IndexConfigAudioTreble +OMX_IndexConfigAudioStereoWidening +OMX_IndexConfigAudioChorus +OMX_IndexConfigAudioEqualizer +OMX_IndexConfigAudioReverberation +OMX_IndexConfigAudioChannelVolume +OMX_IndexImageStartUnused +OMX_IndexParamImagePortFormat +OMX_IndexParamFlashControl +OMX_IndexConfigFocusControl +OMX_IndexParamQFactor +OMX_IndexParamQuantizationTable +OMX_IndexParamHuffmanTable +OMX_IndexConfigFlashControl +OMX_IndexVideoStartUnused +OMX_IndexParamVideoPortFormat +OMX_IndexParamVideoQuantization +OMX_IndexParamVideoFastUpdate +OMX_IndexParamVideoBitrate +OMX_IndexParamVideoMotionVector +OMX_IndexParamVideoIntraRefresh +OMX_IndexParamVideoErrorCorrection +OMX_IndexParamVideoVBSMC +OMX_IndexParamVideoMpeg2 +OMX_IndexParamVideoMpeg4 +OMX_IndexParamVideoWmv +OMX_IndexParamVideoRv +OMX_IndexParamVideoAvc +OMX_IndexParamVideoH263 +OMX_IndexParamVideoProfileLevelQuerySupported +OMX_IndexParamVideoProfileLevelCurrent +OMX_IndexConfigVideoBitrate +OMX_IndexConfigVideoFramerate +OMX_IndexConfigVideoIntraVOPRefresh +OMX_IndexConfigVideoIntraMBRefresh +OMX_IndexConfigVideoMBErrorReporting +OMX_IndexParamVideoMacroblocksPerFrame +OMX_IndexConfigVideoMacroBlockErrorMap +OMX_IndexParamVideoSliceFMO +OMX_IndexConfigVideoAVCIntraPeriod +OMX_IndexConfigVideoNalSize +OMX_IndexCommonStartUnused +OMX_IndexParamCommonDeblocking +OMX_IndexParamCommonSensorMode +OMX_IndexParamCommonInterleave +OMX_IndexConfigCommonColorFormatConversion +OMX_IndexConfigCommonScale +OMX_IndexConfigCommonImageFilter +OMX_IndexConfigCommonColorEnhancement +OMX_IndexConfigCommonColorKey +OMX_IndexConfigCommonColorBlend +OMX_IndexConfigCommonFrameStabilisation +OMX_IndexConfigCommonRotate +OMX_IndexConfigCommonMirror +OMX_IndexConfigCommonOutputPosition +OMX_IndexConfigCommonInputCrop +OMX_IndexConfigCommonOutputCrop +OMX_IndexConfigCommonDigitalZoom +OMX_IndexConfigCommonOpticalZoom +OMX_IndexConfigCommonWhiteBalance +OMX_IndexConfigCommonExposure +OMX_IndexConfigCommonContrast +OMX_IndexConfigCommonBrightness +OMX_IndexConfigCommonBacklight +OMX_IndexConfigCommonGamma +OMX_IndexConfigCommonSaturation +OMX_IndexConfigCommonLightness +OMX_IndexConfigCommonExclusionRect +OMX_IndexConfigCommonDithering +OMX_IndexConfigCommonPlaneBlend +OMX_IndexConfigCommonExposureValue +OMX_IndexConfigCommonOutputSize +OMX_IndexParamCommonExtraQuantData +OMX_IndexConfigCommonFocusRegion +OMX_IndexConfigCommonFocusStatus +OMX_IndexConfigCommonTransitionEffect +OMX_IndexOtherStartUnused +OMX_IndexParamOtherPortFormat +OMX_IndexConfigOtherPower +OMX_IndexConfigOtherStats +OMX_IndexTimeStartUnused +OMX_IndexConfigTimeScale +OMX_IndexConfigTimeClockState +OMX_IndexConfigTimeActiveRefClock +OMX_IndexConfigTimeCurrentMediaTime +OMX_IndexConfigTimeCurrentWallTime +OMX_IndexConfigTimeCurrentAudioReference +OMX_IndexConfigTimeCurrentVideoReference +OMX_IndexConfigTimeMediaTimeRequest +OMX_IndexConfigTimeClientStartTime +OMX_IndexConfigTimePosition +OMX_IndexConfigTimeSeekMode +OMX_IndexKhronosExtensions +OMX_IndexVendorStartUnused +OMX_IndexMax + + +O +OMX_ErrorInsufficientResources +OMX_ErrorUndefined +OMX_ErrorInvalidComponentName +OMX_ErrorComponentNotFound +OMX_ErrorInvalidComponent +OMX_ErrorBadParameter +OMX_ErrorNotImplemented +OMX_ErrorUnderflow +OMX_ErrorOverflow +OMX_ErrorHardware +OMX_ErrorInvalidState +OMX_ErrorStreamCorrupt +OMX_ErrorPortsNotCompatible +OMX_ErrorResourcesLost +OMX_ErrorNoMore +OMX_ErrorVersionMismatch +OMX_ErrorNotReady +OMX_ErrorTimeout +OMX_ErrorSameState +OMX_ErrorResourcesPreempted +OMX_ErrorPortUnresponsiveDuringAllocation +OMX_ErrorPortUnresponsiveDuringDeallocation +OMX_ErrorPortUnresponsiveDuringStop +OMX_ErrorIncorrectStateTransition +OMX_ErrorIncorrectStateOperation +OMX_ErrorUnsupportedSetting +OMX_ErrorUnsupportedIndex +OMX_ErrorBadPortIndex +OMX_ErrorPortUnpopulated +OMX_ErrorComponentSuspended +OMX_ErrorDynamicResourcesUnavailable +OMX_ErrorMbErrorsInFrame +OMX_ErrorFormatNotDetected +OMX_ErrorContentPipeOpenFailed +OMX_ErrorContentPipeCreationFailed +OMX_ErrorSeperateTablesUsed +OMX_ErrorTunnelingUnsupported +OMX_ErrorKhronosExtensions +OMX_ErrorVendorStartUnused +OMX_ErrorMax + + +OMX_CommandStateSet +OMX_CommandFlush +OMX_CommandPortDisable +OMX_CommandPortEnable +OMX_CommandMarkBuffer +OMX_CommandKhronosExtensions +OMX_CommandVendorStartUnused +OMX_CommandMax + + +OMX_StateInvalid +OMX_StateLoaded +OMX_StateIdle +OMX_StateExecuting +OMX_StatePause +OMX_StateWaitForResources +OMX_StateKhronosExtensions +OMX_StateVendorStartUnused +OMX_StateMax + + +OMX_EventCmdComplete +OMX_EventError +OMX_EventMark +OMX_EventPortSettingsChanged +OMX_EventBufferFlag +OMX_EventResourcesAcquired +OMX_EventComponentResumed +OMX_EventDynamicResourcesAvailable +OMX_EventPortFormatDetected +OMX_EventKhronosExtensions +OMX_EventVendorStartUnused +OMX_EventMax + + +OMX_BufferSupplyUnspecified +OMX_BufferSupplyInput +OMX_BufferSupplyOutput +OMX_BufferSupplyKhronosExtensions +OMX_BufferSupplyVendorStartUnused +OMX_BufferSupplyMax + + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,28 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_PLATFORMS +BASEDEFAULT + +PRJ_MMPFILES +// Loader +../mmpfiles/omxilsymbianloader.mmp +../mmpfiles/omxilcomponentif.mmp + +PRJ_EXPORTS + +// Romkit include files +omxilloader.iby /epoc32/rom/include/omxilloader.iby + diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/group/omxilloader.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/group/omxilloader.iby Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,22 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILLOADER_IBY +#define OMXILLOADER_IBY + +// OMX IL Loader +ECOM_PLUGIN(omxilsymbianloader.dll, omxilsymbianloader.rsc) + +#endif // OMXILLOADER_IBY diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/mmpfiles/omxilcomponentif.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/mmpfiles/omxilcomponentif.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,31 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// @file +// @SYMPurpose omxilcomponentif.lib Library used by the OMX Core to +// allow an OMX component to be loaded as an ECom plugin. +// +// + +TARGET omxilcomponentif.lib +TARGETTYPE LIB +UID 0x10285C04 +VENDORID 0x70000001 + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +SOURCEPATH ../src +SOURCE omxilsymbiancomponentif.cpp + + +SMPSAFE diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/mmpfiles/omxilsymbianloader.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/mmpfiles/omxilsymbianloader.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,37 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "../src/omxiluids.hrh" + +TARGET omxilsymbianloader.dll +CAPABILITY ALL -TCB +TARGETTYPE PLUGIN +UID KUidECOM KUidOmxILLoaderDll +VENDORID 0x70000001 + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN +OS_LAYER_ESTLIB_SYSTEMINCLUDE + +SOURCEPATH ../src +SOURCE omxilsymbiancomponentloader.cpp +RESOURCE omxilsymbianloader.rss + +LIBRARY euser.lib +LIBRARY ecom.lib +LIBRARY estlib.lib + +// MACRO _OMXIL_SYMBIANLOADER_DEBUG_TRACING_ON + +SMPSAFE diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/src/log.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/src/log.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,149 @@ +/* +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef __SWI_LOG_H__ +#define __SWI_LOG_H__ + +#include + +class TTruncateOverflowHandler16 : public TDes16Overflow + { + public: + virtual void Overflow( TDes16& aDes ); + }; + +inline void TTruncateOverflowHandler16::Overflow( TDes16& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +class TTruncateOverflowHandler8 : public TDes8Overflow + { + public: + virtual void Overflow( TDes8& aDes ); + }; + +inline void TTruncateOverflowHandler8::Overflow( TDes8& aDes) + { + _LIT(KErrOverflowMsg,"Descriptor Overflow, hence value truncated"); + if( aDes.MaxLength() >= KErrOverflowMsg().Length() + aDes.Length() ) + aDes.Append(KErrOverflowMsg); + } + +namespace DSD +{ + +#ifdef _DEBUG + +#ifdef _OMXIL_SYMBIANLOADER_DEBUG_TRACING_ON + +#define DEBUG_PRINTF(a) {DSD::DebugPrintf(__LINE__, __FILE__, a);} +#define DEBUG_PRINTF2(a, b) {DSD::DebugPrintf(__LINE__, __FILE__, a, b);} +#define DEBUG_PRINTF3(a, b, c) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c);} +#define DEBUG_PRINTF4(a, b, c, d) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d);} +#define DEBUG_PRINTF5(a, b, c, d, e) {DSD::DebugPrintf(__LINE__, __FILE__, a, b, c, d, e);} + +#define DEBUG_CODE_SECTION(a) TRAP_IGNORE({ a; }) + +// UTF-8 overload of the DebufPrintf method. Should be used by default, +// since it's cheaper both in CPU cycles and stack space. + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler8 overflowHandler8; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<1024> buffer; + _LIT8(KSwiLogPrefix, "[symloader] "); + _LIT8(KSwiLineFileFormat, "TID[%d] : [%s:%d] -- "); + buffer.Append(KSwiLogPrefix); + RThread thread; + TUint threadId = thread.Id(); + thread.Close(); + RProcess proc; + TFileName fName = proc.FileName(); + proc.Close(); + buffer.AppendFormat(KSwiLineFileFormat, threadId, aFile, aLine); + buffer.AppendFormatList(aFormat, list ,&overflowHandler8 ); + buffer.Append(_L8("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } + +// Unicode DebufPrintf overload + +inline void DebugPrintf(TInt aLine, char* aFile, TRefByValue aFormat, ...) + { + TTruncateOverflowHandler16 overflowHandler16; + VA_LIST list; + VA_START(list, aFormat); + + TTime now; + now.HomeTime(); + + TBuf8<256> header; + _LIT8(KSwiLogPrefix, "[symloader] "); + _LIT8(KSwiLineFileFormat, "%Ld Line: % 5d, File: %s -- "); + header.Append(KSwiLogPrefix); + header.AppendFormat(KSwiLineFileFormat, now.Int64(), aLine, aFile); + + TBuf<1024> buffer; + buffer.Copy(header); + buffer.AppendFormatList(aFormat, list ,&overflowHandler16); + buffer.Append(_L("\r\n")); + + RDebug::RawPrint(buffer); + + VA_END(list); + } +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + +#else + +#define DEBUG_PRINTF(a) +#define DEBUG_PRINTF2(a, b) +#define DEBUG_PRINTF3(a, b, c) +#define DEBUG_PRINTF4(a, b, c, d) +#define DEBUG_PRINTF5(a, b, c, d, e) + +#define DEBUG_CODE_SECTION(a) + +#endif + + +} // namespace DSD + +#endif // __SWI_LOG_H__ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/src/omxilsymbiancomponentif.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/src/omxilsymbiancomponentif.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,86 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include + +/** +Constructor of this interface. +*/ +COmxILSymbianComponentIf::COmxILSymbianComponentIf() + { + } + +/** +Static method to create this interface. +The actual OMX_COMPONENTTYPE structure should be allocated and populated as part +of the construction of this interface. + +@return A pointer to the newly constructed COmxILSymbianComponentIf. + +@internalTechnology +*/ +COmxILSymbianComponentIf* COmxILSymbianComponentIf::NewL() + { + COmxILSymbianComponentIf* self = new (ELeave) COmxILSymbianComponentIf; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + +/** +Constructs and populates the OMX_COMPONENTTYPE structure encapsulated within this interface. +*/ +void COmxILSymbianComponentIf::ConstructL() + { + ipHandle = new(ELeave) OMX_COMPONENTTYPE; + OMX_ERRORTYPE error = OMX_ErrorInsufficientResources; + + error = ::OMX_ComponentInit(ipHandle); + if ( OMX_ErrorNone != error ) + { + if( error == OMX_ErrorInsufficientResources ) + { + User::Leave(KErrNoMemory); + } + else + { + User::Leave(KErrGeneral); + } + } + } + +/** +Destructor of this interface. +Deletes the component's structure. + +@internalTechnology +*/ +COmxILSymbianComponentIf::~COmxILSymbianComponentIf() + { + delete ipHandle; + } + + +/** +Gets the valid handle of the already populated OMX_HANDLETYPE structure. + +@return The component's handle +*/ +OMX_HANDLETYPE COmxILSymbianComponentIf::Handle() + { + return ipHandle; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/src/omxilsymbiancomponentloader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/src/omxilsymbiancomponentloader.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,443 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include +#include +#include "omxilsymbiancomponentloader.h" +#include "omxiluids.hrh" +#include +#include +#include +#include +#include +#include +#include +#include "log.h" + +OMX_ERRORTYPE OmxInitializeComponentLoader(OMX_LOADERTYPE *loader); +OMX_ERRORTYPE OmxUnInitializeComponentLoader(OMX_LOADERTYPE *loader); +OMX_ERRORTYPE OmxLoadComponent( OMX_LOADERTYPE *loader, + OMX_OUT OMX_HANDLETYPE* pHandle, + OMX_IN OMX_STRING cComponentName, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_CALLBACKTYPE* pCallBacks); +OMX_ERRORTYPE OmxUnloadComponent( OMX_LOADERTYPE *loader, + OMX_HANDLETYPE hComponent); +OMX_ERRORTYPE OmxComponentNameEnum( OMX_LOADERTYPE *loader, + OMX_OUT OMX_STRING cComponentName, + OMX_IN OMX_U32 nNameLength, + OMX_IN OMX_U32 nIndex); +OMX_ERRORTYPE OmxGetRolesOfComponent( OMX_LOADERTYPE *loader, + OMX_IN OMX_STRING compName, + OMX_INOUT OMX_U32 *pNumRoles, + OMX_OUT OMX_U8 **roles); +OMX_ERRORTYPE OmxGetComponentsOfRole( OMX_LOADERTYPE *loader, + OMX_IN OMX_STRING role, + OMX_INOUT OMX_U32 *pNumComps, + OMX_INOUT OMX_U8 **compNames); + + + +OMX_ERRORTYPE OmxInitializeComponentLoader(OMX_LOADERTYPE *loader) + { + return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->InitializeComponentLoader(); + } + +OMX_ERRORTYPE OmxUnInitializeComponentLoader(OMX_LOADERTYPE *loader) + { + return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->UnInitializeComponentLoader(loader); + } + +OMX_ERRORTYPE OmxLoadComponent( OMX_LOADERTYPE *loader, + OMX_OUT OMX_HANDLETYPE* pHandle, + OMX_IN OMX_STRING cComponentName, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_CALLBACKTYPE* pCallBacks) + { + return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->LoadComponent(pHandle,cComponentName,pAppData,pCallBacks); + } + +OMX_ERRORTYPE OmxUnloadComponent( OMX_LOADERTYPE *loader, + OMX_HANDLETYPE hComponent) + { + return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->UnloadComponent(hComponent); + } + +OMX_ERRORTYPE OmxComponentNameEnum( OMX_LOADERTYPE *loader, + OMX_OUT OMX_STRING cComponentName, + OMX_IN OMX_U32 nNameLength, + OMX_IN OMX_U32 nIndex) + { + return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->ComponentNameEnum(cComponentName,nNameLength,nIndex); + } + +OMX_ERRORTYPE OmxGetRolesOfComponent( OMX_LOADERTYPE *loader, + OMX_IN OMX_STRING compName, + OMX_INOUT OMX_U32 *pNumRoles, + OMX_OUT OMX_U8 **roles) + { + return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->GetRolesOfComponent(compName,pNumRoles,roles); + } + +OMX_ERRORTYPE OmxGetComponentsOfRole( OMX_LOADERTYPE *loader, + OMX_IN OMX_STRING role, + OMX_INOUT OMX_U32 *pNumComps, + OMX_INOUT OMX_U8 **compNames) + { + return ((CSymbianOmxComponentLoader*)((OMX_LOADERTYPE*)loader)->pLoaderPrivate)->GetComponentsOfRole(role,pNumComps,compNames); + } + +OMX_ERRORTYPE CSymbianOmxComponentLoader::InitializeComponentLoader() + { + RImplInfoPtrArray ecomArray; + TRAPD(error,REComSession::ListImplementationsL(TUid::Uid(KUidOmxILSymbianComponentIf),ecomArray)); + if( error != KErrNone ) + { + ecomArray.ResetAndDestroy(); + return OMX_ErrorInsufficientResources; + } + TInt index; + CImplementationInformation* info; + + TOmxComponentInfo component; + + iComponentNameList.Reset(); + + const TInt KEcomArrayCount = ecomArray.Count(); + for( index=0; indexImplementationUid(); + if( info->DisplayName().Length() >= OMX_MAX_STRINGNAME_SIZE || + info->DataType().Length() >= OMX_MAX_ROLESBUFFER_SIZE ) + { + error = KErrBadName; + break; + } + + component.iComponentName.Copy(info->DisplayName()); + component.iRoles.Copy(info->DataType()); + + error = iComponentNameList.Append(component); + if(error) + { + break; + } + } + ecomArray.ResetAndDestroy(); + if( error != KErrNone ) + { + if( error == KErrNoMemory ) + { + return OMX_ErrorInsufficientResources; + } + + return OMX_ErrorUndefined; + } + return OMX_ErrorNone; + } + +OMX_ERRORTYPE CSymbianOmxComponentLoader::UnInitializeComponentLoader(OMX_LOADERTYPE * /*loader*/) + { + iComponentNameList.Reset(); + iComponents.ResetAndDestroy(); + return OMX_ErrorNone; + } + +OMX_ERRORTYPE CSymbianOmxComponentLoader::LoadComponent( OMX_HANDLETYPE* pHandle, + OMX_STRING cComponentName, + OMX_PTR pAppData, + OMX_CALLBACKTYPE* pCallBacks) + { + TInt index; + TPtrC8 lComponentName(reinterpret_cast(cComponentName), strlen(cComponentName)); + COmxILComponentIf* component = NULL; + OMX_ERRORTYPE error = OMX_ErrorComponentNotFound; + + const TInt KComponentNameListCount = iComponentNameList.Count(); + for( index = 0; index < KComponentNameListCount; ++index ) + { + TOmxComponentInfo& comp = iComponentNameList[index]; + DEBUG_PRINTF3(_L8("CSymbianOmxComponentLoader::LoadComponent : comp [%index] [%S]"), index, &comp.iComponentName); + if( comp.iComponentName.CompareF(lComponentName) == 0 ) + { + TRAPD(err, component = COmxILComponentIf::CreateImplementationL(iComponentNameList[index].iUid)); + if( err != KErrNone ) + { + if ( err == KErrNoMemory ) + { + return OMX_ErrorInsufficientResources; + } + else + { + return OMX_ErrorInvalidComponent; + } + } + + *pHandle = component->Handle(); + if( !*pHandle ) + { + return OMX_ErrorInvalidComponent; + } + + error = (static_cast(*pHandle))->SetCallbacks(*pHandle, pCallBacks, pAppData); + + if(error != OMX_ErrorNone) + { + (static_cast(*pHandle))->ComponentDeInit(*pHandle); + delete component; + return error; + } + if( iComponents.Append(component) != KErrNone ) + { + (static_cast(*pHandle))->ComponentDeInit(*pHandle); + delete component; + return OMX_ErrorInsufficientResources; + } + return error; + } + } + return error; + } + +OMX_ERRORTYPE CSymbianOmxComponentLoader::UnloadComponent( OMX_HANDLETYPE hComponent) + { + TInt index; + COmxILComponentIf* component; + + const TInt KComponentsCount = iComponents.Count(); + for( index = 0; index < KComponentsCount; ++index ) + { + component = iComponents[index]; + if( component->Handle() == hComponent ) + { + (static_cast(hComponent))->ComponentDeInit( hComponent ); + delete component; + iComponents.Remove(index); + return OMX_ErrorNone; + } + } + return OMX_ErrorComponentNotFound; + } + +OMX_ERRORTYPE CSymbianOmxComponentLoader::ComponentNameEnum( OMX_STRING aComponentName, + OMX_U32 aNameLength, + OMX_U32 aIndex) + { + ASSERT(aComponentName); + + const TInt KIndexForPopulateList = 0; + if ( aIndex == KIndexForPopulateList ) + { + RImplInfoPtrArray ecomArray; + TRAPD(error, REComSession::ListImplementationsL(TUid::Uid(KUidOmxILSymbianComponentIf), ecomArray)); + if (error != KErrNone) + { + return OMX_ErrorUndefined; + } + TInt index; + iComponentNameList.Reset(); + + const TInt KEcomArrayCount = ecomArray.Count(); + // Create Controller Implementation Information for each entry + for (index=0; index= OMX_MAX_STRINGNAME_SIZE || + info.DataType().Length() >= OMX_MAX_ROLESBUFFER_SIZE ) + { + error = KErrBadName; + break; + } + component.iComponentName.Copy(info.DisplayName()); + component.iRoles.Copy(info.DataType()); + error = iComponentNameList.Append(component); + if( error != KErrNone ) + { + break; + } + } + ecomArray.ResetAndDestroy(); + if( error != KErrNone ) + { + return OMX_ErrorUndefined; + } + } + if (aIndex(compName), strlen(compName)); + + OMX_ERRORTYPE error = OMX_ErrorInvalidComponentName; + const TInt KComponentNameListCount = iComponentNameList.Count(); + for( index = 0, roleindex = 0; index < KComponentNameListCount; ++index ) + { + if( iComponentNameList[index].iComponentName.Compare(tComponentName) == 0 ) + { + char parser[OMX_MAX_ROLESBUFFER_SIZE], *p; + size_t size; + TInt i, j; + + size = iComponentNameList[index].iRoles.Length(); + + strncpy(parser, + reinterpret_cast(const_cast(iComponentNameList[index].iRoles.Ptr())), + size); + parser[size]=0; + + for( i=0, j=0, p=parser; i(role), strlen(role)); + + ASSERT(pNumComps); + + TInt KComponentNameListCount = iComponentNameList.Count(); + for( index = 0, compindex = 0; index < KComponentNameListCount; ++index ) + { + if( iComponentNameList[index].iRoles.Find(lRole) != KErrNotFound ) + { + if( compNames != NULL ) + { + if( compNames[compindex]!= NULL ) + { + strncpy((char*)compNames[compindex],(char*)iComponentNameList[index].iComponentName.Ptr(),iComponentNameList[index].iComponentName.Length()); + compNames[compindex][iComponentNameList[index].iComponentName.Size()]=0; + } + else + { + return OMX_ErrorBadParameter; + } + } + ++compindex; + } + } + *pNumComps = compindex; + return OMX_ErrorNone; + } + +OMX_HANDLETYPE CSymbianOmxComponentLoader::Handle() + { + return iHandle; + } + +CSymbianOmxComponentLoader::CSymbianOmxComponentLoader() + { + } + +CSymbianOmxComponentLoader::~CSymbianOmxComponentLoader() + { + delete iHandle; + } + +void CSymbianOmxComponentLoader::ConstructL() + { + iHandle = new(ELeave) OMX_LOADERTYPE; + + iHandle->InitializeComponentLoader = &::OmxInitializeComponentLoader; + iHandle->UnInitializeComponentLoader = &::OmxUnInitializeComponentLoader; + iHandle->LoadComponent = &::OmxLoadComponent; + iHandle->UnloadComponent = &::OmxUnloadComponent; + iHandle->ComponentNameEnum = &::OmxComponentNameEnum; + iHandle->GetRolesOfComponent = &::OmxGetRolesOfComponent; + iHandle->GetComponentsOfRole = &::OmxGetComponentsOfRole; + + iHandle->pLoaderPrivate = this; + } + +CSymbianOmxComponentLoader* CSymbianOmxComponentLoader::NewL() + { + CSymbianOmxComponentLoader* self = new(ELeave) CSymbianOmxComponentLoader; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// ECOM +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KUidOmxILSymbianComponentLoader, CSymbianOmxComponentLoader::NewL), + }; + +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/src/omxilsymbiancomponentloader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/src/omxilsymbiancomponentloader.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,79 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILSYMBIANCOMPONENTLOADER_H +#define OMXILSYMBIANCOMPONENTLOADER_H + +#include +#include +#include +#include +#include + +class CSymbianOmxComponentLoader : private COmxComponentLoaderIf + { +public: + class TOmxComponentInfo + { + public: + TOmxComponentInfo(); + public: + TUid iUid; + TBuf8 iComponentName; + TBuf8 iRoles; + }; + +public: + OMX_HANDLETYPE Handle(); + + static CSymbianOmxComponentLoader* NewL(); + + ~CSymbianOmxComponentLoader(); + + OMX_ERRORTYPE InitializeComponentLoader(); + OMX_ERRORTYPE UnInitializeComponentLoader(OMX_LOADERTYPE* loader); + OMX_ERRORTYPE LoadComponent( OMX_HANDLETYPE* pHandle, + const OMX_STRING cComponentName, + OMX_PTR pAppData, + OMX_CALLBACKTYPE* pCallBacks ); + OMX_ERRORTYPE UnloadComponent( OMX_HANDLETYPE hComponent ); + OMX_ERRORTYPE ComponentNameEnum( OMX_STRING cComponentName, + OMX_U32 nNameLength, + const OMX_U32 nIndex ); + OMX_ERRORTYPE GetRolesOfComponent( const OMX_STRING compName, + OMX_U32* pNumRoles, + OMX_U8** roles ); + OMX_ERRORTYPE GetComponentsOfRole( const OMX_STRING role, + OMX_U32* pNumComps, + OMX_U8** compNames ); + +private: + CSymbianOmxComponentLoader(); + void ConstructL(); + +private: + OMX_LOADERTYPE* iHandle; + + RArray iComponentNameList; + RPointerArray iComponents; + }; + +inline CSymbianOmxComponentLoader::TOmxComponentInfo::TOmxComponentInfo(): + iUid(TUid::Uid(0)),iComponentName(0),iRoles(0) + { + } + + +#endif /*OMXILSYMBIANCOMPONENTLOADER_H*/ diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/src/omxilsymbianloader.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/src/omxilsymbianloader.rss Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,43 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// omxilloader.rss +// +// + +#include +#include "omxiluids.hrh" +#include + +RESOURCE REGISTRY_INFO theInfo + { + dll_uid = KUidOmxILLoaderDll; + interfaces = + { + INTERFACE_INFO + { + interface_uid = KUidOmxILLoaderInterface; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = KUidOmxILSymbianComponentLoader; + version_no = 1; + display_name = ""; + default_data = "" ; + opaque_data = ""; + } + }; + } + }; + } diff -r 000000000000 -r 0e4a32b9112d omxil_generic/omxilloader/src/omxiluids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omxil_generic/omxilloader/src/omxiluids.hrh Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,43 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#ifndef OMXILUIDS_HRH +#define OMXILUIDS_HRH + +#define KUidECOM 0x10009D8D + +// OpenMax IL Loader Static Library +#define KUidOmxILLoaderLib 0x1028349E + +// Symbian OpenMax IL loader +#define KUidOmxILLoaderDll 0x102834CF +#define KUidOmxILSymbianComponentLoader 0x102834D0 + +#if 0 +#define KSharedLibraryUidDefine 0x1000008D + +// OpenMax IL Core client library +#define KUidOmxILCoreClientDll 0x1028349C + +// OpenMax IL Core server library +#define KUidOmxILCoreServerDll 0x10285D1E + + + +// Symbian OpenMax IL Content Pipe Interface +#define KUidOmxILSymbianContentPipeIfLib 0x102834B8 + +#endif +#endif /*OMXILUIDS_HRH*/ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,16 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "../v1_1_2/group/bld.inf" diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_Audio.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_Audio.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1312 @@ +/* + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** @file + * OpenMax IL version 1.1.2 + * The structures needed by Audio components to exchange + * parameters and configuration data with the componenmilts. + */ + +#ifndef OMX_Audio_h +#define OMX_Audio_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ + +#include + +/** @defgroup midi MIDI + * @ingroup audio + */ + +/** @defgroup effects Audio effects + * @ingroup audio + */ + +/** @defgroup audio OpenMAX IL Audio Domain + * Structures for OpenMAX IL Audio domain + * @{ + */ + +/** Enumeration used to define the possible audio codings. + * If "OMX_AUDIO_CodingUnused" is selected, the coding selection must + * be done in a vendor specific way. Since this is for an audio + * processing element this enum is relevant. However, for another + * type of component other enums would be in this area. + */ +typedef enum OMX_AUDIO_CODINGTYPE { + OMX_AUDIO_CodingUnused = 0, /**< Placeholder value when coding is N/A */ + OMX_AUDIO_CodingAutoDetect, /**< auto detection of audio format */ + OMX_AUDIO_CodingPCM, /**< Any variant of PCM coding */ + OMX_AUDIO_CodingADPCM, /**< Any variant of ADPCM encoded data */ + OMX_AUDIO_CodingAMR, /**< Any variant of AMR encoded data */ + OMX_AUDIO_CodingGSMFR, /**< Any variant of GSM fullrate (i.e. GSM610) */ + OMX_AUDIO_CodingGSMEFR, /**< Any variant of GSM Enhanced Fullrate encoded data*/ + OMX_AUDIO_CodingGSMHR, /**< Any variant of GSM Halfrate encoded data */ + OMX_AUDIO_CodingPDCFR, /**< Any variant of PDC Fullrate encoded data */ + OMX_AUDIO_CodingPDCEFR, /**< Any variant of PDC Enhanced Fullrate encoded data */ + OMX_AUDIO_CodingPDCHR, /**< Any variant of PDC Halfrate encoded data */ + OMX_AUDIO_CodingTDMAFR, /**< Any variant of TDMA Fullrate encoded data (TIA/EIA-136-420) */ + OMX_AUDIO_CodingTDMAEFR, /**< Any variant of TDMA Enhanced Fullrate encoded data (TIA/EIA-136-410) */ + OMX_AUDIO_CodingQCELP8, /**< Any variant of QCELP 8kbps encoded data */ + OMX_AUDIO_CodingQCELP13, /**< Any variant of QCELP 13kbps encoded data */ + OMX_AUDIO_CodingEVRC, /**< Any variant of EVRC encoded data */ + OMX_AUDIO_CodingSMV, /**< Any variant of SMV encoded data */ + OMX_AUDIO_CodingG711, /**< Any variant of G.711 encoded data */ + OMX_AUDIO_CodingG723, /**< Any variant of G.723 dot 1 encoded data */ + OMX_AUDIO_CodingG726, /**< Any variant of G.726 encoded data */ + OMX_AUDIO_CodingG729, /**< Any variant of G.729 encoded data */ + OMX_AUDIO_CodingAAC, /**< Any variant of AAC encoded data */ + OMX_AUDIO_CodingMP3, /**< Any variant of MP3 encoded data */ + OMX_AUDIO_CodingSBC, /**< Any variant of SBC encoded data */ + OMX_AUDIO_CodingVORBIS, /**< Any variant of VORBIS encoded data */ + OMX_AUDIO_CodingWMA, /**< Any variant of WMA encoded data */ + OMX_AUDIO_CodingRA, /**< Any variant of RA encoded data */ + OMX_AUDIO_CodingMIDI, /**< Any variant of MIDI encoded data */ + OMX_AUDIO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_CodingMax = 0x7FFFFFFF +} OMX_AUDIO_CODINGTYPE; + + +/** The PortDefinition structure is used to define all of the parameters + * necessary for the compliant component to setup an input or an output audio + * path. If additional information is needed to define the parameters of the + * port (such as frequency), additional structures must be sent such as the + * OMX_AUDIO_PARAM_PCMMODETYPE structure to supply the extra parameters for the port. + */ +typedef struct OMX_AUDIO_PORTDEFINITIONTYPE { + OMX_STRING cMIMEType; /**< MIME type of data for the port */ + OMX_NATIVE_DEVICETYPE pNativeRender; /** < platform specific reference + for an output device, + otherwise this field is 0 */ + OMX_BOOL bFlagErrorConcealment; /**< Turns on error concealment if it is + supported by the OMX component */ + OMX_AUDIO_CODINGTYPE eEncoding; /**< Type of data expected for this + port (e.g. PCM, AMR, MP3, etc) */ +} OMX_AUDIO_PORTDEFINITIONTYPE; + + +/** Port format parameter. This structure is used to enumerate + * the various data input/output format supported by the port. + */ +typedef struct OMX_AUDIO_PARAM_PORTFORMATTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Indicates which port to set */ + OMX_U32 nIndex; /**< Indicates the enumeration index for the format from 0x0 to N-1 */ + OMX_AUDIO_CODINGTYPE eEncoding; /**< Type of data expected for this port (e.g. PCM, AMR, MP3, etc) */ +} OMX_AUDIO_PARAM_PORTFORMATTYPE; + + +/** PCM mode type */ +typedef enum OMX_AUDIO_PCMMODETYPE { + OMX_AUDIO_PCMModeLinear = 0, /**< Linear PCM encoded data */ + OMX_AUDIO_PCMModeALaw, /**< A law PCM encoded data (G.711) */ + OMX_AUDIO_PCMModeMULaw, /**< Mu law PCM encoded data (G.711) */ + OMX_AUDIO_PCMModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_PCMModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_PCMModeMax = 0x7FFFFFFF +} OMX_AUDIO_PCMMODETYPE; + + +typedef enum OMX_AUDIO_CHANNELTYPE { + OMX_AUDIO_ChannelNone = 0x0, /**< Unused or empty */ + OMX_AUDIO_ChannelLF = 0x1, /**< Left front */ + OMX_AUDIO_ChannelRF = 0x2, /**< Right front */ + OMX_AUDIO_ChannelCF = 0x3, /**< Center front */ + OMX_AUDIO_ChannelLS = 0x4, /**< Left surround */ + OMX_AUDIO_ChannelRS = 0x5, /**< Right surround */ + OMX_AUDIO_ChannelLFE = 0x6, /**< Low frequency effects */ + OMX_AUDIO_ChannelCS = 0x7, /**< Back surround */ + OMX_AUDIO_ChannelLR = 0x8, /**< Left rear. */ + OMX_AUDIO_ChannelRR = 0x9, /**< Right rear. */ + OMX_AUDIO_ChannelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_ChannelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_ChannelMax = 0x7FFFFFFF +} OMX_AUDIO_CHANNELTYPE; + +#define OMX_AUDIO_MAXCHANNELS 16 /**< maximum number distinct audio channels that a buffer may contain */ +#define OMX_MIN_PCMPAYLOAD_MSEC 5 /**< Minimum audio buffer payload size for uncompressed (PCM) audio */ + +/** PCM format description */ +typedef struct OMX_AUDIO_PARAM_PCMMODETYPE { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels (e.g. 2 for stereo) */ + OMX_NUMERICALDATATYPE eNumData; /**< indicates PCM data as signed or unsigned */ + OMX_ENDIANTYPE eEndian; /**< indicates PCM data as little or big endian */ + OMX_BOOL bInterleaved; /**< True for normal interleaved data; false for + non-interleaved data (e.g. block data) */ + OMX_U32 nBitPerSample; /**< Bit per sample */ + OMX_U32 nSamplingRate; /**< Sampling rate of the source data. Use 0 for + variable or unknown sampling rate. */ + OMX_AUDIO_PCMMODETYPE ePCMMode; /**< PCM mode enumeration */ + OMX_AUDIO_CHANNELTYPE eChannelMapping[OMX_AUDIO_MAXCHANNELS]; /**< Slot i contains channel defined by eChannelMap[i] */ + +} OMX_AUDIO_PARAM_PCMMODETYPE; + + +/** Audio channel mode. This is used by both AAC and MP3, although the names are more appropriate + * for the MP3. For example, JointStereo for MP3 is CouplingChannels for AAC. + */ +typedef enum OMX_AUDIO_CHANNELMODETYPE { + OMX_AUDIO_ChannelModeStereo = 0, /**< 2 channels, the bitrate allocation between those + two channels changes accordingly to each channel information */ + OMX_AUDIO_ChannelModeJointStereo, /**< mode that takes advantage of what is common between + 2 channels for higher compression gain */ + OMX_AUDIO_ChannelModeDual, /**< 2 mono-channels, each channel is encoded with half + the bitrate of the overall bitrate */ + OMX_AUDIO_ChannelModeMono, /**< Mono channel mode */ + OMX_AUDIO_ChannelModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_ChannelModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_ChannelModeMax = 0x7FFFFFFF +} OMX_AUDIO_CHANNELMODETYPE; + + +typedef enum OMX_AUDIO_MP3STREAMFORMATTYPE { + OMX_AUDIO_MP3StreamFormatMP1Layer3 = 0, /**< MP3 Audio MPEG 1 Layer 3 Stream format */ + OMX_AUDIO_MP3StreamFormatMP2Layer3, /**< MP3 Audio MPEG 2 Layer 3 Stream format */ + OMX_AUDIO_MP3StreamFormatMP2_5Layer3, /**< MP3 Audio MPEG2.5 Layer 3 Stream format */ + OMX_AUDIO_MP3StreamFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_MP3StreamFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_MP3StreamFormatMax = 0x7FFFFFFF +} OMX_AUDIO_MP3STREAMFORMATTYPE; + +/** MP3 params */ +typedef struct OMX_AUDIO_PARAM_MP3TYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels */ + OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable + rate or unknown bit rates */ + OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for + variable or unknown sampling rate. */ + OMX_U32 nAudioBandWidth; /**< Audio band width (in Hz) to which an encoder should + limit the audio signal. Use 0 to let encoder decide */ + OMX_AUDIO_CHANNELMODETYPE eChannelMode; /**< Channel mode enumeration */ + OMX_AUDIO_MP3STREAMFORMATTYPE eFormat; /**< MP3 stream format */ +} OMX_AUDIO_PARAM_MP3TYPE; + + +typedef enum OMX_AUDIO_AACSTREAMFORMATTYPE { + OMX_AUDIO_AACStreamFormatMP2ADTS = 0, /**< AAC Audio Data Transport Stream 2 format */ + OMX_AUDIO_AACStreamFormatMP4ADTS, /**< AAC Audio Data Transport Stream 4 format */ + OMX_AUDIO_AACStreamFormatMP4LOAS, /**< AAC Low Overhead Audio Stream format */ + OMX_AUDIO_AACStreamFormatMP4LATM, /**< AAC Low overhead Audio Transport Multiplex */ + OMX_AUDIO_AACStreamFormatADIF, /**< AAC Audio Data Interchange Format */ + OMX_AUDIO_AACStreamFormatMP4FF, /**< AAC inside MPEG-4/ISO File Format */ + OMX_AUDIO_AACStreamFormatRAW, /**< AAC Raw Format */ + OMX_AUDIO_AACStreamFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_AACStreamFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_AACStreamFormatMax = 0x7FFFFFFF +} OMX_AUDIO_AACSTREAMFORMATTYPE; + + +/** AAC mode type. Note that the term profile is used with the MPEG-2 + * standard and the term object type and profile is used with MPEG-4 */ +typedef enum OMX_AUDIO_AACPROFILETYPE{ + OMX_AUDIO_AACObjectNull = 0, /**< Null, not used */ + OMX_AUDIO_AACObjectMain = 1, /**< AAC Main object */ + OMX_AUDIO_AACObjectLC, /**< AAC Low Complexity object (AAC profile) */ + OMX_AUDIO_AACObjectSSR, /**< AAC Scalable Sample Rate object */ + OMX_AUDIO_AACObjectLTP, /**< AAC Long Term Prediction object */ + OMX_AUDIO_AACObjectHE, /**< AAC High Efficiency (object type SBR, HE-AAC profile) */ + OMX_AUDIO_AACObjectScalable, /**< AAC Scalable object */ + OMX_AUDIO_AACObjectERLC = 17, /**< ER AAC Low Complexity object (Error Resilient AAC-LC) */ + OMX_AUDIO_AACObjectLD = 23, /**< AAC Low Delay object (Error Resilient) */ + OMX_AUDIO_AACObjectHE_PS = 29, /**< AAC High Efficiency with Parametric Stereo coding (HE-AAC v2, object type PS) */ + OMX_AUDIO_AACObjectKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_AACObjectVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_AACObjectMax = 0x7FFFFFFF +} OMX_AUDIO_AACPROFILETYPE; + + +/** AAC tool usage (for nAACtools in OMX_AUDIO_PARAM_AACPROFILETYPE). + * Required for encoder configuration and optional as decoder info output. + * For MP3, OMX_AUDIO_CHANNELMODETYPE is sufficient. */ +#define OMX_AUDIO_AACToolNone 0x00000000 /**< no AAC tools allowed (encoder config) or active (decoder info output) */ +#define OMX_AUDIO_AACToolMS 0x00000001 /**< MS: Mid/side joint coding tool allowed or active */ +#define OMX_AUDIO_AACToolIS 0x00000002 /**< IS: Intensity stereo tool allowed or active */ +#define OMX_AUDIO_AACToolTNS 0x00000004 /**< TNS: Temporal Noise Shaping tool allowed or active */ +#define OMX_AUDIO_AACToolPNS 0x00000008 /**< PNS: MPEG-4 Perceptual Noise substitution tool allowed or active */ +#define OMX_AUDIO_AACToolLTP 0x00000010 /**< LTP: MPEG-4 Long Term Prediction tool allowed or active */ +#define OMX_AUDIO_AACToolAll 0x7FFFFFFF /**< all AAC tools allowed or active (*/ + +/** MPEG-4 AAC error resilience (ER) tool usage (for nAACERtools in OMX_AUDIO_PARAM_AACPROFILETYPE). + * Required for ER encoder configuration and optional as decoder info output */ +#define OMX_AUDIO_AACERNone 0x00000000 /**< no AAC ER tools allowed/used */ +#define OMX_AUDIO_AACERVCB11 0x00000001 /**< VCB11: Virtual Code Books for AAC section data */ +#define OMX_AUDIO_AACERRVLC 0x00000002 /**< RVLC: Reversible Variable Length Coding */ +#define OMX_AUDIO_AACERHCR 0x00000004 /**< HCR: Huffman Codeword Reordering */ +#define OMX_AUDIO_AACERAll 0x7FFFFFFF /**< all AAC ER tools allowed/used */ + + +/** AAC params */ +typedef struct OMX_AUDIO_PARAM_AACPROFILETYPE { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels */ + OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for + variable or unknown sampling rate. */ + OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable + rate or unknown bit rates */ + OMX_U32 nAudioBandWidth; /**< Audio band width (in Hz) to which an encoder should + limit the audio signal. Use 0 to let encoder decide */ + OMX_U32 nFrameLength; /**< Frame length (in audio samples per channel) of the codec. + Can be 1024 or 960 (AAC-LC), 2048 (HE-AAC), 480 or 512 (AAC-LD). + Use 0 to let encoder decide */ + OMX_U32 nAACtools; /**< AAC tool usage */ + OMX_U32 nAACERtools; /**< MPEG-4 AAC error resilience tool usage */ + OMX_AUDIO_AACPROFILETYPE eAACProfile; /**< AAC profile enumeration */ + OMX_AUDIO_AACSTREAMFORMATTYPE eAACStreamFormat; /**< AAC stream format enumeration */ + OMX_AUDIO_CHANNELMODETYPE eChannelMode; /**< Channel mode enumeration */ +} OMX_AUDIO_PARAM_AACPROFILETYPE; + + +/** VORBIS params */ +typedef struct OMX_AUDIO_PARAM_VORBISTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels */ + OMX_U32 nBitRate; /**< Bit rate of the encoded data data. Use 0 for variable + rate or unknown bit rates. Encoding is set to the + bitrate closest to specified value (in bps) */ + OMX_U32 nMinBitRate; /**< Sets minimum bitrate (in bps). */ + OMX_U32 nMaxBitRate; /**< Sets maximum bitrate (in bps). */ + + OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for + variable or unknown sampling rate. */ + OMX_U32 nAudioBandWidth; /**< Audio band width (in Hz) to which an encoder should + limit the audio signal. Use 0 to let encoder decide */ + OMX_S32 nQuality; /**< Sets encoding quality to n, between -1 (low) and 10 (high). + In the default mode of operation, teh quality level is 3. + Normal quality range is 0 - 10. */ + OMX_BOOL bManaged; /**< Set bitrate management mode. This turns off the + normal VBR encoding, but allows hard or soft bitrate + constraints to be enforced by the encoder. This mode can + be slower, and may also be lower quality. It is + primarily useful for streaming. */ + OMX_BOOL bDownmix; /**< Downmix input from stereo to mono (has no effect on + non-stereo streams). Useful for lower-bitrate encoding. */ +} OMX_AUDIO_PARAM_VORBISTYPE; + + +/** WMA Version */ +typedef enum OMX_AUDIO_WMAFORMATTYPE { + OMX_AUDIO_WMAFormatUnused = 0, /**< format unused or unknown */ + OMX_AUDIO_WMAFormat7, /**< Windows Media Audio format 7 */ + OMX_AUDIO_WMAFormat8, /**< Windows Media Audio format 8 */ + OMX_AUDIO_WMAFormat9, /**< Windows Media Audio format 9 */ + OMX_AUDIO_WMAFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_WMAFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_WMAFormatMax = 0x7FFFFFFF +} OMX_AUDIO_WMAFORMATTYPE; + + +/** WMA Profile */ +typedef enum OMX_AUDIO_WMAPROFILETYPE { + OMX_AUDIO_WMAProfileUnused = 0, /**< profile unused or unknown */ + OMX_AUDIO_WMAProfileL1, /**< Windows Media audio version 9 profile L1 */ + OMX_AUDIO_WMAProfileL2, /**< Windows Media audio version 9 profile L2 */ + OMX_AUDIO_WMAProfileL3, /**< Windows Media audio version 9 profile L3 */ + OMX_AUDIO_WMAProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_WMAProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_WMAProfileMax = 0x7FFFFFFF +} OMX_AUDIO_WMAPROFILETYPE; + + +/** WMA params */ +typedef struct OMX_AUDIO_PARAM_WMATYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U16 nChannels; /**< Number of channels */ + OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable + rate or unknown bit rates */ + OMX_AUDIO_WMAFORMATTYPE eFormat; /**< Version of WMA stream / data */ + OMX_AUDIO_WMAPROFILETYPE eProfile; /**< Profile of WMA stream / data */ + OMX_U32 nSamplingRate; /**< Sampling rate of the source data */ + OMX_U16 nBlockAlign; /**< is the block alignment, or block size, in bytes of the audio codec */ + OMX_U16 nEncodeOptions; /**< WMA Type-specific data */ + OMX_U32 nSuperBlockAlign; /**< WMA Type-specific data */ +} OMX_AUDIO_PARAM_WMATYPE; + +/** + * RealAudio format + */ +typedef enum OMX_AUDIO_RAFORMATTYPE { + OMX_AUDIO_RAFormatUnused = 0, /**< Format unused or unknown */ + OMX_AUDIO_RA8, /**< RealAudio 8 codec */ + OMX_AUDIO_RA9, /**< RealAudio 9 codec */ + OMX_AUDIO_RA10_AAC, /**< MPEG-4 AAC codec for bitrates of more than 128kbps */ + OMX_AUDIO_RA10_CODEC, /**< RealAudio codec for bitrates less than 128 kbps */ + OMX_AUDIO_RA10_LOSSLESS, /**< RealAudio Lossless */ + OMX_AUDIO_RA10_MULTICHANNEL, /**< RealAudio Multichannel */ + OMX_AUDIO_RA10_VOICE, /**< RealAudio Voice for bitrates below 15 kbps */ + OMX_AUDIO_RAFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_RAFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_RAFormatMax = 0x7FFFFFFF +} OMX_AUDIO_RAFORMATTYPE; + +/** RA (Real Audio) params */ +typedef struct OMX_AUDIO_PARAM_RATYPE { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels */ + OMX_U32 nSamplingRate; /**< is the sampling rate of the source data */ + OMX_U32 nBitsPerFrame; /**< is the value for bits per frame */ + OMX_U32 nSamplePerFrame; /**< is the value for samples per frame */ + OMX_U32 nCouplingQuantBits; /**< is the number of coupling quantization bits in the stream */ + OMX_U32 nCouplingStartRegion; /**< is the coupling start region in the stream */ + OMX_U32 nNumRegions; /**< is the number of regions value */ + OMX_AUDIO_RAFORMATTYPE eFormat; /**< is the RealAudio audio format */ +} OMX_AUDIO_PARAM_RATYPE; + + +/** SBC Allocation Method Type */ +typedef enum OMX_AUDIO_SBCALLOCMETHODTYPE { + OMX_AUDIO_SBCAllocMethodLoudness, /**< Loudness allocation method */ + OMX_AUDIO_SBCAllocMethodSNR, /**< SNR allocation method */ + OMX_AUDIO_SBCAllocMethodKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_SBCAllocMethodVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_SBCAllocMethodMax = 0x7FFFFFFF +} OMX_AUDIO_SBCALLOCMETHODTYPE; + + +/** SBC params */ +typedef struct OMX_AUDIO_PARAM_SBCTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels */ + OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable + rate or unknown bit rates */ + OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for + variable or unknown sampling rate. */ + OMX_U32 nBlocks; /**< Number of blocks */ + OMX_U32 nSubbands; /**< Number of subbands */ + OMX_U32 nBitPool; /**< Bitpool value */ + OMX_BOOL bEnableBitrate; /**< Use bitrate value instead of bitpool */ + OMX_AUDIO_CHANNELMODETYPE eChannelMode; /**< Channel mode enumeration */ + OMX_AUDIO_SBCALLOCMETHODTYPE eSBCAllocType; /**< SBC Allocation method type */ +} OMX_AUDIO_PARAM_SBCTYPE; + + +/** ADPCM stream format parameters */ +typedef struct OMX_AUDIO_PARAM_ADPCMTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_U32 nBitsPerSample; /**< Number of bits in each sample */ + OMX_U32 nSampleRate; /**< Sampling rate of the source data. Use 0 for + variable or unknown sampling rate. */ +} OMX_AUDIO_PARAM_ADPCMTYPE; + + +/** G723 rate */ +typedef enum OMX_AUDIO_G723RATE { + OMX_AUDIO_G723ModeUnused = 0, /**< AMRNB Mode unused / unknown */ + OMX_AUDIO_G723ModeLow, /**< 5300 bps */ + OMX_AUDIO_G723ModeHigh, /**< 6300 bps */ + OMX_AUDIO_G723ModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_G723ModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_G723ModeMax = 0x7FFFFFFF +} OMX_AUDIO_G723RATE; + + +/** G723 - Sample rate must be 8 KHz */ +typedef struct OMX_AUDIO_PARAM_G723TYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_AUDIO_G723RATE eBitRate; /**< todo: Should this be moved to a config? */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ + OMX_BOOL bPostFilter; /**< Enable Post Filter */ +} OMX_AUDIO_PARAM_G723TYPE; + + +/** ITU G726 (ADPCM) rate */ +typedef enum OMX_AUDIO_G726MODE { + OMX_AUDIO_G726ModeUnused = 0, /**< G726 Mode unused / unknown */ + OMX_AUDIO_G726Mode16, /**< 16 kbps */ + OMX_AUDIO_G726Mode24, /**< 24 kbps */ + OMX_AUDIO_G726Mode32, /**< 32 kbps, most common rate, also G721 */ + OMX_AUDIO_G726Mode40, /**< 40 kbps */ + OMX_AUDIO_G726ModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_G726ModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_G726ModeMax = 0x7FFFFFFF +} OMX_AUDIO_G726MODE; + + +/** G.726 stream format parameters - must be at 8KHz */ +typedef struct OMX_AUDIO_PARAM_G726TYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_AUDIO_G726MODE eG726Mode; +} OMX_AUDIO_PARAM_G726TYPE; + + +/** G729 coder type */ +typedef enum OMX_AUDIO_G729TYPE { + OMX_AUDIO_G729 = 0, /**< ITU G.729 encoded data */ + OMX_AUDIO_G729A, /**< ITU G.729 annex A encoded data */ + OMX_AUDIO_G729B, /**< ITU G.729 with annex B encoded data */ + OMX_AUDIO_G729AB, /**< ITU G.729 annexes A and B encoded data */ + OMX_AUDIO_G729KhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_G729VendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_G729Max = 0x7FFFFFFF +} OMX_AUDIO_G729TYPE; + + +/** G729 stream format parameters - fixed 6KHz sample rate */ +typedef struct OMX_AUDIO_PARAM_G729TYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_AUDIO_G729TYPE eBitType; +} OMX_AUDIO_PARAM_G729TYPE; + + +/** AMR Frame format */ +typedef enum OMX_AUDIO_AMRFRAMEFORMATTYPE { + OMX_AUDIO_AMRFrameFormatConformance = 0, /**< Frame Format is AMR Conformance + (Standard) Format */ + OMX_AUDIO_AMRFrameFormatIF1, /**< Frame Format is AMR Interface + Format 1 */ + OMX_AUDIO_AMRFrameFormatIF2, /**< Frame Format is AMR Interface + Format 2*/ + OMX_AUDIO_AMRFrameFormatFSF, /**< Frame Format is AMR File Storage + Format */ + OMX_AUDIO_AMRFrameFormatRTPPayload, /**< Frame Format is AMR Real-Time + Transport Protocol Payload Format */ + OMX_AUDIO_AMRFrameFormatITU, /**< Frame Format is ITU Format (added at Motorola request) */ + OMX_AUDIO_AMRFrameFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_AMRFrameFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_AMRFrameFormatMax = 0x7FFFFFFF +} OMX_AUDIO_AMRFRAMEFORMATTYPE; + + +/** AMR band mode */ +typedef enum OMX_AUDIO_AMRBANDMODETYPE { + OMX_AUDIO_AMRBandModeUnused = 0, /**< AMRNB Mode unused / unknown */ + OMX_AUDIO_AMRBandModeNB0, /**< AMRNB Mode 0 = 4750 bps */ + OMX_AUDIO_AMRBandModeNB1, /**< AMRNB Mode 1 = 5150 bps */ + OMX_AUDIO_AMRBandModeNB2, /**< AMRNB Mode 2 = 5900 bps */ + OMX_AUDIO_AMRBandModeNB3, /**< AMRNB Mode 3 = 6700 bps */ + OMX_AUDIO_AMRBandModeNB4, /**< AMRNB Mode 4 = 7400 bps */ + OMX_AUDIO_AMRBandModeNB5, /**< AMRNB Mode 5 = 7950 bps */ + OMX_AUDIO_AMRBandModeNB6, /**< AMRNB Mode 6 = 10200 bps */ + OMX_AUDIO_AMRBandModeNB7, /**< AMRNB Mode 7 = 12200 bps */ + OMX_AUDIO_AMRBandModeWB0, /**< AMRWB Mode 0 = 6600 bps */ + OMX_AUDIO_AMRBandModeWB1, /**< AMRWB Mode 1 = 8850 bps */ + OMX_AUDIO_AMRBandModeWB2, /**< AMRWB Mode 2 = 12650 bps */ + OMX_AUDIO_AMRBandModeWB3, /**< AMRWB Mode 3 = 14250 bps */ + OMX_AUDIO_AMRBandModeWB4, /**< AMRWB Mode 4 = 15850 bps */ + OMX_AUDIO_AMRBandModeWB5, /**< AMRWB Mode 5 = 18250 bps */ + OMX_AUDIO_AMRBandModeWB6, /**< AMRWB Mode 6 = 19850 bps */ + OMX_AUDIO_AMRBandModeWB7, /**< AMRWB Mode 7 = 23050 bps */ + OMX_AUDIO_AMRBandModeWB8, /**< AMRWB Mode 8 = 23850 bps */ + OMX_AUDIO_AMRBandModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_AMRBandModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_AMRBandModeMax = 0x7FFFFFFF +} OMX_AUDIO_AMRBANDMODETYPE; + + +/** AMR Discontinuous Transmission mode */ +typedef enum OMX_AUDIO_AMRDTXMODETYPE { + OMX_AUDIO_AMRDTXModeOff = 0, /**< AMR Discontinuous Transmission Mode is disabled */ + OMX_AUDIO_AMRDTXModeOnVAD1, /**< AMR Discontinuous Transmission Mode using + Voice Activity Detector 1 (VAD1) is enabled */ + OMX_AUDIO_AMRDTXModeOnVAD2, /**< AMR Discontinuous Transmission Mode using + Voice Activity Detector 2 (VAD2) is enabled */ + OMX_AUDIO_AMRDTXModeOnAuto, /**< The codec will automatically select between + Off, VAD1 or VAD2 modes */ + + OMX_AUDIO_AMRDTXasEFR, /**< DTX as EFR instead of AMR standard (3GPP 26.101, frame type =8,9,10) */ + + OMX_AUDIO_AMRDTXModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_AMRDTXModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_AMRDTXModeMax = 0x7FFFFFFF +} OMX_AUDIO_AMRDTXMODETYPE; + + +/** AMR params */ +typedef struct OMX_AUDIO_PARAM_AMRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels */ + OMX_U32 nBitRate; /**< Bit rate read only field */ + OMX_AUDIO_AMRBANDMODETYPE eAMRBandMode; /**< AMR Band Mode enumeration */ + OMX_AUDIO_AMRDTXMODETYPE eAMRDTXMode; /**< AMR DTX Mode enumeration */ + OMX_AUDIO_AMRFRAMEFORMATTYPE eAMRFrameFormat; /**< AMR frame format enumeration */ +} OMX_AUDIO_PARAM_AMRTYPE; + + +/** GSM_FR (ETSI 06.10, 3GPP 46.010) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_GSMFRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_GSMFRTYPE; + + +/** GSM-HR (ETSI 06.20, 3GPP 46.020) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_GSMHRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_GSMHRTYPE; + + +/** GSM-EFR (ETSI 06.60, 3GPP 46.060) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_GSMEFRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_GSMEFRTYPE; + + +/** TDMA FR (TIA/EIA-136-420, VSELP 7.95kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_TDMAFRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_TDMAFRTYPE; + + +/** TDMA EFR (TIA/EIA-136-410, ACELP 7.4kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_TDMAEFRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_TDMAEFRTYPE; + + +/** PDC FR ( RCR-27, VSELP 6.7kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_PDCFRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_PDCFRTYPE; + + +/** PDC EFR ( RCR-27, ACELP 6.7kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_PDCEFRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_PDCEFRTYPE; + +/** PDC HR ( RCR-27, PSI-CELP 3.45kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_PDCHRTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_BOOL bDTX; /**< Enable Discontinuous Transmisssion */ + OMX_BOOL bHiPassFilter; /**< Enable High Pass Filter */ +} OMX_AUDIO_PARAM_PDCHRTYPE; + + +/** CDMA Rate types */ +typedef enum OMX_AUDIO_CDMARATETYPE { + OMX_AUDIO_CDMARateBlank = 0, /**< CDMA encoded frame is blank */ + OMX_AUDIO_CDMARateFull, /**< CDMA encoded frame in full rate */ + OMX_AUDIO_CDMARateHalf, /**< CDMA encoded frame in half rate */ + OMX_AUDIO_CDMARateQuarter, /**< CDMA encoded frame in quarter rate */ + OMX_AUDIO_CDMARateEighth, /**< CDMA encoded frame in eighth rate (DTX)*/ + OMX_AUDIO_CDMARateErasure, /**< CDMA erasure frame */ + OMX_AUDIO_CDMARateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_CDMARateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_CDMARateMax = 0x7FFFFFFF +} OMX_AUDIO_CDMARATETYPE; + + +/** QCELP8 (TIA/EIA-96, up to 8kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_QCELP8TYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable + rate or unknown bit rates */ + OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */ + OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 */ + OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 */ +} OMX_AUDIO_PARAM_QCELP8TYPE; + + +/** QCELP13 ( CDMA, EIA/TIA-733, 13.3kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_QCELP13TYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */ + OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 */ + OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 */ +} OMX_AUDIO_PARAM_QCELP13TYPE; + + +/** EVRC ( CDMA, EIA/TIA-127, RCELP up to 8.55kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_EVRCTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_AUDIO_CDMARATETYPE eCDMARate; /**< actual Frame rate */ + OMX_BOOL bRATE_REDUCon; /**< RATE_REDUCtion is requested for this frame */ + OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 */ + OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 */ + OMX_BOOL bHiPassFilter; /**< Enable encoder's High Pass Filter */ + OMX_BOOL bNoiseSuppressor; /**< Enable encoder's noise suppressor pre-processing */ + OMX_BOOL bPostFilter; /**< Enable decoder's post Filter */ +} OMX_AUDIO_PARAM_EVRCTYPE; + + +/** SMV ( up to 8.55kbps coder) stream format parameters */ +typedef struct OMX_AUDIO_PARAM_SMVTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannels; /**< Number of channels in the data stream (not + necessarily the same as the number of channels + to be rendered. */ + OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */ + OMX_BOOL bRATE_REDUCon; /**< RATE_REDUCtion is requested for this frame */ + OMX_U32 nMinBitRate; /**< minmal rate for the encoder = 1,2,3,4, default = 1 ??*/ + OMX_U32 nMaxBitRate; /**< maximal rate for the encoder = 1,2,3,4, default = 4 ??*/ + OMX_BOOL bHiPassFilter; /**< Enable encoder's High Pass Filter ??*/ + OMX_BOOL bNoiseSuppressor; /**< Enable encoder's noise suppressor pre-processing */ + OMX_BOOL bPostFilter; /**< Enable decoder's post Filter ??*/ +} OMX_AUDIO_PARAM_SMVTYPE; + + +/** MIDI Format + * @ingroup midi + */ +typedef enum OMX_AUDIO_MIDIFORMATTYPE +{ + OMX_AUDIO_MIDIFormatUnknown = 0, /**< MIDI Format unknown or don't care */ + OMX_AUDIO_MIDIFormatSMF0, /**< Standard MIDI File Type 0 */ + OMX_AUDIO_MIDIFormatSMF1, /**< Standard MIDI File Type 1 */ + OMX_AUDIO_MIDIFormatSMF2, /**< Standard MIDI File Type 2 */ + OMX_AUDIO_MIDIFormatSPMIDI, /**< SP-MIDI */ + OMX_AUDIO_MIDIFormatXMF0, /**< eXtensible Music Format type 0 */ + OMX_AUDIO_MIDIFormatXMF1, /**< eXtensible Music Format type 1 */ + OMX_AUDIO_MIDIFormatMobileXMF, /**< Mobile XMF (eXtensible Music Format type 2) */ + OMX_AUDIO_MIDIFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_MIDIFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_MIDIFormatMax = 0x7FFFFFFF +} OMX_AUDIO_MIDIFORMATTYPE; + + +/** MIDI params + * @ingroup midi + */ +typedef struct OMX_AUDIO_PARAM_MIDITYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nFileSize; /**< size of the MIDI file in bytes, where the entire + MIDI file passed in, otherwise if 0x0, the MIDI data + is merged and streamed (instead of passed as an + entire MIDI file) */ + OMX_BU32 sMaxPolyphony; /**< Specifies the maximum simultaneous polyphonic + voices. A value of zero indicates that the default + polyphony of the device is used */ + OMX_BOOL bLoadDefaultSound; /**< Whether to load default sound + bank at initialization */ + OMX_AUDIO_MIDIFORMATTYPE eMidiFormat; /**< Version of the MIDI file */ +} OMX_AUDIO_PARAM_MIDITYPE; + + +/** Type of the MIDI sound bank + * @ingroup midi + */ +typedef enum OMX_AUDIO_MIDISOUNDBANKTYPE { + OMX_AUDIO_MIDISoundBankUnused = 0, /**< unused/unknown soundbank type */ + OMX_AUDIO_MIDISoundBankDLS1, /**< DLS version 1 */ + OMX_AUDIO_MIDISoundBankDLS2, /**< DLS version 2 */ + OMX_AUDIO_MIDISoundBankMobileDLSBase, /**< Mobile DLS, using the base functionality */ + OMX_AUDIO_MIDISoundBankMobileDLSPlusOptions, /**< Mobile DLS, using the specification-defined optional feature set */ + OMX_AUDIO_MIDISoundBankKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_MIDISoundBankVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_MIDISoundBankMax = 0x7FFFFFFF +} OMX_AUDIO_MIDISOUNDBANKTYPE; + + +/** Bank Layout describes how bank MSB & LSB are used in the DLS instrument definitions sound bank + * @ingroup midi + */ +typedef enum OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE { + OMX_AUDIO_MIDISoundBankLayoutUnused = 0, /**< unused/unknown soundbank type */ + OMX_AUDIO_MIDISoundBankLayoutGM, /**< GS layout (based on bank MSB 0x00) */ + OMX_AUDIO_MIDISoundBankLayoutGM2, /**< General MIDI 2 layout (using MSB 0x78/0x79, LSB 0x00) */ + OMX_AUDIO_MIDISoundBankLayoutUser, /**< Does not conform to any bank numbering standards */ + OMX_AUDIO_MIDISoundBankLayoutKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_MIDISoundBankLayoutVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_MIDISoundBankLayoutMax = 0x7FFFFFFF +} OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE; + + +/** MIDI params to load/unload user soundbank + * @ingroup midi + */ +typedef struct OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nDLSIndex; /**< DLS file index to be loaded */ + OMX_U32 nDLSSize; /**< Size in bytes */ + OMX_PTR pDLSData; /**< Pointer to DLS file data */ + OMX_AUDIO_MIDISOUNDBANKTYPE eMidiSoundBank; /**< Midi sound bank type enumeration */ + OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE eMidiSoundBankLayout; /**< Midi sound bank layout enumeration */ +} OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE; + + +/** Structure for Live MIDI events and MIP messages. + * (MIP = Maximum Instantaneous Polyphony; part of the SP-MIDI standard.) + * @ingroup midi + */ +typedef struct OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nMidiEventSize; /**< Size of immediate MIDI events or MIP message in bytes */ + OMX_U8 nMidiEvents[1]; /**< MIDI event array to be rendered immediately, or an + array for the MIP message buffer, where the size is + indicated by nMidiEventSize */ +} OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE; + + +/** MIDI sound bank/ program pair in a given channel + * @ingroup midi + */ +typedef struct OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nChannel; /**< Valid channel values range from 1 to 16 */ + OMX_U16 nIDProgram; /**< Valid program ID range is 1 to 128 */ + OMX_U16 nIDSoundBank; /**< Sound bank ID */ + OMX_U32 nUserSoundBankIndex;/**< User soundbank index, easier to access soundbanks + by index if multiple banks are present */ +} OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE; + + +/** MIDI control + * @ingroup midi + */ +typedef struct OMX_AUDIO_CONFIG_MIDICONTROLTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BS32 sPitchTransposition; /**< Pitch transposition in semitones, stored as Q22.10 + format based on JAVA MMAPI (JSR-135) requirement */ + OMX_BU32 sPlayBackRate; /**< Relative playback rate, stored as Q14.17 fixed-point + number based on JSR-135 requirement */ + OMX_BU32 sTempo ; /**< Tempo in beats per minute (BPM), stored as Q22.10 + fixed-point number based on JSR-135 requirement */ + OMX_U32 nMaxPolyphony; /**< Specifies the maximum simultaneous polyphonic + voices. A value of zero indicates that the default + polyphony of the device is used */ + OMX_U32 nNumRepeat; /**< Number of times to repeat playback */ + OMX_U32 nStopTime; /**< Time in milliseconds to indicate when playback + will stop automatically. Set to zero if not used */ + OMX_U16 nChannelMuteMask; /**< 16 bit mask for channel mute status */ + OMX_U16 nChannelSoloMask; /**< 16 bit mask for channel solo status */ + OMX_U32 nTrack0031MuteMask; /**< 32 bit mask for track mute status. Note: This is for tracks 0-31 */ + OMX_U32 nTrack3263MuteMask; /**< 32 bit mask for track mute status. Note: This is for tracks 32-63 */ + OMX_U32 nTrack0031SoloMask; /**< 32 bit mask for track solo status. Note: This is for tracks 0-31 */ + OMX_U32 nTrack3263SoloMask; /**< 32 bit mask for track solo status. Note: This is for tracks 32-63 */ + +} OMX_AUDIO_CONFIG_MIDICONTROLTYPE; + + +/** MIDI Playback States + * @ingroup midi + */ +typedef enum OMX_AUDIO_MIDIPLAYBACKSTATETYPE { + OMX_AUDIO_MIDIPlayBackStateUnknown = 0, /**< Unknown state or state does not map to + other defined states */ + OMX_AUDIO_MIDIPlayBackStateClosedEngaged, /**< No MIDI resource is currently open. + The MIDI engine is currently processing + MIDI events. */ + OMX_AUDIO_MIDIPlayBackStateParsing, /**< A MIDI resource is open and is being + primed. The MIDI engine is currently + processing MIDI events. */ + OMX_AUDIO_MIDIPlayBackStateOpenEngaged, /**< A MIDI resource is open and primed but + not playing. The MIDI engine is currently + processing MIDI events. The transition to + this state is only possible from the + OMX_AUDIO_MIDIPlayBackStatePlaying state, + when the 'playback head' reaches the end + of media data or the playback stops due + to stop time set.*/ + OMX_AUDIO_MIDIPlayBackStatePlaying, /**< A MIDI resource is open and currently + playing. The MIDI engine is currently + processing MIDI events.*/ + OMX_AUDIO_MIDIPlayBackStatePlayingPartially, /**< Best-effort playback due to SP-MIDI/DLS + resource constraints */ + OMX_AUDIO_MIDIPlayBackStatePlayingSilently, /**< Due to system resource constraints and + SP-MIDI content constraints, there is + no audible MIDI content during playback + currently. The situation may change if + resources are freed later.*/ + OMX_AUDIO_MIDIPlayBackStateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_MIDIPlayBackStateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_MIDIPlayBackStateMax = 0x7FFFFFFF +} OMX_AUDIO_MIDIPLAYBACKSTATETYPE; + + +/** MIDI status + * @ingroup midi + */ +typedef struct OMX_AUDIO_CONFIG_MIDISTATUSTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U16 nNumTracks; /**< Number of MIDI tracks in the file, read only field. + NOTE: May not return a meaningful value until the entire + file is parsed and buffered. */ + OMX_U32 nDuration; /**< The length of the currently open MIDI resource + in milliseconds. NOTE: May not return a meaningful value + until the entire file is parsed and buffered. */ + OMX_U32 nPosition; /**< Current Position of the MIDI resource being played + in milliseconds */ + OMX_BOOL bVibra; /**< Does Vibra track exist? NOTE: May not return a meaningful + value until the entire file is parsed and buffered. */ + OMX_U32 nNumMetaEvents; /**< Total number of MIDI Meta Events in the currently + open MIDI resource. NOTE: May not return a meaningful value + until the entire file is parsed and buffered. */ + OMX_U32 nNumActiveVoices; /**< Number of active voices in the currently playing + MIDI resource. NOTE: May not return a meaningful value until + the entire file is parsed and buffered. */ + OMX_AUDIO_MIDIPLAYBACKSTATETYPE eMIDIPlayBackState; /**< MIDI playback state enumeration, read only field */ +} OMX_AUDIO_CONFIG_MIDISTATUSTYPE; + + +/** MIDI Meta Event structure one per Meta Event. + * MIDI Meta Events are like audio metadata, except that they are interspersed + * with the MIDI content throughout the file and are not localized in the header. + * As such, it is necessary to retrieve information about these Meta Events from + * the engine, as it encounters these Meta Events within the MIDI content. + * For example, SMF files can have up to 14 types of MIDI Meta Events (copyright, + * author, default tempo, etc.) scattered throughout the file. + * @ingroup midi + */ +typedef struct OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE{ + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nIndex; /**< Index of Meta Event */ + OMX_U8 nMetaEventType; /**< Meta Event Type, 7bits (i.e. 0 - 127) */ + OMX_U32 nMetaEventSize; /**< size of the Meta Event in bytes */ + OMX_U32 nTrack; /**< track number for the meta event */ + OMX_U32 nPosition; /**< Position of the meta-event in milliseconds */ +} OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE; + + +/** MIDI Meta Event Data structure - one per Meta Event. + * @ingroup midi + */ +typedef struct OMX_AUDIO_CONFIG_MIDIMETAEVENTDATATYPE{ + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nIndex; /**< Index of Meta Event */ + OMX_U32 nMetaEventSize; /**< size of the Meta Event in bytes */ + OMX_U8 nData[1]; /**< array of one or more bytes of meta data + as indicated by the nMetaEventSize field */ +} OMX_AUDIO_CONFIG__MIDIMETAEVENTDATATYPE; + + +/** Audio Volume adjustment for a port */ +typedef struct OMX_AUDIO_CONFIG_VOLUMETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port index indicating which port to + set. Select the input port to set + just that port's volume. Select the + output port to adjust the master + volume. */ + OMX_BOOL bLinear; /**< Is the volume to be set in linear (0.100) + or logarithmic scale (mB) */ + OMX_BS32 sVolume; /**< Volume linear setting in the 0..100 range, OR + Volume logarithmic setting for this port. The values + for volume are in mB (millibels = 1/100 dB) relative + to a gain of 1 (e.g. the output is the same as the + input level). Values are in mB from nMax + (maximum volume) to nMin mB (typically negative). + Since the volume is "voltage" + and not a "power", it takes a setting of + -600 mB to decrease the volume by 1/2. If + a component cannot accurately set the + volume to the requested value, it must + set the volume to the closest value BELOW + the requested value. When getting the + volume setting, the current actual volume + must be returned. */ +} OMX_AUDIO_CONFIG_VOLUMETYPE; + + +/** Audio Volume adjustment for a channel */ +typedef struct OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port index indicating which port to + set. Select the input port to set + just that port's volume. Select the + output port to adjust the master + volume. */ + OMX_U32 nChannel; /**< channel to select from 0 to N-1, + using OMX_ALL to apply volume settings + to all channels */ + OMX_BOOL bLinear; /**< Is the volume to be set in linear (0.100) or + logarithmic scale (mB) */ + OMX_BS32 sVolume; /**< Volume linear setting in the 0..100 range, OR + Volume logarithmic setting for this port. + The values for volume are in mB + (millibels = 1/100 dB) relative to a gain + of 1 (e.g. the output is the same as the + input level). Values are in mB from nMax + (maximum volume) to nMin mB (typically negative). + Since the volume is "voltage" + and not a "power", it takes a setting of + -600 mB to decrease the volume by 1/2. If + a component cannot accurately set the + volume to the requested value, it must + set the volume to the closest value BELOW + the requested value. When getting the + volume setting, the current actual volume + must be returned. */ + OMX_BOOL bIsMIDI; /**< TRUE if nChannel refers to a MIDI channel, + FALSE otherwise */ +} OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE; + + +/** Audio balance setting */ +typedef struct OMX_AUDIO_CONFIG_BALANCETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port index indicating which port to + set. Select the input port to set + just that port's balance. Select the + output port to adjust the master + balance. */ + OMX_S32 nBalance; /**< balance setting for this port + (-100 to 100, where -100 indicates + all left, and no right */ +} OMX_AUDIO_CONFIG_BALANCETYPE; + + +/** Audio Port mute */ +typedef struct OMX_AUDIO_CONFIG_MUTETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port index indicating which port to + set. Select the input port to set + just that port's mute. Select the + output port to adjust the master + mute. */ + OMX_BOOL bMute; /**< Mute setting for this port */ +} OMX_AUDIO_CONFIG_MUTETYPE; + + +/** Audio Channel mute */ +typedef struct OMX_AUDIO_CONFIG_CHANNELMUTETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nChannel; /**< channel to select from 0 to N-1, + using OMX_ALL to apply mute settings + to all channels */ + OMX_BOOL bMute; /**< Mute setting for this channel */ + OMX_BOOL bIsMIDI; /**< TRUE if nChannel refers to a MIDI channel, + FALSE otherwise */ +} OMX_AUDIO_CONFIG_CHANNELMUTETYPE; + + + +/** Enable / Disable for loudness control, which boosts bass and to a + * smaller extent high end frequencies to compensate for hearing + * ability at the extreme ends of the audio spectrum + */ +typedef struct OMX_AUDIO_CONFIG_LOUDNESSTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bLoudness; /**< Enable/disable for loudness */ +} OMX_AUDIO_CONFIG_LOUDNESSTYPE; + + +/** Enable / Disable for bass, which controls low frequencies + */ +typedef struct OMX_AUDIO_CONFIG_BASSTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bEnable; /**< Enable/disable for bass control */ + OMX_S32 nBass; /**< bass setting for the port, as a + continuous value from -100 to 100 + (0 means no change in bass level)*/ +} OMX_AUDIO_CONFIG_BASSTYPE; + + +/** Enable / Disable for treble, which controls high frequencies tones + */ +typedef struct OMX_AUDIO_CONFIG_TREBLETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bEnable; /**< Enable/disable for treble control */ + OMX_S32 nTreble; /**< treble setting for the port, as a + continuous value from -100 to 100 + (0 means no change in treble level) */ +} OMX_AUDIO_CONFIG_TREBLETYPE; + + +/** An equalizer is typically used for two reasons: to compensate for an + * sub-optimal frequency response of a system to make it sound more natural + * or to create intentionally some unnatural coloring to the sound to create + * an effect. + * @ingroup effects + */ +typedef struct OMX_AUDIO_CONFIG_EQUALIZERTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bEnable; /**< Enable/disable for equalizer */ + OMX_BU32 sBandIndex; /**< Band number to be set. Upper Limit is + N-1, where N is the number of bands, lower limit is 0 */ + OMX_BU32 sCenterFreq; /**< Center frequecies in Hz. This is a + read only element and is used to determine + the lower, center and upper frequency of + this band. */ + OMX_BS32 sBandLevel; /**< band level in millibels */ +} OMX_AUDIO_CONFIG_EQUALIZERTYPE; + + +/** Stereo widening mode type + * @ingroup effects + */ +typedef enum OMX_AUDIO_STEREOWIDENINGTYPE { + OMX_AUDIO_StereoWideningHeadphones, /**< Stereo widening for loudspeakers */ + OMX_AUDIO_StereoWideningLoudspeakers, /**< Stereo widening for closely spaced loudspeakers */ + OMX_AUDIO_StereoWideningKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_StereoWideningVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_StereoWideningMax = 0x7FFFFFFF +} OMX_AUDIO_STEREOWIDENINGTYPE; + + +/** Control for stereo widening, which is a special 2-channel + * case of the audio virtualizer effect. For example, for 5.1-channel + * output, it translates to virtual surround sound. + * @ingroup effects + */ +typedef struct OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bEnable; /**< Enable/disable for stereo widening control */ + OMX_AUDIO_STEREOWIDENINGTYPE eWideningType; /**< Stereo widening algorithm type */ + OMX_U32 nStereoWidening; /**< stereo widening setting for the port, + as a continuous value from 0 to 100 */ +} OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE; + + +/** The chorus effect (or ``choralizer'') is any signal processor which makes + * one sound source (such as a voice) sound like many such sources singing + * (or playing) in unison. Since performance in unison is never exact, chorus + * effects simulate this by making independently modified copies of the input + * signal. Modifications may include (1) delay, (2) frequency shift, and + * (3) amplitude modulation. + * @ingroup effects + */ +typedef struct OMX_AUDIO_CONFIG_CHORUSTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bEnable; /**< Enable/disable for chorus */ + OMX_BU32 sDelay; /**< average delay in milliseconds */ + OMX_BU32 sModulationRate; /**< rate of modulation in millihertz */ + OMX_U32 nModulationDepth; /**< depth of modulation as a percentage of + delay (i.e. 0 to 100) */ + OMX_BU32 nFeedback; /**< Feedback from chorus output to input in percentage */ +} OMX_AUDIO_CONFIG_CHORUSTYPE; + + +/** Reverberation is part of the reflected sound that follows the early + * reflections. In a typical room, this consists of a dense succession of + * echoes whose energy decays exponentially. The reverberation effect structure + * as defined here includes both (early) reflections as well as (late) reverberations. + * @ingroup effects + */ +typedef struct OMX_AUDIO_CONFIG_REVERBERATIONTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bEnable; /**< Enable/disable for reverberation control */ + OMX_BS32 sRoomLevel; /**< Intensity level for the whole room effect + (i.e. both early reflections and late + reverberation) in millibels */ + OMX_BS32 sRoomHighFreqLevel; /**< Attenuation at high frequencies + relative to the intensity at low + frequencies in millibels */ + OMX_BS32 sReflectionsLevel; /**< Intensity level of early reflections + (relative to room value), in millibels */ + OMX_BU32 sReflectionsDelay; /**< Delay time of the first reflection relative + to the direct path, in milliseconds */ + OMX_BS32 sReverbLevel; /**< Intensity level of late reverberation + relative to room level, in millibels */ + OMX_BU32 sReverbDelay; /**< Time delay from the first early reflection + to the beginning of the late reverberation + section, in milliseconds */ + OMX_BU32 sDecayTime; /**< Late reverberation decay time at low + frequencies, in milliseconds */ + OMX_BU32 nDecayHighFreqRatio; /**< Ratio of high frequency decay time relative + to low frequency decay time in percent */ + OMX_U32 nDensity; /**< Modal density in the late reverberation decay, + in percent (i.e. 0 - 100) */ + OMX_U32 nDiffusion; /**< Echo density in the late reverberation decay, + in percent (i.e. 0 - 100) */ + OMX_BU32 sReferenceHighFreq; /**< Reference high frequency in Hertz. This is + the frequency used as the reference for all + the high-frequency settings above */ + +} OMX_AUDIO_CONFIG_REVERBERATIONTYPE; + + +/** Possible settings for the Echo Cancelation structure to use + * @ingroup effects + */ +typedef enum OMX_AUDIO_ECHOCANTYPE { + OMX_AUDIO_EchoCanOff = 0, /**< Echo Cancellation is disabled */ + OMX_AUDIO_EchoCanNormal, /**< Echo Cancellation normal operation - + echo from plastics and face */ + OMX_AUDIO_EchoCanHFree, /**< Echo Cancellation optimized for + Hands Free operation */ + OMX_AUDIO_EchoCanCarKit, /**< Echo Cancellation optimized for + Car Kit (longer echo) */ + OMX_AUDIO_EchoCanKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_AUDIO_EchoCanVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_AUDIO_EchoCanMax = 0x7FFFFFFF +} OMX_AUDIO_ECHOCANTYPE; + + +/** Enable / Disable for echo cancelation, which removes undesired echo's + * from the audio + * @ingroup effects + */ +typedef struct OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_AUDIO_ECHOCANTYPE eEchoCancelation; /**< Echo cancelation settings */ +} OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE; + + +/** Enable / Disable for noise reduction, which undesired noise from + * the audio + * @ingroup effects + */ +typedef struct OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bNoiseReduction; /**< Enable/disable for noise reduction */ +} OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE; + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_Component.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_Component.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,579 @@ +/* + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** OMX_Component.h - OpenMax IL version 1.1.2 + * The OMX_Component header file contains the definitions used to define + * the public interface of a component. This header file is intended to + * be used by both the application and the component. + */ + +#ifndef OMX_Component_h +#define OMX_Component_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ + +#include +#include +#include +#include + +/** @ingroup comp */ +typedef enum OMX_PORTDOMAINTYPE { + OMX_PortDomainAudio, + OMX_PortDomainVideo, + OMX_PortDomainImage, + OMX_PortDomainOther, + OMX_PortDomainKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_PortDomainVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_PortDomainMax = 0x7ffffff +} OMX_PORTDOMAINTYPE; + +/** @ingroup comp */ +typedef struct OMX_PARAM_PORTDEFINITIONTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port number the structure applies to */ + OMX_DIRTYPE eDir; /**< Direction (input or output) of this port */ + OMX_U32 nBufferCountActual; /**< The actual number of buffers allocated on this port */ + OMX_U32 nBufferCountMin; /**< The minimum number of buffers this port requires */ + OMX_U32 nBufferSize; /**< Size, in bytes, for buffers to be used for this channel */ + OMX_BOOL bEnabled; /**< Ports default to enabled and are enabled/disabled by + OMX_CommandPortEnable/OMX_CommandPortDisable. + When disabled a port is unpopulated. A disabled port + is not populated with buffers on a transition to IDLE. */ + OMX_BOOL bPopulated; /**< Port is populated with all of its buffers as indicated by + nBufferCountActual. A disabled port is always unpopulated. + An enabled port is populated on a transition to OMX_StateIdle + and unpopulated on a transition to loaded. */ + OMX_PORTDOMAINTYPE eDomain; /**< Domain of the port. Determines the contents of metadata below. */ + union { + OMX_AUDIO_PORTDEFINITIONTYPE audio; + OMX_VIDEO_PORTDEFINITIONTYPE video; + OMX_IMAGE_PORTDEFINITIONTYPE image; + OMX_OTHER_PORTDEFINITIONTYPE other; + } format; + OMX_BOOL bBuffersContiguous; + OMX_U32 nBufferAlignment; +} OMX_PARAM_PORTDEFINITIONTYPE; + +/** @ingroup comp */ +typedef struct OMX_PARAM_U32TYPE { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U32 nU32; /**< U32 value */ +} OMX_PARAM_U32TYPE; + +/** @ingroup rpm */ +typedef enum OMX_SUSPENSIONPOLICYTYPE { + OMX_SuspensionDisabled, /**< No suspension; v1.0 behavior */ + OMX_SuspensionEnabled, /**< Suspension allowed */ + OMX_SuspensionPolicyKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_SuspensionPolicyStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_SuspensionPolicyMax = 0x7fffffff +} OMX_SUSPENSIONPOLICYTYPE; + +/** @ingroup rpm */ +typedef struct OMX_PARAM_SUSPENSIONPOLICYTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_SUSPENSIONPOLICYTYPE ePolicy; +} OMX_PARAM_SUSPENSIONPOLICYTYPE; + +/** @ingroup rpm */ +typedef enum OMX_SUSPENSIONTYPE { + OMX_NotSuspended, /**< component is not suspended */ + OMX_Suspended, /**< component is suspended */ + OMX_SuspensionKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_SuspensionVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_SuspendMax = 0x7FFFFFFF +} OMX_SUSPENSIONTYPE; + +/** @ingroup rpm */ +typedef struct OMX_PARAM_SUSPENSIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_SUSPENSIONTYPE eType; +} OMX_PARAM_SUSPENSIONTYPE ; + +typedef struct OMX_CONFIG_BOOLEANTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_BOOL bEnabled; +} OMX_CONFIG_BOOLEANTYPE; + +/* Parameter specifying the content uri to use. */ +/** @ingroup cp */ +typedef struct OMX_PARAM_CONTENTURITYPE +{ + OMX_U32 nSize; /**< size of the structure in bytes, including + actual URI name */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U8 contentURI[1]; /**< The URI name */ +} OMX_PARAM_CONTENTURITYPE; + +/* Parameter specifying the pipe to use. */ +/** @ingroup cp */ +typedef struct OMX_PARAM_CONTENTPIPETYPE +{ + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_HANDLETYPE hPipe; /**< The pipe handle*/ +} OMX_PARAM_CONTENTPIPETYPE; + +/** @ingroup rpm */ +typedef struct OMX_RESOURCECONCEALMENTTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_BOOL bResourceConcealmentForbidden; /**< disallow the use of resource concealment + methods (like degrading algorithm quality to + lower resource consumption or functional bypass) + on a component as a resolution to resource conflicts. */ +} OMX_RESOURCECONCEALMENTTYPE; + + +/** @ingroup metadata */ +typedef enum OMX_METADATACHARSETTYPE { + OMX_MetadataCharsetUnknown = 0, + OMX_MetadataCharsetASCII, + OMX_MetadataCharsetBinary, + OMX_MetadataCharsetCodePage1252, + OMX_MetadataCharsetUTF8, + OMX_MetadataCharsetJavaConformantUTF8, + OMX_MetadataCharsetUTF7, + OMX_MetadataCharsetImapUTF7, + OMX_MetadataCharsetUTF16LE, + OMX_MetadataCharsetUTF16BE, + OMX_MetadataCharsetGB12345, + OMX_MetadataCharsetHZGB2312, + OMX_MetadataCharsetGB2312, + OMX_MetadataCharsetGB18030, + OMX_MetadataCharsetGBK, + OMX_MetadataCharsetBig5, + OMX_MetadataCharsetISO88591, + OMX_MetadataCharsetISO88592, + OMX_MetadataCharsetISO88593, + OMX_MetadataCharsetISO88594, + OMX_MetadataCharsetISO88595, + OMX_MetadataCharsetISO88596, + OMX_MetadataCharsetISO88597, + OMX_MetadataCharsetISO88598, + OMX_MetadataCharsetISO88599, + OMX_MetadataCharsetISO885910, + OMX_MetadataCharsetISO885913, + OMX_MetadataCharsetISO885914, + OMX_MetadataCharsetISO885915, + OMX_MetadataCharsetShiftJIS, + OMX_MetadataCharsetISO2022JP, + OMX_MetadataCharsetISO2022JP1, + OMX_MetadataCharsetISOEUCJP, + OMX_MetadataCharsetSMS7Bit, + OMX_MetadataCharsetKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_MetadataCharsetVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_MetadataCharsetTypeMax= 0x7FFFFFFF +} OMX_METADATACHARSETTYPE; + +/** @ingroup metadata */ +typedef enum OMX_METADATASCOPETYPE +{ + OMX_MetadataScopeAllLevels, + OMX_MetadataScopeTopLevel, + OMX_MetadataScopePortLevel, + OMX_MetadataScopeNodeLevel, + OMX_MetadataScopeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_MetadataScopeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_MetadataScopeTypeMax = 0x7fffffff +} OMX_METADATASCOPETYPE; + +/** @ingroup metadata */ +typedef enum OMX_METADATASEARCHMODETYPE +{ + OMX_MetadataSearchValueSizeByIndex, + OMX_MetadataSearchItemByIndex, + OMX_MetadataSearchNextItemByKey, + OMX_MetadataSearchKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_MetadataSearchVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_MetadataSearchTypeMax = 0x7fffffff +} OMX_METADATASEARCHMODETYPE; +/** @ingroup metadata */ +typedef struct OMX_CONFIG_METADATAITEMCOUNTTYPE +{ + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_METADATASCOPETYPE eScopeMode; + OMX_U32 nScopeSpecifier; + OMX_U32 nMetadataItemCount; +} OMX_CONFIG_METADATAITEMCOUNTTYPE; + +/** @ingroup metadata */ +typedef struct OMX_CONFIG_METADATAITEMTYPE +{ + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_METADATASCOPETYPE eScopeMode; + OMX_U32 nScopeSpecifier; + OMX_U32 nMetadataItemIndex; + OMX_METADATASEARCHMODETYPE eSearchMode; + OMX_METADATACHARSETTYPE eKeyCharset; + OMX_U8 nKeySizeUsed; + OMX_U8 nKey[128]; + OMX_METADATACHARSETTYPE eValueCharset; + OMX_STRING sLanguageCountry; + OMX_U32 nValueMaxSize; + OMX_U32 nValueSizeUsed; + OMX_U8 nValue[1]; +} OMX_CONFIG_METADATAITEMTYPE; + +/* @ingroup metadata */ +typedef struct OMX_CONFIG_CONTAINERNODECOUNTTYPE +{ + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_BOOL bAllKeys; + OMX_U32 nParentNodeID; + OMX_U32 nNumNodes; +} OMX_CONFIG_CONTAINERNODECOUNTTYPE; + +/** @ingroup metadata */ +typedef struct OMX_CONFIG_CONTAINERNODEIDTYPE +{ + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_BOOL bAllKeys; + OMX_U32 nParentNodeID; + OMX_U32 nNodeIndex; + OMX_U32 nNodeID; + OMX_STRING cNodeName; + OMX_BOOL bIsLeafType; +} OMX_CONFIG_CONTAINERNODEIDTYPE; + +/** @ingroup metadata */ +typedef struct OMX_PARAM_METADATAFILTERTYPE +{ + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_BOOL bAllKeys; /* if true then this structure refers to all keys and + * the three key fields below are ignored */ + OMX_METADATACHARSETTYPE eKeyCharset; + OMX_U32 nKeySizeUsed; + OMX_U8 nKey [128]; + OMX_U32 nLanguageCountrySizeUsed; + OMX_U8 nLanguageCountry[128]; + OMX_BOOL bEnabled; /* if true then key is part of filter (e.g. + * retained for query later). If false then + * key is not part of filter */ +} OMX_PARAM_METADATAFILTERTYPE; + +/** The OMX_HANDLETYPE structure defines the component handle. The component + * handle is used to access all of the component's public methods and also + * contains pointers to the component's private data area. The component + * handle is initialized by the OMX core (with help from the component) + * during the process of loading the component. After the component is + * successfully loaded, the application can safely access any of the + * component's public functions (although some may return an error because + * the state is inappropriate for the access). + * + * @ingroup comp + */ +typedef struct OMX_COMPONENTTYPE +{ + /** The size of this structure, in bytes. It is the responsibility + of the allocator of this structure to fill in this value. Since + this structure is allocated by the GetHandle function, this + function will fill in this value. */ + OMX_U32 nSize; + + /** nVersion is the version of the OMX specification that the structure + is built against. It is the responsibility of the creator of this + structure to initialize this value and every user of this structure + should verify that it knows how to use the exact version of + this structure found herein. */ + OMX_VERSIONTYPE nVersion; + + /** pComponentPrivate is a pointer to the component private data area. + This member is allocated and initialized by the component when the + component is first loaded. The application should not access this + data area. */ + OMX_PTR pComponentPrivate; + + /** pApplicationPrivate is a pointer that is a parameter to the + OMX_GetHandle method, and contains an application private value + provided by the IL client. This application private data is + returned to the IL Client by OMX in all callbacks */ + OMX_PTR pApplicationPrivate; + + /** refer to OMX_GetComponentVersion in OMX_core.h or the OMX IL + specification for details on the GetComponentVersion method. + */ + OMX_ERRORTYPE (*GetComponentVersion)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_OUT OMX_STRING pComponentName, + OMX_OUT OMX_VERSIONTYPE* pComponentVersion, + OMX_OUT OMX_VERSIONTYPE* pSpecVersion, + OMX_OUT OMX_UUIDTYPE* pComponentUUID); + + /** refer to OMX_SendCommand in OMX_core.h or the OMX IL + specification for details on the SendCommand method. + */ + OMX_ERRORTYPE (*SendCommand)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_COMMANDTYPE Cmd, + OMX_IN OMX_U32 nParam1, + OMX_IN OMX_PTR pCmdData); + + /** refer to OMX_GetParameter in OMX_core.h or the OMX IL + specification for details on the GetParameter method. + */ + OMX_ERRORTYPE (*GetParameter)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_INDEXTYPE nParamIndex, + OMX_INOUT OMX_PTR pComponentParameterStructure); + + + /** refer to OMX_SetParameter in OMX_core.h or the OMX IL + specification for details on the SetParameter method. + */ + OMX_ERRORTYPE (*SetParameter)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_INDEXTYPE nIndex, + OMX_IN OMX_PTR pComponentParameterStructure); + + + /** refer to OMX_GetConfig in OMX_core.h or the OMX IL + specification for details on the GetConfig method. + */ + OMX_ERRORTYPE (*GetConfig)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_INDEXTYPE nIndex, + OMX_INOUT OMX_PTR pComponentConfigStructure); + + + /** refer to OMX_SetConfig in OMX_core.h or the OMX IL + specification for details on the SetConfig method. + */ + OMX_ERRORTYPE (*SetConfig)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_INDEXTYPE nIndex, + OMX_IN OMX_PTR pComponentConfigStructure); + + + /** refer to OMX_GetExtensionIndex in OMX_core.h or the OMX IL + specification for details on the GetExtensionIndex method. + */ + OMX_ERRORTYPE (*GetExtensionIndex)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_STRING cParameterName, + OMX_OUT OMX_INDEXTYPE* pIndexType); + + + /** refer to OMX_GetState in OMX_core.h or the OMX IL + specification for details on the GetState method. + */ + OMX_ERRORTYPE (*GetState)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_OUT OMX_STATETYPE* pState); + + + /** The ComponentTunnelRequest method will interact with another OMX + component to determine if tunneling is possible and to setup the + tunneling. The return codes for this method can be used to + determine if tunneling is not possible, or if tunneling is not + supported. + + Base profile components (i.e. non-interop) do not support this + method and should return OMX_ErrorNotImplemented + + The interop profile component MUST support tunneling to another + interop profile component with a compatible port parameters. + A component may also support proprietary communication. + + If proprietary communication is supported the negotiation of + proprietary communication is done outside of OMX in a vendor + specific way. It is only required that the proper result be + returned and the details of how the setup is done is left + to the component implementation. + + When this method is invoked when nPort in an output port, the + component will: + 1. Populate the pTunnelSetup structure with the output port's + requirements and constraints for the tunnel. + + When this method is invoked when nPort in an input port, the + component will: + 1. Query the necessary parameters from the output port to + determine if the ports are compatible for tunneling + 2. If the ports are compatible, the component should store + the tunnel step provided by the output port + 3. Determine which port (either input or output) is the buffer + supplier, and call OMX_SetParameter on the output port to + indicate this selection. + + The component will return from this call within 5 msec. + + @param [in] hComp + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle method. + @param [in] nPort + nPort is used to select the port on the component to be used + for tunneling. + @param [in] hTunneledComp + Handle of the component to tunnel with. This is the component + handle returned by the call to the OMX_GetHandle method. When + this parameter is 0x0 the component should setup the port for + communication with the application / IL Client. + @param [in] nPortOutput + nPortOutput is used indicate the port the component should + tunnel with. + @param [in] pTunnelSetup + Pointer to the tunnel setup structure. When nPort is an output port + the component should populate the fields of this structure. When + When nPort is an input port the component should review the setup + provided by the component with the output port. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup tun + */ + + OMX_ERRORTYPE (*ComponentTunnelRequest)( + OMX_IN OMX_HANDLETYPE hComp, + OMX_IN OMX_U32 nPort, + OMX_IN OMX_HANDLETYPE hTunneledComp, + OMX_IN OMX_U32 nTunneledPort, + OMX_INOUT OMX_TUNNELSETUPTYPE* pTunnelSetup); + + /** refer to OMX_UseBuffer in OMX_core.h or the OMX IL + specification for details on the UseBuffer method. + @ingroup buf + */ + OMX_ERRORTYPE (*UseBuffer)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, + OMX_IN OMX_U32 nPortIndex, + OMX_IN OMX_PTR pAppPrivate, + OMX_IN OMX_U32 nSizeBytes, + OMX_IN OMX_U8* pBuffer); + + /** refer to OMX_AllocateBuffer in OMX_core.h or the OMX IL + specification for details on the AllocateBuffer method. + @ingroup buf + */ + OMX_ERRORTYPE (*AllocateBuffer)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_INOUT OMX_BUFFERHEADERTYPE** ppBuffer, + OMX_IN OMX_U32 nPortIndex, + OMX_IN OMX_PTR pAppPrivate, + OMX_IN OMX_U32 nSizeBytes); + + /** refer to OMX_FreeBuffer in OMX_core.h or the OMX IL + specification for details on the FreeBuffer method. + @ingroup buf + */ + OMX_ERRORTYPE (*FreeBuffer)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_U32 nPortIndex, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + + /** refer to OMX_EmptyThisBuffer in OMX_core.h or the OMX IL + specification for details on the EmptyThisBuffer method. + @ingroup buf + */ + OMX_ERRORTYPE (*EmptyThisBuffer)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + + /** refer to OMX_FillThisBuffer in OMX_core.h or the OMX IL + specification for details on the FillThisBuffer method. + @ingroup buf + */ + OMX_ERRORTYPE (*FillThisBuffer)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + + /** The SetCallbacks method is used by the core to specify the callback + structure from the application to the component. This is a blocking + call. The component will return from this call within 5 msec. + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the GetHandle function. + @param [in] pCallbacks + pointer to an OMX_CALLBACKTYPE structure used to provide the + callback information to the component + @param [in] pAppData + pointer to an application defined value. It is anticipated that + the application will pass a pointer to a data structure or a "this + pointer" in this area to allow the callback (in the application) + to determine the context of the call + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + */ + OMX_ERRORTYPE (*SetCallbacks)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_CALLBACKTYPE* pCallbacks, + OMX_IN OMX_PTR pAppData); + + /** ComponentDeInit method is used to deinitialize the component + providing a means to free any resources allocated at component + initialization. NOTE: After this call the component handle is + not valid for further use. + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the GetHandle function. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + */ + OMX_ERRORTYPE (*ComponentDeInit)( + OMX_IN OMX_HANDLETYPE hComponent); + + /** @ingroup buf */ + OMX_ERRORTYPE (*UseEGLImage)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr, + OMX_IN OMX_U32 nPortIndex, + OMX_IN OMX_PTR pAppPrivate, + OMX_IN void* eglImage); + + OMX_ERRORTYPE (*ComponentRoleEnum)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_OUT OMX_U8 *cRole, + OMX_IN OMX_U32 nIndex); + +} OMX_COMPONENTTYPE; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_ContentPipe.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_ContentPipe.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** OMX_ContentPipe.h - OpenMax IL version 1.1.2 + * The OMX_ContentPipe header file contains the definitions used to define + * the public interface for content piples. This header file is intended to + * be used by the component. + */ + +#ifndef OMX_CONTENTPIPE_H +#define OMX_CONTENTPIPE_H + +#ifndef KD_EACCES +/* OpenKODE error codes. CPResult values may be zero (indicating success + or one of the following values) */ +#define KD_EACCES (1) +#define KD_EADDRINUSE (2) +#define KD_EAGAIN (5) +#define KD_EBADF (7) +#define KD_EBUSY (8) +#define KD_ECONNREFUSED (9) +#define KD_ECONNRESET (10) +#define KD_EDEADLK (11) +#define KD_EDESTADDRREQ (12) +#define KD_ERANGE (35) +#define KD_EEXIST (13) +#define KD_EFBIG (14) +#define KD_EHOSTUNREACH (15) +#define KD_EINVAL (17) +#define KD_EIO (18) +#define KD_EISCONN (20) +#define KD_EISDIR (21) +#define KD_EMFILE (22) +#define KD_ENAMETOOLONG (23) +#define KD_ENOENT (24) +#define KD_ENOMEM (25) +#define KD_ENOSPC (26) +#define KD_ENOSYS (27) +#define KD_ENOTCONN (28) +#define KD_EPERM (33) +#define KD_ETIMEDOUT (36) +#define KD_EILSEQ (19) +#endif + +/** Map types from OMX standard types only here so interface is as generic as possible. */ +typedef OMX_U32 CPresult; +typedef char * CPstring; +typedef void * CPhandle; +typedef OMX_U32 CPuint; +typedef OMX_S32 CPint; +typedef char CPbyte; +typedef OMX_BOOL CPbool; + +/** enumeration of origin types used in the CP_PIPETYPE's Seek function + * @ingroup cp + */ +typedef enum CP_ORIGINTYPE { + CP_OriginBegin, + CP_OriginCur, + CP_OriginEnd, + CP_OriginKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + CP_OriginVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + CP_OriginMax = 0X7FFFFFFF +} CP_ORIGINTYPE; + +/** enumeration of contact access types used in the CP_PIPETYPE's Open function + * @ingroup cp + */ +typedef enum CP_ACCESSTYPE { + CP_AccessRead, + CP_AccessWrite, + CP_AccessReadWrite , + CP_AccessKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + CP_AccessVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + CP_AccessMax = 0X7FFFFFFF +} CP_ACCESSTYPE; + +/** enumeration of results returned by the CP_PIPETYPE's CheckAvailableBytes function + * @ingroup cp + */ +typedef enum CP_CHECKBYTESRESULTTYPE +{ + CP_CheckBytesOk, /**< There are at least the request number + of bytes available */ + CP_CheckBytesNotReady, /**< The pipe is still retrieving bytes + and presently lacks sufficient bytes. + Client will be called when they are + sufficient bytes are available. */ + CP_CheckBytesInsufficientBytes , /**< The pipe has retrieved all bytes + but those available are less than those + requested */ + CP_CheckBytesAtEndOfStream, /**< The pipe has reached the end of stream + and no more bytes are available. */ + CP_CheckBytesOutOfBuffers, /**< All read/write buffers are currently in use. */ + CP_CheckBytesKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + CP_CheckBytesVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + CP_CheckBytesMax = 0X7FFFFFFF +} CP_CHECKBYTESRESULTTYPE; + +/** enumeration of content pipe events sent to the client callback. + * @ingroup cp + */ +typedef enum CP_EVENTTYPE{ + CP_BytesAvailable, /** bytes requested in a CheckAvailableBytes call are now available*/ + CP_Overflow, /** enumeration of content pipe events sent to the client callback*/ + CP_PipeDisconnected , /** enumeration of content pipe events sent to the client callback*/ + CP_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + CP_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + CP_EventMax = 0X7FFFFFFF +} CP_EVENTTYPE; + +/** content pipe definition + * @ingroup cp + */ +typedef struct CP_PIPETYPE +{ + /** Open a content stream for reading or writing. */ + CPresult (*Open)( CPhandle* hContent, CPstring szURI, CP_ACCESSTYPE eAccess ); + + /** Close a content stream. */ + CPresult (*Close)( CPhandle hContent ); + + /** Create a content source and open it for writing. */ + CPresult (*Create)( CPhandle *hContent, CPstring szURI ); + + /** Check the that specified number of bytes are available for reading or writing (depending on access type).*/ + CPresult (*CheckAvailableBytes)( CPhandle hContent, CPuint nBytesRequested, CP_CHECKBYTESRESULTTYPE *eResult ); + + /** Seek to certain position in the content relative to the specified origin. */ + CPresult (*SetPosition)( CPhandle hContent, CPint nOffset, CP_ORIGINTYPE eOrigin); + + /** Retrieve the current position relative to the start of the content. */ + CPresult (*GetPosition)( CPhandle hContent, CPuint *pPosition); + + /** Retrieve data of the specified size from the content stream (advance content pointer by size of data). + Note: pipe client provides pointer. This function is appropriate for small high frequency reads. */ + CPresult (*Read)( CPhandle hContent, CPbyte *pData, CPuint nSize); + + /** Retrieve a buffer allocated by the pipe that contains the requested number of bytes. + Buffer contains the next block of bytes, as specified by nSize, of the content. nSize also + returns the size of the block actually read. Content pointer advances the by the returned size. + Note: pipe provides pointer. This function is appropriate for large reads. The client must call + ReleaseReadBuffer when done with buffer. + + In some cases the requested block may not reside in contiguous memory within the + pipe implementation. For instance if the pipe leverages a circular buffer then the requested + block may straddle the boundary of the circular buffer. By default a pipe implementation + performs a copy in this case to provide the block to the pipe client in one contiguous buffer. + If, however, the client sets bForbidCopy, then the pipe returns only those bytes preceding the memory + boundary. Here the client may retrieve the data in segments over successive calls. */ + CPresult (*ReadBuffer)( CPhandle hContent, CPbyte **ppBuffer, CPuint *nSize, CPbool bForbidCopy); + + /** Release a buffer obtained by ReadBuffer back to the pipe. */ + CPresult (*ReleaseReadBuffer)(CPhandle hContent, CPbyte *pBuffer); + + /** Write data of the specified size to the content (advance content pointer by size of data). + Note: pipe client provides pointer. This function is appropriate for small high frequency writes. */ + CPresult (*Write)( CPhandle hContent, CPbyte *data, CPuint nSize); + + /** Retrieve a buffer allocated by the pipe used to write data to the content. + Client will fill buffer with output data. Note: pipe provides pointer. This function is appropriate + for large writes. The client must call WriteBuffer when done it has filled the buffer with data.*/ + CPresult (*GetWriteBuffer)( CPhandle hContent, CPbyte **ppBuffer, CPuint nSize); + + /** Deliver a buffer obtained via GetWriteBuffer to the pipe. Pipe will write the + the contents of the buffer to content and advance content pointer by the size of the buffer */ + CPresult (*WriteBuffer)( CPhandle hContent, CPbyte *pBuffer, CPuint nFilledSize); + + /** Register a per-handle client callback with the content pipe. */ + CPresult (*RegisterCallback)( CPhandle hContent, CPresult (*ClientCallback)(CP_EVENTTYPE eEvent, CPuint iParam)); + +} CP_PIPETYPE; + +#endif + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_Core.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_Core.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1431 @@ +/* + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** OMX_Core.h - OpenMax IL version 1.1.2 + * The OMX_Core header file contains the definitions used by both the + * application and the component to access common items. + */ + +#ifndef OMX_Core_h +#define OMX_Core_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* Each OMX header shall include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ + +#include + + +/** The OMX_COMMANDTYPE enumeration is used to specify the action in the + * OMX_SendCommand macro. + * @ingroup core + */ +typedef enum OMX_COMMANDTYPE +{ + OMX_CommandStateSet, /**< Change the component state */ + OMX_CommandFlush, /**< Flush the data queue(s) of a component */ + OMX_CommandPortDisable, /**< Disable a port on a component. */ + OMX_CommandPortEnable, /**< Enable a port on a component. */ + OMX_CommandMarkBuffer, /**< Mark a component/buffer for observation */ + OMX_CommandKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_CommandVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_CommandMax = 0X7FFFFFFF +} OMX_COMMANDTYPE; + + + +/** The OMX_STATETYPE enumeration is used to indicate or change the component + * state. This enumeration reflects the current state of the component when + * used with the OMX_GetState macro or becomes the parameter in a state change + * command when used with the OMX_SendCommand macro. + * + * The component will be in the Loaded state after the component is initially + * loaded into memory. In the Loaded state, the component is not allowed to + * allocate or hold resources other than to build it's internal parameter + * and configuration tables. The application will send one or more + * SetParameters/GetParameters and SetConfig/GetConfig commands to the + * component and the component will record each of these parameter and + * configuration changes for use later. When the application sends the + * Idle command, the component will acquire the resources needed for the + * specified configuration and will transition to the idle state if the + * allocation is successful. If the component cannot successfully + * transition to the idle state for any reason, the state of the component + * shall be fully rolled back to the Loaded state (e.g. all allocated + * resources shall be released). When the component receives the command + * to go to the Executing state, it shall begin processing buffers by + * sending all input buffers it holds to the application. While + * the component is in the Idle state, the application may also send the + * Pause command. If the component receives the pause command while in the + * Idle state, the component shall send all input buffers it holds to the + * application, but shall not begin processing buffers. This will allow the + * application to prefill buffers. + * + * @ingroup comp + */ + +typedef enum OMX_STATETYPE +{ + OMX_StateInvalid, /**< component has detected that it's internal data + structures are corrupted to the point that + it cannot determine it's state properly */ + OMX_StateLoaded, /**< component has been loaded but has not completed + initialization. The OMX_SetParameter macro + and the OMX_GetParameter macro are the only + valid macros allowed to be sent to the + component in this state. */ + OMX_StateIdle, /**< component initialization has been completed + successfully and the component is ready to + to start. */ + OMX_StateExecuting, /**< component has accepted the start command and + is processing data (if data is available) */ + OMX_StatePause, /**< component has received pause command */ + OMX_StateWaitForResources, /**< component is waiting for resources, either after + preemption or before it gets the resources requested. + See specification for complete details. */ + OMX_StateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_StateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_StateMax = 0X7FFFFFFF +} OMX_STATETYPE; + +/** The OMX_ERRORTYPE enumeration defines the standard OMX Errors. These + * errors should cover most of the common failure cases. However, + * vendors are free to add additional error messages of their own as + * long as they follow these rules: + * 1. Vendor error messages shall be in the range of 0x90000000 to + * 0x9000FFFF. + * 2. Vendor error messages shall be defined in a header file provided + * with the component. No error messages are allowed that are + * not defined. + */ +typedef enum OMX_ERRORTYPE +{ + OMX_ErrorNone = 0, + + /** There were insufficient resources to perform the requested operation */ + OMX_ErrorInsufficientResources = (OMX_S32) 0x80001000, + + /** There was an error, but the cause of the error could not be determined */ + OMX_ErrorUndefined = (OMX_S32) 0x80001001, + + /** The component name string was not valid */ + OMX_ErrorInvalidComponentName = (OMX_S32) 0x80001002, + + /** No component with the specified name string was found */ + OMX_ErrorComponentNotFound = (OMX_S32) 0x80001003, + + /** The component specified did not have a "OMX_ComponentInit" or + "OMX_ComponentDeInit entry point */ + OMX_ErrorInvalidComponent = (OMX_S32) 0x80001004, + + /** One or more parameters were not valid */ + OMX_ErrorBadParameter = (OMX_S32) 0x80001005, + + /** The requested function is not implemented */ + OMX_ErrorNotImplemented = (OMX_S32) 0x80001006, + + /** The buffer was emptied before the next buffer was ready */ + OMX_ErrorUnderflow = (OMX_S32) 0x80001007, + + /** The buffer was not available when it was needed */ + OMX_ErrorOverflow = (OMX_S32) 0x80001008, + + /** The hardware failed to respond as expected */ + OMX_ErrorHardware = (OMX_S32) 0x80001009, + + /** The component is in the state OMX_StateInvalid */ + OMX_ErrorInvalidState = (OMX_S32) 0x8000100A, + + /** Stream is found to be corrupt */ + OMX_ErrorStreamCorrupt = (OMX_S32) 0x8000100B, + + /** Ports being connected are not compatible */ + OMX_ErrorPortsNotCompatible = (OMX_S32) 0x8000100C, + + /** Resources allocated to an idle component have been + lost resulting in the component returning to the loaded state */ + OMX_ErrorResourcesLost = (OMX_S32) 0x8000100D, + + /** No more indicies can be enumerated */ + OMX_ErrorNoMore = (OMX_S32) 0x8000100E, + + /** The component detected a version mismatch */ + OMX_ErrorVersionMismatch = (OMX_S32) 0x8000100F, + + /** The component is not ready to return data at this time */ + OMX_ErrorNotReady = (OMX_S32) 0x80001010, + + /** There was a timeout that occurred */ + OMX_ErrorTimeout = (OMX_S32) 0x80001011, + + /** This error occurs when trying to transition into the state you are already in */ + OMX_ErrorSameState = (OMX_S32) 0x80001012, + + /** Resources allocated to an executing or paused component have been + preempted, causing the component to return to the idle state */ + OMX_ErrorResourcesPreempted = (OMX_S32) 0x80001013, + + /** A non-supplier port sends this error to the IL client (via the EventHandler callback) + during the allocation of buffers (on a transition from the LOADED to the IDLE state or + on a port restart) when it deems that it has waited an unusually long time for the supplier + to send it an allocated buffer via a UseBuffer call. */ + OMX_ErrorPortUnresponsiveDuringAllocation = (OMX_S32) 0x80001014, + + /** A non-supplier port sends this error to the IL client (via the EventHandler callback) + during the deallocation of buffers (on a transition from the IDLE to LOADED state or + on a port stop) when it deems that it has waited an unusually long time for the supplier + to request the deallocation of a buffer header via a FreeBuffer call. */ + OMX_ErrorPortUnresponsiveDuringDeallocation = (OMX_S32) 0x80001015, + + /** A supplier port sends this error to the IL client (via the EventHandler callback) + during the stopping of a port (either on a transition from the IDLE to LOADED + state or a port stop) when it deems that it has waited an unusually long time for + the non-supplier to return a buffer via an EmptyThisBuffer or FillThisBuffer call. */ + OMX_ErrorPortUnresponsiveDuringStop = (OMX_S32) 0x80001016, + + /** Attempting a state transtion that is not allowed */ + OMX_ErrorIncorrectStateTransition = (OMX_S32) 0x80001017, + + /* Attempting a command that is not allowed during the present state. */ + OMX_ErrorIncorrectStateOperation = (OMX_S32) 0x80001018, + + /** The values encapsulated in the parameter or config structure are not supported. */ + OMX_ErrorUnsupportedSetting = (OMX_S32) 0x80001019, + + /** The parameter or config indicated by the given index is not supported. */ + OMX_ErrorUnsupportedIndex = (OMX_S32) 0x8000101A, + + /** The port index supplied is incorrect. */ + OMX_ErrorBadPortIndex = (OMX_S32) 0x8000101B, + + /** The port has lost one or more of its buffers and it thus unpopulated. */ + OMX_ErrorPortUnpopulated = (OMX_S32) 0x8000101C, + + /** Component suspended due to temporary loss of resources */ + OMX_ErrorComponentSuspended = (OMX_S32) 0x8000101D, + + /** Component suspended due to an inability to acquire dynamic resources */ + OMX_ErrorDynamicResourcesUnavailable = (OMX_S32) 0x8000101E, + + /** When the macroblock error reporting is enabled the component returns new error + for every frame that has errors */ + OMX_ErrorMbErrorsInFrame = (OMX_S32) 0x8000101F, + + /** A component reports this error when it cannot parse or determine the format of an input stream. */ + OMX_ErrorFormatNotDetected = (OMX_S32) 0x80001020, + + /** The content open operation failed. */ + OMX_ErrorContentPipeOpenFailed = (OMX_S32) 0x80001021, + + /** The content creation operation failed. */ + OMX_ErrorContentPipeCreationFailed = (OMX_S32) 0x80001022, + + /** Separate table information is being used */ + OMX_ErrorSeperateTablesUsed = (OMX_S32) 0x80001023, + + /** Tunneling is unsupported by the component*/ + OMX_ErrorTunnelingUnsupported = (OMX_S32) 0x80001024, + + OMX_ErrorKhronosExtensions = (OMX_S32)0x8F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_ErrorVendorStartUnused = (OMX_S32)0x90000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_ErrorMax = 0x7FFFFFFF +} OMX_ERRORTYPE; + +/** @ingroup core */ +typedef OMX_ERRORTYPE (* OMX_COMPONENTINITTYPE)(OMX_IN OMX_HANDLETYPE hComponent); + +/** @ingroup core */ +typedef struct OMX_COMPONENTREGISTERTYPE +{ + const char * pName; /* Component name, 128 byte limit (including '\0') applies */ + OMX_COMPONENTINITTYPE pInitialize; /* Component instance initialization function */ +} OMX_COMPONENTREGISTERTYPE; + +/** @ingroup core */ +extern OMX_COMPONENTREGISTERTYPE OMX_ComponentRegistered[]; + +/** @ingroup rpm */ +typedef struct OMX_PRIORITYMGMTTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nGroupPriority; /**< Priority of the component group */ + OMX_U32 nGroupID; /**< ID of the component group */ +} OMX_PRIORITYMGMTTYPE; + +/* Component name and Role names are limited to 128 characters including the terminating '\0'. */ +#define OMX_MAX_STRINGNAME_SIZE 128 + +/** @ingroup comp */ +typedef struct OMX_PARAM_COMPONENTROLETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U8 cRole[OMX_MAX_STRINGNAME_SIZE]; /**< name of standard component which defines component role */ +} OMX_PARAM_COMPONENTROLETYPE; + +/** End of Stream Buffer Flag: + * + * A component sets EOS when it has no more data to emit on a particular + * output port. Thus an output port shall set EOS on the last buffer it + * emits. A component's determination of when an output port should + * cease sending data is implemenation specific. + * @ingroup buf + */ + +#define OMX_BUFFERFLAG_EOS 0x00000001 + +/** Start Time Buffer Flag: + * + * The source of a stream (e.g. a demux component) sets the STARTTIME + * flag on the buffer that contains the starting timestamp for the + * stream. The starting timestamp corresponds to the first data that + * should be displayed at startup or after a seek. + * The first timestamp of the stream is not necessarily the start time. + * For instance, in the case of a seek to a particular video frame, + * the target frame may be an interframe. Thus the first buffer of + * the stream will be the intra-frame preceding the target frame and + * the starttime will occur with the target frame (with any other + * required frames required to reconstruct the target intervening). + * + * The STARTTIME flag is directly associated with the buffer's + * timestamp ' thus its association to buffer data and its + * propagation is identical to the timestamp's. + * + * When a Sync Component client receives a buffer with the + * STARTTIME flag it shall perform a SetConfig on its sync port + * using OMX_ConfigTimeClientStartTime and passing the buffer's + * timestamp. + * + * @ingroup buf + */ + +#define OMX_BUFFERFLAG_STARTTIME 0x00000002 + + + +/** Decode Only Buffer Flag: + * + * The source of a stream (e.g. a demux component) sets the DECODEONLY + * flag on any buffer that should shall be decoded but should not be + * displayed. This flag is used, for instance, when a source seeks to + * a target interframe that requires the decode of frames preceding the + * target to facilitate the target's reconstruction. In this case the + * source would emit the frames preceding the target downstream + * but mark them as decode only. + * + * The DECODEONLY is associated with buffer data and propagated in a + * manner identical to the buffer timestamp. + * + * A component that renders data should ignore all buffers with + * the DECODEONLY flag set. + * + * @ingroup buf + */ + +#define OMX_BUFFERFLAG_DECODEONLY 0x00000004 + + +/* Data Corrupt Flag: This flag is set when the IL client believes the data in the associated buffer is corrupt + * @ingroup buf + */ + +#define OMX_BUFFERFLAG_DATACORRUPT 0x00000008 + +/* End of Frame: The buffer contains exactly one end of frame and no data + * occurs after the end of frame. This flag is an optional hint. The absence + * of this flag does not imply the absence of an end of frame within the buffer. + * @ingroup buf +*/ +#define OMX_BUFFERFLAG_ENDOFFRAME 0x00000010 + +/* Sync Frame Flag: This flag is set when the buffer content contains a coded sync frame ' + * a frame that has no dependency on any other frame information + * @ingroup buf + */ +#define OMX_BUFFERFLAG_SYNCFRAME 0x00000020 + +/* Extra data present flag: there is extra data appended to the data stream + * residing in the buffer + * @ingroup buf + */ +#define OMX_BUFFERFLAG_EXTRADATA 0x00000040 + +/** Codec Config Buffer Flag: +* OMX_BUFFERFLAG_CODECCONFIG is an optional flag that is set by an +* output port when all bytes in the buffer form part or all of a set of +* codec specific configuration data. Examples include SPS/PPS nal units +* for OMX_VIDEO_CodingAVC or AudioSpecificConfig data for +* OMX_AUDIO_CodingAAC. Any component that for a given stream sets +* OMX_BUFFERFLAG_CODECCONFIG shall not mix codec configuration bytes +* with frame data in the same buffer, and shall send all buffers +* containing codec configuration bytes before any buffers containing +* frame data that those configurations bytes describe. +* If the stream format for a particular codec has a frame specific +* header at the start of each frame, for example OMX_AUDIO_CodingMP3 or +* OMX_AUDIO_CodingAAC in ADTS mode, then these shall be presented as +* normal without setting OMX_BUFFERFLAG_CODECCONFIG. + * @ingroup buf + */ +#define OMX_BUFFERFLAG_CODECCONFIG 0x00000080 + + + +/** @ingroup buf */ +typedef struct OMX_BUFFERHEADERTYPE +{ + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U8* pBuffer; /**< Pointer to actual block of memory + that is acting as the buffer */ + OMX_U32 nAllocLen; /**< size of the buffer allocated, in bytes */ + OMX_U32 nFilledLen; /**< number of bytes currently in the + buffer */ + OMX_U32 nOffset; /**< start offset of valid data in bytes from + the start of the buffer */ + OMX_PTR pAppPrivate; /**< pointer to any data the application + wants to associate with this buffer */ + OMX_PTR pPlatformPrivate; /**< pointer to any data the platform + wants to associate with this buffer */ + OMX_PTR pInputPortPrivate; /**< pointer to any data the input port + wants to associate with this buffer */ + OMX_PTR pOutputPortPrivate; /**< pointer to any data the output port + wants to associate with this buffer */ + OMX_HANDLETYPE hMarkTargetComponent; /**< The component that will generate a + mark event upon processing this buffer. */ + OMX_PTR pMarkData; /**< Application specific data associated with + the mark sent on a mark event to disambiguate + this mark from others. */ + OMX_U32 nTickCount; /**< Optional entry that the component and + application can update with a tick count + when they access the component. This + value should be in microseconds. Since + this is a value relative to an arbitrary + starting point, this value cannot be used + to determine absolute time. This is an + optional entry and not all components + will update it.*/ + OMX_TICKS nTimeStamp; /**< Timestamp corresponding to the sample + starting at the first logical sample + boundary in the buffer. Timestamps of + successive samples within the buffer may + be inferred by adding the duration of the + of the preceding buffer to the timestamp + of the preceding buffer.*/ + OMX_U32 nFlags; /**< buffer specific flags */ + OMX_U32 nOutputPortIndex; /**< The index of the output port (if any) using + this buffer */ + OMX_U32 nInputPortIndex; /**< The index of the input port (if any) using + this buffer */ +} OMX_BUFFERHEADERTYPE; + +/** The OMX_EXTRADATATYPE enumeration is used to define the + * possible extra data payload types. + * NB: this enum is binary backwards compatible with the previous + * OMX_EXTRADATA_QUANT define. This should be replaced with + * OMX_ExtraDataQuantization. + */ +typedef enum OMX_EXTRADATATYPE +{ + OMX_ExtraDataNone = 0, /**< Indicates that no more extra data sections follow */ + OMX_ExtraDataQuantization, /**< The data payload contains quantization data */ + OMX_ExtraDataKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_ExtraDataVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_ExtraDataMax = 0x7FFFFFFF +} OMX_EXTRADATATYPE; + + +typedef struct OMX_OTHER_EXTRADATATYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_EXTRADATATYPE eType; /* Extra Data type */ + OMX_U32 nDataSize; /* Size of the supporting data to follow */ + OMX_U8 data[1]; /* Supporting data hint */ +} OMX_OTHER_EXTRADATATYPE; + +/** @ingroup comp */ +typedef struct OMX_PORT_PARAM_TYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPorts; /**< The number of ports for this component */ + OMX_U32 nStartPortNumber; /** first port number for this type of port */ +} OMX_PORT_PARAM_TYPE; + +/** @ingroup comp */ +typedef enum OMX_EVENTTYPE +{ + OMX_EventCmdComplete, /**< component has sucessfully completed a command */ + OMX_EventError, /**< component has detected an error condition */ + OMX_EventMark, /**< component has detected a buffer mark */ + OMX_EventPortSettingsChanged, /**< component is reported a port settings change */ + OMX_EventBufferFlag, /**< component has detected an EOS */ + OMX_EventResourcesAcquired, /**< component has been granted resources and is + automatically starting the state change from + OMX_StateWaitForResources to OMX_StateIdle. */ + OMX_EventComponentResumed, /**< Component resumed due to reacquisition of resources */ + OMX_EventDynamicResourcesAvailable, /**< Component has acquired previously unavailable dynamic resources */ + OMX_EventPortFormatDetected, /**< Component has detected a supported format. */ + OMX_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_EventMax = 0x7FFFFFFF +} OMX_EVENTTYPE; + +typedef struct OMX_CALLBACKTYPE +{ + /** The EventHandler method is used to notify the application when an + event of interest occurs. Events are defined in the OMX_EVENTTYPE + enumeration. Please see that enumeration for details of what will + be returned for each type of event. Callbacks should not return + an error to the component, so if an error occurs, the application + shall handle it internally. This is a blocking call. + + The application should return from this call within 5 msec to avoid + blocking the component for an excessively long period of time. + + @param hComponent + handle of the component to access. This is the component + handle returned by the call to the GetHandle function. + @param pAppData + pointer to an application defined value that was provided in the + pAppData parameter to the OMX_GetHandle method for the component. + This application defined value is provided so that the application + can have a component specific context when receiving the callback. + @param eEvent + Event that the component wants to notify the application about. + @param nData1 + nData will be the OMX_ERRORTYPE for an error event and will be + an OMX_COMMANDTYPE for a command complete event and OMX_INDEXTYPE for a OMX_PortSettingsChanged event. + @param nData2 + nData2 will hold further information related to the event. Can be OMX_STATETYPE for + a OMX_CommandStateSet command or port index for a OMX_PortSettingsChanged event. + Default value is 0 if not used. ) + @param pEventData + Pointer to additional event-specific data (see spec for meaning). + */ + + OMX_ERRORTYPE (*EventHandler)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_EVENTTYPE eEvent, + OMX_IN OMX_U32 nData1, + OMX_IN OMX_U32 nData2, + OMX_IN OMX_PTR pEventData); + + /** The EmptyBufferDone method is used to return emptied buffers from an + input port back to the application for reuse. This is a blocking call + so the application should not attempt to refill the buffers during this + call, but should queue them and refill them in another thread. There + is no error return, so the application shall handle any errors generated + internally. + + The application should return from this call within 5 msec. + + @param hComponent + handle of the component to access. This is the component + handle returned by the call to the GetHandle function. + @param pAppData + pointer to an application defined value that was provided in the + pAppData parameter to the OMX_GetHandle method for the component. + This application defined value is provided so that the application + can have a component specific context when receiving the callback. + @param pBuffer + pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer + or AllocateBuffer indicating the buffer that was emptied. + @ingroup buf + */ + OMX_ERRORTYPE (*EmptyBufferDone)( + OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + + /** The FillBufferDone method is used to return filled buffers from an + output port back to the application for emptying and then reuse. + This is a blocking call so the application should not attempt to + empty the buffers during this call, but should queue the buffers + and empty them in another thread. There is no error return, so + the application shall handle any errors generated internally. The + application shall also update the buffer header to indicate the + number of bytes placed into the buffer. + + The application should return from this call within 5 msec. + + @param hComponent + handle of the component to access. This is the component + handle returned by the call to the GetHandle function. + @param pAppData + pointer to an application defined value that was provided in the + pAppData parameter to the OMX_GetHandle method for the component. + This application defined value is provided so that the application + can have a component specific context when receiving the callback. + @param pBuffer + pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer + or AllocateBuffer indicating the buffer that was filled. + @ingroup buf + */ + OMX_ERRORTYPE (*FillBufferDone)( + OMX_OUT OMX_HANDLETYPE hComponent, + OMX_OUT OMX_PTR pAppData, + OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer); + +} OMX_CALLBACKTYPE; + +/** The OMX_BUFFERSUPPLIERTYPE enumeration is used to dictate port supplier + preference when tunneling between two ports. + @ingroup tun buf +*/ +typedef enum OMX_BUFFERSUPPLIERTYPE +{ + OMX_BufferSupplyUnspecified = 0x0, /**< port supplying the buffers is unspecified, + or don't care */ + OMX_BufferSupplyInput, /**< input port supplies the buffers */ + OMX_BufferSupplyOutput, /**< output port supplies the buffers */ + OMX_BufferSupplyKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_BufferSupplyVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_BufferSupplyMax = 0x7FFFFFFF +} OMX_BUFFERSUPPLIERTYPE; + + +/** buffer supplier parameter + * @ingroup tun + */ +typedef struct OMX_PARAM_BUFFERSUPPLIERTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BUFFERSUPPLIERTYPE eBufferSupplier; /**< buffer supplier */ +} OMX_PARAM_BUFFERSUPPLIERTYPE; + + +/**< indicates that buffers received by an input port of a tunnel + may not modify the data in the buffers + @ingroup tun + */ +#define OMX_PORTTUNNELFLAG_READONLY 0x00000001 + + +/** The OMX_TUNNELSETUPTYPE structure is used to pass data from an output + port to an input port as part the two ComponentTunnelRequest calls + resulting from a OMX_SetupTunnel call from the IL Client. + @ingroup tun + */ +typedef struct OMX_TUNNELSETUPTYPE +{ + OMX_U32 nTunnelFlags; /**< bit flags for tunneling */ + OMX_BUFFERSUPPLIERTYPE eSupplier; /**< supplier preference */ +} OMX_TUNNELSETUPTYPE; + +/* OMX Component headers is included to enable the core to use + macros for functions into the component for OMX release 1.0. + Developers should not access any structures or data from within + the component header directly */ +/* TO BE REMOVED - #include */ + +/** GetComponentVersion will return information about the component. + This is a blocking call. This macro will go directly from the + application to the component (via a core macro). The + component will return from this call within 5 msec. + @param [in] hComponent + handle of component to execute the command + @param [out] pComponentName + pointer to an empty string of length 128 bytes. The component + will write its name into this string. The name will be + terminated by a single zero byte. The name of a component will + be 127 bytes or less to leave room for the trailing zero byte. + An example of a valid component name is "OMX.ABC.ChannelMixer\0". + @param [out] pComponentVersion + pointer to an OMX Version structure that the component will fill + in. The component will fill in a value that indicates the + component version. NOTE: the component version is NOT the same + as the OMX Specification version (found in all structures). The + component version is defined by the vendor of the component and + its value is entirely up to the component vendor. + @param [out] pSpecVersion + pointer to an OMX Version structure that the component will fill + in. The SpecVersion is the version of the specification that the + component was built against. Please note that this value may or + may not match the structure's version. For example, if the + component was built against the 2.0 specification, but the + application (which creates the structure is built against the + 1.0 specification the versions would be different. + @param [out] pComponentUUID + pointer to the UUID of the component which will be filled in by + the component. The UUID is a unique identifier that is set at + RUN time for the component and is unique to each instantion of + the component. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp + */ +#define OMX_GetComponentVersion( \ + hComponent, \ + pComponentName, \ + pComponentVersion, \ + pSpecVersion, \ + pComponentUUID) \ + ((OMX_COMPONENTTYPE*)hComponent)->GetComponentVersion( \ + hComponent, \ + pComponentName, \ + pComponentVersion, \ + pSpecVersion, \ + pComponentUUID) /* Macro End */ + + +/** Send a command to the component. This call is a non-blocking call. + The component should check the parameters and then queue the command + to the component thread to be executed. The component thread shall + send the EventHandler() callback at the conclusion of the command. + This macro will go directly from the application to the component (via + a core macro). The component will return from this call within 5 msec. + + When the command is "OMX_CommandStateSet" the component will queue a + state transition to the new state idenfied in nParam. + + When the command is "OMX_CommandFlush", to flush a port's buffer queues, + the command will force the component to return all buffers NOT CURRENTLY + BEING PROCESSED to the application, in the order in which the buffers + were received. + + When the command is "OMX_CommandPortDisable" or + "OMX_CommandPortEnable", the component's port (given by the value of + nParam) will be stopped or restarted. + + When the command "OMX_CommandMarkBuffer" is used to mark a buffer, the + pCmdData will point to a OMX_MARKTYPE structure containing the component + handle of the component to examine the buffer chain for the mark. nParam1 + contains the index of the port on which the buffer mark is applied. + + Specification text for more details. + + @param [in] hComponent + handle of component to execute the command + @param [in] Cmd + Command for the component to execute + @param [in] nParam + Parameter for the command to be executed. When Cmd has the value + OMX_CommandStateSet, value is a member of OMX_STATETYPE. When Cmd has + the value OMX_CommandFlush, value of nParam indicates which port(s) + to flush. -1 is used to flush all ports a single port index will + only flush that port. When Cmd has the value "OMX_CommandPortDisable" + or "OMX_CommandPortEnable", the component's port is given by + the value of nParam. When Cmd has the value "OMX_CommandMarkBuffer" + the components pot is given by the value of nParam. + @param [in] pCmdData + Parameter pointing to the OMX_MARKTYPE structure when Cmd has the value + "OMX_CommandMarkBuffer". + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp + */ +#define OMX_SendCommand( \ + hComponent, \ + Cmd, \ + nParam, \ + pCmdData) \ + ((OMX_COMPONENTTYPE*)hComponent)->SendCommand( \ + hComponent, \ + Cmd, \ + nParam, \ + pCmdData) /* Macro End */ + + +/** The OMX_GetParameter macro will get one of the current parameter + settings from the component. This macro cannot only be invoked when + the component is in the OMX_StateInvalid state. The nParamIndex + parameter is used to indicate which structure is being requested from + the component. The application shall allocate the correct structure + and shall fill in the structure size and version information before + invoking this macro. When the parameter applies to a port, the + caller shall fill in the appropriate nPortIndex value indicating the + port on which the parameter applies. If the component has not had + any settings changed, then the component should return a set of + valid DEFAULT parameters for the component. This is a blocking + call. + + The component should return from this call within 20 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [in] nParamIndex + Index of the structure to be filled. This value is from the + OMX_INDEXTYPE enumeration. + @param [in,out] pComponentParameterStructure + Pointer to application allocated structure to be filled by the + component. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp + */ +#define OMX_GetParameter( \ + hComponent, \ + nParamIndex, \ + pComponentParameterStructure) \ + ((OMX_COMPONENTTYPE*)hComponent)->GetParameter( \ + hComponent, \ + nParamIndex, \ + pComponentParameterStructure) /* Macro End */ + + +/** The OMX_SetParameter macro will send an initialization parameter + structure to a component. Each structure shall be sent one at a time, + in a separate invocation of the macro. This macro can only be + invoked when the component is in the OMX_StateLoaded state, or the + port is disabled (when the parameter applies to a port). The + nParamIndex parameter is used to indicate which structure is being + passed to the component. The application shall allocate the + correct structure and shall fill in the structure size and version + information (as well as the actual data) before invoking this macro. + The application is free to dispose of this structure after the call + as the component is required to copy any data it shall retain. This + is a blocking call. + + The component should return from this call within 20 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [in] nIndex + Index of the structure to be sent. This value is from the + OMX_INDEXTYPE enumeration. + @param [in] pComponentParameterStructure + pointer to application allocated structure to be used for + initialization by the component. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp + */ +#define OMX_SetParameter( \ + hComponent, \ + nParamIndex, \ + pComponentParameterStructure) \ + ((OMX_COMPONENTTYPE*)hComponent)->SetParameter( \ + hComponent, \ + nParamIndex, \ + pComponentParameterStructure) /* Macro End */ + + +/** The OMX_GetConfig macro will get one of the configuration structures + from a component. This macro can be invoked anytime after the + component has been loaded. The nParamIndex call parameter is used to + indicate which structure is being requested from the component. The + application shall allocate the correct structure and shall fill in the + structure size and version information before invoking this macro. + If the component has not had this configuration parameter sent before, + then the component should return a set of valid DEFAULT values for the + component. This is a blocking call. + + The component should return from this call within 5 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [in] nIndex + Index of the structure to be filled. This value is from the + OMX_INDEXTYPE enumeration. + @param [in,out] pComponentConfigStructure + pointer to application allocated structure to be filled by the + component. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp +*/ +#define OMX_GetConfig( \ + hComponent, \ + nConfigIndex, \ + pComponentConfigStructure) \ + ((OMX_COMPONENTTYPE*)hComponent)->GetConfig( \ + hComponent, \ + nConfigIndex, \ + pComponentConfigStructure) /* Macro End */ + + +/** The OMX_SetConfig macro will send one of the configuration + structures to a component. Each structure shall be sent one at a time, + each in a separate invocation of the macro. This macro can be invoked + anytime after the component has been loaded. The application shall + allocate the correct structure and shall fill in the structure size + and version information (as well as the actual data) before invoking + this macro. The application is free to dispose of this structure after + the call as the component is required to copy any data it shall retain. + This is a blocking call. + + The component should return from this call within 5 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [in] nConfigIndex + Index of the structure to be sent. This value is from the + OMX_INDEXTYPE enumeration above. + @param [in] pComponentConfigStructure + pointer to application allocated structure to be used for + initialization by the component. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp + */ +#define OMX_SetConfig( \ + hComponent, \ + nConfigIndex, \ + pComponentConfigStructure) \ + ((OMX_COMPONENTTYPE*)hComponent)->SetConfig( \ + hComponent, \ + nConfigIndex, \ + pComponentConfigStructure) /* Macro End */ + + +/** The OMX_GetExtensionIndex macro will invoke a component to translate + a vendor specific configuration or parameter string into an OMX + structure index. There is no requirement for the vendor to support + this command for the indexes already found in the OMX_INDEXTYPE + enumeration (this is done to save space in small components). The + component shall support all vendor supplied extension indexes not found + in the master OMX_INDEXTYPE enumeration. This is a blocking call. + + The component should return from this call within 5 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the GetHandle function. + @param [in] cParameterName + OMX_STRING that shall be less than 128 characters long including + the trailing null byte. This is the string that will get + translated by the component into a configuration index. + @param [out] pIndexType + a pointer to a OMX_INDEXTYPE to receive the index value. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp + */ +#define OMX_GetExtensionIndex( \ + hComponent, \ + cParameterName, \ + pIndexType) \ + ((OMX_COMPONENTTYPE*)hComponent)->GetExtensionIndex( \ + hComponent, \ + cParameterName, \ + pIndexType) /* Macro End */ + + +/** The OMX_GetState macro will invoke the component to get the current + state of the component and place the state value into the location + pointed to by pState. + + The component should return from this call within 5 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [out] pState + pointer to the location to receive the state. The value returned + is one of the OMX_STATETYPE members + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp + */ +#define OMX_GetState( \ + hComponent, \ + pState) \ + ((OMX_COMPONENTTYPE*)hComponent)->GetState( \ + hComponent, \ + pState) /* Macro End */ + + +/** The OMX_UseBuffer macro will request that the component use + a buffer (and allocate its own buffer header) already allocated + by another component, or by the IL Client. This is a blocking + call. + + The component should return from this call within 20 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [out] ppBuffer + pointer to an OMX_BUFFERHEADERTYPE structure used to receive the + pointer to the buffer header + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp buf + */ + +#define OMX_UseBuffer( \ + hComponent, \ + ppBufferHdr, \ + nPortIndex, \ + pAppPrivate, \ + nSizeBytes, \ + pBuffer) \ + ((OMX_COMPONENTTYPE*)hComponent)->UseBuffer( \ + hComponent, \ + ppBufferHdr, \ + nPortIndex, \ + pAppPrivate, \ + nSizeBytes, \ + pBuffer) + + +/** The OMX_AllocateBuffer macro will request that the component allocate + a new buffer and buffer header. The component will allocate the + buffer and the buffer header and return a pointer to the buffer + header. This is a blocking call. + + The component should return from this call within 5 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [out] ppBuffer + pointer to an OMX_BUFFERHEADERTYPE structure used to receive + the pointer to the buffer header + @param [in] nPortIndex + nPortIndex is used to select the port on the component the buffer will + be used with. The port can be found by using the nPortIndex + value as an index into the Port Definition array of the component. + @param [in] pAppPrivate + pAppPrivate is used to initialize the pAppPrivate member of the + buffer header structure. + @param [in] nSizeBytes + size of the buffer to allocate. Used when bAllocateNew is true. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp buf + */ +#define OMX_AllocateBuffer( \ + hComponent, \ + ppBuffer, \ + nPortIndex, \ + pAppPrivate, \ + nSizeBytes) \ + ((OMX_COMPONENTTYPE*)hComponent)->AllocateBuffer( \ + hComponent, \ + ppBuffer, \ + nPortIndex, \ + pAppPrivate, \ + nSizeBytes) /* Macro End */ + + +/** The OMX_FreeBuffer macro will release a buffer header from the component + which was allocated using either OMX_AllocateBuffer or OMX_UseBuffer. If + the component allocated the buffer (see the OMX_UseBuffer macro) then + the component shall free the buffer and buffer header. This is a + blocking call. + + The component should return from this call within 20 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [in] nPortIndex + nPortIndex is used to select the port on the component the buffer will + be used with. + @param [in] pBuffer + pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer + or AllocateBuffer. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp buf + */ +#define OMX_FreeBuffer( \ + hComponent, \ + nPortIndex, \ + pBuffer) \ + ((OMX_COMPONENTTYPE*)hComponent)->FreeBuffer( \ + hComponent, \ + nPortIndex, \ + pBuffer) /* Macro End */ + + +/** The OMX_EmptyThisBuffer macro will send a buffer full of data to an + input port of a component. The buffer will be emptied by the component + and returned to the application via the EmptyBufferDone call back. + This is a non-blocking call in that the component will record the buffer + and return immediately and then empty the buffer, later, at the proper + time. As expected, this macro may be invoked only while the component + is in the OMX_StateExecuting. If nPortIndex does not specify an input + port, the component shall return an error. + + The component should return from this call within 5 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [in] pBuffer + pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer + or AllocateBuffer. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp buf + */ +#define OMX_EmptyThisBuffer( \ + hComponent, \ + pBuffer) \ + ((OMX_COMPONENTTYPE*)hComponent)->EmptyThisBuffer( \ + hComponent, \ + pBuffer) /* Macro End */ + + +/** The OMX_FillThisBuffer macro will send an empty buffer to an + output port of a component. The buffer will be filled by the component + and returned to the application via the FillBufferDone call back. + This is a non-blocking call in that the component will record the buffer + and return immediately and then fill the buffer, later, at the proper + time. As expected, this macro may be invoked only while the component + is in the OMX_ExecutingState. If nPortIndex does not specify an output + port, the component shall return an error. + + The component should return from this call within 5 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [in] pBuffer + pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer + or AllocateBuffer. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp buf + */ +#define OMX_FillThisBuffer( \ + hComponent, \ + pBuffer) \ + ((OMX_COMPONENTTYPE*)hComponent)->FillThisBuffer( \ + hComponent, \ + pBuffer) /* Macro End */ + + + +/** The OMX_UseEGLImage macro will request that the component use + a EGLImage provided by EGL (and allocate its own buffer header) + This is a blocking call. + + The component should return from this call within 20 msec. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the OMX_GetHandle function. + @param [out] ppBuffer + pointer to an OMX_BUFFERHEADERTYPE structure used to receive the + pointer to the buffer header. Note that the memory location used + for this buffer is NOT visible to the IL Client. + @param [in] nPortIndex + nPortIndex is used to select the port on the component the buffer will + be used with. The port can be found by using the nPortIndex + value as an index into the Port Definition array of the component. + @param [in] pAppPrivate + pAppPrivate is used to initialize the pAppPrivate member of the + buffer header structure. + @param [in] eglImage + eglImage contains the handle of the EGLImage to use as a buffer on the + specified port. The component is expected to validate properties of + the EGLImage against the configuration of the port to ensure the component + can use the EGLImage as a buffer. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup comp buf + */ +#define OMX_UseEGLImage( \ + hComponent, \ + ppBufferHdr, \ + nPortIndex, \ + pAppPrivate, \ + eglImage) \ + ((OMX_COMPONENTTYPE*)hComponent)->UseEGLImage( \ + hComponent, \ + ppBufferHdr, \ + nPortIndex, \ + pAppPrivate, \ + eglImage) + +/** The OMX_Init method is used to initialize the OMX core. It shall be the + first call made into OMX and it should only be executed one time without + an interviening OMX_Deinit call. + + The core should return from this call within 20 msec. + + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup core + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void); + + +/** The OMX_Deinit method is used to deinitialize the OMX core. It shall be + the last call made into OMX. In the event that the core determines that + thare are components loaded when this call is made, the core may return + with an error rather than try to unload the components. + + The core should return from this call within 20 msec. + + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup core + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void); + + +/** The OMX_ComponentNameEnum method will enumerate through all the names of + recognised valid components in the system. This function is provided + as a means to detect all the components in the system run-time. There is + no strict ordering to the enumeration order of component names, although + each name will only be enumerated once. If the OMX core supports run-time + installation of new components, it is only requried to detect newly + installed components when the first call to enumerate component names + is made (i.e. when nIndex is 0x0). + + The core should return from this call in 20 msec. + + @param [out] cComponentName + pointer to a null terminated string with the component name. The + names of the components are strings less than 127 bytes in length + plus the trailing null for a maximum size of 128 bytes. An example + of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0". Names are + assigned by the vendor, but shall start with "OMX." and then have + the Vendor designation next. + @param [in] nNameLength + number of characters in the cComponentName string. With all + component name strings restricted to less than 128 characters + (including the trailing null) it is recomended that the caller + provide a input string for the cComponentName of 128 characters. + @param [in] nIndex + number containing the enumeration index for the component. + Multiple calls to OMX_ComponentNameEnum with increasing values + of nIndex will enumerate through the component names in the + system until OMX_ErrorNoMore is returned. The value of nIndex + is 0 to (N-1), where N is the number of valid installed components + in the system. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. When the value of nIndex exceeds the number of + components in the system minus 1, OMX_ErrorNoMore will be + returned. Otherwise the appropriate OMX error will be returned. + @ingroup core + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum( + OMX_OUT OMX_STRING cComponentName, + OMX_IN OMX_U32 nNameLength, + OMX_IN OMX_U32 nIndex); + + +/** The OMX_GetHandle method will locate the component specified by the + component name given, load that component into memory and then invoke + the component's methods to create an instance of the component. + + The core should return from this call within 20 msec. + + @param [out] pHandle + pointer to an OMX_HANDLETYPE pointer to be filled in by this method. + @param [in] cComponentName + pointer to a null terminated string with the component name. The + names of the components are strings less than 127 bytes in length + plus the trailing null for a maximum size of 128 bytes. An example + of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0". Names are + assigned by the vendor, but shall start with "OMX." and then have + the Vendor designation next. + @param [in] pAppData + pointer to an application defined value that will be returned + during callbacks so that the application can identify the source + of the callback. + @param [in] pCallBacks + pointer to a OMX_CALLBACKTYPE structure that will be passed to the + component to initialize it with. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup core + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle( + OMX_OUT OMX_HANDLETYPE* pHandle, + OMX_IN OMX_STRING cComponentName, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_CALLBACKTYPE* pCallBacks); + + +/** The OMX_FreeHandle method will free a handle allocated by the OMX_GetHandle + method. If the component reference count goes to zero, the component will + be unloaded from memory. + + The core should return from this call within 20 msec when the component is + in the OMX_StateLoaded state. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the GetHandle function. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + @ingroup core + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle( + OMX_IN OMX_HANDLETYPE hComponent); + + + +/** The OMX_SetupTunnel method will handle the necessary calls to the components + to setup the specified tunnel the two components. NOTE: This is + an actual method (not a #define macro). This method will make calls into + the component ComponentTunnelRequest method to do the actual tunnel + connection. + + The ComponentTunnelRequest method on both components will be called. + This method shall not be called unless the component is in the + OMX_StateLoaded state except when the ports used for the tunnel are + disabled. In this case, the component may be in the OMX_StateExecuting, + OMX_StatePause, or OMX_StateIdle states. + + The core should return from this call within 20 msec. + + @param [in] hOutput + Handle of the component to be accessed. Also this is the handle + of the component whose port, specified in the nPortOutput parameter + will be used the source for the tunnel. This is the component handle + returned by the call to the OMX_GetHandle function. There is a + requirement that hOutput be the source for the data when + tunelling (i.e. nPortOutput is an output port). If 0x0, the component + specified in hInput will have it's port specified in nPortInput + setup for communication with the application / IL client. + @param [in] nPortOutput + nPortOutput is used to select the source port on component to be + used in the tunnel. + @param [in] hInput + This is the component to setup the tunnel with. This is the handle + of the component whose port, specified in the nPortInput parameter + will be used the destination for the tunnel. This is the component handle + returned by the call to the OMX_GetHandle function. There is a + requirement that hInput be the destination for the data when + tunelling (i.e. nPortInut is an input port). If 0x0, the component + specified in hOutput will have it's port specified in nPortPOutput + setup for communication with the application / IL client. + @param [in] nPortInput + nPortInput is used to select the destination port on component to be + used in the tunnel. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. Otherwise the appropriate OMX error will be returned. + When OMX_ErrorNotImplemented is returned, one or both components is + a non-interop component and does not support tunneling. + + On failure, the ports of both components are setup for communication + with the application / IL Client. + @ingroup core tun + */ +OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel( + OMX_IN OMX_HANDLETYPE hOutput, + OMX_IN OMX_U32 nPortOutput, + OMX_IN OMX_HANDLETYPE hInput, + OMX_IN OMX_U32 nPortInput); + +/** @ingroup cp */ +OMX_API OMX_ERRORTYPE OMX_GetContentPipe( + OMX_OUT OMX_HANDLETYPE *hPipe, + OMX_IN OMX_STRING szURI); + +/** The OMX_GetComponentsOfRole method will return the number of components that support the given + role and (if the compNames field is non-NULL) the names of those components. The call will fail if + an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the + client should: + * first call this function with the compNames field NULL to determine the number of component names + * second call this function with the compNames field pointing to an array of names allocated + according to the number returned by the first call. + + The core should return from this call within 5 msec. + + @param [in] role + This is generic standard component name consisting only of component class + name and the type within that class (e.g. 'audio_decoder.aac'). + @param [inout] pNumComps + This is used both as input and output. + + If compNames is NULL, the input is ignored and the output specifies how many components support + the given role. + + If compNames is not NULL, on input it bounds the size of the input structure and + on output, it specifies the number of components string names listed within the compNames parameter. + @param [inout] compNames + If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings which accepts + a list of the names of all physical components that implement the specified standard component name. + Each name is NULL terminated. numComps indicates the number of names. + @ingroup core + */ +OMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole ( + OMX_IN OMX_STRING role, + OMX_INOUT OMX_U32 *pNumComps, + OMX_INOUT OMX_U8 **compNames); + +/** The OMX_GetRolesOfComponent method will return the number of roles supported by the given + component and (if the roles field is non-NULL) the names of those roles. The call will fail if + an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the + client should: + * first call this function with the roles field NULL to determine the number of role names + * second call this function with the roles field pointing to an array of names allocated + according to the number returned by the first call. + + The core should return from this call within 5 msec. + + @param [in] compName + This is the name of the component being queried about. + @param [inout] pNumRoles + This is used both as input and output. + + If roles is NULL, the input is ignored and the output specifies how many roles the component supports. + + If compNames is not NULL, on input it bounds the size of the input structure and + on output, it specifies the number of roles string names listed within the roles parameter. + @param [out] roles + If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings + which accepts a list of the names of all standard components roles implemented on the + specified component name. numComps indicates the number of names. + @ingroup core + */ +OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent ( + OMX_IN OMX_STRING compName, + OMX_INOUT OMX_U32 *pNumRoles, + OMX_OUT OMX_U8 **roles); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_IVCommon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_IVCommon.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,921 @@ +/** + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file + * OpenMax IL version 1.1.2 + * The structures needed by Video and Image components to exchange + * parameters and configuration data with the components. + */ +#ifndef OMX_IVCommon_h +#define OMX_IVCommon_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * Each OMX header must include all required header files to allow the header + * to compile without errors. The includes below are required for this header + * file to compile successfully + */ + +#include + +/** @defgroup iv OpenMAX IL Imaging and Video Domain + * Common structures for OpenMAX IL Imaging and Video domains + * @{ + */ + + +/** + * Enumeration defining possible uncompressed image/video formats. + * + * ENUMS: + * Unused : Placeholder value when format is N/A + * Monochrome : black and white + * 8bitRGB332 : Red 7:5, Green 4:2, Blue 1:0 + * 12bitRGB444 : Red 11:8, Green 7:4, Blue 3:0 + * 16bitARGB4444 : Alpha 15:12, Red 11:8, Green 7:4, Blue 3:0 + * 16bitARGB1555 : Alpha 15, Red 14:10, Green 9:5, Blue 4:0 + * 16bitRGB565 : Red 15:11, Green 10:5, Blue 4:0 + * 16bitBGR565 : Blue 15:11, Green 10:5, Red 4:0 + * 18bitRGB666 : Red 17:12, Green 11:6, Blue 5:0 + * 18bitARGB1665 : Alpha 17, Red 16:11, Green 10:5, Blue 4:0 + * 19bitARGB1666 : Alpha 18, Red 17:12, Green 11:6, Blue 5:0 + * 24bitRGB888 : Red 24:16, Green 15:8, Blue 7:0 + * 24bitBGR888 : Blue 24:16, Green 15:8, Red 7:0 + * 24bitARGB1887 : Alpha 23, Red 22:15, Green 14:7, Blue 6:0 + * 25bitARGB1888 : Alpha 24, Red 23:16, Green 15:8, Blue 7:0 + * 32bitBGRA8888 : Blue 31:24, Green 23:16, Red 15:8, Alpha 7:0 + * 32bitARGB8888 : Alpha 31:24, Red 23:16, Green 15:8, Blue 7:0 + * YUV411Planar : U,Y are subsampled by a factor of 4 horizontally + * YUV411PackedPlanar : packed per payload in planar slices + * YUV420Planar : Three arrays Y,U,V. + * YUV420PackedPlanar : packed per payload in planar slices + * YUV420SemiPlanar : Two arrays, one is all Y, the other is U and V + * YUV422Planar : Three arrays Y,U,V. + * YUV422PackedPlanar : packed per payload in planar slices + * YUV422SemiPlanar : Two arrays, one is all Y, the other is U and V + * YCbYCr : Organized as 16bit YUYV (i.e. YCbYCr) + * YCrYCb : Organized as 16bit YVYU (i.e. YCrYCb) + * CbYCrY : Organized as 16bit UYVY (i.e. CbYCrY) + * CrYCbY : Organized as 16bit VYUY (i.e. CrYCbY) + * YUV444Interleaved : Each pixel contains equal parts YUV + * RawBayer8bit : SMIA camera output format + * RawBayer10bit : SMIA camera output format + * RawBayer8bitcompressed : SMIA camera output format + */ +typedef enum OMX_COLOR_FORMATTYPE { + OMX_COLOR_FormatUnused, + OMX_COLOR_FormatMonochrome, + OMX_COLOR_Format8bitRGB332, + OMX_COLOR_Format12bitRGB444, + OMX_COLOR_Format16bitARGB4444, + OMX_COLOR_Format16bitARGB1555, + OMX_COLOR_Format16bitRGB565, + OMX_COLOR_Format16bitBGR565, + OMX_COLOR_Format18bitRGB666, + OMX_COLOR_Format18bitARGB1665, + OMX_COLOR_Format19bitARGB1666, + OMX_COLOR_Format24bitRGB888, + OMX_COLOR_Format24bitBGR888, + OMX_COLOR_Format24bitARGB1887, + OMX_COLOR_Format25bitARGB1888, + OMX_COLOR_Format32bitBGRA8888, + OMX_COLOR_Format32bitARGB8888, + OMX_COLOR_FormatYUV411Planar, + OMX_COLOR_FormatYUV411PackedPlanar, + OMX_COLOR_FormatYUV420Planar, + OMX_COLOR_FormatYUV420PackedPlanar, + OMX_COLOR_FormatYUV420SemiPlanar, + OMX_COLOR_FormatYUV422Planar, + OMX_COLOR_FormatYUV422PackedPlanar, + OMX_COLOR_FormatYUV422SemiPlanar, + OMX_COLOR_FormatYCbYCr, + OMX_COLOR_FormatYCrYCb, + OMX_COLOR_FormatCbYCrY, + OMX_COLOR_FormatCrYCbY, + OMX_COLOR_FormatYUV444Interleaved, + OMX_COLOR_FormatRawBayer8bit, + OMX_COLOR_FormatRawBayer10bit, + OMX_COLOR_FormatRawBayer8bitcompressed, + OMX_COLOR_FormatL2, + OMX_COLOR_FormatL4, + OMX_COLOR_FormatL8, + OMX_COLOR_FormatL16, + OMX_COLOR_FormatL24, + OMX_COLOR_FormatL32, + OMX_COLOR_FormatYUV420PackedSemiPlanar, + OMX_COLOR_FormatYUV422PackedSemiPlanar, + OMX_COLOR_Format18BitBGR666, + OMX_COLOR_Format24BitARGB6666, + OMX_COLOR_Format24BitABGR6666, + OMX_COLOR_FormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_COLOR_FormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_COLOR_FormatMax = 0x7FFFFFFF +} OMX_COLOR_FORMATTYPE; + + +/** + * Defines the matrix for conversion from RGB to YUV or vice versa. + * iColorMatrix should be initialized with the fixed point values + * used in converting between formats. + */ +typedef struct OMX_CONFIG_COLORCONVERSIONTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version info */ + OMX_U32 nPortIndex; /**< Port that this struct applies to */ + OMX_S32 xColorMatrix[3][3]; /**< Stored in signed Q16 format */ + OMX_S32 xColorOffset[4]; /**< Stored in signed Q16 format */ +}OMX_CONFIG_COLORCONVERSIONTYPE; + + +/** + * Structure defining percent to scale each frame dimension. For example: + * To make the width 50% larger, use fWidth = 1.5 and to make the width + * 1/2 the original size, use fWidth = 0.5 + */ +typedef struct OMX_CONFIG_SCALEFACTORTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version info */ + OMX_U32 nPortIndex; /**< Port that this struct applies to */ + OMX_S32 xWidth; /**< Fixed point value stored as Q16 */ + OMX_S32 xHeight; /**< Fixed point value stored as Q16 */ +}OMX_CONFIG_SCALEFACTORTYPE; + + +/** + * Enumeration of possible image filter types + */ +typedef enum OMX_IMAGEFILTERTYPE { + OMX_ImageFilterNone, + OMX_ImageFilterNoise, + OMX_ImageFilterEmboss, + OMX_ImageFilterNegative, + OMX_ImageFilterSketch, + OMX_ImageFilterOilPaint, + OMX_ImageFilterHatch, + OMX_ImageFilterGpen, + OMX_ImageFilterAntialias, + OMX_ImageFilterDeRing, + OMX_ImageFilterSolarize, + OMX_ImageFilterKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_ImageFilterVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_ImageFilterMax = 0x7FFFFFFF +} OMX_IMAGEFILTERTYPE; + + +/** + * Image filter configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eImageFilter : Image filter type enumeration + */ +typedef struct OMX_CONFIG_IMAGEFILTERTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_IMAGEFILTERTYPE eImageFilter; +} OMX_CONFIG_IMAGEFILTERTYPE; + + +/** + * Customized U and V for color enhancement + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * bColorEnhancement : Enable/disable color enhancement + * nCustomizedU : Practical values: 16-240, range: 0-255, value set for + * U component + * nCustomizedV : Practical values: 16-240, range: 0-255, value set for + * V component + */ +typedef struct OMX_CONFIG_COLORENHANCEMENTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bColorEnhancement; + OMX_U8 nCustomizedU; + OMX_U8 nCustomizedV; +} OMX_CONFIG_COLORENHANCEMENTTYPE; + + +/** + * Define color key and color key mask + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nARGBColor : 32bit Alpha, Red, Green, Blue Color + * nARGBMask : 32bit Mask for Alpha, Red, Green, Blue channels + */ +typedef struct OMX_CONFIG_COLORKEYTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nARGBColor; + OMX_U32 nARGBMask; +} OMX_CONFIG_COLORKEYTYPE; + + +/** + * List of color blend types for pre/post processing + * + * ENUMS: + * None : No color blending present + * AlphaConstant : Function is (alpha_constant * src) + + * (1 - alpha_constant) * dst) + * AlphaPerPixel : Function is (alpha * src) + (1 - alpha) * dst) + * Alternate : Function is alternating pixels from src and dst + * And : Function is (src & dst) + * Or : Function is (src | dst) + * Invert : Function is ~src + */ +typedef enum OMX_COLORBLENDTYPE { + OMX_ColorBlendNone, + OMX_ColorBlendAlphaConstant, + OMX_ColorBlendAlphaPerPixel, + OMX_ColorBlendAlternate, + OMX_ColorBlendAnd, + OMX_ColorBlendOr, + OMX_ColorBlendInvert, + OMX_ColorBlendKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_ColorBlendVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_ColorBlendMax = 0x7FFFFFFF +} OMX_COLORBLENDTYPE; + + +/** + * Color blend configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nRGBAlphaConstant : Constant global alpha values when global alpha is used + * eColorBlend : Color blend type enumeration + */ +typedef struct OMX_CONFIG_COLORBLENDTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nRGBAlphaConstant; + OMX_COLORBLENDTYPE eColorBlend; +} OMX_CONFIG_COLORBLENDTYPE; + + +/** + * Hold frame dimension + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nWidth : Frame width in pixels + * nHeight : Frame height in pixels + */ +typedef struct OMX_FRAMESIZETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nWidth; + OMX_U32 nHeight; +} OMX_FRAMESIZETYPE; + + +/** + * Rotation configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nRotation : +/- integer rotation value + */ +typedef struct OMX_CONFIG_ROTATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nRotation; +} OMX_CONFIG_ROTATIONTYPE; + + +/** + * Possible mirroring directions for pre/post processing + * + * ENUMS: + * None : No mirroring + * Vertical : Vertical mirroring, flip on X axis + * Horizontal : Horizontal mirroring, flip on Y axis + * Both : Both vertical and horizontal mirroring + */ +typedef enum OMX_MIRRORTYPE { + OMX_MirrorNone = 0, + OMX_MirrorVertical, + OMX_MirrorHorizontal, + OMX_MirrorBoth, + OMX_MirrorKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_MirrorVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_MirrorMax = 0x7FFFFFFF +} OMX_MIRRORTYPE; + + +/** + * Mirroring configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eMirror : Mirror type enumeration + */ +typedef struct OMX_CONFIG_MIRRORTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_MIRRORTYPE eMirror; +} OMX_CONFIG_MIRRORTYPE; + + +/** + * Position information only + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nX : X coordinate for the point + * nY : Y coordinate for the point + */ +typedef struct OMX_CONFIG_POINTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nX; + OMX_S32 nY; +} OMX_CONFIG_POINTTYPE; + + +/** + * Frame size plus position + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nLeft : X Coordinate of the top left corner of the rectangle + * nTop : Y Coordinate of the top left corner of the rectangle + * nWidth : Width of the rectangle + * nHeight : Height of the rectangle + */ +typedef struct OMX_CONFIG_RECTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nLeft; + OMX_S32 nTop; + OMX_U32 nWidth; + OMX_U32 nHeight; +} OMX_CONFIG_RECTTYPE; + + +/** + * Deblocking state; it is required to be set up before starting the codec + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * bDeblocking : Enable/disable deblocking mode + */ +typedef struct OMX_PARAM_DEBLOCKINGTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bDeblocking; +} OMX_PARAM_DEBLOCKINGTYPE; + + +/** + * Stabilization state + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * bStab : Enable/disable frame stabilization state + */ +typedef struct OMX_CONFIG_FRAMESTABTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bStab; +} OMX_CONFIG_FRAMESTABTYPE; + + +/** + * White Balance control type + * + * STRUCT MEMBERS: + * SunLight : Referenced in JSR-234 + * Flash : Optimal for device's integrated flash + */ +typedef enum OMX_WHITEBALCONTROLTYPE { + OMX_WhiteBalControlOff = 0, + OMX_WhiteBalControlAuto, + OMX_WhiteBalControlSunLight, + OMX_WhiteBalControlCloudy, + OMX_WhiteBalControlShade, + OMX_WhiteBalControlTungsten, + OMX_WhiteBalControlFluorescent, + OMX_WhiteBalControlIncandescent, + OMX_WhiteBalControlFlash, + OMX_WhiteBalControlHorizon, + OMX_WhiteBalControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_WhiteBalControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_WhiteBalControlMax = 0x7FFFFFFF +} OMX_WHITEBALCONTROLTYPE; + + +/** + * White Balance control configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eWhiteBalControl : White balance enumeration + */ +typedef struct OMX_CONFIG_WHITEBALCONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_WHITEBALCONTROLTYPE eWhiteBalControl; +} OMX_CONFIG_WHITEBALCONTROLTYPE; + + +/** + * Exposure control type + */ +typedef enum OMX_EXPOSURECONTROLTYPE { + OMX_ExposureControlOff = 0, + OMX_ExposureControlAuto, + OMX_ExposureControlNight, + OMX_ExposureControlBackLight, + OMX_ExposureControlSpotLight, + OMX_ExposureControlSports, + OMX_ExposureControlSnow, + OMX_ExposureControlBeach, + OMX_ExposureControlLargeAperture, + OMX_ExposureControlSmallApperture, + OMX_ExposureControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_ExposureControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_ExposureControlMax = 0x7FFFFFFF +} OMX_EXPOSURECONTROLTYPE; + + +/** + * White Balance control configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eExposureControl : Exposure control enumeration + */ +typedef struct OMX_CONFIG_EXPOSURECONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_EXPOSURECONTROLTYPE eExposureControl; +} OMX_CONFIG_EXPOSURECONTROLTYPE; + + +/** + * Defines sensor supported mode. + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nFrameRate : Single shot mode is indicated by a 0 + * bOneShot : Enable for single shot, disable for streaming + * sFrameSize : Framesize + */ +typedef struct OMX_PARAM_SENSORMODETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nFrameRate; + OMX_BOOL bOneShot; + OMX_FRAMESIZETYPE sFrameSize; +} OMX_PARAM_SENSORMODETYPE; + + +/** + * Defines contrast level + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nContrast : Values allowed for contrast -100 to 100, zero means no change + */ +typedef struct OMX_CONFIG_CONTRASTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nContrast; +} OMX_CONFIG_CONTRASTTYPE; + + +/** + * Defines brightness level + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nBrightness : 0-100% + */ +typedef struct OMX_CONFIG_BRIGHTNESSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nBrightness; +} OMX_CONFIG_BRIGHTNESSTYPE; + + +/** + * Defines backlight level configuration for a video sink, e.g. LCD panel + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nBacklight : Values allowed for backlight 0-100% + * nTimeout : Number of milliseconds before backlight automatically turns + * off. A value of 0x0 disables backight timeout + */ +typedef struct OMX_CONFIG_BACKLIGHTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nBacklight; + OMX_U32 nTimeout; +} OMX_CONFIG_BACKLIGHTTYPE; + + +/** + * Defines setting for Gamma + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nGamma : Values allowed for gamma -100 to 100, zero means no change + */ +typedef struct OMX_CONFIG_GAMMATYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nGamma; +} OMX_CONFIG_GAMMATYPE; + + +/** + * Define for setting saturation + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nSaturation : Values allowed for saturation -100 to 100, zero means + * no change + */ +typedef struct OMX_CONFIG_SATURATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nSaturation; +} OMX_CONFIG_SATURATIONTYPE; + + +/** + * Define for setting Lightness + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nLightness : Values allowed for lightness -100 to 100, zero means no + * change + */ +typedef struct OMX_CONFIG_LIGHTNESSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nLightness; +} OMX_CONFIG_LIGHTNESSTYPE; + + +/** + * Plane blend configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Index of input port associated with the plane. + * nDepth : Depth of the plane in relation to the screen. Higher + * numbered depths are "behind" lower number depths. + * This number defaults to the Port Index number. + * nAlpha : Transparency blending component for the entire plane. + * See blending modes for more detail. + */ +typedef struct OMX_CONFIG_PLANEBLENDTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nDepth; + OMX_U32 nAlpha; +} OMX_CONFIG_PLANEBLENDTYPE; + + +/** + * Define interlace type + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * bEnable : Enable control variable for this functionality + * (see below) + * nInterleavePortIndex : Index of input or output port associated with + * the interleaved plane. + * pPlanarPortIndexes[4] : Index of input or output planar ports. + */ +typedef struct OMX_PARAM_INTERLEAVETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_U32 nInterleavePortIndex; +} OMX_PARAM_INTERLEAVETYPE; + + +/** + * Defines the picture effect used for an input picture + */ +typedef enum OMX_TRANSITIONEFFECTTYPE { + OMX_EffectNone, + OMX_EffectFadeFromBlack, + OMX_EffectFadeToBlack, + OMX_EffectUnspecifiedThroughConstantColor, + OMX_EffectDissolve, + OMX_EffectWipe, + OMX_EffectUnspecifiedMixOfTwoScenes, + OMX_EffectKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_EffectVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_EffectMax = 0x7FFFFFFF +} OMX_TRANSITIONEFFECTTYPE; + + +/** + * Structure used to configure current transition effect + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eEffect : Effect to enable + */ +typedef struct OMX_CONFIG_TRANSITIONEFFECTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_TRANSITIONEFFECTTYPE eEffect; +} OMX_CONFIG_TRANSITIONEFFECTTYPE; + + +/** + * Defines possible data unit types for encoded video data. The data unit + * types are used both for encoded video input for playback as well as + * encoded video output from recording. + */ +typedef enum OMX_DATAUNITTYPE { + OMX_DataUnitCodedPicture, + OMX_DataUnitVideoSegment, + OMX_DataUnitSeveralSegments, + OMX_DataUnitArbitraryStreamSection, + OMX_DataUnitKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_DataUnitVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_DataUnitMax = 0x7FFFFFFF +} OMX_DATAUNITTYPE; + + +/** + * Defines possible encapsulation types for coded video data unit. The + * encapsulation information is used both for encoded video input for + * playback as well as encoded video output from recording. + */ +typedef enum OMX_DATAUNITENCAPSULATIONTYPE { + OMX_DataEncapsulationElementaryStream, + OMX_DataEncapsulationGenericPayload, + OMX_DataEncapsulationRtpPayload, + OMX_DataEncapsulationKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_DataEncapsulationVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_DataEncapsulationMax = 0x7FFFFFFF +} OMX_DATAUNITENCAPSULATIONTYPE; + + +/** + * Structure used to configure the type of being decoded/encoded + */ +typedef struct OMX_PARAM_DATAUNITTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_DATAUNITTYPE eUnitType; + OMX_DATAUNITENCAPSULATIONTYPE eEncapsulationType; +} OMX_PARAM_DATAUNITTYPE; + + +/** + * Defines dither types + */ +typedef enum OMX_DITHERTYPE { + OMX_DitherNone, + OMX_DitherOrdered, + OMX_DitherErrorDiffusion, + OMX_DitherOther, + OMX_DitherKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_DitherVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_DitherMax = 0x7FFFFFFF +} OMX_DITHERTYPE; + + +/** + * Structure used to configure current type of dithering + */ +typedef struct OMX_CONFIG_DITHERTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_DITHERTYPE eDither; /**< Type of dithering to use */ +} OMX_CONFIG_DITHERTYPE; + +typedef struct OMX_CONFIG_CAPTUREMODETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_BOOL bContinuous; /**< If true then ignore frame rate and emit capture + * data as fast as possible (otherwise obey port's frame rate). */ + OMX_BOOL bFrameLimited; /**< If true then terminate capture after the port emits the + * specified number of frames (otherwise the port does not + * terminate the capture until instructed to do so by the client). + * Even if set, the client may manually terminate the capture prior + * to reaching the limit. */ + OMX_U32 nFrameLimit; /**< Limit on number of frames emitted during a capture (only + * valid if bFrameLimited is set). */ +} OMX_CONFIG_CAPTUREMODETYPE; + +typedef enum OMX_METERINGTYPE { + + OMX_MeteringModeAverage, /**< Center-weighted average metering. */ + OMX_MeteringModeSpot, /**< Spot (partial) metering. */ + OMX_MeteringModeMatrix, /**< Matrix or evaluative metering. */ + + OMX_MeteringKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_MeteringVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_EVModeMax = 0x7fffffff +} OMX_METERINGTYPE; + +typedef struct OMX_CONFIG_EXPOSUREVALUETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_METERINGTYPE eMetering; + OMX_S32 xEVCompensation; /**< Fixed point value stored as Q16 */ + OMX_U32 nApertureFNumber; /**< e.g. nApertureFNumber = 2 implies "f/2" - Q16 format */ + OMX_BOOL bAutoAperture; /**< Whether aperture number is defined automatically */ + OMX_U32 nShutterSpeedMsec; /**< Shutterspeed in milliseconds */ + OMX_BOOL bAutoShutterSpeed; /**< Whether shutter speed is defined automatically */ + OMX_U32 nSensitivity; /**< e.g. nSensitivity = 100 implies "ISO 100" */ + OMX_BOOL bAutoSensitivity; /**< Whether sensitivity is defined automatically */ +} OMX_CONFIG_EXPOSUREVALUETYPE; + +/** + * Focus region configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * bCenter : Use center region as focus region of interest + * bLeft : Use left region as focus region of interest + * bRight : Use right region as focus region of interest + * bTop : Use top region as focus region of interest + * bBottom : Use bottom region as focus region of interest + * bTopLeft : Use top left region as focus region of interest + * bTopRight : Use top right region as focus region of interest + * bBottomLeft : Use bottom left region as focus region of interest + * bBottomRight : Use bottom right region as focus region of interest + */ +typedef struct OMX_CONFIG_FOCUSREGIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bCenter; + OMX_BOOL bLeft; + OMX_BOOL bRight; + OMX_BOOL bTop; + OMX_BOOL bBottom; + OMX_BOOL bTopLeft; + OMX_BOOL bTopRight; + OMX_BOOL bBottomLeft; + OMX_BOOL bBottomRight; +} OMX_CONFIG_FOCUSREGIONTYPE; + +/** + * Focus Status type + */ +typedef enum OMX_FOCUSSTATUSTYPE { + OMX_FocusStatusOff = 0, + OMX_FocusStatusRequest, + OMX_FocusStatusReached, + OMX_FocusStatusUnableToReach, + OMX_FocusStatusLost, + OMX_FocusStatusKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_FocusStatusVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_FocusStatusMax = 0x7FFFFFFF +} OMX_FOCUSSTATUSTYPE; + +/** + * Focus status configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eFocusStatus : Specifies the focus status + * bCenterStatus : Use center region as focus region of interest + * bLeftStatus : Use left region as focus region of interest + * bRightStatus : Use right region as focus region of interest + * bTopStatus : Use top region as focus region of interest + * bBottomStatus : Use bottom region as focus region of interest + * bTopLeftStatus : Use top left region as focus region of interest + * bTopRightStatus : Use top right region as focus region of interest + * bBottomLeftStatus : Use bottom left region as focus region of interest + * bBottomRightStatus : Use bottom right region as focus region of interest + */ +typedef struct OMX_PARAM_FOCUSSTATUSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_FOCUSSTATUSTYPE eFocusStatus; + OMX_BOOL bCenterStatus; + OMX_BOOL bLeftStatus; + OMX_BOOL bRightStatus; + OMX_BOOL bTopStatus; + OMX_BOOL bBottomStatus; + OMX_BOOL bTopLeftStatus; + OMX_BOOL bTopRightStatus; + OMX_BOOL bBottomLeftStatus; + OMX_BOOL bBottomRightStatus; +} OMX_PARAM_FOCUSSTATUSTYPE; + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_Image.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_Image.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,329 @@ +/** + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/** + * @file + * OpenMax IL version 1.1.2 + * The structures needed by Image components to exchange parameters and + * configuration data with the components. + */ +#ifndef OMX_Image_h +#define OMX_Image_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/** + * Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ + +#include + +/** @defgroup imaging OpenMAX IL Imaging Domain + * @ingroup iv + * Structures for OpenMAX IL Imaging domain + * @{ + */ + +/** + * Enumeration used to define the possible image compression coding. + */ +typedef enum OMX_IMAGE_CODINGTYPE { + OMX_IMAGE_CodingUnused, /**< Value when format is N/A */ + OMX_IMAGE_CodingAutoDetect, /**< Auto detection of image format */ + OMX_IMAGE_CodingJPEG, /**< JPEG/JFIF image format */ + OMX_IMAGE_CodingJPEG2K, /**< JPEG 2000 image format */ + OMX_IMAGE_CodingEXIF, /**< EXIF image format */ + OMX_IMAGE_CodingTIFF, /**< TIFF image format */ + OMX_IMAGE_CodingGIF, /**< Graphics image format */ + OMX_IMAGE_CodingPNG, /**< PNG image format */ + OMX_IMAGE_CodingLZW, /**< LZW image format */ + OMX_IMAGE_CodingBMP, /**< Windows Bitmap format */ + OMX_IMAGE_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_IMAGE_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_IMAGE_CodingMax = 0x7FFFFFFF +} OMX_IMAGE_CODINGTYPE; + + +/** + * Data structure used to define an image path. The number of image paths + * for input and output will vary by type of the image component. + * + * Input (aka Source) : Zero Inputs, one Output, + * Splitter : One Input, 2 or more Outputs, + * Processing Element : One Input, one output, + * Mixer : 2 or more inputs, one output, + * Output (aka Sink) : One Input, zero outputs. + * + * The PortDefinition structure is used to define all of the parameters + * necessary for the compliant component to setup an input or an output + * image path. If additional vendor specific data is required, it should + * be transmitted to the component using the CustomCommand function. + * Compliant components will prepopulate this structure with optimal + * values during the OMX_GetParameter() command. + * + * STRUCT MEMBERS: + * cMIMEType : MIME type of data for the port + * pNativeRender : Platform specific reference for a display if a + * sync, otherwise this field is 0 + * nFrameWidth : Width of frame to be used on port if + * uncompressed format is used. Use 0 for + * unknown, don't care or variable + * nFrameHeight : Height of frame to be used on port if + * uncompressed format is used. Use 0 for + * unknown, don't care or variable + * nStride : Number of bytes per span of an image (i.e. + * indicates the number of bytes to get from + * span N to span N+1, where negative stride + * indicates the image is bottom up + * nSliceHeight : Height used when encoding in slices + * bFlagErrorConcealment : Turns on error concealment if it is supported by + * the OMX component + * eCompressionFormat : Compression format used in this instance of + * the component. When OMX_IMAGE_CodingUnused is + * specified, eColorFormat is valid + * eColorFormat : Decompressed format used by this component + * pNativeWindow : Platform specific reference for a window object if a + * display sink , otherwise this field is 0x0. + */ +typedef struct OMX_IMAGE_PORTDEFINITIONTYPE { + OMX_STRING cMIMEType; + OMX_NATIVE_DEVICETYPE pNativeRender; + OMX_U32 nFrameWidth; + OMX_U32 nFrameHeight; + OMX_S32 nStride; + OMX_U32 nSliceHeight; + OMX_BOOL bFlagErrorConcealment; + OMX_IMAGE_CODINGTYPE eCompressionFormat; + OMX_COLOR_FORMATTYPE eColorFormat; + OMX_NATIVE_WINDOWTYPE pNativeWindow; +} OMX_IMAGE_PORTDEFINITIONTYPE; + + +/** + * Port format parameter. This structure is used to enumerate the various + * data input/output format supported by the port. + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Indicates which port to set + * nIndex : Indicates the enumeration index for the format from + * 0x0 to N-1 + * eCompressionFormat : Compression format used in this instance of the + * component. When OMX_IMAGE_CodingUnused is specified, + * eColorFormat is valid + * eColorFormat : Decompressed format used by this component + */ +typedef struct OMX_IMAGE_PARAM_PORTFORMATTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nIndex; + OMX_IMAGE_CODINGTYPE eCompressionFormat; + OMX_COLOR_FORMATTYPE eColorFormat; +} OMX_IMAGE_PARAM_PORTFORMATTYPE; + + +/** + * Flash control type + * + * ENUMS + * Torch : Flash forced constantly on + */ +typedef enum OMX_IMAGE_FLASHCONTROLTYPE { + OMX_IMAGE_FlashControlOn = 0, + OMX_IMAGE_FlashControlOff, + OMX_IMAGE_FlashControlAuto, + OMX_IMAGE_FlashControlRedEyeReduction, + OMX_IMAGE_FlashControlFillin, + OMX_IMAGE_FlashControlTorch, + OMX_IMAGE_FlashControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_IMAGE_FlashControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_IMAGE_FlashControlMax = 0x7FFFFFFF +} OMX_IMAGE_FLASHCONTROLTYPE; + + +/** + * Flash control configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eFlashControl : Flash control type + */ +typedef struct OMX_IMAGE_PARAM_FLASHCONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_IMAGE_FLASHCONTROLTYPE eFlashControl; +} OMX_IMAGE_PARAM_FLASHCONTROLTYPE; + + +/** + * Focus control type + */ +typedef enum OMX_IMAGE_FOCUSCONTROLTYPE { + OMX_IMAGE_FocusControlOn = 0, + OMX_IMAGE_FocusControlOff, + OMX_IMAGE_FocusControlAuto, + OMX_IMAGE_FocusControlAutoLock, + OMX_IMAGE_FocusControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_IMAGE_FocusControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_IMAGE_FocusControlMax = 0x7FFFFFFF +} OMX_IMAGE_FOCUSCONTROLTYPE; + + +/** + * Focus control configuration + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eFocusControl : Focus control + * nFocusSteps : Focus can take on values from 0 mm to infinity. + * Interest is only in number of steps over this range. + * nFocusStepIndex : Current focus step index + */ +typedef struct OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_IMAGE_FOCUSCONTROLTYPE eFocusControl; + OMX_U32 nFocusSteps; + OMX_U32 nFocusStepIndex; +} OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE; + + +/** + * Q Factor for JPEG compression, which controls the tradeoff between image + * quality and size. Q Factor provides a more simple means of controlling + * JPEG compression quality, without directly programming Quantization + * tables for chroma and luma + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nQFactor : JPEG Q factor value in the range of 1-100. A factor of 1 + * produces the smallest, worst quality images, and a factor + * of 100 produces the largest, best quality images. A + * typical default is 75 for small good quality images + */ +typedef struct OMX_IMAGE_PARAM_QFACTORTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nQFactor; +} OMX_IMAGE_PARAM_QFACTORTYPE; + +/** + * Quantization table type + */ + +typedef enum OMX_IMAGE_QUANTIZATIONTABLETYPE { + OMX_IMAGE_QuantizationTableLuma = 0, + OMX_IMAGE_QuantizationTableChroma, + OMX_IMAGE_QuantizationTableChromaCb, + OMX_IMAGE_QuantizationTableChromaCr, + OMX_IMAGE_QuantizationTableKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_IMAGE_QuantizationTableVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_IMAGE_QuantizationTableMax = 0x7FFFFFFF +} OMX_IMAGE_QUANTIZATIONTABLETYPE; + +/** + * JPEG quantization tables are used to determine DCT compression for + * YUV data, as an alternative to specifying Q factor, providing exact + * control of compression + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eQuantizationTable : Quantization table type + * nQuantizationMatrix[64] : JPEG quantization table of coefficients stored + * in increasing columns then by rows of data (i.e. + * row 1, ... row 8). Quantization values are in + * the range 0-255 and stored in linear order + * (i.e. the component will zig-zag the + * quantization table data if required internally) + */ +typedef struct OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_IMAGE_QUANTIZATIONTABLETYPE eQuantizationTable; + OMX_U8 nQuantizationMatrix[64]; +} OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE; + + +/** + * Huffman table type, the same Huffman table is applied for chroma and + * luma component + */ +typedef enum OMX_IMAGE_HUFFMANTABLETYPE { + OMX_IMAGE_HuffmanTableAC = 0, + OMX_IMAGE_HuffmanTableDC, + OMX_IMAGE_HuffmanTableACLuma, + OMX_IMAGE_HuffmanTableACChroma, + OMX_IMAGE_HuffmanTableDCLuma, + OMX_IMAGE_HuffmanTableDCChroma, + OMX_IMAGE_HuffmanTableKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_IMAGE_HuffmanTableVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_IMAGE_HuffmanTableMax = 0x7FFFFFFF +} OMX_IMAGE_HUFFMANTABLETYPE; + +/** + * JPEG Huffman table + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eHuffmanTable : Huffman table type + * nNumberOfHuffmanCodeOfLength[16] : 0-16, number of Huffman codes of each + * possible length + * nHuffmanTable[256] : 0-255, the size used for AC and DC + * HuffmanTable are 16 and 162 + */ +typedef struct OMX_IMAGE_PARAM_HUFFMANTTABLETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_IMAGE_HUFFMANTABLETYPE eHuffmanTable; + OMX_U8 nNumberOfHuffmanCodeOfLength[16]; + OMX_U8 nHuffmanTable[256]; +}OMX_IMAGE_PARAM_HUFFMANTTABLETYPE; + +/** @} */ +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_Index.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_Index.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** @file + * OpenMax IL version 1.1.2 + * The OMX_Index header file contains the definitions for both applications + * and components . + */ + + +#ifndef OMX_Index_h +#define OMX_Index_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ +#include + + +/** The OMX_INDEXTYPE enumeration is used to select a structure when either + * getting or setting parameters and/or configuration data. Each entry in + * this enumeration maps to an OMX specified structure. When the + * OMX_GetParameter, OMX_SetParameter, OMX_GetConfig or OMX_SetConfig methods + * are used, the second parameter will always be an entry from this enumeration + * and the third entry will be the structure shown in the comments for the entry. + * For example, if the application is initializing a cropping function, the + * OMX_SetConfig command would have OMX_IndexConfigCommonInputCrop as the second parameter + * and would send a pointer to an initialized OMX_RECTTYPE structure as the + * third parameter. + * + * The enumeration entries named with the OMX_Config prefix are sent using + * the OMX_SetConfig command and the enumeration entries named with the + * OMX_PARAM_ prefix are sent using the OMX_SetParameter command. + */ +typedef enum OMX_INDEXTYPE { + + OMX_IndexComponentStartUnused = 0x01000000, + OMX_IndexParamPriorityMgmt, /**< reference: OMX_PRIORITYMGMTTYPE */ + OMX_IndexParamAudioInit, /**< reference: OMX_PORT_PARAM_TYPE */ + OMX_IndexParamImageInit, /**< reference: OMX_PORT_PARAM_TYPE */ + OMX_IndexParamVideoInit, /**< reference: OMX_PORT_PARAM_TYPE */ + OMX_IndexParamOtherInit, /**< reference: OMX_PORT_PARAM_TYPE */ + OMX_IndexParamNumAvailableStreams, /**< reference: OMX_PARAM_U32TYPE */ + OMX_IndexParamActiveStream, /**< reference: OMX_PARAM_U32TYPE */ + OMX_IndexParamSuspensionPolicy, /**< reference: OMX_PARAM_SUSPENSIONPOLICYTYPE */ + OMX_IndexParamComponentSuspended, /**< reference: OMX_PARAM_SUSPENSIONTYPE */ + OMX_IndexConfigCapturing, /**< reference: OMX_CONFIG_BOOLEANTYPE */ + OMX_IndexConfigCaptureMode, /**< reference: OMX_CONFIG_CAPTUREMODETYPE */ + OMX_IndexAutoPauseAfterCapture, /**< reference: OMX_CONFIG_BOOLEANTYPE */ + OMX_IndexParamContentURI, /**< reference: OMX_PARAM_CONTENTURITYPE */ + OMX_IndexParamCustomContentPipe, /**< reference: OMX_PARAM_CONTENTPIPETYPE */ + OMX_IndexParamDisableResourceConcealment, /**< reference: OMX_RESOURCECONCEALMENTTYPE */ + OMX_IndexConfigMetadataItemCount, /**< reference: OMX_CONFIG_METADATAITEMCOUNTTYPE */ + OMX_IndexConfigContainerNodeCount, /**< reference: OMX_CONFIG_CONTAINERNODECOUNTTYPE */ + OMX_IndexConfigMetadataItem, /**< reference: OMX_CONFIG_METADATAITEMTYPE */ + OMX_IndexConfigCounterNodeID, /**< reference: OMX_CONFIG_CONTAINERNODEIDTYPE */ + OMX_IndexParamMetadataFilterType, /**< reference: OMX_PARAM_METADATAFILTERTYPE */ + OMX_IndexParamMetadataKeyFilter, /**< reference: OMX_PARAM_METADATAFILTERTYPE */ + OMX_IndexConfigPriorityMgmt, /**< reference: OMX_PRIORITYMGMTTYPE */ + OMX_IndexParamStandardComponentRole, /**< reference: OMX_PARAM_COMPONENTROLETYPE */ + + OMX_IndexPortStartUnused = 0x02000000, + OMX_IndexParamPortDefinition, /**< reference: OMX_PARAM_PORTDEFINITIONTYPE */ + OMX_IndexParamCompBufferSupplier, /**< reference: OMX_PARAM_BUFFERSUPPLIERTYPE */ + OMX_IndexReservedStartUnused = 0x03000000, + + /* Audio parameters and configurations */ + OMX_IndexAudioStartUnused = 0x04000000, + OMX_IndexParamAudioPortFormat, /**< reference: OMX_AUDIO_PARAM_PORTFORMATTYPE */ + OMX_IndexParamAudioPcm, /**< reference: OMX_AUDIO_PARAM_PCMMODETYPE */ + OMX_IndexParamAudioAac, /**< reference: OMX_AUDIO_PARAM_AACPROFILETYPE */ + OMX_IndexParamAudioRa, /**< reference: OMX_AUDIO_PARAM_RATYPE */ + OMX_IndexParamAudioMp3, /**< reference: OMX_AUDIO_PARAM_MP3TYPE */ + OMX_IndexParamAudioAdpcm, /**< reference: OMX_AUDIO_PARAM_ADPCMTYPE */ + OMX_IndexParamAudioG723, /**< reference: OMX_AUDIO_PARAM_G723TYPE */ + OMX_IndexParamAudioG729, /**< reference: OMX_AUDIO_PARAM_G729TYPE */ + OMX_IndexParamAudioAmr, /**< reference: OMX_AUDIO_PARAM_AMRTYPE */ + OMX_IndexParamAudioWma, /**< reference: OMX_AUDIO_PARAM_WMATYPE */ + OMX_IndexParamAudioSbc, /**< reference: OMX_AUDIO_PARAM_SBCTYPE */ + OMX_IndexParamAudioMidi, /**< reference: OMX_AUDIO_PARAM_MIDITYPE */ + OMX_IndexParamAudioGsm_FR, /**< reference: OMX_AUDIO_PARAM_GSMFRTYPE */ + OMX_IndexParamAudioMidiLoadUserSound, /**< reference: OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE */ + OMX_IndexParamAudioG726, /**< reference: OMX_AUDIO_PARAM_G726TYPE */ + OMX_IndexParamAudioGsm_EFR, /**< reference: OMX_AUDIO_PARAM_GSMEFRTYPE */ + OMX_IndexParamAudioGsm_HR, /**< reference: OMX_AUDIO_PARAM_GSMHRTYPE */ + OMX_IndexParamAudioPdc_FR, /**< reference: OMX_AUDIO_PARAM_PDCFRTYPE */ + OMX_IndexParamAudioPdc_EFR, /**< reference: OMX_AUDIO_PARAM_PDCEFRTYPE */ + OMX_IndexParamAudioPdc_HR, /**< reference: OMX_AUDIO_PARAM_PDCHRTYPE */ + OMX_IndexParamAudioTdma_FR, /**< reference: OMX_AUDIO_PARAM_TDMAFRTYPE */ + OMX_IndexParamAudioTdma_EFR, /**< reference: OMX_AUDIO_PARAM_TDMAEFRTYPE */ + OMX_IndexParamAudioQcelp8, /**< reference: OMX_AUDIO_PARAM_QCELP8TYPE */ + OMX_IndexParamAudioQcelp13, /**< reference: OMX_AUDIO_PARAM_QCELP13TYPE */ + OMX_IndexParamAudioEvrc, /**< reference: OMX_AUDIO_PARAM_EVRCTYPE */ + OMX_IndexParamAudioSmv, /**< reference: OMX_AUDIO_PARAM_SMVTYPE */ + OMX_IndexParamAudioVorbis, /**< reference: OMX_AUDIO_PARAM_VORBISTYPE */ + + OMX_IndexConfigAudioMidiImmediateEvent, /**< reference: OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE */ + OMX_IndexConfigAudioMidiControl, /**< reference: OMX_AUDIO_CONFIG_MIDICONTROLTYPE */ + OMX_IndexConfigAudioMidiSoundBankProgram, /**< reference: OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE */ + OMX_IndexConfigAudioMidiStatus, /**< reference: OMX_AUDIO_CONFIG_MIDISTATUSTYPE */ + OMX_IndexConfigAudioMidiMetaEvent, /**< reference: OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE */ + OMX_IndexConfigAudioMidiMetaEventData, /**< reference: OMX_AUDIO_CONFIG_MIDIMETAEVENTDATATYPE */ + OMX_IndexConfigAudioVolume, /**< reference: OMX_AUDIO_CONFIG_VOLUMETYPE */ + OMX_IndexConfigAudioBalance, /**< reference: OMX_AUDIO_CONFIG_BALANCETYPE */ + OMX_IndexConfigAudioChannelMute, /**< reference: OMX_AUDIO_CONFIG_CHANNELMUTETYPE */ + OMX_IndexConfigAudioMute, /**< reference: OMX_AUDIO_CONFIG_MUTETYPE */ + OMX_IndexConfigAudioLoudness, /**< reference: OMX_AUDIO_CONFIG_LOUDNESSTYPE */ + OMX_IndexConfigAudioEchoCancelation, /**< reference: OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE */ + OMX_IndexConfigAudioNoiseReduction, /**< reference: OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE */ + OMX_IndexConfigAudioBass, /**< reference: OMX_AUDIO_CONFIG_BASSTYPE */ + OMX_IndexConfigAudioTreble, /**< reference: OMX_AUDIO_CONFIG_TREBLETYPE */ + OMX_IndexConfigAudioStereoWidening, /**< reference: OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE */ + OMX_IndexConfigAudioChorus, /**< reference: OMX_AUDIO_CONFIG_CHORUSTYPE */ + OMX_IndexConfigAudioEqualizer, /**< reference: OMX_AUDIO_CONFIG_EQUALIZERTYPE */ + OMX_IndexConfigAudioReverberation, /**< reference: OMX_AUDIO_CONFIG_REVERBERATIONTYPE */ + OMX_IndexConfigAudioChannelVolume, /**< reference: OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE */ + + /* Image specific parameters and configurations */ + OMX_IndexImageStartUnused = 0x05000000, + OMX_IndexParamImagePortFormat, /**< reference: OMX_IMAGE_PARAM_PORTFORMATTYPE */ + OMX_IndexParamFlashControl, /**< reference: OMX_IMAGE_PARAM_FLASHCONTROLTYPE */ + OMX_IndexConfigFocusControl, /**< reference: OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE */ + OMX_IndexParamQFactor, /**< reference: OMX_IMAGE_PARAM_QFACTORTYPE */ + OMX_IndexParamQuantizationTable, /**< reference: OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE */ + OMX_IndexParamHuffmanTable, /**< reference: OMX_IMAGE_PARAM_HUFFMANTTABLETYPE */ + OMX_IndexConfigFlashControl, /**< reference: OMX_IMAGE_PARAM_FLASHCONTROLTYPE */ + + /* Video specific parameters and configurations */ + OMX_IndexVideoStartUnused = 0x06000000, + OMX_IndexParamVideoPortFormat, /**< reference: OMX_VIDEO_PARAM_PORTFORMATTYPE */ + OMX_IndexParamVideoQuantization, /**< reference: OMX_VIDEO_PARAM_QUANTIZATIONTYPE */ + OMX_IndexParamVideoFastUpdate, /**< reference: OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE */ + OMX_IndexParamVideoBitrate, /**< reference: OMX_VIDEO_PARAM_BITRATETYPE */ + OMX_IndexParamVideoMotionVector, /**< reference: OMX_VIDEO_PARAM_MOTIONVECTORTYPE */ + OMX_IndexParamVideoIntraRefresh, /**< reference: OMX_VIDEO_PARAM_INTRAREFRESHTYPE */ + OMX_IndexParamVideoErrorCorrection, /**< reference: OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE */ + OMX_IndexParamVideoVBSMC, /**< reference: OMX_VIDEO_PARAM_VBSMCTYPE */ + OMX_IndexParamVideoMpeg2, /**< reference: OMX_VIDEO_PARAM_MPEG2TYPE */ + OMX_IndexParamVideoMpeg4, /**< reference: OMX_VIDEO_PARAM_MPEG4TYPE */ + OMX_IndexParamVideoWmv, /**< reference: OMX_VIDEO_PARAM_WMVTYPE */ + OMX_IndexParamVideoRv, /**< reference: OMX_VIDEO_PARAM_RVTYPE */ + OMX_IndexParamVideoAvc, /**< reference: OMX_VIDEO_PARAM_AVCTYPE */ + OMX_IndexParamVideoH263, /**< reference: OMX_VIDEO_PARAM_H263TYPE */ + OMX_IndexParamVideoProfileLevelQuerySupported, /**< reference: OMX_VIDEO_PARAM_PROFILELEVELTYPE */ + OMX_IndexParamVideoProfileLevelCurrent, /**< reference: OMX_VIDEO_PARAM_PROFILELEVELTYPE */ + OMX_IndexConfigVideoBitrate, /**< reference: OMX_VIDEO_CONFIG_BITRATETYPE */ + OMX_IndexConfigVideoFramerate, /**< reference: OMX_CONFIG_FRAMERATETYPE */ + OMX_IndexConfigVideoIntraVOPRefresh, /**< reference: OMX_CONFIG_INTRAREFRESHVOPTYPE */ + OMX_IndexConfigVideoIntraMBRefresh, /**< reference: OMX_CONFIG_MACROBLOCKERRORMAPTYPE */ + OMX_IndexConfigVideoMBErrorReporting, /**< reference: OMX_CONFIG_MBERRORREPORTINGTYPE */ + OMX_IndexParamVideoMacroblocksPerFrame, /**< reference: OMX_PARAM_MACROBLOCKSTYPE */ + OMX_IndexConfigVideoMacroBlockErrorMap, /**< reference: OMX_CONFIG_MACROBLOCKERRORMAPTYPE */ + OMX_IndexParamVideoSliceFMO, /**< reference: OMX_VIDEO_PARAM_AVCSLICEFMO */ + OMX_IndexConfigVideoAVCIntraPeriod, /**< reference: OMX_VIDEO_CONFIG_AVCINTRAPERIOD */ + OMX_IndexConfigVideoNalSize, /**< reference: OMX_VIDEO_CONFIG_NALSIZE */ + + /* Image & Video common Configurations */ + OMX_IndexCommonStartUnused = 0x07000000, + OMX_IndexParamCommonDeblocking, /**< reference: OMX_PARAM_DEBLOCKINGTYPE */ + OMX_IndexParamCommonSensorMode, /**< reference: OMX_PARAM_SENSORMODETYPE */ + OMX_IndexParamCommonInterleave, /**< reference: OMX_PARAM_INTERLEAVETYPE */ + OMX_IndexConfigCommonColorFormatConversion, /**< reference: OMX_CONFIG_COLORCONVERSIONTYPE */ + OMX_IndexConfigCommonScale, /**< reference: OMX_CONFIG_SCALEFACTORTYPE */ + OMX_IndexConfigCommonImageFilter, /**< reference: OMX_CONFIG_IMAGEFILTERTYPE */ + OMX_IndexConfigCommonColorEnhancement, /**< reference: OMX_CONFIG_COLORENHANCEMENTTYPE */ + OMX_IndexConfigCommonColorKey, /**< reference: OMX_CONFIG_COLORKEYTYPE */ + OMX_IndexConfigCommonColorBlend, /**< reference: OMX_CONFIG_COLORBLENDTYPE */ + OMX_IndexConfigCommonFrameStabilisation,/**< reference: OMX_CONFIG_FRAMESTABTYPE */ + OMX_IndexConfigCommonRotate, /**< reference: OMX_CONFIG_ROTATIONTYPE */ + OMX_IndexConfigCommonMirror, /**< reference: OMX_CONFIG_MIRRORTYPE */ + OMX_IndexConfigCommonOutputPosition, /**< reference: OMX_CONFIG_POINTTYPE */ + OMX_IndexConfigCommonInputCrop, /**< reference: OMX_CONFIG_RECTTYPE */ + OMX_IndexConfigCommonOutputCrop, /**< reference: OMX_CONFIG_RECTTYPE */ + OMX_IndexConfigCommonDigitalZoom, /**< reference: OMX_CONFIG_SCALEFACTORTYPE */ + OMX_IndexConfigCommonOpticalZoom, /**< reference: OMX_CONFIG_SCALEFACTORTYPE*/ + OMX_IndexConfigCommonWhiteBalance, /**< reference: OMX_CONFIG_WHITEBALCONTROLTYPE */ + OMX_IndexConfigCommonExposure, /**< reference: OMX_CONFIG_EXPOSURECONTROLTYPE */ + OMX_IndexConfigCommonContrast, /**< reference: OMX_CONFIG_CONTRASTTYPE */ + OMX_IndexConfigCommonBrightness, /**< reference: OMX_CONFIG_BRIGHTNESSTYPE */ + OMX_IndexConfigCommonBacklight, /**< reference: OMX_CONFIG_BACKLIGHTTYPE */ + OMX_IndexConfigCommonGamma, /**< reference: OMX_CONFIG_GAMMATYPE */ + OMX_IndexConfigCommonSaturation, /**< reference: OMX_CONFIG_SATURATIONTYPE */ + OMX_IndexConfigCommonLightness, /**< reference: OMX_CONFIG_LIGHTNESSTYPE */ + OMX_IndexConfigCommonExclusionRect, /**< reference: OMX_CONFIG_RECTTYPE */ + OMX_IndexConfigCommonDithering, /**< reference: OMX_CONFIG_DITHERTYPE */ + OMX_IndexConfigCommonPlaneBlend, /**< reference: OMX_CONFIG_PLANEBLENDTYPE */ + OMX_IndexConfigCommonExposureValue, /**< reference: OMX_CONFIG_EXPOSUREVALUETYPE */ + OMX_IndexConfigCommonOutputSize, /**< reference: OMX_FRAMESIZETYPE */ + OMX_IndexParamCommonExtraQuantData, /**< reference: OMX_OTHER_EXTRADATATYPE */ + OMX_IndexConfigCommonFocusRegion, /**< reference: OMX_CONFIG_FOCUSREGIONTYPE */ + OMX_IndexConfigCommonFocusStatus, /**< reference: OMX_PARAM_FOCUSSTATUSTYPE */ + OMX_IndexConfigCommonTransitionEffect, /**< reference: OMX_CONFIG_TRANSITIONEFFECTTYPE */ + + /* Reserved Configuration range */ + OMX_IndexOtherStartUnused = 0x08000000, + OMX_IndexParamOtherPortFormat, /**< reference: OMX_OTHER_PARAM_PORTFORMATTYPE */ + OMX_IndexConfigOtherPower, /**< reference: OMX_OTHER_CONFIG_POWERTYPE */ + OMX_IndexConfigOtherStats, /**< reference: OMX_OTHER_CONFIG_STATSTYPE */ + + + /* Reserved Time range */ + OMX_IndexTimeStartUnused = 0x09000000, + OMX_IndexConfigTimeScale, /**< reference: OMX_TIME_CONFIG_SCALETYPE */ + OMX_IndexConfigTimeClockState, /**< reference: OMX_TIME_CONFIG_CLOCKSTATETYPE */ + OMX_IndexConfigTimeActiveRefClock, /**< reference: OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE */ + OMX_IndexConfigTimeCurrentMediaTime, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (read only) */ + OMX_IndexConfigTimeCurrentWallTime, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (read only) */ + OMX_IndexConfigTimeCurrentAudioReference, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */ + OMX_IndexConfigTimeCurrentVideoReference, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */ + OMX_IndexConfigTimeMediaTimeRequest, /**< reference: OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE (write only) */ + OMX_IndexConfigTimeClientStartTime, /** + + +/** + * Enumeration of possible data types which match to multiple domains or no + * domain at all. For types which are vendor specific, a value above + * OMX_OTHER_VENDORTSTART should be used. + */ +typedef enum OMX_OTHER_FORMATTYPE { + OMX_OTHER_FormatTime = 0, /**< Transmission of various timestamps, elapsed time, + time deltas, etc */ + OMX_OTHER_FormatPower, /**< Perhaps used for enabling/disabling power + management, setting clocks? */ + OMX_OTHER_FormatStats, /**< Could be things such as frame rate, frames + dropped, etc */ + OMX_OTHER_FormatBinary, /**< Arbitrary binary data */ + OMX_OTHER_FormatVendorReserved = 1000, /**< Starting value for vendor specific + formats */ + + OMX_OTHER_FormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_OTHER_FormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_OTHER_FormatMax = 0x7FFFFFFF +} OMX_OTHER_FORMATTYPE; + +/** + * Enumeration of seek modes. + */ +typedef enum OMX_TIME_SEEKMODETYPE { + OMX_TIME_SeekModeFast = 0, /**< Prefer seeking to an approximation + * of the requested seek position over + * the actual seek position if it + * results in a faster seek. */ + OMX_TIME_SeekModeAccurate, /**< Prefer seeking to the actual seek + * position over an approximation + * of the requested seek position even + * if it results in a slower seek. */ + OMX_TIME_SeekModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_TIME_SeekModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_TIME_SeekModeMax = 0x7FFFFFFF +} OMX_TIME_SEEKMODETYPE; + +/* Structure representing the seekmode of the component */ +typedef struct OMX_TIME_CONFIG_SEEKMODETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_TIME_SEEKMODETYPE eType; /**< The seek mode */ +} OMX_TIME_CONFIG_SEEKMODETYPE; + +/** Structure representing a time stamp used with the following configs + * on the Clock Component (CC): + * + * OMX_IndexConfigTimeCurrentWallTime: query of the CC’s current wall + * time + * OMX_IndexConfigTimeCurrentMediaTime: query of the CC’s current media + * time + * OMX_IndexConfigTimeCurrentAudioReference and + * OMX_IndexConfigTimeCurrentVideoReference: audio/video reference + * clock sending SC its reference time + * OMX_IndexConfigTimeClientStartTime: a Clock Component client sends + * this structure to the Clock Component via a SetConfig on its + * client port when it receives a buffer with + * OMX_BUFFERFLAG_STARTTIME set. It must use the timestamp + * specified by that buffer for nStartTimestamp. + * + * It’s also used with the following config on components in general: + * + * OMX_IndexConfigTimePosition: IL client querying component position + * (GetConfig) or commanding a component to seek to the given location + * (SetConfig) + */ +typedef struct OMX_TIME_CONFIG_TIMESTAMPTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version + * information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_TICKS nTimestamp; /**< timestamp .*/ +} OMX_TIME_CONFIG_TIMESTAMPTYPE; + +/** Enumeration of possible reference clocks to the media time. */ +typedef enum OMX_TIME_UPDATETYPE { + OMX_TIME_UpdateRequestFulfillment, /**< Update is the fulfillment of a media time request. */ + OMX_TIME_UpdateScaleChanged, /**< Update was generated because the scale chagned. */ + OMX_TIME_UpdateClockStateChanged, /**< Update was generated because the clock state changed. */ + OMX_TIME_UpdateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_TIME_UpdateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_TIME_UpdateMax = 0x7FFFFFFF +} OMX_TIME_UPDATETYPE; + +/** Enumeration of possible reference clocks to the media time. */ +typedef enum OMX_TIME_REFCLOCKTYPE { + OMX_TIME_RefClockNone, /**< Use no references. */ + OMX_TIME_RefClockAudio, /**< Use references sent through OMX_IndexConfigTimeCurrentAudioReference */ + OMX_TIME_RefClockVideo, /**< Use references sent through OMX_IndexConfigTimeCurrentVideoReference */ + OMX_TIME_RefClockKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_TIME_RefClockVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_TIME_RefClockMax = 0x7FFFFFFF +} OMX_TIME_REFCLOCKTYPE; + +/** Enumeration of clock states. */ +typedef enum OMX_TIME_CLOCKSTATE { + OMX_TIME_ClockStateRunning, /**< Clock running. */ + OMX_TIME_ClockStateWaitingForStartTime, /**< Clock waiting until the + * prescribed clients emit their + * start time. */ + OMX_TIME_ClockStateStopped, /**< Clock stopped. */ + OMX_TIME_ClockStateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_TIME_ClockStateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_TIME_ClockStateMax = 0x7FFFFFFF +} OMX_TIME_CLOCKSTATE; + +/** Structure representing a media time request to the clock component. + * + * A client component sends this structure to the Clock Component via a SetConfig + * on its client port to specify a media timestamp the Clock Component + * should emit. The Clock Component should fulfill the request by sending a + * OMX_TIME_MEDIATIMETYPE when its media clock matches the requested + * timestamp. + * + * The client may require a media time request be fulfilled slightly + * earlier than the media time specified. In this case the client specifies + * an offset which is equal to the difference between wall time corresponding + * to the requested media time and the wall time when it will be + * fulfilled. + * + * A client component may uses these requests and the OMX_TIME_MEDIATIMETYPE to + * time events according to timestamps. If a client must perform an operation O at + * a time T (e.g. deliver a video frame at its corresponding timestamp), it makes a + * media time request at T (perhaps specifying an offset to ensure the request fulfillment + * is a little early). When the clock component passes the resulting OMX_TIME_MEDIATIMETYPE + * structure back to the client component, the client may perform operation O (perhaps having + * to wait a slight amount more time itself as specified by the return values). + */ + +typedef struct OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_PTR pClientPrivate; /**< Client private data to disabiguate this media time + * from others (e.g. the number of the frame to deliver). + * Duplicated in the media time structure that fulfills + * this request. A value of zero is reserved for time scale + * updates. */ + OMX_TICKS nMediaTimestamp; /**< Media timestamp requested.*/ + OMX_TICKS nOffset; /**< Amount of wall clock time by which this + * request should be fulfilled early */ +} OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE; + +/**< Structure sent from the clock component client either when fulfilling + * a media time request or when the time scale has changed. + * + * In the former case the Clock Component fills this structure and times its emission + * to a client component (via the client port) according to the corresponding media + * time request sent by the client. The Clock Component should time the emission to occur + * when the requested timestamp matches the Clock Component's media time but also the + * prescribed offset early. + * + * Upon scale changes the clock component clears the nClientPrivate data, sends the current + * media time and sets the nScale to the new scale via the client port. It emits a + * OMX_TIME_MEDIATIMETYPE to all clients independent of any requests. This allows clients to + * alter processing to accomodate scaling. For instance a video component might skip inter-frames + * in the case of extreme fastforward. Likewise an audio component might add or remove samples + * from an audio frame to scale audio data. + * + * It is expected that some clock components may not be able to fulfill requests + * at exactly the prescribed time. This is acceptable so long as the request is + * fulfilled at least as early as described and not later. This structure provides + * fields the client may use to wait for the remaining time. + * + * The client may use either the nOffset or nWallTimeAtMedia fields to determine the + * wall time until the nMediaTimestamp actually occurs. In the latter case the + * client can get a more accurate value for offset by getting the current wall + * from the cloc component and subtracting it from nWallTimeAtMedia. + */ + +typedef struct OMX_TIME_MEDIATIMETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nClientPrivate; /**< Client private data to disabiguate this media time + * from others. Copied from the media time request. + * A value of zero is reserved for time scale updates. */ + OMX_TIME_UPDATETYPE eUpdateType; /**< Reason for the update */ + OMX_TICKS nMediaTimestamp; /**< Media time requested. If no media time was + * requested then this is the current media time. */ + OMX_TICKS nOffset; /**< Amount of wall clock time by which this + * request was actually fulfilled early */ + + OMX_TICKS nWallTimeAtMediaTime; /**< Wall time corresponding to nMediaTimeStamp. + * A client may compare this value to current + * media time obtained from the Clock Component to determine + * the wall time until the media timestamp is really + * current. */ + OMX_S32 xScale; /**< Current media time scale in Q16 format. */ + OMX_TIME_CLOCKSTATE eState; /* Seeking Change. Added 7/12.*/ + /**< State of the media time. */ +} OMX_TIME_MEDIATIMETYPE; + +/** Structure representing the current media time scale factor. Applicable only to clock + * component, other components see scale changes via OMX_TIME_MEDIATIMETYPE buffers sent via + * the clock component client ports. Upon recieving this config the clock component changes + * the rate by which the media time increases or decreases effectively implementing trick modes. + */ +typedef struct OMX_TIME_CONFIG_SCALETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_S32 xScale; /**< This is a value in Q16 format which is used for + * scaling the media time */ +} OMX_TIME_CONFIG_SCALETYPE; + +/** Bits used to identify a clock port. Used in OMX_TIME_CONFIG_CLOCKSTATETYPE’s nWaitMask field */ +#define OMX_CLOCKPORT0 0x00000001 +#define OMX_CLOCKPORT1 0x00000002 +#define OMX_CLOCKPORT2 0x00000004 +#define OMX_CLOCKPORT3 0x00000008 +#define OMX_CLOCKPORT4 0x00000010 +#define OMX_CLOCKPORT5 0x00000020 +#define OMX_CLOCKPORT6 0x00000040 +#define OMX_CLOCKPORT7 0x00000080 + +/** Structure representing the current mode of the media clock. + * IL Client uses this config to change or query the mode of the + * media clock of the clock component. Applicable only to clock + * component. + * + * On a SetConfig if eState is OMX_TIME_ClockStateRunning media time + * starts immediately at the prescribed start time. If + * OMX_TIME_ClockStateWaitingForStartTime the Clock Component ignores + * the given nStartTime and waits for all clients specified in the + * nWaitMask to send starttimes (via + * OMX_IndexConfigTimeClientStartTime). The Clock Component then starts + * the media clock using the earliest start time supplied. */ +typedef struct OMX_TIME_CONFIG_CLOCKSTATETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version + * information */ + OMX_TIME_CLOCKSTATE eState; /**< State of the media time. */ + OMX_TICKS nStartTime; /**< Start time of the media time. */ + OMX_TICKS nOffset; /**< Time to offset the media time by + * (e.g. preroll). Media time will be + * reported to be nOffset ticks earlier. + */ + OMX_U32 nWaitMask; /**< Mask of OMX_CLOCKPORT values. */ +} OMX_TIME_CONFIG_CLOCKSTATETYPE; + +/** Structure representing the reference clock currently being used to + * compute media time. IL client uses this config to change or query the + * clock component's active reference clock */ +typedef struct OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_TIME_REFCLOCKTYPE eClock; /**< Reference clock used to compute media time */ +} OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE; + +/** Descriptor for setting specifics of power type. + * Note: this structure is listed for backwards compatibility. */ +typedef struct OMX_OTHER_CONFIG_POWERTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_BOOL bEnablePM; /**< Flag to enable Power Management */ +} OMX_OTHER_CONFIG_POWERTYPE; + + +/** Descriptor for setting specifics of stats type. + * Note: this structure is listed for backwards compatibility. */ +typedef struct OMX_OTHER_CONFIG_STATSTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + /* what goes here */ +} OMX_OTHER_CONFIG_STATSTYPE; + + +/** + * The PortDefinition structure is used to define all of the parameters + * necessary for the compliant component to setup an input or an output other + * path. + */ +typedef struct OMX_OTHER_PORTDEFINITIONTYPE { + OMX_OTHER_FORMATTYPE eFormat; /**< Type of data expected for this channel */ +} OMX_OTHER_PORTDEFINITIONTYPE; + +/** Port format parameter. This structure is used to enumerate + * the various data input/output format supported by the port. + */ +typedef struct OMX_OTHER_PARAM_PORTFORMATTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Indicates which port to set */ + OMX_U32 nIndex; /**< Indicates the enumeration index for the format from 0x0 to N-1 */ + OMX_OTHER_FORMATTYPE eFormat; /**< Type of data expected for this channel */ +} OMX_OTHER_PARAM_PORTFORMATTYPE; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_Types.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_Types.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** OMX_Types.h - OpenMax IL version 1.1.2 + * The OMX_Types header file contains the primitive type definitions used by + * the core, the application and the component. This file may need to be + * modified to be used on systems that do not have "char" set to 8 bits, + * "short" set to 16 bits and "long" set to 32 bits. + */ + +#ifndef OMX_Types_h +#define OMX_Types_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** The OMX_API and OMX_APIENTRY are platform specific definitions used + * to declare OMX function prototypes. They are modified to meet the + * requirements for a particular platform */ +#ifdef __SYMBIAN32__ +# ifdef __OMX_EXPORTS +# define OMX_API __declspec(dllexport) +# else +# ifdef _WIN32 +# define OMX_API __declspec(dllexport) +# else +# define OMX_API __declspec(dllimport) +# endif +# endif +#else +# ifdef _WIN32 +# ifdef __OMX_EXPORTS +# define OMX_API __declspec(dllexport) +# else +# define OMX_API __declspec(dllimport) +# endif +# else +# ifdef __OMX_EXPORTS +# define OMX_API +# else +# define OMX_API extern +# endif +# endif +#endif + +#ifndef OMX_APIENTRY +#define OMX_APIENTRY +#endif + +/** OMX_IN is used to identify inputs to an OMX function. This designation + will also be used in the case of a pointer that points to a parameter + that is used as an output. */ +#ifndef OMX_IN +#define OMX_IN +#endif + +/** OMX_OUT is used to identify outputs from an OMX function. This + designation will also be used in the case of a pointer that points + to a parameter that is used as an input. */ +#ifndef OMX_OUT +#define OMX_OUT +#endif + + +/** OMX_INOUT is used to identify parameters that may be either inputs or + outputs from an OMX function at the same time. This designation will + also be used in the case of a pointer that points to a parameter that + is used both as an input and an output. */ +#ifndef OMX_INOUT +#define OMX_INOUT +#endif + +/** OMX_ALL is used to as a wildcard to select all entities of the same type + * when specifying the index, or referring to a object by an index. (i.e. + * use OMX_ALL to indicate all N channels). When used as a port index + * for a config or parameter this OMX_ALL denotes that the config or + * parameter applies to the entire component not just one port. */ +#define OMX_ALL 0xFFFFFFFF + +/** In the following we define groups that help building doxygen documentation */ + +/** @defgroup core OpenMAX IL core + * Functions and structure related to the OMX IL core + */ + + /** @defgroup comp OpenMAX IL component + * Functions and structure related to the OMX IL component + */ + +/** @defgroup rpm Resource and Policy Management + * Structures for resource and policy management of components + */ + +/** @defgroup buf Buffer Management + * Buffer handling functions and structures + */ + +/** @defgroup tun Tunneling + * @ingroup core comp + * Structures and functions to manage tunnels among component ports + */ + +/** @defgroup cp Content Pipes + * @ingroup core + */ + + /** @defgroup metadata Metadata handling + * + */ + +/** OMX_U8 is an 8 bit unsigned quantity that is byte aligned */ +typedef unsigned char OMX_U8; + +/** OMX_S8 is an 8 bit signed quantity that is byte aligned */ +typedef signed char OMX_S8; + +/** OMX_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */ +typedef unsigned short OMX_U16; + +/** OMX_S16 is a 16 bit signed quantity that is 16 bit word aligned */ +typedef signed short OMX_S16; + +/** OMX_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */ +typedef unsigned long OMX_U32; + +/** OMX_S32 is a 32 bit signed quantity that is 32 bit word aligned */ +typedef signed long OMX_S32; + + +/* Users with compilers that cannot accept the "long long" designation should + define the OMX_SKIP64BIT macro. It should be noted that this may cause + some components to fail to compile if the component was written to require + 64 bit integral types. However, these components would NOT compile anyway + since the compiler does not support the way the component was written. +*/ +#ifndef OMX_SKIP64BIT +#ifdef __SYMBIAN32__ +/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */ +typedef unsigned long long OMX_U64; + +/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */ +typedef signed long long OMX_S64; + +#elif defined(WIN32) + +/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */ +typedef unsigned __int64 OMX_U64; + +/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */ +typedef signed __int64 OMX_S64; + +#else /* WIN32 */ + +/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */ +typedef unsigned long long OMX_U64; + +/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */ +typedef signed long long OMX_S64; + +#endif /* WIN32 */ +#endif + + +/** The OMX_BOOL type is intended to be used to represent a true or a false + value when passing parameters to and from the OMX core and components. The + OMX_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary. + */ +typedef enum OMX_BOOL { + OMX_FALSE = 0, + OMX_TRUE = !OMX_FALSE, + OMX_BOOL_MAX = 0x7FFFFFFF +} OMX_BOOL; + +/** The OMX_PTR type is intended to be used to pass pointers between the OMX + applications and the OMX Core and components. This is a 32 bit pointer and + is aligned on a 32 bit boundary. + */ +typedef void* OMX_PTR; + +/** The OMX_STRING type is intended to be used to pass "C" type strings between + the application and the core and component. The OMX_STRING type is a 32 + bit pointer to a zero terminated string. The pointer is word aligned and + the string is byte aligned. + */ +typedef char* OMX_STRING; + +/** The OMX_BYTE type is intended to be used to pass arrays of bytes such as + buffers between the application and the component and core. The OMX_BYTE + type is a 32 bit pointer to a zero terminated string. The pointer is word + aligned and the string is byte aligned. + */ +typedef unsigned char* OMX_BYTE; + +/** OMX_UUIDTYPE is a very long unique identifier to uniquely identify + at runtime. This identifier should be generated by a component in a way + that guarantees that every instance of the identifier running on the system + is unique. */ +typedef unsigned char OMX_UUIDTYPE[128]; + +/** The OMX_DIRTYPE enumeration is used to indicate if a port is an input or + an output port. This enumeration is common across all component types. + */ +typedef enum OMX_DIRTYPE +{ + OMX_DirInput, /**< Port is an input port */ + OMX_DirOutput, /**< Port is an output port */ + OMX_DirMax = 0x7FFFFFFF +} OMX_DIRTYPE; + +/** The OMX_ENDIANTYPE enumeration is used to indicate the bit ordering + for numerical data (i.e. big endian, or little endian). + */ +typedef enum OMX_ENDIANTYPE +{ + OMX_EndianBig, /**< big endian */ + OMX_EndianLittle, /**< little endian */ + OMX_EndianMax = 0x7FFFFFFF +} OMX_ENDIANTYPE; + + +/** The OMX_NUMERICALDATATYPE enumeration is used to indicate if data + is signed or unsigned + */ +typedef enum OMX_NUMERICALDATATYPE +{ + OMX_NumericalDataSigned, /**< signed data */ + OMX_NumericalDataUnsigned, /**< unsigned data */ + OMX_NumercialDataMax = 0x7FFFFFFF +} OMX_NUMERICALDATATYPE; + + +/** Unsigned bounded value type */ +typedef struct OMX_BU32 { + OMX_U32 nValue; /**< actual value */ + OMX_U32 nMin; /**< minimum for value (i.e. nValue >= nMin) */ + OMX_U32 nMax; /**< maximum for value (i.e. nValue <= nMax) */ +} OMX_BU32; + + +/** Signed bounded value type */ +typedef struct OMX_BS32 { + OMX_S32 nValue; /**< actual value */ + OMX_S32 nMin; /**< minimum for value (i.e. nValue >= nMin) */ + OMX_S32 nMax; /**< maximum for value (i.e. nValue <= nMax) */ +} OMX_BS32; + + +/** Structure representing some time or duration in microseconds. This structure + * must be interpreted as a signed 64 bit value. The quantity is signed to accommodate + * negative deltas and preroll scenarios. The quantity is represented in microseconds + * to accomodate high resolution timestamps (e.g. DVD presentation timestamps based + * on a 90kHz clock) and to allow more accurate and synchronized delivery (e.g. + * individual audio samples delivered at 192 kHz). The quantity is 64 bit to + * accommodate a large dynamic range (signed 32 bit values would allow only for plus + * or minus 35 minutes). + * + * Implementations with limited precision may convert the signed 64 bit value to + * a signed 32 bit value internally but risk loss of precision. + */ +#ifndef OMX_SKIP64BIT +typedef OMX_S64 OMX_TICKS; +#else +typedef struct OMX_TICKS +{ + OMX_U32 nLowPart; /** low bits of the signed 64 bit tick value */ + OMX_U32 nHighPart; /** high bits of the signed 64 bit tick value */ +} OMX_TICKS; +#endif +#define OMX_TICKS_PER_SECOND 1000000 + +/** Define the public interface for the OMX Handle. The core will not use + this value internally, but the application should only use this value. + */ +typedef void* OMX_HANDLETYPE; + +typedef struct OMX_MARKTYPE +{ + OMX_HANDLETYPE hMarkTargetComponent; /**< The component that will + generate a mark event upon + processing the mark. */ + OMX_PTR pMarkData; /**< Application specific data associated with + the mark sent on a mark event to disambiguate + this mark from others. */ +} OMX_MARKTYPE; + + +/** OMX_NATIVE_DEVICETYPE is used to map a OMX video port to the + * platform & operating specific object used to reference the display + * or can be used by a audio port for native audio rendering */ +typedef void* OMX_NATIVE_DEVICETYPE; + +/** OMX_NATIVE_WINDOWTYPE is used to map a OMX video port to the + * platform & operating specific object used to reference the window */ +typedef void* OMX_NATIVE_WINDOWTYPE; + + +/** Define the OMX IL version that corresponds to this set of header files. + * We also define a combined version that can be used to write or compare + * values of the 32bit nVersion field, assuming a little endian architecture */ +#define OMX_VERSION_MAJOR 1 +#define OMX_VERSION_MINOR 1 +#define OMX_VERSION_REVISION 2 +#define OMX_VERSION_STEP 0 + +#define OMX_VERSION ((OMX_VERSION_STEP<<24) | (OMX_VERSION_REVISION<<16) | (OMX_VERSION_MINOR<<8) | OMX_VERSION_MAJOR) + + +/** The OMX_VERSIONTYPE union is used to specify the version for + a structure or component. For a component, the version is entirely + specified by the component vendor. Components doing the same function + from different vendors may or may not have the same version. For + structures, the version shall be set by the entity that allocates the + structure. For structures specified in the OMX 1.1 specification, the + value of the version shall be set to 1.1.0.0 in all cases. Access to the + OMX_VERSIONTYPE can be by a single 32 bit access (e.g. by nVersion) or + by accessing one of the structure elements to, for example, check only + the Major revision. + */ +typedef union OMX_VERSIONTYPE +{ + struct + { + OMX_U8 nVersionMajor; /**< Major version accessor element */ + OMX_U8 nVersionMinor; /**< Minor version accessor element */ + OMX_U8 nRevision; /**< Revision version accessor element */ + OMX_U8 nStep; /**< Step version accessor element */ + } s; + OMX_U32 nVersion; /**< 32 bit value to make accessing the + version easily done in a single word + size copy/compare operation */ +} OMX_VERSIONTYPE; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/OMX_Video.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/OMX_Video.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1060 @@ +/** + * Copyright (c) 2008 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject + * to the following conditions: + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ + +/** + * @file OMX_Video.h - OpenMax IL version 1.1.2 + * The structures is needed by Video components to exchange parameters + * and configuration data with OMX components. + */ +#ifndef OMX_Video_h +#define OMX_Video_h + +/** @defgroup video OpenMAX IL Video Domain + * @ingroup iv + * Structures for OpenMAX IL Video domain + * @{ + */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/** + * Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ + +#include + + +/** + * Enumeration used to define the possible video compression codings. + * NOTE: This essentially refers to file extensions. If the coding is + * being used to specify the ENCODE type, then additional work + * must be done to configure the exact flavor of the compression + * to be used. For decode cases where the user application can + * not differentiate between MPEG-4 and H.264 bit streams, it is + * up to the codec to handle this. + */ +typedef enum OMX_VIDEO_CODINGTYPE { + OMX_VIDEO_CodingUnused, /**< Value when coding is N/A */ + OMX_VIDEO_CodingAutoDetect, /**< Autodetection of coding type */ + OMX_VIDEO_CodingMPEG2, /**< AKA: H.262 */ + OMX_VIDEO_CodingH263, /**< H.263 */ + OMX_VIDEO_CodingMPEG4, /**< MPEG-4 */ + OMX_VIDEO_CodingWMV, /**< all versions of Windows Media Video */ + OMX_VIDEO_CodingRV, /**< all versions of Real Video */ + OMX_VIDEO_CodingAVC, /**< H.264/AVC */ + OMX_VIDEO_CodingMJPEG, /**< Motion JPEG */ + OMX_VIDEO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_CodingMax = 0x7FFFFFFF +} OMX_VIDEO_CODINGTYPE; + + +/** + * Data structure used to define a video path. The number of Video paths for + * input and output will vary by type of the Video component. + * + * Input (aka Source) : zero Inputs, one Output, + * Splitter : one Input, 2 or more Outputs, + * Processing Element : one Input, one output, + * Mixer : 2 or more inputs, one output, + * Output (aka Sink) : one Input, zero outputs. + * + * The PortDefinition structure is used to define all of the parameters + * necessary for the compliant component to setup an input or an output video + * path. If additional vendor specific data is required, it should be + * transmitted to the component using the CustomCommand function. Compliant + * components will prepopulate this structure with optimal values during the + * GetDefaultInitParams command. + * + * STRUCT MEMBERS: + * cMIMEType : MIME type of data for the port + * pNativeRender : Platform specific reference for a display if a + * sync, otherwise this field is 0 + * nFrameWidth : Width of frame to be used on channel if + * uncompressed format is used. Use 0 for unknown, + * don't care or variable + * nFrameHeight : Height of frame to be used on channel if + * uncompressed format is used. Use 0 for unknown, + * don't care or variable + * nStride : Number of bytes per span of an image + * (i.e. indicates the number of bytes to get + * from span N to span N+1, where negative stride + * indicates the image is bottom up + * nSliceHeight : Height used when encoding in slices + * nBitrate : Bit rate of frame to be used on channel if + * compressed format is used. Use 0 for unknown, + * don't care or variable + * xFramerate : Frame rate to be used on channel if uncompressed + * format is used. Use 0 for unknown, don't care or + * variable. Units are Q16 frames per second. + * bFlagErrorConcealment : Turns on error concealment if it is supported by + * the OMX component + * eCompressionFormat : Compression format used in this instance of the + * component. When OMX_VIDEO_CodingUnused is + * specified, eColorFormat is used + * eColorFormat : Decompressed format used by this component + * pNativeWindow : Platform specific reference for a window object if a + * display sink , otherwise this field is 0x0. + */ +typedef struct OMX_VIDEO_PORTDEFINITIONTYPE { + OMX_STRING cMIMEType; + OMX_NATIVE_DEVICETYPE pNativeRender; + OMX_U32 nFrameWidth; + OMX_U32 nFrameHeight; + OMX_S32 nStride; + OMX_U32 nSliceHeight; + OMX_U32 nBitrate; + OMX_U32 xFramerate; + OMX_BOOL bFlagErrorConcealment; + OMX_VIDEO_CODINGTYPE eCompressionFormat; + OMX_COLOR_FORMATTYPE eColorFormat; + OMX_NATIVE_WINDOWTYPE pNativeWindow; +} OMX_VIDEO_PORTDEFINITIONTYPE; + +/** + * Port format parameter. This structure is used to enumerate the various + * data input/output format supported by the port. + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Indicates which port to set + * nIndex : Indicates the enumeration index for the format from + * 0x0 to N-1 + * eCompressionFormat : Compression format used in this instance of the + * component. When OMX_VIDEO_CodingUnused is specified, + * eColorFormat is used + * eColorFormat : Decompressed format used by this component + * xFrameRate : Indicates the video frame rate in Q16 format + */ +typedef struct OMX_VIDEO_PARAM_PORTFORMATTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nIndex; + OMX_VIDEO_CODINGTYPE eCompressionFormat; + OMX_COLOR_FORMATTYPE eColorFormat; + OMX_U32 xFramerate; +} OMX_VIDEO_PARAM_PORTFORMATTYPE; + + +/** + * This is a structure for configuring video compression quantization + * parameter values. Codecs may support different QP values for different + * frame types. + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version info + * nPortIndex : Port that this structure applies to + * nQpI : QP value to use for index frames + * nQpP : QP value to use for P frames + * nQpB : QP values to use for bidirectional frames + */ +typedef struct OMX_VIDEO_PARAM_QUANTIZATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nQpI; + OMX_U32 nQpP; + OMX_U32 nQpB; +} OMX_VIDEO_PARAM_QUANTIZATIONTYPE; + + +/** + * Structure for configuration of video fast update parameters. + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version info + * nPortIndex : Port that this structure applies to + * bEnableVFU : Enable/Disable video fast update + * nFirstGOB : Specifies the number of the first macroblock row + * nFirstMB : specifies the first MB relative to the specified first GOB + * nNumMBs : Specifies the number of MBs to be refreshed from nFirstGOB + * and nFirstMB + */ +typedef struct OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnableVFU; + OMX_U32 nFirstGOB; + OMX_U32 nFirstMB; + OMX_U32 nNumMBs; +} OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE; + + +/** + * Enumeration of possible bitrate control types + */ +typedef enum OMX_VIDEO_CONTROLRATETYPE { + OMX_Video_ControlRateDisable, + OMX_Video_ControlRateVariable, + OMX_Video_ControlRateConstant, + OMX_Video_ControlRateVariableSkipFrames, + OMX_Video_ControlRateConstantSkipFrames, + OMX_Video_ControlRateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_Video_ControlRateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_Video_ControlRateMax = 0x7FFFFFFF +} OMX_VIDEO_CONTROLRATETYPE; + + +/** + * Structure for configuring bitrate mode of a codec. + * + * STRUCT MEMBERS: + * nSize : Size of the struct in bytes + * nVersion : OMX spec version info + * nPortIndex : Port that this struct applies to + * eControlRate : Control rate type enum + * nTargetBitrate : Target bitrate to encode with + */ +typedef struct OMX_VIDEO_PARAM_BITRATETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_VIDEO_CONTROLRATETYPE eControlRate; + OMX_U32 nTargetBitrate; +} OMX_VIDEO_PARAM_BITRATETYPE; + + +/** + * Enumeration of possible motion vector (MV) types + */ +typedef enum OMX_VIDEO_MOTIONVECTORTYPE { + OMX_Video_MotionVectorPixel, + OMX_Video_MotionVectorHalfPel, + OMX_Video_MotionVectorQuarterPel, + OMX_Video_MotionVectorEighthPel, + OMX_Video_MotionVectorKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_Video_MotionVectorVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_Video_MotionVectorMax = 0x7FFFFFFF +} OMX_VIDEO_MOTIONVECTORTYPE; + + +/** + * Structure for configuring the number of motion vectors used as well + * as their accuracy. + * + * STRUCT MEMBERS: + * nSize : Size of the struct in bytes + * nVersion : OMX spec version info + * nPortIndex : port that this structure applies to + * eAccuracy : Enumerated MV accuracy + * bUnrestrictedMVs : Allow unrestricted MVs + * bFourMV : Allow use of 4 MVs + * sXSearchRange : Search range in horizontal direction for MVs + * sYSearchRange : Search range in vertical direction for MVs + */ +typedef struct OMX_VIDEO_PARAM_MOTIONVECTORTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_VIDEO_MOTIONVECTORTYPE eAccuracy; + OMX_BOOL bUnrestrictedMVs; + OMX_BOOL bFourMV; + OMX_S32 sXSearchRange; + OMX_S32 sYSearchRange; +} OMX_VIDEO_PARAM_MOTIONVECTORTYPE; + + +/** + * Enumeration of possible methods to use for Intra Refresh + */ +typedef enum OMX_VIDEO_INTRAREFRESHTYPE { + OMX_VIDEO_IntraRefreshCyclic, + OMX_VIDEO_IntraRefreshAdaptive, + OMX_VIDEO_IntraRefreshBoth, + OMX_VIDEO_IntraRefreshKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_IntraRefreshVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_IntraRefreshMax = 0x7FFFFFFF +} OMX_VIDEO_INTRAREFRESHTYPE; + + +/** + * Structure for configuring intra refresh mode + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eRefreshMode : Cyclic, Adaptive, or Both + * nAirMBs : Number of intra macroblocks to refresh in a frame when + * AIR is enabled + * nAirRef : Number of times a motion marked macroblock has to be + * intra coded + * nCirMBs : Number of consecutive macroblocks to be coded as "intra" + * when CIR is enabled + */ +typedef struct OMX_VIDEO_PARAM_INTRAREFRESHTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_VIDEO_INTRAREFRESHTYPE eRefreshMode; + OMX_U32 nAirMBs; + OMX_U32 nAirRef; + OMX_U32 nCirMBs; +} OMX_VIDEO_PARAM_INTRAREFRESHTYPE; + + +/** + * Structure for enabling various error correction methods for video + * compression. + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * bEnableHEC : Enable/disable header extension codes (HEC) + * bEnableResync : Enable/disable resynchronization markers + * nResynchMarkerSpacing : Resynch markers interval (in bits) to be + * applied in the stream + * bEnableDataPartitioning : Enable/disable data partitioning + * bEnableRVLC : Enable/disable reversible variable length + * coding + */ +typedef struct OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnableHEC; + OMX_BOOL bEnableResync; + OMX_U32 nResynchMarkerSpacing; + OMX_BOOL bEnableDataPartitioning; + OMX_BOOL bEnableRVLC; +} OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE; + + +/** + * Configuration of variable block-size motion compensation (VBSMC) + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * b16x16 : Enable inter block search 16x16 + * b16x8 : Enable inter block search 16x8 + * b8x16 : Enable inter block search 8x16 + * b8x8 : Enable inter block search 8x8 + * b8x4 : Enable inter block search 8x4 + * b4x8 : Enable inter block search 4x8 + * b4x4 : Enable inter block search 4x4 + */ +typedef struct OMX_VIDEO_PARAM_VBSMCTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL b16x16; + OMX_BOOL b16x8; + OMX_BOOL b8x16; + OMX_BOOL b8x8; + OMX_BOOL b8x4; + OMX_BOOL b4x8; + OMX_BOOL b4x4; +} OMX_VIDEO_PARAM_VBSMCTYPE; + + +/** + * H.263 profile types, each profile indicates support for various + * performance bounds and different annexes. + * + * ENUMS: + * Baseline : Baseline Profile: H.263 (V1), no optional modes + * H320 Coding : H.320 Coding Efficiency Backward Compatibility + * Profile: H.263+ (V2), includes annexes I, J, L.4 + * and T + * BackwardCompatible : Backward Compatibility Profile: H.263 (V1), + * includes annex F + * ISWV2 : Interactive Streaming Wireless Profile: H.263+ + * (V2), includes annexes I, J, K and T + * ISWV3 : Interactive Streaming Wireless Profile: H.263++ + * (V3), includes profile 3 and annexes V and W.6.3.8 + * HighCompression : Conversational High Compression Profile: H.263++ + * (V3), includes profiles 1 & 2 and annexes D and U + * Internet : Conversational Internet Profile: H.263++ (V3), + * includes profile 5 and annex K + * Interlace : Conversational Interlace Profile: H.263++ (V3), + * includes profile 5 and annex W.6.3.11 + * HighLatency : High Latency Profile: H.263++ (V3), includes + * profile 6 and annexes O.1 and P.5 + */ +typedef enum OMX_VIDEO_H263PROFILETYPE { + OMX_VIDEO_H263ProfileBaseline = 0x01, + OMX_VIDEO_H263ProfileH320Coding = 0x02, + OMX_VIDEO_H263ProfileBackwardCompatible = 0x04, + OMX_VIDEO_H263ProfileISWV2 = 0x08, + OMX_VIDEO_H263ProfileISWV3 = 0x10, + OMX_VIDEO_H263ProfileHighCompression = 0x20, + OMX_VIDEO_H263ProfileInternet = 0x40, + OMX_VIDEO_H263ProfileInterlace = 0x80, + OMX_VIDEO_H263ProfileHighLatency = 0x100, + OMX_VIDEO_H263ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_H263ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_H263ProfileMax = 0x7FFFFFFF +} OMX_VIDEO_H263PROFILETYPE; + + +/** + * H.263 level types, each level indicates support for various frame sizes, + * bit rates, decoder frame rates. + */ +typedef enum OMX_VIDEO_H263LEVELTYPE { + OMX_VIDEO_H263Level10 = 0x01, + OMX_VIDEO_H263Level20 = 0x02, + OMX_VIDEO_H263Level30 = 0x04, + OMX_VIDEO_H263Level40 = 0x08, + OMX_VIDEO_H263Level45 = 0x10, + OMX_VIDEO_H263Level50 = 0x20, + OMX_VIDEO_H263Level60 = 0x40, + OMX_VIDEO_H263Level70 = 0x80, + OMX_VIDEO_H263LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_H263LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_H263LevelMax = 0x7FFFFFFF +} OMX_VIDEO_H263LEVELTYPE; + + +/** + * Specifies the picture type. These values should be OR'd to signal all + * pictures types which are allowed. + * + * ENUMS: + * Generic Picture Types: I, P and B + * H.263 Specific Picture Types: SI and SP + * H.264 Specific Picture Types: EI and EP + * MPEG-4 Specific Picture Types: S + */ +typedef enum OMX_VIDEO_PICTURETYPE { + OMX_VIDEO_PictureTypeI = 0x01, + OMX_VIDEO_PictureTypeP = 0x02, + OMX_VIDEO_PictureTypeB = 0x04, + OMX_VIDEO_PictureTypeSI = 0x08, + OMX_VIDEO_PictureTypeSP = 0x10, + OMX_VIDEO_PictureTypeEI = 0x11, + OMX_VIDEO_PictureTypeEP = 0x12, + OMX_VIDEO_PictureTypeS = 0x14, + OMX_VIDEO_PictureTypeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_PictureTypeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_PictureTypeMax = 0x7FFFFFFF +} OMX_VIDEO_PICTURETYPE; + + +/** + * H.263 Params + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nPFrames : Number of P frames between each I frame + * nBFrames : Number of B frames between each I frame + * eProfile : H.263 profile(s) to use + * eLevel : H.263 level(s) to use + * bPLUSPTYPEAllowed : Indicating that it is allowed to use PLUSPTYPE + * (specified in the 1998 version of H.263) to + * indicate custom picture sizes or clock + * frequencies + * nAllowedPictureTypes : Specifies the picture types allowed in the + * bitstream + * bForceRoundingTypeToZero : value of the RTYPE bit (bit 6 of MPPTYPE) is + * not constrained. It is recommended to change + * the value of the RTYPE bit for each reference + * picture in error-free communication + * nPictureHeaderRepetition : Specifies the frequency of picture header + * repetition + * nGOBHeaderInterval : Specifies the interval of non-empty GOB + * headers in units of GOBs + */ +typedef struct OMX_VIDEO_PARAM_H263TYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nPFrames; + OMX_U32 nBFrames; + OMX_VIDEO_H263PROFILETYPE eProfile; + OMX_VIDEO_H263LEVELTYPE eLevel; + OMX_BOOL bPLUSPTYPEAllowed; + OMX_U32 nAllowedPictureTypes; + OMX_BOOL bForceRoundingTypeToZero; + OMX_U32 nPictureHeaderRepetition; + OMX_U32 nGOBHeaderInterval; +} OMX_VIDEO_PARAM_H263TYPE; + + +/** + * MPEG-2 profile types, each profile indicates support for various + * performance bounds and different annexes. + */ +typedef enum OMX_VIDEO_MPEG2PROFILETYPE { + OMX_VIDEO_MPEG2ProfileSimple = 0, /**< Simple Profile */ + OMX_VIDEO_MPEG2ProfileMain, /**< Main Profile */ + OMX_VIDEO_MPEG2Profile422, /**< 4:2:2 Profile */ + OMX_VIDEO_MPEG2ProfileSNR, /**< SNR Profile */ + OMX_VIDEO_MPEG2ProfileSpatial, /**< Spatial Profile */ + OMX_VIDEO_MPEG2ProfileHigh, /**< High Profile */ + OMX_VIDEO_MPEG2ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_MPEG2ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_MPEG2ProfileMax = 0x7FFFFFFF +} OMX_VIDEO_MPEG2PROFILETYPE; + + +/** + * MPEG-2 level types, each level indicates support for various frame + * sizes, bit rates, decoder frame rates. No need + */ +typedef enum OMX_VIDEO_MPEG2LEVELTYPE { + OMX_VIDEO_MPEG2LevelLL = 0, /**< Low Level */ + OMX_VIDEO_MPEG2LevelML, /**< Main Level */ + OMX_VIDEO_MPEG2LevelH14, /**< High 1440 */ + OMX_VIDEO_MPEG2LevelHL, /**< High Level */ + OMX_VIDEO_MPEG2LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_MPEG2LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_MPEG2LevelMax = 0x7FFFFFFF +} OMX_VIDEO_MPEG2LEVELTYPE; + + +/** + * MPEG-2 params + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nPFrames : Number of P frames between each I frame + * nBFrames : Number of B frames between each I frame + * eProfile : MPEG-2 profile(s) to use + * eLevel : MPEG-2 levels(s) to use + */ +typedef struct OMX_VIDEO_PARAM_MPEG2TYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nPFrames; + OMX_U32 nBFrames; + OMX_VIDEO_MPEG2PROFILETYPE eProfile; + OMX_VIDEO_MPEG2LEVELTYPE eLevel; +} OMX_VIDEO_PARAM_MPEG2TYPE; + + +/** + * MPEG-4 profile types, each profile indicates support for various + * performance bounds and different annexes. + * + * ENUMS: + * - Simple Profile, Levels 1-3 + * - Simple Scalable Profile, Levels 1-2 + * - Core Profile, Levels 1-2 + * - Main Profile, Levels 2-4 + * - N-bit Profile, Level 2 + * - Scalable Texture Profile, Level 1 + * - Simple Face Animation Profile, Levels 1-2 + * - Simple Face and Body Animation (FBA) Profile, Levels 1-2 + * - Basic Animated Texture Profile, Levels 1-2 + * - Hybrid Profile, Levels 1-2 + * - Advanced Real Time Simple Profiles, Levels 1-4 + * - Core Scalable Profile, Levels 1-3 + * - Advanced Coding Efficiency Profile, Levels 1-4 + * - Advanced Core Profile, Levels 1-2 + * - Advanced Scalable Texture, Levels 2-3 + */ +typedef enum OMX_VIDEO_MPEG4PROFILETYPE { + OMX_VIDEO_MPEG4ProfileSimple = 0x01, + OMX_VIDEO_MPEG4ProfileSimpleScalable = 0x02, + OMX_VIDEO_MPEG4ProfileCore = 0x04, + OMX_VIDEO_MPEG4ProfileMain = 0x08, + OMX_VIDEO_MPEG4ProfileNbit = 0x10, + OMX_VIDEO_MPEG4ProfileScalableTexture = 0x20, + OMX_VIDEO_MPEG4ProfileSimpleFace = 0x40, + OMX_VIDEO_MPEG4ProfileSimpleFBA = 0x80, + OMX_VIDEO_MPEG4ProfileBasicAnimated = 0x100, + OMX_VIDEO_MPEG4ProfileHybrid = 0x200, + OMX_VIDEO_MPEG4ProfileAdvancedRealTime = 0x400, + OMX_VIDEO_MPEG4ProfileCoreScalable = 0x800, + OMX_VIDEO_MPEG4ProfileAdvancedCoding = 0x1000, + OMX_VIDEO_MPEG4ProfileAdvancedCore = 0x2000, + OMX_VIDEO_MPEG4ProfileAdvancedScalable = 0x4000, + OMX_VIDEO_MPEG4ProfileAdvancedSimple = 0x8000, + OMX_VIDEO_MPEG4ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_MPEG4ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_MPEG4ProfileMax = 0x7FFFFFFF +} OMX_VIDEO_MPEG4PROFILETYPE; + + +/** + * MPEG-4 level types, each level indicates support for various frame + * sizes, bit rates, decoder frame rates. No need + */ +typedef enum OMX_VIDEO_MPEG4LEVELTYPE { + OMX_VIDEO_MPEG4Level0 = 0x01, /**< Level 0 */ + OMX_VIDEO_MPEG4Level0b = 0x02, /**< Level 0b */ + OMX_VIDEO_MPEG4Level1 = 0x04, /**< Level 1 */ + OMX_VIDEO_MPEG4Level2 = 0x08, /**< Level 2 */ + OMX_VIDEO_MPEG4Level3 = 0x10, /**< Level 3 */ + OMX_VIDEO_MPEG4Level4 = 0x20, /**< Level 4 */ + OMX_VIDEO_MPEG4Level4a = 0x40, /**< Level 4a */ + OMX_VIDEO_MPEG4Level5 = 0x80, /**< Level 5 */ + OMX_VIDEO_MPEG4LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_MPEG4LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_MPEG4LevelMax = 0x7FFFFFFF +} OMX_VIDEO_MPEG4LEVELTYPE; + + +/** + * MPEG-4 configuration. This structure handles configuration options + * which are specific to MPEG4 algorithms + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nSliceHeaderSpacing : Number of macroblocks between slice header (H263+ + * Annex K). Put zero if not used + * bSVH : Enable Short Video Header mode + * bGov : Flag to enable GOV + * nPFrames : Number of P frames between each I frame (also called + * GOV period) + * nBFrames : Number of B frames between each I frame + * nIDCVLCThreshold : Value of intra DC VLC threshold + * bACPred : Flag to use ac prediction + * nMaxPacketSize : Maximum size of packet in bytes. + * nTimeIncRes : Used to pass VOP time increment resolution for MPEG4. + * Interpreted as described in MPEG4 standard. + * eProfile : MPEG-4 profile(s) to use. + * eLevel : MPEG-4 level(s) to use. + * nAllowedPictureTypes : Specifies the picture types allowed in the bitstream + * nHeaderExtension : Specifies the number of consecutive video packet + * headers within a VOP + * bReversibleVLC : Specifies whether reversible variable length coding + * is in use + */ +typedef struct OMX_VIDEO_PARAM_MPEG4TYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nSliceHeaderSpacing; + OMX_BOOL bSVH; + OMX_BOOL bGov; + OMX_U32 nPFrames; + OMX_U32 nBFrames; + OMX_U32 nIDCVLCThreshold; + OMX_BOOL bACPred; + OMX_U32 nMaxPacketSize; + OMX_U32 nTimeIncRes; + OMX_VIDEO_MPEG4PROFILETYPE eProfile; + OMX_VIDEO_MPEG4LEVELTYPE eLevel; + OMX_U32 nAllowedPictureTypes; + OMX_U32 nHeaderExtension; + OMX_BOOL bReversibleVLC; +} OMX_VIDEO_PARAM_MPEG4TYPE; + + +/** + * WMV Versions + */ +typedef enum OMX_VIDEO_WMVFORMATTYPE { + OMX_VIDEO_WMVFormatUnused = 0x01, /**< Format unused or unknown */ + OMX_VIDEO_WMVFormat7 = 0x02, /**< Windows Media Video format 7 */ + OMX_VIDEO_WMVFormat8 = 0x04, /**< Windows Media Video format 8 */ + OMX_VIDEO_WMVFormat9 = 0x08, /**< Windows Media Video format 9 */ + OMX_VIDEO_WMFFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_WMFFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_WMVFormatMax = 0x7FFFFFFF +} OMX_VIDEO_WMVFORMATTYPE; + + +/** + * WMV Params + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eFormat : Version of WMV stream / data + */ +typedef struct OMX_VIDEO_PARAM_WMVTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_VIDEO_WMVFORMATTYPE eFormat; +} OMX_VIDEO_PARAM_WMVTYPE; + + +/** + * Real Video Version + */ +typedef enum OMX_VIDEO_RVFORMATTYPE { + OMX_VIDEO_RVFormatUnused = 0, /**< Format unused or unknown */ + OMX_VIDEO_RVFormat8, /**< Real Video format 8 */ + OMX_VIDEO_RVFormat9, /**< Real Video format 9 */ + OMX_VIDEO_RVFormatG2, /**< Real Video Format G2 */ + OMX_VIDEO_RVFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_RVFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_RVFormatMax = 0x7FFFFFFF +} OMX_VIDEO_RVFORMATTYPE; + + +/** + * Real Video Params + * + * STUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * eFormat : Version of RV stream / data + * nBitsPerPixel : Bits per pixel coded in the frame + * nPaddedWidth : Padded width in pixel of a video frame + * nPaddedHeight : Padded Height in pixels of a video frame + * nFrameRate : Rate of video in frames per second + * nBitstreamFlags : Flags which internal information about the bitstream + * nBitstreamVersion : Bitstream version + * nMaxEncodeFrameSize: Max encoded frame size + * bEnablePostFilter : Turn on/off post filter + * bEnableTemporalInterpolation : Turn on/off temporal interpolation + * bEnableLatencyMode : When enabled, the decoder does not display a decoded + * frame until it has detected that no enhancement layer + * frames or dependent B frames will be coming. This + * detection usually occurs when a subsequent non-B + * frame is encountered + */ +typedef struct OMX_VIDEO_PARAM_RVTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_VIDEO_RVFORMATTYPE eFormat; + OMX_U16 nBitsPerPixel; + OMX_U16 nPaddedWidth; + OMX_U16 nPaddedHeight; + OMX_U32 nFrameRate; + OMX_U32 nBitstreamFlags; + OMX_U32 nBitstreamVersion; + OMX_U32 nMaxEncodeFrameSize; + OMX_BOOL bEnablePostFilter; + OMX_BOOL bEnableTemporalInterpolation; + OMX_BOOL bEnableLatencyMode; +} OMX_VIDEO_PARAM_RVTYPE; + + +/** + * AVC profile types, each profile indicates support for various + * performance bounds and different annexes. + */ +typedef enum OMX_VIDEO_AVCPROFILETYPE { + OMX_VIDEO_AVCProfileBaseline = 0x01, /**< Baseline profile */ + OMX_VIDEO_AVCProfileMain = 0x02, /**< Main profile */ + OMX_VIDEO_AVCProfileExtended = 0x04, /**< Extended profile */ + OMX_VIDEO_AVCProfileHigh = 0x08, /**< High profile */ + OMX_VIDEO_AVCProfileHigh10 = 0x10, /**< High 10 profile */ + OMX_VIDEO_AVCProfileHigh422 = 0x20, /**< High 4:2:2 profile */ + OMX_VIDEO_AVCProfileHigh444 = 0x40, /**< High 4:4:4 profile */ + OMX_VIDEO_AVCProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_AVCProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_AVCProfileMax = 0x7FFFFFFF +} OMX_VIDEO_AVCPROFILETYPE; + + +/** + * AVC level types, each level indicates support for various frame sizes, + * bit rates, decoder frame rates. No need + */ +typedef enum OMX_VIDEO_AVCLEVELTYPE { + OMX_VIDEO_AVCLevel1 = 0x01, /**< Level 1 */ + OMX_VIDEO_AVCLevel1b = 0x02, /**< Level 1b */ + OMX_VIDEO_AVCLevel11 = 0x04, /**< Level 1.1 */ + OMX_VIDEO_AVCLevel12 = 0x08, /**< Level 1.2 */ + OMX_VIDEO_AVCLevel13 = 0x10, /**< Level 1.3 */ + OMX_VIDEO_AVCLevel2 = 0x20, /**< Level 2 */ + OMX_VIDEO_AVCLevel21 = 0x40, /**< Level 2.1 */ + OMX_VIDEO_AVCLevel22 = 0x80, /**< Level 2.2 */ + OMX_VIDEO_AVCLevel3 = 0x100, /**< Level 3 */ + OMX_VIDEO_AVCLevel31 = 0x200, /**< Level 3.1 */ + OMX_VIDEO_AVCLevel32 = 0x400, /**< Level 3.2 */ + OMX_VIDEO_AVCLevel4 = 0x800, /**< Level 4 */ + OMX_VIDEO_AVCLevel41 = 0x1000, /**< Level 4.1 */ + OMX_VIDEO_AVCLevel42 = 0x2000, /**< Level 4.2 */ + OMX_VIDEO_AVCLevel5 = 0x4000, /**< Level 5 */ + OMX_VIDEO_AVCLevel51 = 0x8000, /**< Level 5.1 */ + OMX_VIDEO_AVCLevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_AVCLevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_AVCLevelMax = 0x7FFFFFFF +} OMX_VIDEO_AVCLEVELTYPE; + + +/** + * AVC loop filter modes + * + * OMX_VIDEO_AVCLoopFilterEnable : Enable + * OMX_VIDEO_AVCLoopFilterDisable : Disable + * OMX_VIDEO_AVCLoopFilterDisableSliceBoundary : Disabled on slice boundaries + */ +typedef enum OMX_VIDEO_AVCLOOPFILTERTYPE { + OMX_VIDEO_AVCLoopFilterEnable = 0, + OMX_VIDEO_AVCLoopFilterDisable, + OMX_VIDEO_AVCLoopFilterDisableSliceBoundary, + OMX_VIDEO_AVCLoopFilterKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_AVCLoopFilterVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_AVCLoopFilterMax = 0x7FFFFFFF +} OMX_VIDEO_AVCLOOPFILTERTYPE; + + +/** + * AVC params + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nSliceHeaderSpacing : Number of macroblocks between slice header, put + * zero if not used + * nPFrames : Number of P frames between each I frame + * nBFrames : Number of B frames between each I frame + * bUseHadamard : Enable/disable Hadamard transform + * nRefFrames : Max number of reference frames to use for inter + * motion search (1-16) + * nRefIdxTrailing : Pic param set ref frame index (index into ref + * frame buffer of trailing frames list), B frame + * support + * nRefIdxForward : Pic param set ref frame index (index into ref + * frame buffer of forward frames list), B frame + * support + * bEnableUEP : Enable/disable unequal error protection. This + * is only valid of data partitioning is enabled. + * bEnableFMO : Enable/disable flexible macroblock ordering + * bEnableASO : Enable/disable arbitrary slice ordering + * bEnableRS : Enable/disable sending of redundant slices + * eProfile : AVC profile(s) to use + * eLevel : AVC level(s) to use + * nAllowedPictureTypes : Specifies the picture types allowed in the + * bitstream + * bFrameMBsOnly : specifies that every coded picture of the + * coded video sequence is a coded frame + * containing only frame macroblocks + * bMBAFF : Enable/disable switching between frame and + * field macroblocks within a picture + * bEntropyCodingCABAC : Entropy decoding method to be applied for the + * syntax elements for which two descriptors appear + * in the syntax tables + * bWeightedPPrediction : Enable/disable weighted prediction shall not + * be applied to P and SP slices + * nWeightedBipredicitonMode : Default weighted prediction is applied to B + * slices + * bconstIpred : Enable/disable intra prediction + * bDirect8x8Inference : Specifies the method used in the derivation + * process for luma motion vectors for B_Skip, + * B_Direct_16x16 and B_Direct_8x8 as specified + * in subclause 8.4.1.2 of the AVC spec + * bDirectSpatialTemporal : Flag indicating spatial or temporal direct + * mode used in B slice coding (related to + * bDirect8x8Inference) . Spatial direct mode is + * more common and should be the default. + * nCabacInitIdx : Index used to init CABAC contexts + * eLoopFilterMode : Enable/disable loop filter + */ +typedef struct OMX_VIDEO_PARAM_AVCTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nSliceHeaderSpacing; + OMX_U32 nPFrames; + OMX_U32 nBFrames; + OMX_BOOL bUseHadamard; + OMX_U32 nRefFrames; + OMX_U32 nRefIdx10ActiveMinus1; + OMX_U32 nRefIdx11ActiveMinus1; + OMX_BOOL bEnableUEP; + OMX_BOOL bEnableFMO; + OMX_BOOL bEnableASO; + OMX_BOOL bEnableRS; + OMX_VIDEO_AVCPROFILETYPE eProfile; + OMX_VIDEO_AVCLEVELTYPE eLevel; + OMX_U32 nAllowedPictureTypes; + OMX_BOOL bFrameMBsOnly; + OMX_BOOL bMBAFF; + OMX_BOOL bEntropyCodingCABAC; + OMX_BOOL bWeightedPPrediction; + OMX_U32 nWeightedBipredicitonMode; + OMX_BOOL bconstIpred ; + OMX_BOOL bDirect8x8Inference; + OMX_BOOL bDirectSpatialTemporal; + OMX_U32 nCabacInitIdc; + OMX_VIDEO_AVCLOOPFILTERTYPE eLoopFilterMode; +} OMX_VIDEO_PARAM_AVCTYPE; + +typedef struct OMX_VIDEO_PARAM_PROFILELEVELTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 eProfile; /**< type is OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263PROFILETYPE, + or OMX_VIDEO_MPEG4PROFILETYPE depending on context */ + OMX_U32 eLevel; /**< type is OMX_VIDEO_AVCLEVELTYPE, OMX_VIDEO_H263LEVELTYPE, + or OMX_VIDEO_MPEG4PROFILETYPE depending on context */ + OMX_U32 nProfileIndex; /**< Used to query for individual profile support information, + This parameter is valid only for + OMX_IndexParamVideoProfileLevelQuerySupported index, + For all other indices this parameter is to be ignored. */ +} OMX_VIDEO_PARAM_PROFILELEVELTYPE; + +/** + * Structure for dynamically configuring bitrate mode of a codec. + * + * STRUCT MEMBERS: + * nSize : Size of the struct in bytes + * nVersion : OMX spec version info + * nPortIndex : Port that this struct applies to + * nEncodeBitrate : Target average bitrate to be generated in bps + */ +typedef struct OMX_VIDEO_CONFIG_BITRATETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nEncodeBitrate; +} OMX_VIDEO_CONFIG_BITRATETYPE; + +/** + * Defines Encoder Frame Rate setting + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * xEncodeFramerate : Encoding framerate represented in Q16 format + */ +typedef struct OMX_CONFIG_FRAMERATETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 xEncodeFramerate; /* Q16 format */ +} OMX_CONFIG_FRAMERATETYPE; + +typedef struct OMX_CONFIG_INTRAREFRESHVOPTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL IntraRefreshVOP; +} OMX_CONFIG_INTRAREFRESHVOPTYPE; + +typedef struct OMX_CONFIG_MACROBLOCKERRORMAPTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nErrMapSize; /* Size of the Error Map in bytes */ + OMX_U8 ErrMap[1]; /* Error map hint */ +} OMX_CONFIG_MACROBLOCKERRORMAPTYPE; + +typedef struct OMX_CONFIG_MBERRORREPORTINGTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnabled; +} OMX_CONFIG_MBERRORREPORTINGTYPE; + +typedef struct OMX_PARAM_MACROBLOCKSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nMacroblocks; +} OMX_PARAM_MACROBLOCKSTYPE; + +/** + * AVC Slice Mode modes + * + * OMX_VIDEO_SLICEMODE_AVCDefault : Normal frame encoding, one slice per frame + * OMX_VIDEO_SLICEMODE_AVCMBSlice : NAL mode, number of MBs per frame + * OMX_VIDEO_SLICEMODE_AVCByteSlice : NAL mode, number of bytes per frame + */ +typedef enum OMX_VIDEO_AVCSLICEMODETYPE { + OMX_VIDEO_SLICEMODE_AVCDefault = 0, + OMX_VIDEO_SLICEMODE_AVCMBSlice, + OMX_VIDEO_SLICEMODE_AVCByteSlice, + OMX_VIDEO_SLICEMODE_AVCKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_VIDEO_SLICEMODE_AVCVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_VIDEO_SLICEMODE_AVCLevelMax = 0x7FFFFFFF +} OMX_VIDEO_AVCSLICEMODETYPE; + +/** + * AVC FMO Slice Mode Params + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nNumSliceGroups : Specifies the number of slice groups + * nSliceGroupMapType : Specifies the type of slice groups + * eSliceMode : Specifies the type of slice + */ +typedef struct OMX_VIDEO_PARAM_AVCSLICEFMO { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U8 nNumSliceGroups; + OMX_U8 nSliceGroupMapType; + OMX_VIDEO_AVCSLICEMODETYPE eSliceMode; +} OMX_VIDEO_PARAM_AVCSLICEFMO; + +/** + * AVC IDR Period Configs + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nIDRPeriod : Specifies periodicity of IDR frames + * nPFrames : Specifies internal of coding Intra frames + */ +typedef struct OMX_VIDEO_CONFIG_AVCINTRAPERIOD { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nIDRPeriod; + OMX_U32 nPFrames; +} OMX_VIDEO_CONFIG_AVCINTRAPERIOD; + +/** + * AVC NAL Size Configs + * + * STRUCT MEMBERS: + * nSize : Size of the structure in bytes + * nVersion : OMX specification version information + * nPortIndex : Port that this structure applies to + * nNaluBytes : Specifies the NAL unit size + */ +typedef struct OMX_VIDEO_CONFIG_NALSIZE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nNaluBytes; +} OMX_VIDEO_CONFIG_NALSIZE; + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif +/* File EOF */ + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/khronos_api/v1_1_2/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/khronos_api/v1_1_2/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,36 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +PRJ_EXPORTS +// Khronos OpenMAX IL API +../OMX_Core.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Core.h) +../OMX_Component.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Component.h) +../OMX_Index.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Index.h) +../OMX_Audio.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Audio.h) +../OMX_Video.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Video.h) +../OMX_IVCommon.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_IVCommon.h) +../OMX_Image.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Image.h) +../OMX_Types.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Types.h) +../OMX_Other.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_Other.h) +../OMX_ContentPipe.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/khronos/v1_x/OMX_ContentPipe.h) + +// +// Files above are listed in \epoc32\tools\filenamepolicyexclusions.txt. +// They are exported in CamelCase instead of lower case. +// If a new header is added to the export, e.g. OMX_ContentPipe.h, the name +// should be added to filenamepolicyexclusions.txt ahead of time. Otherwise +// checksource will flag it as error. +// filenamepolicyexclusions.txt is in \src\cedar\generic\tools\e32toolp\platform diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,35 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +// +// Romkit include files for omxilcomplib (OMX framework) +// +#include "../omxilcomplib_api/group/bld.inf" + +// +// Romkit include files for omxilcore +// +#include "../omxilcore_api/group/bld.inf" + +// +// OMX IL Loader Interface +// +#include "../omxilloader_api/group/bld.inf" + +// +// SHAI extension headers +// +#include "../shaiext_api/group/bld.inf" diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,37 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +PRJ_EXPORTS + +// +// Romkit include files for omxilcomplib (OMX framework) +// +../inc/omxilcomponent.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilcomponent.h) +../inc/omxilconfigmanager.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilconfigmanager.h) +../inc/omxilstatedefs.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilstatedefs.h) +../inc/omxilport.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilport.h) +../inc/omxilprocessingfunction.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilprocessingfunction.h) +../inc/omxilspecversion.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilspecversion.h) +../inc/omxilcallbacknotificationif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilcallbacknotificationif.h) +../inc/omxilimageport.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilimageport.h) +../inc/omxilvideoport.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilvideoport.h) +../inc/omxilaudioport.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilaudioport.h) +../inc/omxilotherport.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilotherport.h) +../inc/omxilclockcomponentcmdsif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilclockcomponentcmdsif.h) +../inc/omxilclientclockport.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilclientclockport.h) +../inc/omxilport.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilport.inl) +../inc/omxilutil.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/common/omxilutil.h) + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilaudioport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilaudioport.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,200 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILAUDIOPORT_H +#define OMXILAUDIOPORT_H + +#include + +#include +#include +#include + +#include + +class COmxILAudioPortImpl; + +/** + Audio Port Panic category +*/ +_LIT(KOmxILAudioPortPanicCategory, "OmxILAudioPort"); + +class COmxILAudioPort : public COmxILPort + { + +public: + + IMPORT_C ~COmxILAudioPort(); + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxParamIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxConfigIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const = 0; + // From COmxILPort + IMPORT_C OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) = 0; + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateBuffer( + OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE TunnelRequest( + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateTunnel( + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeTunnel( + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferSent( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferReturned( + OMX_BUFFERHEADERTYPE* apBufferHeader); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabledCompleted(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabledCompleted(); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE StoreBufferMark( + const OMX_MARKTYPE* pMark); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetComponentRoleDefaults( + TUint aComponentRoleIndex); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE DoPortReconfiguration( + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient); + + // From COmxILPort + IMPORT_C virtual TBool HasAllBuffersAtHome() const; + + // From COmxILPort + IMPORT_C virtual TBool IsBufferAtHome( + OMX_BUFFERHEADERTYPE* apHeaderHeader) const; + +protected: + + IMPORT_C COmxILAudioPort(); + IMPORT_C void ConstructL(const TOmxILCommonPortData& aCommonPortData, const RArray& aSupportedAudioFormats); + + + // From COmxILPort + virtual OMX_ERRORTYPE SetFormatInPortDefinition( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition, + TBool& aUpdateProcessingFunction) = 0; + + // From COmxILPort + virtual TBool IsTunnelledPortCompatible( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const = 0; + + IMPORT_C virtual OMX_ERRORTYPE DoBufferAllocation( + OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferDeallocation( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoBufferWrapping( + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferUnwrapping( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoOmxUseBuffer( + OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer); + + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +private: + COmxILAudioPortImpl* ipAudioPortImpl; + }; + +#endif // OMXILAUDIOPORT_H + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilcallbacknotificationif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilcallbacknotificationif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,130 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCALLBACKNOTIFICATIONIF_H +#define OMXILCALLBACKNOTIFICATIONIF_H + +#include + +#include + + +/** + Portion of CallBack Manager Interface used by Processing Function objects + */ +class MOmxILCallbackNotificationIf + { + +public: + + /** + OpenMAX IL Error notification method that must be implemented by the + Callback manager object. + + @param [in] aOmxError The error event. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE ErrorEventNotification( + OMX_ERRORTYPE aOmxError) = 0; + + /** + OpenMAX IL Buffer Done notification method that must be implemented by + the Callback manager object. + + @param [in] apBufferHeader The header of the buffer processed. + + @param [in] aLocalPortIndex Index of the port that processed the buffer. + + @param [in] aLocalPortDirection The direction of the port. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) = 0; + + /** + OpenMAX IL Clock Buffer Done notification method that must be + implemented by the Callback manager object. If queueing is implemented, + clock buffers will be returned with higher priority than normal buffers. + + @param [in] apBufferHeader The header of the clock buffer processed. + + @param [in] aLocalPortIndex Index of the port that processed the buffer. + + @param [in] aLocalPortDirection The direction of the port. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE ClockBufferDoneNotification( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_U32 aLocalPortIndex, + OMX_DIRTYPE aLocalPortDirection) = 0; + + /** + Generic OpenMAX IL Event method notification method that must be + implemented by the Callback manager object. + + @param [in] aEvent The event to be notified. + + @param [in] aData1 An integer with additional event information. + + @param [in] aData2 An integer with additional event information. + + @param [in] aExtraInfo An optional text. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE EventNotification( + OMX_EVENTTYPE aEvent, + TUint32 aData1, + TUint32 aData2, + OMX_STRING aExtraInfo) = 0; + + /** + Notification method that must be implemented by the Callback manager + object. It is used by Processing Function objects to notify that some + port setting has changed during the processing of a buffer. + + @param [in] aLocalPortIndex The index of the local port that needs to be + notified of the change. + + @param [in] aPortSettingsIndex An implementation-specific identifier + that the implementation associates to the setting(s) that need(s) + updating in the port. + + @param [in] aPortSettings A buffer descriptor that contains an + implementation-specific structure with the new setting(s) that need to + be updated in the port. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE PortSettingsChangeNotification( + OMX_U32 aLocalPortIndex, + TUint aPortSettingsIndex, + const TDesC8& aPortSettings) = 0; + + }; + +#endif // OMXILCALLBACKNOTIFICATIONIF_H + + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilclientclockport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilclientclockport.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,93 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCLIENTCLOCKPORT_H +#define OMXILCLIENTCLOCKPORT_H + +#include +#include + +NONSHARABLE_CLASS(COmxILClientClockPort) : public COmxILOtherPort, public MOmxILClockComponentCmdsIf + { +public: + IMPORT_C static COmxILClientClockPort* NewL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedOtherFormats); + + // From MOmxILClockComponentCmdsIf + virtual OMX_ERRORTYPE GetMediaTime(OMX_TICKS& aMediaTime) const; + + // From MOmxILClockComponentCmdsIf + virtual OMX_ERRORTYPE GetWallTime(OMX_TICKS& aWallTime) const; + + // From MOmxILClockComponentCmdsIf + virtual OMX_ERRORTYPE GetClockState(OMX_TIME_CONFIG_CLOCKSTATETYPE& aClockState) const; + + // From MOmxILClockComponentCmdsIf + virtual OMX_ERRORTYPE MediaTimeRequest(const OMX_PTR apPrivate, const OMX_TICKS aMediaTime, const OMX_TICKS aOffset) const; + + // From MOmxILClockComponentCmdsIf + virtual OMX_ERRORTYPE SetStartTime(const OMX_TICKS aStartTime) const; + + // From MOmxILClockComponentCmdsIf + virtual OMX_ERRORTYPE SetVideoReference(const OMX_TICKS aVideRef) const; + + // From MOmxILClockComponentCmdsIf + virtual OMX_ERRORTYPE SetAudioReference(const OMX_TICKS aAudioRef) const; + + // From MOmxILClockComponentCmdsIf + virtual OMX_BOOL IsClockComponentAvailable() const; + + // From COmxILPort + OMX_ERRORTYPE GetLocalOmxParamIndexes(RArray& aIndexArray) const; + + // From COmxILPort + OMX_ERRORTYPE GetLocalOmxConfigIndexes(RArray& aIndexArray) const; + + // From COmxILPort + OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + // From COmxILPort + OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction); + +protected: + // From COmxILPort + OMX_ERRORTYPE SetFormatInPortDefinition(const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition, + TBool& aUpdateProcessingFunction); + + // From COmxILPort + TBool IsTunnelledPortCompatible(const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const; + +private: + void ConstructL(const TOmxILCommonPortData& aCommonPortData, const RArray& aSupportedOtherFormats); + + COmxILClientClockPort(); + + OMX_ERRORTYPE GetTime(OMX_TICKS& aTime, const OMX_INDEXTYPE aTimeIndex) const; + + OMX_ERRORTYPE SetTime(const OMX_TICKS aTime, const OMX_INDEXTYPE aTimeIndex) const; + + const OMX_VERSIONTYPE iSpecVersion; + }; + +#endif // COMXILCLIENTCLOCKPORT_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilclockcomponentcmdsif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilclockcomponentcmdsif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,107 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCLOCKCOMPONENTCMDSIF_H +#define OMXILCLOCKCOMPONENTCMDSIF_H + +#include + +class MOmxILClockComponentCmdsIf + { +public: + /** + This method is used to query for the current media clock time of the + clock component. + + @param aMediaTime The clock component media time in OMX_TICKS. + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetMediaTime(OMX_TICKS& aMediaTime) const = 0; + + /** + This method is used to query for the current wall clock of the clock + component. + + @param aWallTime The clock component wall clock in OMX_TICKS. + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetWallTime(OMX_TICKS& aWallTime) const = 0; + + + /** + This method is used to query for the current state of the clock + component. + + @param aClockState A OMX_TIME_CONFIG_CLOCKSTATETYPE structure. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetClockState(OMX_TIME_CONFIG_CLOCKSTATETYPE& aClockState) const = 0; + + /** + This method allows a client to request a particular timestamp + + @param apPrivate A pointer to any private data that the client wants to + associate with the request. + @param aMediaTime A timestamp, which is associated with some + operation (e.g., the presentation of a frame) that + the client shall execute at the time requested. + @param aOffset Specifies the desired difference between the wall time + when the timestamp actually occurs and the wall time + when the request is to be fulfilled. + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE MediaTimeRequest(const OMX_PTR apPrivate, const OMX_TICKS aMediaTime, const OMX_TICKS aOffset) const = 0; + + /** + This method sends the start time to the clock component + + @param aStartTime The starting timestamp of the stream + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetStartTime(const OMX_TICKS aStartTime) const = 0; + + /** + This method updates the clock component's video reference clock. + + @param aVideoRef The media time of the video component. + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetVideoReference(const OMX_TICKS aVideoRef) const = 0; + + /** + This method updates the clock component's audio reference clock. + + @param aAudioRef The media time of the audio component. + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetAudioReference(const OMX_TICKS aAudioRef) const = 0; + + /** + This method checks the clock component availability + + @return TBool + */ + virtual OMX_BOOL IsClockComponentAvailable() const = 0; + }; + +#endif // OMXILCLOCKCOMPONENTCMDSIF_H + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilcomponent.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilcomponent.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,94 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCOMPONENT_H +#define OMXILCOMPONENT_H + +#include +#include + +// forward declarations +class COmxILConfigManager; +class COmxILProcessingFunction; +class COmxILPort; +class COmxILComponentImpl; +class MOmxILCallbackNotificationIf; + +/** + Component Panic category +*/ +_LIT(KOmxILComponentPanicCategory, "OmxILComponent"); + +class COmxILComponent : public CBase + { +public: + enum TCallbackManagerType + { + EOutofContext, + EInContext, + ECallbackManagerTypeMax =0xff + }; + enum TPortManagerType + { + ENonBufferSharingPortManager, + EBufferSharingPortManager, + EPortManagerTypeMax =0xff + }; + +public: + IMPORT_C virtual ~COmxILComponent(); + IMPORT_C static OMX_ERRORTYPE SymbianErrorToGetHandleError(TInt aSymbianError); + +protected: + IMPORT_C COmxILComponent(); + IMPORT_C void InitComponentL(); + IMPORT_C virtual void ConstructL(OMX_HANDLETYPE aComponent); + IMPORT_C MOmxILCallbackNotificationIf* CreateCallbackManagerL(TCallbackManagerType aCallbackManagerType); + IMPORT_C void CreatePortManagerL(TPortManagerType aType, + const OMX_VERSIONTYPE& aOmxVersion, + OMX_U32 aNumberOfAudioPorts, + OMX_U32 aStartAudioPortNumber, + OMX_U32 aNumberOfImagePorts, + OMX_U32 aStartImagePortNumber, + OMX_U32 aNumberOfVideoPorts, + OMX_U32 aStartVideoPortNumber, + OMX_U32 aNumberOfOtherPorts, + OMX_U32 aStartOtherPortNumber, + OMX_BOOL aImmediateReturnTimeBuffer = OMX_TRUE); + IMPORT_C TInt AddPort(const COmxILPort* aPort, OMX_DIRTYPE aDirection); + IMPORT_C void RegisterProcessingFunction(const COmxILProcessingFunction* aProcessingFunction); + IMPORT_C void RegisterConfigurationManager(const COmxILConfigManager* aConfigManager); + + //getters and setters + IMPORT_C OMX_COMPONENTTYPE* GetHandle() const; + IMPORT_C OMX_PTR GetAppData() const; + IMPORT_C OMX_CALLBACKTYPE* GetCallbacks() const; + IMPORT_C COmxILConfigManager* GetConfigManager() const; + IMPORT_C COmxILProcessingFunction* GetProcessingFunction() const; + + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +private: + COmxILComponentImpl* ipImpl; + }; + +#endif // OMXILCOMPONENT_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilconfigmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilconfigmanager.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,123 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILCONFIGMANAGER_H +#define OMXILCONFIGMANAGER_H + +#include +#include +#include +#include + +/** + Config Manager Panic category +*/ +_LIT(KOmxILConfigManagerPanicCategory, "OmxILConfigManager"); + + +// Forward declarations +class MOmxILPortManagerIf; +class COmxILConfigManagerImpl; + +/** + This class is a placeholder for those OpenMAX IL parameters and configs that + apply to the component as a whole and not to an specific port in the + component. The design of this class should be revisited as the OpenMAX IL + resource management logic is added. For now resource management-related + params/configs values can only be set or queried but the associated + functionality is missing. + */ +class COmxILConfigManager : public CBase + { + +public: + + IMPORT_C static COmxILConfigManager* NewL( + const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList); + + IMPORT_C ~COmxILConfigManager(); + + OMX_ERRORTYPE GetComponentVersion( + OMX_STRING aComponentName, + OMX_VERSIONTYPE* apComponentVersion, + OMX_VERSIONTYPE* apSpecVersion, + OMX_UUIDTYPE* apComponentUUID) const; + + IMPORT_C virtual OMX_ERRORTYPE GetParameter( + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const; + + IMPORT_C virtual OMX_ERRORTYPE SetParameter( + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + OMX_BOOL aInitTime = OMX_TRUE); + + IMPORT_C virtual OMX_ERRORTYPE GetConfig( + OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + IMPORT_C virtual OMX_ERRORTYPE SetConfig( + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure); + + IMPORT_C virtual OMX_ERRORTYPE GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + OMX_ERRORTYPE ComponentRoleEnum( + OMX_U8* aRole, + OMX_U32 aIndex) const; + + void SetPortManager(MOmxILPortManagerIf* aPortManager); + + + IMPORT_C void InsertParamIndexL(TUint aParamIndex); + + IMPORT_C TInt FindParamIndex(TUint aParamIndex) const; + + IMPORT_C void InsertConfigIndexL(TUint aConfigIndex); + + IMPORT_C TInt FindConfigIndex(TUint aConfigIndex) const; + + +protected: + + IMPORT_C COmxILConfigManager(); + + IMPORT_C void ConstructL(const TDesC8& aComponentName, + const OMX_VERSIONTYPE& aComponentVersion, + const RPointerArray& aComponentRoleList); + RArray& ManagedParamIndexes(); + + IMPORT_C RArray& ManagedConfigIndexes(); + + + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +private: + + COmxILConfigManagerImpl* ipConfigManagerImpl; + }; + +#endif // OMXILCONFIGMANAGER_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilimageport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilimageport.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,208 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + * @file + * @internalTechnology + */ + +#ifndef OMXILIMAGEPORT_H +#define OMXILIMAGEPORT_H + +#include + +#include +#include +#include + +#include + +class COmxILImagePortImpl; +/** + Image Port Panic category +*/ +_LIT(KOmxILImagePortPanicCategory, "OmxILImagePort"); + +class COmxILImagePort : public COmxILPort + { + +public: + + IMPORT_C ~COmxILImagePort(); + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxParamIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxConfigIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const = 0; + // From COmxILPort + IMPORT_C OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) = 0; + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateBuffer( + OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE TunnelRequest( + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateTunnel( + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeTunnel( + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferSent( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferReturned( + OMX_BUFFERHEADERTYPE* apBufferHeader); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabledCompleted(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabledCompleted(); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE StoreBufferMark( + const OMX_MARKTYPE* pMark); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetComponentRoleDefaults( + TUint aComponentRoleIndex); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE DoPortReconfiguration( + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient); + + // From COmxILPort + IMPORT_C virtual TBool HasAllBuffersAtHome() const; + + // From COmxILPort + IMPORT_C virtual TBool IsBufferAtHome( + OMX_BUFFERHEADERTYPE* apHeaderHeader) const; + +protected: + + IMPORT_C COmxILImagePort(); + + // From COmxILPort + OMX_ERRORTYPE SetFormatInPortDefinition( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition, + TBool& aUpdateProcessingFunction) = 0; + + // From COmxILPort + TBool IsTunnelledPortCompatible( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const = 0; + + IMPORT_C void ConstructL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedImageFormats, + const RArray& aSupportedColorFormats); + + IMPORT_C virtual OMX_ERRORTYPE DoBufferAllocation( + OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferDeallocation( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoBufferWrapping( + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferUnwrapping( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoOmxUseBuffer( + OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer); + + IMPORT_C const RArray& GetSupportedImageFormats() const; + IMPORT_C const RArray& GetSupportedColorFormats() const; + IMPORT_C const OMX_IMAGE_PARAM_PORTFORMATTYPE& GetParamImagePortFormat() const; + + IMPORT_C RArray& GetSupportedImageFormats(); + IMPORT_C RArray& GetSupportedColorFormats(); + IMPORT_C OMX_IMAGE_PARAM_PORTFORMATTYPE& GetParamImagePortFormat(); + + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +private: + COmxILImagePortImpl* ipImagePortImpl; + }; + +#endif // OMXILIMAGEPORT_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilotherport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilotherport.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,200 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalTechnology +*/ + +#ifndef OMXILOTHERPORT_H +#define OMXILOTHERPORT_H + +#include +#include +#include +#include +#include + +class COmxILOtherPortImpl; +/** + Other Port Panic category +*/ +_LIT(KOmxILOtherPortPanicCategory, "OmxILOtherPort"); + +class COmxILOtherPort : public COmxILPort + { +public: + IMPORT_C ~COmxILOtherPort(); + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxParamIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxConfigIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) = 0; + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateBuffer( + OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE TunnelRequest( + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateTunnel( + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeTunnel( + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferSent( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferReturned( + OMX_BUFFERHEADERTYPE* apBufferHeader); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabledCompleted(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabledCompleted(); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE StoreBufferMark( + const OMX_MARKTYPE* pMark); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetComponentRoleDefaults( + TUint aComponentRoleIndex); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE DoPortReconfiguration( + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient); + + // From COmxILPort + IMPORT_C virtual TBool HasAllBuffersAtHome() const; + + // From COmxILPort + IMPORT_C virtual TBool IsBufferAtHome( + OMX_BUFFERHEADERTYPE* apHeaderHeader) const; + +protected: + IMPORT_C COmxILOtherPort(); + + IMPORT_C void ConstructL(const TOmxILCommonPortData& aCommonPortData, const RArray& aSupportedOtherFormats); + + // From COmxILPort + OMX_ERRORTYPE SetFormatInPortDefinition( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition, + TBool& aUpdateProcessingFunction) = 0; + + // From COmxILPort + TBool IsTunnelledPortCompatible( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const = 0; + + IMPORT_C virtual OMX_ERRORTYPE DoBufferAllocation( + OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferDeallocation( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoBufferWrapping( + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferUnwrapping( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoOmxUseBuffer( + OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer); + + IMPORT_C const RArray& GetSupportedOtherFormats() const; + IMPORT_C const OMX_OTHER_PARAM_PORTFORMATTYPE& GetParamOtherPortFormat() const; + IMPORT_C RArray& GetSupportedOtherFormats(); + IMPORT_C OMX_OTHER_PARAM_PORTFORMATTYPE& GetParamOtherPortFormat(); + + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +private: + COmxILOtherPortImpl* ipOtherPortImpl; + }; + +#endif // OMXILOTHERPORT_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilport.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,354 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILPORT_H +#define OMXILPORT_H + +#include +#include +#include + + +/** + Base Port Panic category +*/ +_LIT(KOmxILPortPanicCategory, "OmxILPort"); + +// Forward declarations +class COmxILPortImpl; + +/** + Structure used to pass the common information that an OpenMAX IL port needs + at instantiation time. +*/ +class TOmxILCommonPortData + { + +public: + + // OMX specification version information + OMX_VERSIONTYPE iOmxVersion; + // Port number the structure applies to + OMX_U32 iPortIndex; + // Direction (input or output) of this port + OMX_DIRTYPE iDirection; + // The minimum number of buffers this port requires + OMX_U32 iBufferCountMin; + // Minimum size, in bytes, for buffers to be used for this port + OMX_U32 iBufferSizeMin; + // Domain of the port + OMX_PORTDOMAINTYPE iPortDomain; + // Buffers contiguous requirement (true or false) + OMX_BOOL iBuffersContiguous; + // Buffer aligment requirements + OMX_U32 iBufferAlignment; + // Port supplier preference when tunneling between two ports + OMX_BUFFERSUPPLIERTYPE iBufferSupplier; + + // \brief This is the associated port that will be used to propagate buffer marks + // found in incoming buffer headers. + // + // In general, for any output port, this parameter should be configured + // with constant COmxILPort::KBufferMarkPropagationPortNotNeeded except + // for an output port of a source component, in which case it must be used + // the same index of the port that this structure applies to. For an input + // port of a sink component, + // COmxILPort::KBufferMarkPropagationPortNotNeeded must also be used. + OMX_U32 iBufferMarkPropagationPortIndex; + + // Constructor + IMPORT_C TOmxILCommonPortData( + OMX_VERSIONTYPE aOmxVersion, + OMX_U32 aPortIndex, + OMX_DIRTYPE aDirection, + OMX_U32 aBufferCountMin, + OMX_U32 aBufferSizeMin, + OMX_PORTDOMAINTYPE aPortDomain, + OMX_BOOL aBuffersContiguous, + OMX_U32 aBufferAlignment, + OMX_BUFFERSUPPLIERTYPE aBufferSupplier, + OMX_U32 aBufferMarkPropagationPortIndex); + + }; + + +/** + OpenMAX IL component port base class. +*/ +class COmxILPort : public CBase + { +friend class COmxILPortImpl; + +public: + static const TInt KBufferMarkPropagationPortNotNeeded = 0x7FFFFFFF; + + ~COmxILPort(); + + /** + This method is used to retrieve the local OpenMAX IL parameter indexes + managed by the specific port. The implementation should collect indexes + from the parent class. Local indexes should be appended in order to the + list received as parameter. The implementation should handle index + duplication as a non-error situation (i.e., the resulting list will + contain unique indexes). + + @param aIndexArray An array of parameter indexes where the local + indexes are to be appended. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetLocalOmxParamIndexes( + RArray& aIndexArray) const = 0; + + /** + This method is used to retrieve the local OpenMAX IL config indexes + managed by the specific port. The implementation should collect indexes + from the parent class. Local indexes should be appended in order to the + list received as parameter. The implementation should handle index + duplication as a non-error situation (i.e., the resulting list will + contain unique indexes). + + @param aIndexArray An array of config indexes where the local indexes + are to be appended. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetLocalOmxConfigIndexes( + RArray& aIndexArray) const = 0; + + /** + Port-specific version of the OpenMAX IL GetParameter API. + + @param aParamIndex The index of the structure that is to be filled. + @param apComponentParameterStructure A pointer to the IL structure. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE GetParameter( + OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const = 0; + + /** + Port-specific version of the OpenMAX IL SetParameter API. + + @param aParamIndex The index of the structure that is to be set. + @param apComponentParameterStructure A pointer to the IL structure. + @param aUpdateProcessingFunction A flag to signal that the component's + processing function needs to be updated with this structure. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetParameter( + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) = 0; + + virtual OMX_ERRORTYPE GetConfig( + OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + + virtual OMX_ERRORTYPE SetConfig( + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction); + + virtual OMX_ERRORTYPE GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + virtual OMX_ERRORTYPE PopulateBuffer( + OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + virtual OMX_ERRORTYPE FreeBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted); + + virtual OMX_ERRORTYPE TunnelRequest( + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + virtual OMX_ERRORTYPE PopulateTunnel( + TBool& portPopulationCompleted); + + virtual OMX_ERRORTYPE FreeTunnel( + TBool& portDepopulationCompleted); + + virtual TBool SetBufferSent( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark); + + virtual TBool SetBufferReturned( + OMX_BUFFERHEADERTYPE* apBufferHeader); + + virtual void SetTransitionToDisabled(); + + virtual void SetTransitionToEnabled(); + + virtual void SetTransitionToDisabledCompleted(); + + virtual void SetTransitionToEnabledCompleted(); + + virtual OMX_ERRORTYPE StoreBufferMark( + const OMX_MARKTYPE* pMark); + + virtual OMX_ERRORTYPE SetComponentRoleDefaults( + TUint aComponentRoleIndex); + + virtual OMX_ERRORTYPE DoPortReconfiguration( + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient); + + OMX_DIRTYPE Direction() const; + + IMPORT_C TBool IsEnabled() const; + + TBool IsPopulated() const; + + TBool IsDePopulated() const; + + TBool IsTunnelled() const; + + TBool IsTunnelledAndBufferSupplier() const; + + virtual TBool HasAllBuffersAtHome() const; + + TBool IsTransitioningToEnabled() const; + + TBool IsTransitioningToDisabled() const; + + virtual TBool IsBufferAtHome( + OMX_BUFFERHEADERTYPE* apHeaderHeader) const; + + IMPORT_C OMX_U32 Index() const; + + OMX_PORTDOMAINTYPE Domain() const; + + OMX_U32 Count() const; + + OMX_BUFFERHEADERTYPE* const& operator[](TInt anIndex) const; + + OMX_BUFFERHEADERTYPE*& operator[](TInt anIndex); + + OMX_U32 BufferMarkPropagationPort() const; + +protected: + + COmxILPort(); + void ConstructL(const TOmxILCommonPortData& aCommonPortData); + /** + When the IL Client calls SetParameter with index + OMX_IndexParamPortDefinition, this method is called to set the fields in + the OMX_PARAM_PORTDEFINITIONTYPE (@see iParamPortDefinition) structure + that are specific to this port's domain. + + @param aPortDefinition The OpenMAX IL structure received from the IL Client. + @param aUpdateProcessingFunction A flag to signal that the component's + processing function needs to be updated with the this structure. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE SetFormatInPortDefinition( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition, + TBool& aUpdateProcessingFunction) = 0; + + /** + On a tunnel request, this method is called to check the compatibility of + the fields in the OMX_PARAM_PORTDEFINITIONTYPE structure of the + tunnelled component that are specific to this port's domain. + + @param aPortDefinition The OpenMAX IL structure received from a + tunnelled component. + + @return ETrue if compatible, EFalse otherwise. + */ + virtual TBool IsTunnelledPortCompatible( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const = 0; + + virtual OMX_ERRORTYPE DoBufferAllocation( + OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + virtual void DoBufferDeallocation( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + virtual OMX_ERRORTYPE DoBufferWrapping( + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + virtual void DoBufferUnwrapping( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + virtual OMX_ERRORTYPE DoOmxUseBuffer( + OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer); + + template + inline OMX_ERRORTYPE GetParamStructureFromTunnel( + T& aComponentConfigStructure, OMX_INDEXTYPE aParamIndex) const; + + OMX_ERRORTYPE StoreBufferMark( + OMX_HANDLETYPE& ipMarkTargetComponent, + OMX_PTR& ipMarkData); + + IMPORT_C void CleanUpPort(); + +protected: + IMPORT_C const OMX_PARAM_PORTDEFINITIONTYPE& GetParamPortDefinition() const; + IMPORT_C const OMX_HANDLETYPE& GetTunnelledComponent() const; + IMPORT_C const OMX_U32& GetTunnelledPort() const; + + IMPORT_C OMX_PARAM_PORTDEFINITIONTYPE& GetParamPortDefinition(); + IMPORT_C OMX_HANDLETYPE& GetTunnelledComponent(); + IMPORT_C OMX_U32& GetTunnelledPort(); + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +private: + COmxILPortImpl* ipPortImpl; + + }; + +#include + +#endif // OMXILPORT_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilport.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilport.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,47 @@ +// Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +template +inline OMX_ERRORTYPE +COmxILPort::GetParamStructureFromTunnel( + T& aComponentConfigStructure, OMX_INDEXTYPE aParamIndex) const + { + + __ASSERT_ALWAYS(GetTunnelledComponent(), + User::Panic(KOmxILPortPanicCategory, 1)); + + aComponentConfigStructure.nSize = sizeof(T); + aComponentConfigStructure.nVersion = TOmxILSpecVersion(); + aComponentConfigStructure.nPortIndex = GetTunnelledPort(); + + if (OMX_ErrorNone != + OMX_GetParameter(GetTunnelledComponent(), + aParamIndex, + &aComponentConfigStructure) ) + { + return OMX_ErrorUndefined; + } + + return OMX_ErrorNone; + + } + + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilprocessingfunction.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilprocessingfunction.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,181 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILPROCESSINGFUNCTION_H +#define OMXILPROCESSINGFUNCTION_H + +#include + +#include +#include +#include + +//#include "omxilfsm.h" +#include + +// Forward declarations +class MOmxILCallbackNotificationIf; + +/** + Base class for component-specific implementations of the Processing Function + abstraction. Component implementations realize within a Processing Function + object the codec specific logic. Component implementations may choose + whether to implement the Processing Function functionality in an additional + independent thread or in-context with the framework. The interface is + designed to generalize the notification of the OpenMAX IL commands, OpenMAX + IL state changes and input/output buffer arrivals to the codec + itself. Implementations of this interface are intended to communicate with + the entity in charge of the egress component communication, the Callback + Manager. + */ +class COmxILProcessingFunction : public CBase + { + +public: + + IMPORT_C ~COmxILProcessingFunction(); + + /** + Framework notification of a state transition in the component. + + @param aNewState The new state. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE StateTransitionIndication( + TStateIndex aNewState) = 0; + + /** + Framework notification of a buffer flushing command. + + @param aPortIndex The port that is being flushed. + + @param aDirection The direction of the port that is being flushed. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferFlushingIndication( + TUint32 aPortIndex, + OMX_DIRTYPE aDirection) = 0; + + /** + Framework notification of an OpenMAX IL Param structure change. + + @param aParamIndex The index of the param structure that has changed. + + @param apComponentParameterStructure The param structure. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE ParamIndication( + OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure) = 0; + + /** + Framework notification of an OpenMAX IL Config structure change. + + @param aConfigIndex The index of the config structure that has changed. + + @param apComponentConfigStructure The config structure. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE ConfigIndication( + OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure) = 0; + + /** + Framework notification of a buffer arrival. + + @param apBufferHeader The header of the buffer to be processed. + + @param aDirection The direction of the port that has received the + buffer. + + @return OMX_ERRORTYPE + */ + virtual OMX_ERRORTYPE BufferIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) = 0; + + /** + Framework notification of a buffer removal. Here the Processing Function + object is being notified that a buffer needs to be removed from its + internal queues. At present, a synchronous implementation of this method + is assumed. Buffer removal notifications may be originated by the + framework in the following scenarios: + + -# After an OMX_FreeBuffer call has been received from the IL Client or + from another component. + + -# After a port flushing command has been received from the IL Client + AND the port is tunnelled and buffer supplier. + + -# After a transition OMX_StateExecuting/OMX_StatePause -> OMX_StateIdle + has been requested by the IL Client AND the port associated to the + buffer is tunnelled and buffer supplier. + + -# After a port disable command has been received from the IL Client AND + the port associated to the buffer is tunnelled and buffer supplier. + + @param apBufferHeader The buffer header to be removed from internal + queues. + + @param aDirection The direction of the port associated to the buffer. + + @return OMX_BOOL Etrue if the Processing Function has successfully + removed the buffer header from its internal queues, EFalse otherwise. + */ + virtual OMX_BOOL BufferRemovalIndication( + OMX_BUFFERHEADERTYPE* apBufferHeader, + OMX_DIRTYPE aDirection) = 0; + + IMPORT_C virtual OMX_ERRORTYPE ComponentRoleIndication( + TUint aComponentRoleIndex); + + /** + Framework notification of a buffer arrival on a OMX_PortDomainOther; + normally the interested component would just extract the buffer and + let the port manager returns the buffer to the buffer supplier + component via callback immediately. + + @param apBufferHeader The header of the buffer to be processed. + @param aDirection The direction of the port that has received + the buffer. + @return OMX_ERRORTYPE + */ + IMPORT_C virtual OMX_ERRORTYPE MediaTimeIndication(const OMX_TIME_MEDIATIMETYPE& ); + +protected: + + IMPORT_C COmxILProcessingFunction( + MOmxILCallbackNotificationIf& aCallbacks); + + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +protected: + + MOmxILCallbackNotificationIf& iCallbacks; + + }; + +#endif // OMXILPROCESSINGFUNCTION_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilspecversion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilspecversion.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,72 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILSPECVERSION_H +#define OMXILSPECVERSION_H + +#include +#include + +#include + +class TOmxILVersion + { + +public: + + IMPORT_C TOmxILVersion(TUint8 aMajor, + TUint8 aMinor, + TUint8 aRev, + TUint8 aStep); + + + IMPORT_C operator OMX_VERSIONTYPE&(); + +#ifdef _OMXIL_COMMON_SPEC_VERSION_CHECKS_ON + TBool operator!=(const OMX_VERSIONTYPE& aVer) const; + + TBool operator==(const OMX_VERSIONTYPE& aVer) const; +#endif + +private: + + OMX_VERSIONTYPE iSpecVersion; + + }; + +class TOmxILSpecVersion : public TOmxILVersion + { + +public: + + static const TUint8 KSpecVersionMajor = OMX_VERSION_MAJOR; + static const TUint8 KSpecVersionMinor = OMX_VERSION_MINOR; + static const TUint8 KSpecVersionRevision = OMX_VERSION_REVISION; + static const TUint8 KSpecVersionStep = OMX_VERSION_STEP; + +public: + + IMPORT_C TOmxILSpecVersion(); + + }; + +#endif // OMXILSPECVERSION_H + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilstatedefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilstatedefs.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,40 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILSTATEDEFS_H +#define OMXILSTATEDEFS_H + +enum TStateIndex + { + EStateInvalid = OMX_StateInvalid, + EStateLoaded = OMX_StateLoaded, + EStateIdle = OMX_StateIdle, + EStateExecuting = OMX_StateExecuting, + EStatePause = OMX_StatePause, + EStateWaitForResources = OMX_StateWaitForResources, + ESubStateLoadedToIdle, + ESubStateIdleToLoaded, + ESubStateExecutingToIdle, + ESubStatePauseToIdle, + EStateMax + }; + +#endif // OMXILSTATEDEFS_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilutil.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilutil.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,47 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILUTIL_H +#define OMXILUTIL_H + +#include + +#include +#include + + +class TOmxILUtil + { + +public: + + IMPORT_C static OMX_ERRORTYPE CheckOmxStructSizeAndVersion( + OMX_PTR apHeader, OMX_U32 aSize); + + IMPORT_C static void ClearBufferContents( + OMX_BUFFERHEADERTYPE* apBufferHeader); + + }; + + +#endif // OMXILUTIL_H + + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilvideoport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcomplib_api/inc/omxilvideoport.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,210 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +/** + @file + @internalTechnology +*/ + +#ifndef OMXILVIDEOPORT_H +#define OMXILVIDEOPORT_H + +#include + +#include +#include +#include + +#include + +class COmxILVideoPortImpl; +/** + Image Port Panic category +*/ +_LIT(KOmxILVideoPortPanicCategory, "OmxILVideoPort"); + +class COmxILVideoPort : public COmxILPort + { + +public: + + IMPORT_C ~COmxILVideoPort(); + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxParamIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetLocalOmxConfigIndexes(RArray& aIndexArray) const = 0; + + // From COmxILPort + IMPORT_C OMX_ERRORTYPE GetParameter(OMX_INDEXTYPE aParamIndex, + TAny* apComponentParameterStructure) const = 0; + // From COmxILPort + IMPORT_C OMX_ERRORTYPE SetParameter(OMX_INDEXTYPE aParamIndex, + const TAny* apComponentParameterStructure, + TBool& aUpdateProcessingFunction) = 0; + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetConfig(OMX_INDEXTYPE aConfigIndex, + TAny* apComponentConfigStructure) const; + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetConfig(OMX_INDEXTYPE aConfigIndex, + const TAny* apComponentConfigStructure, + TBool& aUpdateProcessingFunction); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE GetExtensionIndex( + OMX_STRING aParameterName, + OMX_INDEXTYPE* apIndexType) const; + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateBuffer( + OMX_BUFFERHEADERTYPE** appBufferHdr, + const OMX_PTR apAppPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeBuffer( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE TunnelRequest( + OMX_HANDLETYPE aTunneledComp, + OMX_U32 aTunneledPort, + OMX_TUNNELSETUPTYPE* apTunnelSetup); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE PopulateTunnel( + TBool& portPopulationCompleted); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE FreeTunnel( + TBool& portDepopulationCompleted); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferSent( + OMX_BUFFERHEADERTYPE* apBufferHeader, + TBool& aBufferMarkedWithOwnMark); + + // From COmxILPort + IMPORT_C virtual TBool SetBufferReturned( + OMX_BUFFERHEADERTYPE* apBufferHeader); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabled(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToDisabledCompleted(); + + // From COmxILPort + IMPORT_C virtual void SetTransitionToEnabledCompleted(); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE StoreBufferMark( + const OMX_MARKTYPE* pMark); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE SetComponentRoleDefaults( + TUint aComponentRoleIndex); + + // From COmxILPort + IMPORT_C virtual OMX_ERRORTYPE DoPortReconfiguration( + TUint aPortSettingsIndex, + const TDesC8& aPortSettings, + OMX_EVENTTYPE& aEventForILClient); + + // From COmxILPort + IMPORT_C virtual TBool HasAllBuffersAtHome() const; + + // From COmxILPort + IMPORT_C virtual TBool IsBufferAtHome( + OMX_BUFFERHEADERTYPE* apHeaderHeader) const; + +protected: + + IMPORT_C COmxILVideoPort(); + + IMPORT_C void ConstructL(const TOmxILCommonPortData& aCommonPortData, + const RArray& aSupportedVideoFormats, + const RArray& aSupportedColorFormats); + + // From COmxILPort + OMX_ERRORTYPE SetFormatInPortDefinition( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition, + TBool& aUpdateProcessingFunction) = 0; + + // From COmxILPort + TBool IsTunnelledPortCompatible( + const OMX_PARAM_PORTDEFINITIONTYPE& aPortDefinition) const = 0; + + IMPORT_C TBool UpdateColorFormat(OMX_COLOR_FORMATTYPE& aOldColor, OMX_COLOR_FORMATTYPE aNewColor, TBool& aUpdated); + IMPORT_C TBool UpdateCodingType(OMX_VIDEO_CODINGTYPE& aOldCodingType, OMX_VIDEO_CODINGTYPE aNewCodingType, TBool& aUpdated); + + IMPORT_C RArray& GetSupportedVideoFormats(); + IMPORT_C RArray& GetSupportedColorFormats(); + IMPORT_C OMX_VIDEO_PARAM_PORTFORMATTYPE& GetParamVideoPortFormat(); + IMPORT_C const RArray& GetSupportedVideoFormats() const; + IMPORT_C const RArray& GetSupportedColorFormats() const; + IMPORT_C const OMX_VIDEO_PARAM_PORTFORMATTYPE& GetParamVideoPortFormat() const; + + IMPORT_C virtual OMX_ERRORTYPE DoBufferAllocation( + OMX_U32 aSizeBytes, + OMX_U8*& apPortSpecificBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferDeallocation( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoBufferWrapping( + OMX_U32 aSizeBytes, + OMX_U8* apBuffer, + OMX_PTR& apPortPrivate, + OMX_PTR& apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual void DoBufferUnwrapping( + OMX_PTR apPortSpecificBuffer, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_PTR apAppPrivate = 0); + + IMPORT_C virtual OMX_ERRORTYPE DoOmxUseBuffer( + OMX_HANDLETYPE aTunnelledComponent, + OMX_BUFFERHEADERTYPE** appBufferHdr, + OMX_U32 aTunnelledPortIndex, + OMX_PTR apPortPrivate, + OMX_PTR apPlatformPrivate, + OMX_U32 aSizeBytes, + OMX_U8* apBuffer); + + //From CBase + IMPORT_C virtual TInt Extension_(TUint aExtensionId, TAny *&a0, TAny *a1); + +private: + COmxILVideoPortImpl* ipVideoPortImpl; + }; + +#endif // OMXILVIDEOPORT_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,31 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +PRJ_EXPORTS + +// +// Romkit include files for omxilcore +// +../inc/omxilloaderif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/core/omxilloaderif.h) +../inc/omxilloaderif.hrh SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/core/omxilloaderif.hrh) +../inc/omxilloaderif.inl SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/core/omxilloaderif.inl) +../inc/omxilsymbianloaderif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/core/omxilsymbianloaderif.h) + +// Content Pipe Interface API +../inc/omxilcontentpipeif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/core/omxilcontentpipeif.h) +../inc/omxilcontentpipeif.hrh SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/core/omxilcontentpipeif.hrh) +../inc/omxilsymbiancontentpipeif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/core/omxilsymbiancontentpipeif.h) + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/inc/omxilcontentpipeif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/inc/omxilcontentpipeif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,77 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Keep it as prototype until the end of Diran to allow time for the Symbian Content Pipe OMX IL v1.x solution to be exercised, +// since we know this feature has recently been added to the standard and it is not yet in use. +// +// + +/** + @file + @publishedPartner + @prototype +*/ + +#ifndef OMXILCONTENTPIPEIF_H +#define OMXILCONTENTPIPEIF_H + +#include +#include +#include +#include + +/** + Bridge to allow content pipes to be loaded as an ECOM plugin. + Inheritance from this class allows it +*/ +class COmxILContentPipeIf : public CBase + { +public: + ~COmxILContentPipeIf(); + static COmxILContentPipeIf* CreateImplementationL(TUid aUid); + + /** + Gets a valid content pipe handle + + @return KErrNone if successful, otherwise another system-wide error codes + @param aContentPipe Returns a pointer to the content pipe handle + */ + virtual TInt GetHandle(OMX_HANDLETYPE* aContentPipe) = 0; + +private: + /** A 32-bit instance key returned by the ECom framework */ + TUid iDestructorKey; + }; + +/** + Destructor +*/ +inline COmxILContentPipeIf::~COmxILContentPipeIf() + { + REComSession::DestroyedImplementation(iDestructorKey); + } + +/** + This function loads the ECOM plug-in specified by the UID passed as argument and + return a newly created COmxContentPipeIf object + + @return Newly created COmxContentPipeIf object + @param aImplementationUid UID of the ECOM plug-in +*/ +inline COmxILContentPipeIf* COmxILContentPipeIf::CreateImplementationL(TUid aImplementationUid) + { + COmxILContentPipeIf* self = reinterpret_cast(REComSession::CreateImplementationL(aImplementationUid, _FOFF(COmxILContentPipeIf, iDestructorKey))); + return self; + } + +#endif // OMXILCONTENTPIPEIF_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/inc/omxilcontentpipeif.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/inc/omxilcontentpipeif.hrh Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,37 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Keep it as prototype until the end of Diran to allow time for the Symbian Content Pipe OMX IL v1.x solution to be exercised, +// since we know this feature has recently been added to the standard and it is not yet in use. +// +// + +/** + @file + @publishedPartner + @prototype +*/ + +#ifndef OMXILCONTENTPIPEIF_HRH +#define OMXILCONTENTPIPEIF_HRH + +// OpenMax IL Content Pipe Interface + +/** + This Macro defines the interface UID of an OpenMax IL content pipe. + All content pipes ECOM plugins must use this UID in their resource files. +*/ +#define KUidOmxILContentPipeIf 0x102834BA + +#endif // OMXILCONTENTPIPEIF_HRH + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/inc/omxilloaderif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/inc/omxilloaderif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,57 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef OMXILLOADERIF_H +#define OMXILLOADERIF_H + +#include +#include +#include + +/** +The COmxComponentLoaderIf class provides an interface to the Component Loader implementation. +Component Loaders shall be installed as ECOM plug-ins implementing the COmxComponentLoaderIf +to run under Symbian OMX IL Core. +Symbian OMX IL Core creates a list of all the ECOM implementations of this Component Loader +interface installed in the system. + +@see KUidOmxILLoaderInterface +*/ +class COmxComponentLoaderIf : public CBase + { +public: + inline virtual ~COmxComponentLoaderIf(); + inline static COmxComponentLoaderIf* CreateImplementationL(TUid aUid); + + /** + Gets the valid handle of the already populated OMX_LOADERTYPE structure. + + @return The loader's handle + */ + virtual OMX_HANDLETYPE Handle() = 0; + +private: + TUid iDestructorKey; + }; + +#include + +#endif /*OMXILLOADERIF_H*/ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/inc/omxilloaderif.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/inc/omxilloaderif.hrh Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,33 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef OMXILLOADERIF_HRH +#define OMXILLOADERIF_HRH + + +/** +Defines the numerical value for the Interface UID of an OpenMax IL Symbian Component Loader. +All component loader ECOM plugins must use this interface UID in the REGISTRY_INFO of +their resource files. +*/ +#define KUidOmxILLoaderInterface 0x1028349D + +#endif // OMXILLOADERIF_HRH diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/inc/omxilloaderif.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/inc/omxilloaderif.inl Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,37 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Destructor of this interface. +// +// + +inline COmxComponentLoaderIf::~COmxComponentLoaderIf() + { + REComSession::DestroyedImplementation(iDestructorKey); + } + +/** +Static method to load the particular ECOM plugin specified by the implementation UID passed as a parameter. +As part of the creation of this interface the actual OMX_LOADERTYPE structure should be allocated and populated. + +@param aUid + UID of the ECOM plug-in +@return The pointer to the newly created COmxComponentLoaderIf object + +@see KUidOmxILLoaderInterface +*/ +inline COmxComponentLoaderIf* COmxComponentLoaderIf::CreateImplementationL(TUid aUid) + { + COmxComponentLoaderIf* self = reinterpret_cast(REComSession::CreateImplementationL(aUid, _FOFF(COmxComponentLoaderIf, iDestructorKey))); + return self; + } diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/inc/omxilsymbiancontentpipeif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/inc/omxilsymbiancontentpipeif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,114 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Keep it as prototype until the end of Diran to allow time for the Symbian Content Pipe OMX IL v1.x solution to be exercised, +// since we know this feature has recently been added to the standard and it is not yet in use. +// +// + +/** + @file + @publishedPartner + @prototype +*/ + +#ifndef OMXILSYMBIANCONTENTPIPEIF_H +#define OMXILSYMBIANCONTENTPIPEIF_H + +#include + +/** +Bridge to allow content pipes to be loaded as ECOM plugins. + +@publishedPartner +*/ +NONSHARABLE_CLASS(COmxILSymbianContentPipeIf) : private COmxILContentPipeIf + { +public: + static COmxILSymbianContentPipeIf* NewL(); + ~COmxILSymbianContentPipeIf(); + TInt GetHandle(OMX_HANDLETYPE* aContentPipe); + +private: + COmxILSymbianContentPipeIf(); + +private: + /** A handle to the CP_PIPETYPE structure */ + CP_PIPETYPE* iHandle; + }; + +/** + This Macro defines the ECOM plug-in entry point and must be used by the content pipe. + + In order to allow a content pipe to be loaded as an ECOM plugin you must: + - Link the content pipe library against this component + - Declare the OMXIL_CONTENTPIPE_ECOM_ENTRYPOINT macro with the content pipe UID + - Implement the function "TInt ContentPipeInit(OMX_HANDLETYPE* aContentPipe)", + the content pipe entry point. This function initialises the CP_PIPETYPE structure + and returns it in its first argument. aContentPipe = Returns a pointer to the + content pipe handle. Must return KErrNone if successful, otherwise another + system-wide error code. + - Implement the function "TInt ContentPipeDeInit(OMX_HANDLETYPE aContentPipe)", + the content pipe exit point. This function deinitialises the CP_PIPETYPE structure + passed as the first argument. aContentPipe = A pointer to the content pipe handle + that will be deinitialised. Must return KErrNone if successful, otherwise another + system-wide error code. + + @param aUid UID of the ECOM plug-in + @see ContentPipeInit + @see ContentPipeDeInit +*/ +#define OMXIL_CONTENTPIPE_ECOM_ENTRYPOINT(aUid) \ +\ +const TImplementationProxy ImplementationTable[] = \ + {\ + IMPLEMENTATION_PROXY_ENTRY((aUid), COmxILSymbianContentPipeIf::NewL),\ + };\ +\ +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)\ + {\ + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);\ + return ImplementationTable;\ + } + +/** + Although this is tagged as InternalAll it is effectively PublishedPartner, however + since it is not exported we are unable to tag it as such. + Any change to this function signature will be a PublishedPartner break. + + Content pipe entry point + This function initialises the CP_PIPETYPE structure and returns it in its first argument + + @return KErrNone if successful, otherwise another system-wide error code + @param aContentPipe Returns a pointer to the content pipe handle + + @publishedPartner +*/ +TInt ContentPipeInit(OMX_HANDLETYPE* aContentPipe); + +/** + Although this is tagged as InternalAll it is effectively PublishedPartner, however + since it is not exported we are unable to tag it as such. + Any change to this function signature will be a PublishedPartner break. + + Content pipe exit point + This function deinitialises the CP_PIPETYPE structure passed as the first argument + + @return KErrNone if successful, otherwise another system-wide error code + @param aContentPipe A pointer to the content pipe handle that will be deinitialised + + @publishedPartner +*/ +TInt ContentPipeDeInit(OMX_HANDLETYPE aContentPipe); + +#endif // OMXILSYMBIANCONTENTPIPEIF_H \ No newline at end of file diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilcore_api/inc/omxilsymbianloaderif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilcore_api/inc/omxilsymbianloaderif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,102 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef OMXILSYMBIANLOADERIF_H +#define OMXILSYMBIANLOADERIF_H + +#include + +/** +COmxSymbianLoaderIf is the Symbian implementation of the COmxComponentLoaderIf. +The COmxComponentLoaderIf class provides an interface to the Component Loader implementation. +Component Loaders shall be installed as ECOM plug-ins implementing the COmxComponentLoaderIf +to run under Symbian OMX IL Core. + +@publishedPartner +*/ +NONSHARABLE_CLASS( COmxSymbianLoaderIf ) : public COmxComponentLoaderIf + { +public: + static COmxSymbianLoaderIf* NewL(); + ~COmxSymbianLoaderIf(); + + // from COmxComponentLoaderIf + OMX_HANDLETYPE Handle(); + +private: + void ConstructL(); + COmxSymbianLoaderIf(); + +private: + OMX_LOADERTYPE* iHandle; + }; + + +/** +Macro to facilitate the entry in the ECOM's ImplementationTable of any new Component Loader ECOM implementation UID. + +To make easier the task of exposing Component Loaders as ECOM plug-ins, Symbian offers a static +library that facilitates the mapping from the ECOM COmxComponentLoaderIf interface to non-ECOM +implementations. +The steps to wrap up a Component Loader as an ECOM plugin are: +- Provide a .mmp project definition file specifying plugin as Targetype, +- Link the Component Loader implementation against the omxilsymbianloaderif.lib static library. +- Provide a .rss file with interface_uid = KUidOmxILLoaderInterface. +- Declare the OMX_LOADER_ECOM_ENTRYPOINT macro with the particular implementation UID of the Loader. +- Implement the function "OMX_ERRORTYPE OMX_LoaderSetup(OMX_HANDLETYPE aLoader)". This function +is the entry point routine that Component Loaders have to implement to populate the actual structure +represented by the handle passed as argument. aLoader = The handle to the OMX_LOADERTYPE structure +to be populated. Must return an OpenMAX defined error, OMX_ErrorNone if successful. + +@param aUid UID of the ECOM plug-in +@see KUidOmxILLoaderInterface +@see OMX_LoaderSetup() +*/ +#define OMX_LOADER_ECOM_ENTRYPOINT(aUid) \ + \ + const TImplementationProxy ImplementationTable[] = \ + {\ + IMPLEMENTATION_PROXY_ENTRY((aUid), COmxSymbianLoaderIf::NewL),\ + };\ + \ + EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)\ + {\ + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);\ + return ImplementationTable;\ + } + +/** +Although this is tagged as InternalAll it is effectively PublishedPartner, however since it is not exported +we are unable to tag it as such. +Any change to this function signature will be a PublishedPartner break. + +Entry point routine that Component Loaders have to implement to populate the actual +structure represented by the handle passed as argument. +@param aLoader + The handle to the OMX_LOADERTYPE structure to be populated. +@return An OpenMAX defined error. OMX_ErrorNone if successful. + +@publishedPartner +*/ +OMX_ERRORTYPE OMX_LoaderSetup(OMX_HANDLETYPE aLoader); + + +#endif /*OMXILSYMBIANLOADERIF_H*/ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilloader_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilloader_api/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,32 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +PRJ_EXPORTS + + +// +// OMX IL Loader Interface +// + +// Symbian intend to push OMX_Loader.h to the OMX IL community. Hence export this +// file in mixed case. Its name is listed in filenamepolicyexclusions.txt. +../inc/OMX_Loader.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/loader/OMX_Loader.h) + + +// OMX IL Component Interface +../inc/omxilcomponentif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/loader/omxilcomponentif.h) +../inc/omxilcomponentif.hrh SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/loader/omxilcomponentif.hrh) +../inc/omxilsymbiancomponentif.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/loader/omxilsymbiancomponentif.h) diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilloader_api/inc/OMX_Loader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilloader_api/inc/OMX_Loader.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,208 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef OMX_LOADER_H +#define OMX_LOADER_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include + +struct OMX_LOADERTYPE + { + /** The InitializeComponentLoader method is used to initialize the loader. + It shall be the first call made into the loader and it should only be executed once + until UnInitializeComponentLoader call is made. + + @return OMX_ERRORTYPE + OMX_ErrorNone if the function is executed successfully, + OMX_ErrorInsufficientResources if the component loader fails to construct due to an + out of memory issue, OMX_ErrorUndefined or any other appropriate OMX error otherwise. + */ + OMX_ERRORTYPE (*InitializeComponentLoader)(OMX_LOADERTYPE *loader); + + /** The UnInitializeComponentLoader method is used to uninitialize the loader. + It shall be the last call made into the loader and should be called after all + OpenMAX-related resources have been released. + + @return OMX_ERRORTYPE + It returns OMX_ErrorNone if the function is executed successfully + or any other appropriate OMX error otherwise. + */ + OMX_ERRORTYPE (*UnInitializeComponentLoader)(OMX_LOADERTYPE *loader); + + /** The LoadComponent method will locate the component specified by the + component name given, load that component into memory and then invoke + the component's methods to create an instance of the component. + + @param [out] pHandle + pointer to an OMX_HANDLETYPE pointer to be filled in by this method. + @param [in] cComponentName + pointer to a null terminated string with the component name. The + names of the components are strings less than 127 bytes in length + plus the trailing null for a maximum size of 128 bytes. An example + of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0". Names are + assigned by the vendor, but shall start with "OMX." and then have + the Vendor designation next. + @param [in] pAppData + pointer to an application defined value that will be returned + during callbacks so that the application can identify the source + of the callback. + @param [in] pCallBacks + pointer to a OMX_CALLBACKTYPE structure that will be passed to the + component to initialize it with. + @return OMX_ERRORTYPE + It returns OMX_ErrorNone if the function is executed successfully + or any other appropriate OMX error otherwise. + */ + OMX_ERRORTYPE (*LoadComponent)( OMX_LOADERTYPE *loader, + OMX_OUT OMX_HANDLETYPE* pHandle, + OMX_IN OMX_STRING cComponentName, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_CALLBACKTYPE* pCallBacks); + + + /** The UnloadComponent method will free a handle allocated by the LoadComponent + method. + + @param [in] hComponent + Handle of the component to be accessed. This is the component + handle returned by the call to the GetHandle function. + @return OMX_ERRORTYPE + It returns OMX_ErrorNone if the function is executed successfully + OMX_ErrorComponentNotFound if the component is not found in this loader; + or any other appropriate OMX error otherwise. + */ + OMX_ERRORTYPE (*UnloadComponent)( OMX_LOADERTYPE *loader, + OMX_HANDLETYPE hComponent); + + /** The ComponentNameEnum method will enumerate through all the names of + recognised valid components in the system. This function is provided + as a means to detect all the components in the system run-time. There is + no strict ordering to the enumeration order of component names, although + each name will only be enumerated once. If the loader supports run-time + installation of new components, it is only requried to detect newly + installed components when the first call to enumerate component names + is made (i.e. when nIndex is 0x0). + + @param [out] cComponentName + pointer to a null terminated string with the component name. The + names of the components are strings less than 127 bytes in length + plus the trailing null for a maximum size of 128 bytes. An example + of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0". Names are + assigned by the vendor, but shall start with "OMX." and then have + the Vendor designation next. + @param [in] nNameLength + number of characters in the cComponentName string. With all + component name strings restricted to less than 128 characters + (including the trailing null) it is recomended that the caller + provide a input string for the cComponentName of 128 characters. + @param [in] nIndex + number containing the enumeration index for the component. + Multiple calls to OMX_ComponentNameEnum with increasing values + of nIndex will enumerate through the component names in the + system until OMX_ErrorNoMore is returned. The value of nIndex + is 0 to (N-1), where N is the number of valid installed components + in the system. + @return OMX_ERRORTYPE + If the command successfully executes, the return code will be + OMX_ErrorNone. When the value of nIndex exceeds the number of + components in the system minus 1, OMX_ErrorNoMore will be + returned. Otherwise the appropriate OMX error will be returned. + */ + OMX_ERRORTYPE (*ComponentNameEnum)( OMX_LOADERTYPE *loader, + OMX_OUT OMX_STRING cComponentName, + OMX_IN OMX_U32 nNameLength, + OMX_IN OMX_U32 nIndex); + + /** The GetRolesOfComponent method will return the number of roles supported by the given + component and (if the roles field is non-NULL) the names of those roles. The call will fail if + an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the + client should: + * first call this function with the roles field NULL to determine the number of role names + * second call this function with the roles field pointing to an array of names allocated + according to the number returned by the first call. + + @param [in] compName + This is the name of the component being queried about. + @param [inout] pNumRoles + This is used both as input and output. + + If roles is NULL, the input is ignored and the output specifies how many roles the component supports. + + If compNames is not NULL, on input it bounds the size of the input structure and + on output, it specifies the number of roles string names listed within the roles parameter. + @param [out] roles + If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings + which accepts a list of the names of all standard components roles implemented on the + specified component name. + @return OMX_ERRORTYPE + It returns OMX_ErrorNone if the function is executed successfully + or any other appropriate OMX error otherwise. + */ + OMX_ERRORTYPE (*GetRolesOfComponent)( OMX_LOADERTYPE *loader, + OMX_IN OMX_STRING compName, + OMX_INOUT OMX_U32 *pNumRoles, + OMX_OUT OMX_U8 **roles); + + /** The GetComponentsOfRole method will return the number of components that support the given + role and (if the compNames field is non-NULL) the names of those components. The call will fail if + an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the + client should: + * first call this function with the compNames field NULL to determine the number of component names + * second call this function with the compNames field pointing to an array of names allocated + according to the number returned by the first call. + + @param [in] role + This is generic standard component name consisting only of component class + name and the type within that class (e.g. 'audio_decoder.aac'). + @param [inout] pNumComps + This is used both as input and output. + + If compNames is NULL, the input is ignored and the output specifies how many components support + the given role. + + If compNames is not NULL, on input it bounds the size of the input structure and + on output, it specifies the number of components string names listed within the compNames parameter. + @param [inout] compNames + If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings which accepts + a list of the names of all physical components that implement the specified standard component name. + Each name is NULL terminated. numComps indicates the number of names. + @return OMX_ERRORTYPE + It returns OMX_ErrorNone if the function is executed successfully + or any other appropriate OMX error otherwise. + */ + OMX_ERRORTYPE (*GetComponentsOfRole)( OMX_LOADERTYPE *loader, + OMX_IN OMX_STRING role, + OMX_INOUT OMX_U32 *pNumComps, + OMX_INOUT OMX_U8 **compNames); + OMX_PTR pLoaderPrivate; + }; + +#define OMX_MAX_ROLESBUFFER_SIZE 256 + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /*OMX_LOADER_H*/ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilloader_api/inc/omxilcomponentif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilloader_api/inc/omxilcomponentif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,81 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef OMXILCOMPONENTIF_H +#define OMXILCOMPONENTIF_H + +#include +#include +#include +#include + +/** +The COmxILComponentIf class provides an interface to the OMX IL Component implementations. + +Symbian OS provides a Symbian Component Loader that manages OMX IL Components that are +installed as ECOM plug-ins implementing the COmxILComponentIf. The Symbian Component Loader +creates a list of all the ECOM implementations of this component interface (identified by +the KUidOmxILSymbianComponentIf UID) installed in the system. + +@see KUidOmxILSymbianComponentIf +*/ +class COmxILComponentIf : public CBase + { +public: + ~COmxILComponentIf(); + static COmxILComponentIf* CreateImplementationL(TUid aUid); + + /** + Gets the valid handle of the already populated OMX_COMPONENTTYPE structure. + + @return The component's handle + */ + virtual OMX_HANDLETYPE Handle() = 0; + +private: + + TUid iDestructorKey; + }; + +/** +Static method to load the particular ECOM plugin specified by the implementation UID passed as a parameter. +As part of the creation of this interface the actual OMX_COMPONENTTYPE structure should be allocated and populated. + +@param aUid + UID of the ECOM plug-in +@return The pointer to the newly created COmxILComponentIf object + +@see KUidOmxILSymbianComponentIf +*/ +inline COmxILComponentIf* COmxILComponentIf::CreateImplementationL(TUid aImplementationUid) + { + COmxILComponentIf* self = reinterpret_cast( REComSession::CreateImplementationL( aImplementationUid, _FOFF(COmxILComponentIf, iDestructorKey))); + return self; + } + +/** +Destructor of this interface. +*/ +inline COmxILComponentIf::~COmxILComponentIf() + { + REComSession::DestroyedImplementation(iDestructorKey); + } +#endif // OMXILCOMPONENTIF_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilloader_api/inc/omxilcomponentif.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilloader_api/inc/omxilcomponentif.hrh Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,32 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef OMXILCOMPONENTIF_HRH +#define OMXILCOMPONENTIF_HRH + +/** +Defines the numerical value for the Interface UID of an OpenMax IL Symbian Component. +All components to be loaded by the Symbian Component Loader should be ECOM plugins and must use +this interface UID in the REGISTRY_INFO of their resource files. +*/ +#define KUidOmxILSymbianComponentIf 0x10283497 + +#endif // OMXILCOMPONENTIF_HRH diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/omxilloader_api/inc/omxilsymbiancomponentif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/omxilloader_api/inc/omxilsymbiancomponentif.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,104 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @publishedPartner + @released +*/ + +#ifndef OMXILSYMBIANCOMPONENTIF_H +#define OMXILSYMBIANCOMPONENTIF_H + +#include + +/** +COmxILSymbianComponentIf is the Symbian implementation of the COmxILComponentIf. +The COmxILComponentIf class provides an interface that the Symbian Component Loader uses to access +Symbian OMX IL Components . + + +@publishedPartner + + +*/ +NONSHARABLE_CLASS(COmxILSymbianComponentIf) : private COmxILComponentIf + { +public: + static COmxILSymbianComponentIf* NewL(); + ~COmxILSymbianComponentIf(); + + // from COmxILComponentIf + OMX_HANDLETYPE Handle(); + +private: + COmxILSymbianComponentIf(); + void ConstructL(); + +private: + OMX_COMPONENTTYPE* ipHandle; + }; + +/** +Macro to facilitate the entry in the ECOM's ImplementationTable of any new Component ECOM implementation UID. + +To make easier the task of exposing OMX IL Components as ECOM plug-ins, Symbian offers a static +library that facilitates the mapping from the ECOM COmxILComponentIf interface to non-ECOM +implementations. +The steps to wrap up a Component as an ECOM plugin are: +- Provide a .mmp project definition file specifying plugin as Targetype, +- Link the Component implementation against the omxilcomponentif.lib static library. +- Provide a .rss file with interface_uid = KUidOmxILSymbianComponentIf +- Declare the OMXIL_COMPONENT_ECOM_ENTRYPOINT macro with the particular implementation UID of the Component. +- Implement the function "OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE aComponent)". This function +is the entry point routine that OMX IL Components have to implement to populate the actual structure +represented by the handle passed as argument. aComponent = The handle to the OMX_COMPONENTTYPE +structure to be populated. Must return an OpenMAX defined error, OMX_ErrorNone if successful. + +@param aUid UID of the ECOM plug-in +@see KUidOmxILSymbianComponentIf +@see OMX_ComponentInit() +@see COmxComponentLoaderIf +*/ +#define OMXIL_COMPONENT_ECOM_ENTRYPOINT(aUid) \ +\ +const TImplementationProxy ImplementationTable[] = \ + {\ + IMPLEMENTATION_PROXY_ENTRY((aUid), COmxILSymbianComponentIf::NewL),\ + };\ +\ +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)\ + {\ + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);\ + return ImplementationTable;\ + } + +/** +Although this is tagged as InternalAll it is effectively PublishedPartner, however +since it is not exported we are unable to tag it as such. +Any change to this function signature will be a PublishedPartner break. + +Entry point routine that OMX IL Components have to implement to populate the actual +structure represented by the handle passed as argument. +@param aComponent + The handle to the OMX_COMPONENTTYPE structure to be populated. +@return An OpenMAX defined error. OMX_ErrorNone if successful. + +@publishedPartner +*/ +OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE aComponent); + + +#endif //OMXILSYMBIANCOMPONENTIF_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/shaiext_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/shaiext_api/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,27 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +PRJ_EXPORTS + +// +// SHAI extension headers +// +../inc/OMX_Symbian_AudioExt.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/shai/OMX_Symbian_AudioExt.h) +../inc/OMX_Symbian_ComponentExt.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/shai/OMX_Symbian_ComponentExt.h) +../inc/OMX_Symbian_CoreExt.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/shai/OMX_Symbian_CoreExt.h) +../inc/OMX_Symbian_ExtensionNames.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/shai/OMX_Symbian_ExtensionNames.h) +../inc/OMX_Symbian_IVCommonExt.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/shai/OMX_Symbian_IVCommonExt.h) +../inc/OMX_Symbian_OtherExt.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/shai/OMX_Symbian_OtherExt.h) diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_AudioExt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_AudioExt.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1254 @@ +/* + OMX_Symbian_AudioExt.h + + Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which accompanies + this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + Initial Contributors: + Nokia Corporation - initial contribution. +*/ + +/** @file +@brief Symbian OpenMAX IL Extension Data Structures in the Audio Domain. + +This file contains the extension structures for the Symbian IL extensions that +pertain to audio components. + +@publishedDeviceAbstraction +*/ + +#ifndef OMX_Symbian_AudioExt_h +#define OMX_Symbian_AudioExt_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ +#include +#include +#include + + +/** @name Generic Audio Control Definitions. */ + +/*@{*/ + +/** Simple effect enable/disable switch control. + +This struct can be used to control all effects that only require an on/off +type of control. + +This data structure is currently used for: +- Earpiece Active Noise Control (EANC) settings with extension string + "OMX.Symbian.Index.Config.Audio.EANC" +- Algorithm for Preventing System Shutdown by Audio System (APSSAS) params + with extension string "OMX.Symbian.Index.Param.Audio.APSSAS". +- Uplink algorithms configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.UplinkAlgorithms". +- Downlink algorithms configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.DownlinkAlgorithms". +- Automatic volume control configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.AutomaticVolumeControl". +- Comfort noise generation configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.ComfortNoiseGeneration". +- Multimicrophone noise control configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.MultiMicrophoneNoiseControl". +- Transducer dynamic range control (DRC) configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.TransducerDRC". +- Uplink level normalization configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.UplinkLevelNormalization". +- Voice clarity configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.VoiceClarity". +- Sidetone howling control configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.SidetoneHowlingControl" +- Automatic gain control configuration parameters with extension string + "OMX.Symbian.Index.Config.Audio.AutomaticGainControl". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_EFFECTENABLETYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_BOOL bEnable; /**< enable (OMX_TRUE) or disable (OMX_FALSE) the effect */ +} OMX_SYMBIAN_AUDIO_CONFIG_EFFECTENABLETYPE; + +/*@}*/ + +/** @name Audio Codecs Extensions */ + +/*@{*/ + +/** WMA params. + +The OMX_AUDIO_PARAM_WMAAVGBYTESTYPE structure is used to set or query +the WMA codec related parameters. The setting can be changed using +the OMX_SetParam() function, and the current state can be queried using +the OMX_GetParam() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Param.Audio.WMAAvgBytes". +*/ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_WMAAVGBYTESTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nAvgBytesPerSec; +} OMX_SYMBIAN_AUDIO_PARAM_WMAAVGBYTESTYPE; + +/** The version of the Windows Media Audio Pro codec */ +typedef enum OMX_SYMBIAN_AUDIO_WMAPROFORMATTYPE { + OMX_SYMBIAN_AUDIO_WMAPROFormatUnused, /**< The version of the Windows Media audio codec is + either not applicable or is unknown. */ + OMX_SYMBIAN_AUDIO_WMAPROFormat9, /**< Windows Media Audio Pro version 9 */ + OMX_SYMBIAN_AUDIO_WMAPROFormat10, /**< Windows Media Audio Pro version 10 */ + OMX_SYMBIAN_AUDIO_WMAPROFormatMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_WMAPROFORMATTYPE; + +/** The profile of the Windows Media Audio Pro codec */ +typedef enum OMX_SYMBIAN_AUDIO_WMAPROPROFILETYPE { + OMX_SYMBIAN_AUDIO_WMAPROProfileUnused, /**< The profile of the Windows Media Audio Pro codec is + either not applicable or is unknown. */ + OMX_SYMBIAN_AUDIO_WMAPROProfileM0, /**< Windows Media Audio Pro profile M0. */ + OMX_SYMBIAN_AUDIO_WMAPROProfileM1, /**< Windows Media Audio Pro profile M1. */ + OMX_SYMBIAN_AUDIO_WMAPROProfileM2, /**< Windows Media Audio Pro profile M2. */ + OMX_SYMBIAN_AUDIO_WMAPROProfileM3, /**< Windows Media Audio Pro profile M3. */ + OMX_SYMBIAN_AUDIO_WMAPROProfileMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_WMAPROPROFILETYPE; + +/** WMA Pro params. + +The OMX_SYMBIAN_AUDIO_PARAM_WMAPROTYPE structure is used to set or query +the WMA pro codec related parameters. The setting can be changed using +the OMX_SetParam() function, and the current state can be queried using +the OMX_GetParam() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Param.Audio.WMAPro". +*/ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_WMAPROTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< port that this structure applies to */ + OMX_U16 nChannels; /**< Number of channels */ + OMX_U32 nBitRate; /**< Bit rate of the input data. Use 0 for variable + rate or unknown bit rates */ + OMX_SYMBIAN_AUDIO_WMAPROFORMATTYPE eFormat; /**< The version of the Windows Media Audio Pro codec */ + OMX_SYMBIAN_AUDIO_WMAPROPROFILETYPE eProfile; /**< The profile of the Windows Media Audio Pro codec */ + OMX_U32 nSamplingRate; /**< Sampling rate of the source data. */ + OMX_U32 nBlockAlign; /**< The block alignment, or block size (in bytes) + of the audio codec */ + OMX_U32 nSuperBlockAlign; /**< WMA Type specific data. It is used only by encoder + and is don’t care for decoder. */ + OMX_U32 nEncodeOptions; /**< WMA Type specific opaque data */ + OMX_U32 nAdvancedEncodeOptions; /**< WMA pro specific opaque data (don’t care for others) */ + OMX_U32 nAdvancedEncodeOptions2; /**< WMA pro LBR specific opaque data (don’t care for others) */ + OMX_U32 nChannelMask; /**< Output channel configuration; used only when down mixing + is enabled. Channel mask for stereo down mix is 0x03. */ +} OMX_SYMBIAN_AUDIO_PARAM_WMAPROTYPE; + +/** AMR configs. + +The OMX_SYMBIAN_AUDIO_CONFIG_AMRMODETYPE structure is used to set or query +the AMR codec related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.AMRMode". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_AMRMODETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_AUDIO_AMRBANDMODETYPE eAMRBandMode; +} OMX_SYMBIAN_AUDIO_CONFIG_AMRMODETYPE; + +/** SBC configs. + +The OMX_SYMBIAN_AUDIO_CONFIG_SBCBITPOOLTYPE structure is used to set or query +the SBC codec related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.SBCBitpool". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_SBCBITPOOLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nNewBitPool; +} OMX_SYMBIAN_AUDIO_CONFIG_SBCBITPOOLTYPE; + +/** iLBC params. + +The OMX_SYMBIAN_AUDIO_PARAM_ILBCTYPE structure is used to set or query +the iLBC codec related parameters. The setting can be changed using +the OMX_SetParam() function, and the current state can be queried using +the OMX_GetParam() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Param.Audio.ILBC". +*/ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_ILBCTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nFrameLength; + OMX_BOOL bIsDTXCNGSupported; + OMX_BOOL bDTXCNGSelected; + OMX_BOOL bPLCSelected; +} OMX_SYMBIAN_AUDIO_PARAM_ILBCTYPE; + +/** iLBC configs. + +The OMX_SYMBIAN_AUDIO_CONFIG_ILBCFRAMETYPE structure is used to set or query +the iLBC codec related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.ILBCFrame". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_ILBCFRAMETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nFrameLength; +} OMX_SYMBIAN_AUDIO_CONFIG_ILBCFRAMETYPE; + +/** G.711 params. + +The OMX_SYMBIAN_AUDIO_PARAM_G711TYPE structure is used to set or query +the G.711 codec related parameters. The setting can be changed using +the OMX_SetParam() function, and the current state can be queried using +the OMX_GetParam() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Param.Audio.G711". +*/ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_G711TYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bIsDTXCNGSupported; + OMX_BOOL bIsPLCSupported; + OMX_BOOL bDTXCNGEnabled; + OMX_BOOL bPLCEnabled; + OMX_U32 nFrameLength; +} OMX_SYMBIAN_AUDIO_PARAM_G711TYPE; + +/*@}*/ + +/** @name Audio Capture Extensions */ + +/*@{*/ + +/*@}*/ + +/** @name Audio Rendering Extensions */ + +/*@{*/ + +/** Mixer port pause config. + +The OMX_SYMBIAN_AUDIO_CONFIG_PORTPAUSETYPE structure is used to set or query +the mixer/splitter related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.PortPause". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_PORTPAUSETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bIsPaused; +} OMX_SYMBIAN_AUDIO_CONFIG_PORTPAUSETYPE; + +/** Mixer port synchronized param. + +The OMX_SYMBIAN_AUDIO_PARAM_SYNCHRONIZEDTYPE structure is used to set or query +the mixer/splitter related parameters. The setting can be changed using +the OMX_SetParam() function, and the current state can be queried using +the OMX_GetParam() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Param.Audio.Synchronized". +*/ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_SYNCHRONIZEDTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bIsSynchronized; +} OMX_SYMBIAN_AUDIO_PARAM_SYNCHRONIZEDTYPE; + +/** Output transducer setting for 3D. */ +typedef enum OMX_SYMBIAN_AUDIO_3DOUTPUTTYPE { + OMX_SYMBIAN_AUDIO_3DOutputHeadphones, /**< Positional 3D audio for headphones */ + OMX_SYMBIAN_AUDIO_3DOutputLoudspeakers, /**< Positional 3D audio for two closely spaced loudspeakers */ + OMX_SYMBIAN_AUDIO_3DOutputMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_3DOUTPUTTYPE; + +/** Output transducer setting for 3D. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DOUTPUTTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DOutput". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DOUTPUTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_SYMBIAN_AUDIO_3DOUTPUTTYPE e3DOutputType; +} OMX_SYMBIAN_AUDIO_CONFIG_3DOUTPUTTYPE; + +/** 3D location setting. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DLOCATIONTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DLocation". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DLOCATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nX; + OMX_S32 nY; + OMX_S32 nZ; +} OMX_SYMBIAN_AUDIO_CONFIG_3DLOCATIONTYPE; + +/** Doppler effect mode for 3D. + +The OMX_SYMBIAN_AUDIO_PARAM_3DDOPPLERMODETYPE structure is used to set or query +the 3D mixer related parameters. The setting can be changed using +the OMX_SetParam() function, and the current state can be queried using +the OMX_GetParam() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Param.Audio.3DDopplerMode". +*/ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_3DDOPPLERMODETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnabled; +} OMX_SYMBIAN_AUDIO_PARAM_3DDOPPLERMODETYPE; + +/** Doppler effect settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DDOPPLERSETTINGSTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DDopplerSettings". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DDOPPLERSETTINGSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nSoundSpeed; + OMX_S32 nSourceVelocity; + OMX_S32 nListenerVelocity; +} OMX_SYMBIAN_AUDIO_CONFIG_3DDOPPLERSETTINGSTYPE; + +/** 3D mixer level settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DLEVELSTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DLevels". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DLEVELSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BS32 sDirectLevel; + OMX_BS32 sRoomLevel; +} OMX_SYMBIAN_AUDIO_CONFIG_3DLEVELSTYPE; + +/** Distance attenuation roll-off model setting for 3D. */ +typedef enum OMX_SYMBIAN_AUDIO_ROLLOFFMODELTYPE { + OMX_SYMBIAN_AUDIO_RollOffExponential, + OMX_SYMBIAN_AUDIO_RollOffLinear, + OMX_SYMBIAN_AUDIO_RollOffMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_ROLLOFFMODELTYPE; + +/** 3D mixer distance attenuation. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DDISTANCEATTENUATIONTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DDistanceAttenuation". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DDISTANCEATTENUATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BS32 sMinDistance; + OMX_BS32 sMaxDistance; + OMX_BS32 sRollOffFactor; + OMX_BS32 sRoomRollOffFactor; + OMX_SYMBIAN_AUDIO_ROLLOFFMODELTYPE eRollOffModel; + OMX_BOOL bMuteAfterMax; +} OMX_SYMBIAN_AUDIO_CONFIG_3DDISTANCEATTENUATIONTYPE; + +/** 3D mixer directivity settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DDIRECTIVITYSETTINGSTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DDirectivitySettings". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DDIRECTIVITYSETTINGSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BS32 sInnerAngle; + OMX_BS32 sOuterAngle; + OMX_BS32 sOuterLevel; +} OMX_SYMBIAN_AUDIO_CONFIG_3DDIRECTIVITYSETTINGSTYPE; + +/** 3D mixer orientation setting for the directivity effect. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DDIRECTIVITYORIENTATIONTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DDirectivityOrientation". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DDIRECTIVITYORIENTATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nXFront; + OMX_S32 nYFront; + OMX_S32 nZFront; +} OMX_SYMBIAN_AUDIO_CONFIG_3DDIRECTIVITYORIENTATIONTYPE; + +/** 3D mixer orientation setting for the macroscopic effect. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DMACROSCOPICORIENTATIONTYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DMacroscopicOrientation". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DMACROSCOPICORIENTATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nXFront; + OMX_S32 nYFront; + OMX_S32 nZFront; + OMX_S32 nXAbove; + OMX_S32 nYAbove; + OMX_S32 nZAbove; +} OMX_SYMBIAN_AUDIO_CONFIG_3DMACROSCOPICORIENTATIONTYPE; + +/** 3D mixer macroscopic effect size setting. + +The OMX_SYMBIAN_AUDIO_CONFIG_3DMACROSCOPICSIZETYPE structure is used to set or query +the 3D mixer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.3DMacroscopicSize". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_3DMACROSCOPICSIZETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_S32 nWidth; + OMX_S32 nHeight; + OMX_S32 nDepth; +} OMX_SYMBIAN_AUDIO_CONFIG_3DMACROSCOPICSIZETYPE; + + + +/** Audio virtualizer transducer type */ +typedef enum OMX_SYMBIAN_AUDIO_VIRTUALIZERTYPE { + OMX_SYMBIAN_AUDIO_VirtualizerLoudspeakers, /**< Loudspeakers */ + OMX_SYMBIAN_AUDIO_VirtualizerHeadphones, /**< Headphones */ + OMX_SYMBIAN_AUDIO_VirtualizerMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_VIRTUALIZERTYPE; + +/** Virtualizer mode setting. + +The OMX_SYMBIAN_AUDIO_CONFIG_VIRTUALIZERTYPE structure is used to set or query +the Virtualizer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.Virtualizer". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_VIRTUALIZERTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_SYMBIAN_AUDIO_VIRTUALIZERTYPE eVirtualizationType; + OMX_U32 nVirtualizationStrength; +} OMX_SYMBIAN_AUDIO_CONFIG_VIRTUALIZERTYPE; + +/** Virtualizer loudspeaker angle setting. + +The OMX_SYMBIAN_AUDIO_CONFIG_VIRTUALIZERLOUDSPEAKERTYPE structure is used to set or query +the Virtualizer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.VirtualizerLoudspeaker". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_VIRTUALIZERLOUDSPEAKERTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nListeningAngle; +} OMX_SYMBIAN_AUDIO_CONFIG_VIRTUALIZERLOUDSPEAKERTYPE; + +/** Audio visualizer mode type */ +typedef enum OMX_SYMBIAN_AUDIO_VISUALIZATIONTYPE { + OMX_SYMBIAN_AUDIO_VisualizationPresetNone, + OMX_SYMBIAN_AUDIO_VisualizationPresetWaveform, + OMX_SYMBIAN_AUDIO_VisualizationPresetSpectrum, + OMX_SYMBIAN_AUDIO_VisualizationPresetWaveformAndSpectrum, + OMX_SYMBIAN_AUDIO_VisualizationPresetMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_VISUALIZATIONTYPE; + +/** Audio visualizer mode setting. + +The OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONTYPE structure is used to set or query +the Audio visualizer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.Visualization". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_SYMBIAN_AUDIO_VISUALIZATIONTYPE ePreset; + OMX_BU32 sRate; +} OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONTYPE; + +/** Audio visualizer settings for the spectral mode. + +The OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONSPECTRALTYPE structure is used to set or query +the Audio visualizer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.VisualizationSpectral". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONSPECTRALTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BU32 sBandIndex; + OMX_BU32 sCenterFreq; + OMX_U32 nType; +} OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONSPECTRALTYPE; + +/** Audio visualizer settings for the waveform mode. + +The OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONWAVEFORMTYPE structure is used to set or query +the Audio visualizer related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.VisualizationWaveform". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONWAVEFORMTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BU32 sWaveformLength; +} OMX_SYMBIAN_AUDIO_CONFIG_VISUALIZATIONWAVEFORMTYPE; + +/*@}*/ + +/** @name Audio Transducer Processing Extensions */ + +/*@{*/ + +/** Equalizer filter type */ +typedef enum OMX_SYMBIAN_AUDIO_FILTERTYPE { + OMX_SYMBIAN_AUDIO_FilterNotDefined, + OMX_SYMBIAN_AUDIO_FilterPeaking, + OMX_SYMBIAN_AUDIO_FilterLowpass, + OMX_SYMBIAN_AUDIO_FilterHighpass, + OMX_SYMBIAN_AUDIO_FilterLowshelf, + OMX_SYMBIAN_AUDIO_FilterHighshelf, + OMX_SYMBIAN_AUDIO_FilterMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_FILTERTYPE; + +/** IIR Transducer EQ settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_IIREQUALIZERTYPE structure is used to set or query +the Transducer EQ related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.IIREqualizer". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_IIREQTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nChannel; + OMX_BU32 sBandIndex ; + OMX_SYMBIAN_AUDIO_FILTERTYPE eFilterType; + OMX_U32 nFilterCenterCutoffFrequency; + OMX_S32 nFilterGain; + OMX_U32 nFilterBandwidth; +} OMX_SYMBIAN_AUDIO_CONFIG_IIREQTYPE; + + +/** The maximum number of frequency response points for the FIR EQ */ +#define OMX_SYMBIAN_AUDIO_MAX_FIR_RESPONSE_POINTS 100 + +/** FIR Transducer EQ configs. + +The OMX_SYMBIAN_AUDIO_CONFIG_FIRRESPONSETYPE structure is used to set or query +the Transducer EQ related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.FIRResponse". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_FIRRESPONSETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nChannel; + OMX_U32 nFrequencyPoints; + OMX_S32 nFrequencies[OMX_SYMBIAN_AUDIO_MAX_FIR_RESPONSE_POINTS]; + OMX_S32 nGains[OMX_SYMBIAN_AUDIO_MAX_FIR_RESPONSE_POINTS]; +} OMX_SYMBIAN_AUDIO_CONFIG_FIRRESPONSETYPE; + +/** Phase response enum */ +typedef enum OMX_SYMBIAN_AUDIO_PHASERESPONSETYPE { + OMX_SYMBIAN_AUDIO_PhaseNotDefined, + OMX_SYMBIAN_AUDIO_LinearPhase, + OMX_SYMBIAN_AUDIO_MinimumPhase, +} OMX_SYMBIAN_AUDIO_PHASERESPONSETYPE; + +/** Transducer EQ main settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_TRANSDUCEREQUALIZERTYPE structure is used to set or query +the Transducer EQ related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.TransducerEqualizer". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_TRANSDUCEREQUALIZERTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnableFir; + OMX_BOOL bEnableIir; + OMX_U32 nChannel; + OMX_SYMBIAN_AUDIO_PHASERESPONSETYPE ePhaseResponseTargetFir; + OMX_SYMBIAN_AUDIO_PHASERESPONSETYPE ePhaseResponseTargetIir; + OMX_U32 nIIREqualizerBlocks; + OMX_U32 nIIREqualizerGain; +} OMX_SYMBIAN_AUDIO_CONFIG_TRANSDUCEREQUALIZERTYPE; + +/** Multi-band DRC settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_MDRCTYPE structure is used to set or query +the MDRC related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.MDRC". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_MDRCTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nChannel; + OMX_BOOL bEnable; + OMX_BU32 sBandIndex; + OMX_BU32 sBandRange; + OMX_BU32 sBandLevel; + OMX_BU32 sKneePoints; + OMX_U32 nDynamicResponse[10][2]; + OMX_BU32 sAttackTime; + OMX_BU32 sReleaseTime; +} OMX_SYMBIAN_AUDIO_CONFIG_MDRCTYPE; + +/** Transducer protection settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_LSPROTECTIONTYPE structure is used to set or query +the Transducer protection related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.LSProtection". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_LSPROTECTIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_AUDIO_CHANNELTYPE eChannel; + OMX_BOOL bEnable; +} OMX_SYMBIAN_AUDIO_CONFIG_LSPROTECTIONTYPE; + +/** Transducer SPL limiting mode*/ +typedef enum OMX_SYMBIAN_AUDIO_SPLLIMITTYPE { + OMX_SYMBIAN_AUDIO_SPLLimitation, + OMX_SYMBIAN_AUDIO_SPLNormalization, + OMX_SYMBIAN_AUDIO_SPLMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_SPLLIMITTYPE; + +/** SPL Limiter configs. + +The OMX_SYMBIAN_AUDIO_CONFIG_SPLLIMITTYPE structure is used to set or query +the SPL Limiter related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.SPLLimit". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_SPLLIMITTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_SYMBIAN_AUDIO_SPLLIMITTYPE eMode; + OMX_S32 nSplLimit; + OMX_S32 nGain; +} OMX_SYMBIAN_AUDIO_CONFIG_SPLLIMITTYPE; + +/** Click Removal settings. + +The OMX_SYMBIAN_AUDIO_CONFIG_CLICKREMOVALTYPE structure is used to set or query +the Click Removal related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.ClickRemoval". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_CLICKREMOVALTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_BU32 sClickControl; +} OMX_SYMBIAN_AUDIO_CONFIG_CLICKREMOVALTYPE; + +/** APSSAS configs. + +The OMX_SYMBIAN_AUDIO_CONFIG_BATTERYVOLTAGETYPE structure is used to set or query +the APSSAS related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.BatteryVoltage". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_BATTERYVOLTAGETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nBattVol; +} OMX_SYMBIAN_AUDIO_CONFIG_BATTERYVOLTAGETYPE; + +/*@}*/ + +/** HDMI related configuration structure. */ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_HDMITYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nSubFrameSize; + OMX_U32 nVaildBitsPerSample; + OMX_U32 nQFormat; +} OMX_SYMBIAN_AUDIO_PARAM_HDMITYPE; + + +/** Tone generation mode enum. */ +typedef enum OMX_SYMBIAN_AUDIO_TONEGENTONETYPE { + OMX_SYMBIAN_AUDIO_TonegenNormal, /**< Normal Tone */ + OMX_SYMBIAN_AUDIO_TonegenDtmf, /**< DTMF Tone */ + OMX_SYMBIAN_AUDIO_TonegenMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_TONEGENTONETYPE; + +/** Tone generator configs. + +The OMX_SYMBIAN_AUDIO_CONFIG_TONEGENERATORTYPE structure is used to set or query +the Tone generator related configurations. The setting can be changed using +the OMX_SetConfig() function, and the current state can be queried using +the OMX_GetConfig() function. When calling either function, the index +specified for this structure is retrieved using OMX_GetExtensionIndex() +with the extension string "OMX.Symbian.Index.Config.Audio.ToneGenerator". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_TONEGENERATORTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_SYMBIAN_AUDIO_TONEGENTONETYPE eTonetype; + OMX_U32 nFrequency[2]; + OMX_U32 nDigit; +} OMX_SYMBIAN_AUDIO_CONFIG_TONEGENERATORTYPE; + +/*@}*/ + +/** @name Audio Telephony Extensions */ + +/*@{*/ + +/** Speech decoder status information. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.DecoderStatus". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_DECODERSTATUSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion ; + OMX_AUDIO_CODINGTYPE nCoding; + OMX_U32 nBitrate; +} OMX_SYMBIAN_AUDIO_CONFIG_DECODERSTATUSTYPE; + +/** Speech encoder status information. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.EncoderStatus". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_ENCODERSTATUSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion ; + OMX_AUDIO_CODINGTYPE nCoding; + OMX_U32 nBitrate; + OMX_BOOL bDtx; + OMX_BOOL bAudioActivityControl; + OMX_BOOL bNsync; +} OMX_SYMBIAN_AUDIO_CONFIG_ENCODERSTATUSTYPE; + +/** Uplink timing control. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.UplinkTiming". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_UPLINKTIMINGTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nDeliveryTime; + OMX_U32 nModemProcessingTime; +} OMX_SYMBIAN_AUDIO_CONFIG_UPLINKTIMINGTYPE; + +/** RF-TX Power information. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.RFTxPower". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_RFTXPOWERTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPower; + OMX_U32 nTime; +} OMX_SYMBIAN_AUDIO_CONFIG_RFTXPOWERTYPE; + +/** Uplink timing information. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.UplinkTimingInfo". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_UPLINKTIMINGINFOTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_S32 nMaxTime; + OMX_S32 nAverageTime; + OMX_S32 nMinTime; +} OMX_SYMBIAN_AUDIO_CONFIG_UPLINKTIMINGINFOTYPE; + +/** Uplink delay information. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.UplinkDelayInfo". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_UPLINKDELAYINFOTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_S32 nMaxDelay; + OMX_S32 nAverageDelay; + OMX_S32 nMinDelay; +} OMX_SYMBIAN_AUDIO_CONFIG_UPLINKDELAYINFOTYPE; + +/** Acoustic echo control configuration parameters. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.AcousticEchoControl". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_ACOUSTICECHOCONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_S32 sEchoGain; + OMX_U32 nEchoMinDelay; + OMX_U32 nEchoMaxDelay; +} OMX_SYMBIAN_AUDIO_CONFIG_ACOUSTICECHOCONTROLTYPE; + +/** Artificial bandwidth expansion configuration parameters. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.BandwidthExpansion". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_BANDWIDTHEXPANSIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_BU32 nStrength; +} OMX_SYMBIAN_AUDIO_CONFIG_BANDWIDTHEXPANSIONTYPE; + +/** Background noise control configuration parameters. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.BackgroundNoiseControl". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_BACKGROUNDNOISECONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_BU32 nAttenuation; +} OMX_SYMBIAN_AUDIO_CONFIG_BACKGROUNDNOISECONTROLTYPE; + +/** Downlink noise control configuration parameters. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.DownLinkNoiseControl". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_DOWNLINKNOISECONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_BU32 nStrength; +} OMX_SYMBIAN_AUDIO_CONFIG_DOWNLINKNOISECONTROLTYPE; + +/** Wind noise control configuration parameters. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.WindNoiseControl". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_WINDNOISECONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bEnable; + OMX_BU32 nSensitivity; +} OMX_SYMBIAN_AUDIO_CONFIG_WINDNOISECONTROLTYPE; + + +/** Downlink speech information extra data type. */ +typedef struct OMX_SYMBIAN_AUDIO_EXTRADATA_DLSPEECHINFOTYPE { + OMX_SYMBIAN_OTHER_EXTRADATABASETYPE base; + OMX_BOOL bComfortNoiseFrame; + OMX_BOOL bCorruptedFrame; +} OMX_SYMBIAN_AUDIO_EXTRADATA_DLSPEECHINFOTYPE; + +/** DA-AD timing difference information extra data type. */ +typedef struct OMX_SYMBIAN_AUDIO_EXTRADATA_DAADTIMINGDIFFTYPE { + OMX_SYMBIAN_OTHER_EXTRADATABASETYPE base; + OMX_TICKS nDaAdTimingDifference; +} OMX_SYMBIAN_AUDIO_EXTRADATA_DAADTIMINGDIFFTYPE; + +/** Voice Activity Detection information extra data type. */ +typedef struct OMX_SYMBIAN_AUDIO_EXTRADATA_VADINFOTYPE { + OMX_SYMBIAN_OTHER_EXTRADATABASETYPE base; + OMX_BOOL bUplinkVad; + OMX_BOOL bDownlinkVad; +} OMX_SYMBIAN_AUDIO_EXTRADATA_VADINFOTYPE; + +/** Audio tuning data type. + +Audio tuning data type is used for passing tuning parameters via the OpenMAX IL +component API to audio algorithms. The audio tuning parameters form an opaque +data block, which only the sender and the algorithm understand. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.TuningData". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_TUNINGDATATYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nChannel; + OMX_U8 nData[1]; +} OMX_SYMBIAN_AUDIO_CONFIG_TUNINGDATATYPE; + +/** Speech path loops control type. + +Loop control for speech signal path. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.SpeechLoops". +*/ + +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_SPEECHLOOPSTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_BOOL bLoopUplinkDownlink; + OMX_BOOL bLoopUplinkDownlinkAlg; + OMX_BOOL bLoopDownlinkUplink; + OMX_BOOL bLoopDownlinkUplinkAlg; +} OMX_SYMBIAN_AUDIO_CONFIG_SPEECHLOOPSTYPE; + +/** Sidetone attenuation info type. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string "OMX.Symbian.Index.Config.Audio.SidetoneAttenuationInfo" +*/ +typedef OMX_AUDIO_CONFIG_VOLUMETYPE OMX_AUDIO_CONFIG_SIDETONEATTENUATIONINFOTYPE; + +/** Volume info type. + +This struct can be used to control sidetone attenuation. + +This data structure is currently used for reading volume info with extension string + "OMX.Symbian.Index.Config.Audio.VolumeInfo" +*/ +typedef OMX_AUDIO_CONFIG_VOLUMETYPE OMX_AUDIO_CONFIG_VOLUMEINFOTYPE; + + +/*@}*/ + +/** @name Audio HW Control Extensions */ + +/*@{*/ + +/** Audio power control. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.Power". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_POWERTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nChannel; + OMX_BOOL bPower; +} OMX_SYMBIAN_AUDIO_CONFIG_POWERTYPE; + +/** Audio volume ramp control. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.VolumeRamp". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_VOLUMERAMPTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nChannel; + OMX_BOOL bLinear; + OMX_BS32 sStartVolume; + OMX_BS32 sEndVolume; + OMX_TICKS nRampDuration; + OMX_BOOL bRampTerminate; + OMX_BS32 sCurrentVolume; + OMX_TICKS nRampCurrentTime; + OMX_TICKS nRampMinDuration; + OMX_TICKS nRampMaxDuration; + OMX_U32 nVolumeStep; +} OMX_SYMBIAN_AUDIO_CONFIG_VOLUMERAMPTYPE; + +/** Audio register bank query. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.RegisterBankQuery". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_REGISTERBANKQUERYTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U16 nNumRegisterBanks; +} OMX_SYMBIAN_AUDIO_CONFIG_REGISTERBANKQUERYTYPE; + + +typedef enum OMX_SYMBIAN_AUDIO_HWREGISTERTYPE { + OMX_SYMBIAN_AUDIO_RegisterIO = 0, + OMX_SYMBIAN_AUDIO_RegisterI2C, + OMX_SYMBIAN_AUDIO_RegisterSlimbus, + OMX_SYMBIAN_AUDIO_RegisterCBUS = 0xFFFF, + OMX_SYMBIAN_AUDIO_RegisterMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_HWREGISTERTYPE; + +typedef struct OMX_SYMBIAN_AUDIO_REGBANKDESCRIPTORTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nRegBankIndex; + OMX_U32 nLogicalStartAddr; + OMX_U32 nLogicalEndAddr; + OMX_SYMBIAN_AUDIO_HWREGISTERTYPE eRegBankType; +} OMX_SYMBIAN_AUDIO_REGBANKDESCRIPTORTYPE; + +/** Audio register bank table control. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.RegisterBankTable". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_REGISTERBANKTABLETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U16 nNumRegisterBanks; + OMX_SYMBIAN_AUDIO_REGBANKDESCRIPTORTYPE RegBankDescriptorTable; +} OMX_SYMBIAN_AUDIO_CONFIG_REGISTERBANKTABLETYPE; + + +typedef enum OMX_SYMBIAN_AUDIO_HWCTRLSTATUSTYPE { + OMX_SYMBIAN_AUDIO_HWCtrlStatusOk = 0, + OMX_SYMBIAN_AUDIO_HWCtrlStatusFail, + /* if callback facility is somehow solved in OpenMAX IL for getconfig/setconfig parameter calls, it is expected */ + /* to have here extra status information that can be returned for e.g. multi-read/write commands */ + OMX_SYMBIAN_AUDIO_HWCtrlStatusNotSupported = 0xFFFF, + OMX_SYMBIAN_AUDIO_HWCtrlStatusMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_HWCTRLSTATUSTYPE; + +typedef enum OMX_SYMBIAN_AUDIO_HWOPERATIONTYPE { + OMX_SYMBIAN_AUDIO_HWOperationNoOp = 0, + OMX_SYMBIAN_AUDIO_HWOperation8BitSingleRead, + OMX_SYMBIAN_AUDIO_HWOperation8BitSingleWrite, + OMX_SYMBIAN_AUDIO_HWOperation16BitSingleRead, + OMX_SYMBIAN_AUDIO_HWOperation16BitSingleWrite, + OMX_SYMBIAN_AUDIO_HWOperation32BitSingleRead, + OMX_SYMBIAN_AUDIO_HWOperation32BitSingleWrite, + OMX_SYMBIAN_AUDIO_HWOperation8BitMultiRead, + OMX_SYMBIAN_AUDIO_HWOperation8BitMultiWrite, + OMX_SYMBIAN_AUDIO_HWOperation16BitMultiRead, + OMX_SYMBIAN_AUDIO_HWOperation16BitMultiWrite, + OMX_SYMBIAN_AUDIO_HWOperation32BitMultiRead, + OMX_SYMBIAN_AUDIO_HWOperation32BitMultiWrite, + OMX_SYMBIAN_AUDIO_HWOperation8BitBurstMultiRead, + OMX_SYMBIAN_AUDIO_HWOperation8BitBurstMultiWrite, + OMX_SYMBIAN_AUDIO_HWOperation16BitBurstMultiRead, + OMX_SYMBIAN_AUDIO_HWOperation16BitBurstMultiWrite, + OMX_SYMBIAN_AUDIO_HWOperation32BitBurstMultiRead, + OMX_SYMBIAN_AUDIO_HWOperation32BitBurstMultiWrite = 0xFFFF, + OMX_SYMBIAN_AUDIO_HWOperationMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_HWOPERATIONTYPE; + +/** Custom audio HW control. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.CustomHwControl". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_CUSTOMHWCONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_SYMBIAN_AUDIO_HWCTRLSTATUSTYPE eStatus; + OMX_SYMBIAN_AUDIO_HWOPERATIONTYPE eHwOperation; + OMX_SYMBIAN_AUDIO_HWREGISTERTYPE eRegisterType; + OMX_U16 nDataCount; + OMX_U8 nAddressDataSequence[1]; +} OMX_SYMBIAN_AUDIO_CONFIG_CUSTOMHWCONTROLTYPE; + + +typedef enum OMX_SYMBIAN_AUDIO_HWLOOPTYPE { + OMX_SYMBIAN_AUDIO_HWLoopNone = 0, + OMX_SYMBIAN_AUDIO_HWLoopSidetone = 0xFFFF, + /* rest of HW loops are to be defined on a vendor specific basis */ + OMX_SYMBIAN_AUDIO_HWLoopMax = 0x7FFFFFFF +} OMX_SYMBIAN_AUDIO_HWLOOPTYPE; + +/** Audio HW loop support query. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.HwLoopSupport". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_HWLOOPSUPPORTTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nSupportedLoops; + OMX_SYMBIAN_AUDIO_HWLOOPTYPE eLoopIndex; +} OMX_SYMBIAN_AUDIO_CONFIG_HWLOOPSUPPORTTYPE; + +/** Audio HW loop control. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Audio.HwLoopControl". +*/ +typedef struct OMX_SYMBIAN_AUDIO_CONFIG_HWLOOPCONTROLTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_SYMBIAN_AUDIO_HWLOOPTYPE eLoopIndex; + OMX_U32 nChannel; + OMX_BOOL bControlSwitch; + OMX_BOOL bLinear; + OMX_BS32 sLoopVolume; +} OMX_SYMBIAN_AUDIO_CONFIG_HWLOOPCONTROLTYPE; + +/*@}*/ + +/** @name Haptics Extensions */ + +/*@{*/ + +/** Haptics driver properties query. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Param.Audio.HapticsDriverProperties". +*/ +typedef struct OMX_SYMBIAN_AUDIO_PARAM_HAPTICSDRIVERPROPERTIESTYPE +{ + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U32 nNativeSamplingRate; + OMX_U32 nHapticsDriverNominalVoltage; + OMX_U32 nHapticsDriverImpedance; +} OMX_SYMBIAN_AUDIO_PARAM_HAPTICSDRIVERPROPERTIESTYPE; + +/*@}*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* OMX_Symbian_AudioExt_h */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_ComponentExt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_ComponentExt.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,137 @@ +/* + OMX_Symbian_ComponentExt.h + + Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which accompanies + this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + Initial Contributors: + Nokia Corporation - initial contribution. +*/ + +/** @file +@brief Symbian OpenMAX IL Extension Data Structures for the 'Component' types. + +This file contains the extension structures for the Symbian IL extensions that +pertain to common component functionality. + +@publishedDeviceAbstraction +*/ + +#ifndef OMX_Symbian_ComponentExt_h +#define OMX_Symbian_ComponentExt_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ +#include + + +/** @name Deferred mode control */ + +/*@{*/ + +/** Commit mode selection struct. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.CommitMode". +*/ +typedef struct OMX_SYMBIAN_CONFIG_COMMITMODETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_BOOL bDeferred; +} OMX_SYMBIAN_CONFIG_COMMITMODETYPE; + +/** Explicit commit struct. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Commit". +*/ +typedef struct OMX_SYMBIAN_CONFIG_COMMITTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; +} OMX_SYMBIAN_CONFIG_COMMITTYPE; + +/*@}*/ + +/** @name Thread Priority Control */ + +/*@{*/ + +/** Symbian OS thread priority control. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.SymbianThreadPriority". +*/ +typedef struct OMX_SYMBIAN_CONFIG_SYMBIANTHREADPRIORITYTYPE { + OMX_U32 nSize; /**< size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nThreadID; /**< Implementation specific thread ID */ + OMX_S32 nThreadPriority; /**< The actual priority value */ +} OMX_SYMBIAN_CONFIG_SYMBIANTHREADPRIORITYTYPE; + +/*@}*/ + +/** @name Shared Chunk Metadata Extension */ + +/*@{*/ + +/** Symbian OS shared chunk metadata config type. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Sharedchunkmetadata". +*/ +typedef struct OMX_SYMBIAN_CONFIG_SHAREDCHUNKMETADATATYPE +{ + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nHandleId; /**< This is a handle id of the shared chunk */ + OMX_U64 nOwnerThreadId; /**< This is thread that contains the handle */ +} OMX_SYMBIAN_CONFIG_SHAREDCHUNKMETADATATYPE; + +/*@}*/ + +/** @name GPS Positioning Extension */ + +/*@{*/ + +/** GPS location config. +*/ +typedef struct OMX_SYMBIAN_CONFIG_GPSLOCATIONTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_U64 nLatitudeDegrees; + OMX_U64 nLatitudeMinutes; + OMX_U64 nLatitudeSeconds; + OMX_U64 nLongitudeDegrees; + OMX_U64 nLongitudeMinutes; + OMX_U64 nLongitudeSeconds; + OMX_U64 nAltitudeMeters; + OMX_BOOL bLatitudeRefNorth; + OMX_BOOL bLongitudeRefEast; + OMX_BOOL bAltitudeRefAboveSea; + OMX_BOOL bLocationKnown; +} OMX_SYMBIAN_CONFIG_GPSLOCATIONTYPE; + +/*@}*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* OMX_Symbian_ComponentExt_h */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_CoreExt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_CoreExt.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,51 @@ +/* + OMX_Symbian_CoreExt.h + + Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which accompanies + this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + Initial Contributors: + Nokia Corporation - initial contribution. +*/ + +/** @file +@brief Symbian OpenMAX IL Extension Data Structures for the 'Core' types. + +This file contains the extension structures for the Symbian IL extensions that +pertain to core functionality. + +@publishedDeviceAbstraction +*/ + +#ifndef OMX_Symbian_CoreExt_h +#define OMX_Symbian_CoreExt_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ +#include + + +/** Extensions to the standard IL errors. */ +typedef enum OMX_SYMBIAN_ERRORTYPE +{ + OMX_Symbian_ErrorInvalidMode = (OMX_S32) (OMX_ErrorVendorStartUnused + 0x00A00001), + OMX_Symbian_ErrorMax = 0x7FFFFFFF +} OMX_SYMBIAN_ERRORTYPE; + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* OMX_Symbian_CoreExt_h */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_ExtensionNames.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_ExtensionNames.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,179 @@ +/* + OMX_Symbian_ExtensionNames.h + + Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which accompanies + this distribution" and is available at + http://www.eclipse.org/legal/epl-v10.html + + Initial Contributors: + Nokia Corporation - initial contribution. +*/ + +/** @file +@brief Symbian OpenMAX IL Extension Names. + +This header file lists Symbian's extensions to OpenMAX IL. + +@publishedDeviceAbstraction +*/ + +#ifndef OMX_Symbian_ExtensionNames_h +#define OMX_Symbian_ExtensionNames_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Component extensions */ + +#define OMX_SYMBIAN_INDEX_CONFIG_COMMITMODE_NAME "OMX.Symbian.Index.Config.CommitMode" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMIT_NAME "OMX.Symbian.Index.Config.Commit" +#define OMX_SYMBIAN_INDEX_CONFIG_SYMBIANTHREADPRIORITY_NAME "OMX.Symbian.Index.Config.SymbianThreadPriority" +#define OMX_SYMBIAN_INDEX_CONFIG_GPSLOCATION_NAME "OMX.Symbian.Index.Config.GpsLocation" +#define OMX_SYMBIAN_INDEX_CONFIG_SHAREDCHUNKMETADATA_NAME "OMX.Symbian.Index.Config.Sharedchunkmetadata" + +/* Audio parameters and configurations */ +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_WMAAVGBYTES_NAME "OMX.Symbian.Index.Param.Audio.WmaAvgBytes" +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_WMAPRO_NAME "OMX.Symbian.Index.Param.Audio.WmaPro" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_AMRMODE_NAME "OMX.Symbian.Index.Config.Audio.AmrMode" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SBCBITPOOL_NAME "OMX.Symbian.Index.Config.Audio.SbcBitpool" +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_G711_NAME "OMX.Symbian.Index.Param.Audio.G711" +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_ILBC_NAME "OMX.Symbian.Index.Param.Audio.Ilbc" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_ILBCFRAME_NAME "OMX.Symbian.Index.Config.Audio.IlbcFrame" +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_SYNCHRONIZED_NAME "OMX.Symbian.Index.Param.Audio.Synchronized" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_PORTPAUSE_NAME "OMX.Symbian.Index.Config.Audio.PortPause" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DOUTPUT_NAME "OMX.Symbian.Index.Config.Audio.3DOutput" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DLOCATION_NAME "OMX.Symbian.Index.Config.Audio.3DLocation" +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_3DDOPPLERMODE_NAME "OMX.Symbian.Index.Param.Audio.3DDopplerMode" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DDOPPLERSETTINGS_NAME "OMX.Symbian.Index.Config.Audio.3DDopplerSettings" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DLEVELS_NAME "OMX.Symbian.Index.Config.Audio.3DLevels" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DDISTANCEATTENUATION_NAME "OMX.Symbian.Index.Config.Audio.3DDistanceAttenuation" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DDIRECTIVITYSETTINGS_NAME "OMX.Symbian.Index.Config.Audio.3DDirectivitySettings" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DDIRECTIVITYORIENTATION_NAME "OMX.Symbian.Index.Config.Audio.3DDirectivityOrientation" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DMACROSCOPICORIENTATION_NAME "OMX.Symbian.Index.Config.Audio.3DMacroscopicOrientation" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_3DMACROSCOPICSIZE_NAME "OMX.Symbian.Index.Config.Audio.3DMacroscopicSize" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VIRTUALIZER_NAME "OMX.Symbian.Index.Config.Audio.Virtualizer" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VIRTUALIZERLOUDSPEAKER_NAME "OMX.Symbian.Index.Config.Audio.VirtualizerLoudspeaker" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VISUALIZATION_NAME "OMX.Symbian.Index.Config.Audio.Visualization" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VISUALIZATIONSPECTRAL_NAME "OMX.Symbian.Index.Config.Audio.VisualizationSpectral" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VISUALIZATIONWAVEFORM_NAME "OMX.Symbian.Index.Config.Audio.VisualizationWaveform" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_TRANSEQUALIZER_NAME "OMX.Symbian.Index.Config.Audio.TransEqualizer" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_TRANSEQUALIZERIIREQ_NAME "OMX.Symbian.Index.Config.Audio.TransEqualizerIirEq" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_TRANSEQUALIZERFIRRESPONSE_NAME "OMX.Symbian.Index.Config.Audio.TransEqualizerFirResponse" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_MDRC_NAME "OMX.Symbian.Index.Config.Audio.Mdrc" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_LSPROT_NAME "OMX.Symbian.Index.Config.Audio.LsProt" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SPLLIMIT_NAME "OMX.Symbian.Index.Config.Audio.SplLimit" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_CLICKREMOVAL_NAME "OMX.Symbian.Index.Config.Audio.ClickRemoval" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_EANC_NAME "OMX.Symbian.Index.Config.Audio.Eanc" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_APSSAS_NAME "OMX.Symbian.Index.Config.Audio.Apssas" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_BATTERYVOLTAGE_NAME "OMX.Symbian.Index.Config.Audio.BatteryVoltage" +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_HDMI_NAME "OMX.Symbian.Index.Param.Audio.Hdmi" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_TONEGENERATOR_NAME "OMX.Symbian.Index.Config.Audio.ToneGenerator" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_POWER_NAME "OMX.Symbian.Index.Config.Audio.Power" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VOLUMERAMP_NAME "OMX.Symbian.Index.Config.Audio.VolumeRamp" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_REGISTERBANKQUERY_NAME "OMX.Symbian.Index.Config.Audio.RegisterBankQuery" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_REGISTERBANKTABLE_NAME "OMX.Symbian.Index.Config.Audio.RegisterBankTable" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_CUSTOMHWCONTROL_NAME "OMX.Symbian.Index.Config.Audio.CustomHwControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_HWLOOPSUPPORT_NAME "OMX.Symbian.Index.Config.Audio.HwLoopSupport" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_HWLOOPCONTROL_NAME "OMX.Symbian.Index.Config.Audio.HwLoopControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_DECODERSTATUS_NAME "OMX.Symbian.Index.Config.Audio.DecoderStatus" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_ENCODERSTATUS_NAME "OMX.Symbian.Index.Config.Audio.EncoderStatus" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_UPLINKTIMIMG_NAME "OMX.Symbian.Index.Config.Audio.UplinkTiming" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_RFTXPOWER_NAME "OMX.Symbian.Index.Config.Audio.RfTxPower" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_UPLINKTIMINGINFO_NAME "OMX.Symbian.Index.Config.Audio.UplinkTimingInfo" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_UPLINKDELAYINFO_NAME "OMX.Symbian.Index.Config.Audio.UplinkDelayInfo" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_UPLINKALGORITHMS_NAME "OMX.Symbian.Index.Config.Audio.UplinkAlgorithms" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_DOWNLINKALGORITHMS_NAME "OMX.Symbian.Index.Config.Audio.DownlinkAlgorithms" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_ACOUSTICECHOCONTROL_NAME "OMX.Symbian.Index.Config.Audio.AcousticEchoControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_BANDWIDTHEXPANSION_NAME "OMX.Symbian.Index.Config.Audio.BandwidthExpansion" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_AUTOMATICVOLUMECONTROL_NAME "OMX.Symbian.Index.Config.Audio.AutomaticVolumeControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_BACKGROUNDNOISECONTROL_NAME "OMX.Symbian.Index.Config.Audio.BackgroundNoiseControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_COMFORTNOISEGENERATION_NAME "OMX.Symbian.Index.Config.Audio.ComfortNoiseGeneration" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_DOWNLINKNOISECONTROL_NAME "OMX.Symbian.Index.Config.Audio.DownLinkNoiseControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_MULTIMICNOISECONTROL_NAME "OMX.Symbian.Index.Config.Audio.MultiMicNoiseControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SIDETONEHOWLINGCONTROL_NAME "OMX.Symbian.Index.Config.Audio.SidetoneHowlingControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SIDETONEGAIN_NAME "OMX.Symbian.Index.Config.Audio.SidetoneGain" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SIDETONEATTENUATION_NAME "OMX.Symbian.Index.Config.Audio.SidetoneAttenuation" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_TRANSDUCERDRC_NAME "OMX.Symbian.Index.Config.Audio.TransducerDrc" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_UPLINKLEVELNORMALIZATION_NAME "OMX.Symbian.Index.Config.Audio.UplinkLevelNormalization" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VOICECLARITY_NAME "OMX.Symbian.Index.Config.Audio.VoiceClarity" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_WINDNOISECONTROL_NAME "OMX.Symbian.Index.Config.Audio.WindNoiseControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_TUNINGDATA_NAME "OMX.Symbian.Index.Config.Audio.TuningData" +#define OMX_SYMBIAN_INDEX_PARAM_AUDIO_HAPTICSDRIVERPROPERTIES_NAME "OMX.Symbian.Index.Param.Audio.HapticsDriverProperties" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SPEECHCODECENABLED_NAME "OMX.Symbian.Index.Config.Audio.SpeechCodecEnabled" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SPEECHCODECDISABLED_NAME "OMX.Symbian.Index.Config.Audio.SpeechCodecDisabled" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_AUTOMATICGAINCONTROL_NAME "OMX.Symbian.Index.Config.Audio.AutomaticGainControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_MULTIMICROPHONENOISECONTROL_NAME "OMX.Symbian.Index.Config.Audio.MultiMicrophoneNoiseControl" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SPEECHLOOPS_NAME "OMX.Symbian.Index.Config.Audio.SpeechLoops" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_SIDETONEATTENUATIONINFO_NAME "OMX.Symbian.Index.Config.Audio.SidetoneAttenuationInfo" +#define OMX_SYMBIAN_INDEX_CONFIG_AUDIO_VOLUMEINFO_NAME "OMX.Symbian.Index.Config.Audio.VolumeInfo" + +/* Image parameters and configurations */ +#define OMX_SYMBIAN_INDEX_CONFIG_IMAGE_MAXJPEGSIZE_NAME "OMX.Symbian.Index.Config.Image.MaxJpegSize" + +/* Video parameters and configurations */ +#define OMX_SYMBIAN_INDEX_PARAM_VIDEO_SEQUENCEHEADER_NAME "OMX.Symbian.Index.Param.Video.SequenceHeader" +#define OMX_SYMBIAN_INDEX_PARAM_VIDEO_AVCSEI_NAME "OMX.Symbian.Index.Param.Video.AvcSei" +#define OMX_SYMBIAN_INDEX_PARAM_VIDEO_AVCOUTPUTORDER_NAME "OMX.Symbian.Index.Param.Video.AvcOutputOrder" +#define OMX_SYMBIAN_INDEX_CONFIG_VIDEO_REFRESHMODE_NAME "OMX.Symbian.Index.Config.Video.RefreshMode" +#define OMX_SYMBIAN_INDEX_CONFIG_VIDEO_OUTPUTRECT_NAME "OMX.Symbian.Index.Config.Video.OutputRect" +#define OMX_SYMBIAN_INDEX_PARAM_VIDEO_VC1_NAME "OMX.Symbian.Index.Param.Video.Vc1" +#define OMX_SYMBIAN_INDEX_PARAM_VIDEO_VC6_NAME "OMX.Symbian.Index.Param.Video.Vp6" + +/* Image & Video common configurations */ +#define OMX_SYMBIAN_INDEX_PARAM_COMMON_PIXELASPECTRATIO_NAME "OMX.Symbian.Index.Param.Common.PixelAspectRatio" +#define OMX_SYMBIAN_INDEX_PARAM_COMMON_COLORPRIMARY_NAME "OMX.Symbian.Index.Param.Common.ColorPrimary" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_CAMERAFUNCTESTSELECT_NAME "OMX.Symbian.Index.Config.Common.CameraFuncTestSelect" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_CAMERASELFTESTSELECT_NAME "OMX.Symbian.Index.Config.Common.CameraSelfTestSelect" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_CAMERATESTING_NAME "OMX.Symbian.Index.Config.Common.CameraTesting" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_SCENEMODE_NAME "OMX.Symbian.Index.Config.Common.SceneMode" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_RGBHISTOGRAM_NAME "OMX.Symbian.Index.Config.Common.RgbHistogram" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_HISTOGRAMCONTROL_NAME "OMX.Symbian.Index.Config.Common.HistogramControl" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_XENONLIFECOUNTER_NAME "OMX.Symbian.Index.Config.Common.XenonLifeCounter" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_ROISELECTION_NAME "OMX.Symbian.Index.Config.Common.RoiSelection" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_REDCOMPLEXITY_NAME "OMX.Symbian.Index.Config.Common.RedComplexity" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_REDEYEREMOVAL_NAME "OMX.Symbian.Index.Config.Common.RedEyeRemoval" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_ORIENTATIONSCENE_NAME "OMX.Symbian.Index.Config.Common.OrientationScene" +#define OMX_SYMBIAN_INDEX_PARAM_COMMON_REVERTASPECTRATIO_NAME "OMX.Symbian.Index.Param.Common.RevertAspectRatio" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_NDFILTERCONTROL_NAME "OMX.Symbian.Index.Config.Common.NdFilterControl" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_EXPOSURELOCK_NAME "OMX.Symbian.Index.Config.Common.ExposureLock" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_WHITEBALANCELOCK_NAME "OMX.Symbian.Index.Config.Common.WhiteBalanceLock" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_FOCUSLOCK_NAME "OMX.Symbian.Index.Config.Common.FocusLock" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_ALLLOCK_NAME "OMX.Symbian.Index.Config.Common.AllLock" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_CENTERFIELDOFVIEW_NAME "OMX.Symbian.Index.Config.Common.CenterFieldOfView" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_EXTDIGITALZOOM_NAME "OMX.Symbian.Index.Config.Common.ExtDigitalZoom" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_EXTOPTICALZOOM_NAME "OMX.Symbian.Index.Config.Common.ExtOpticalZoom" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_FOCUSRANGE_NAME "OMX.Symbian.Index.Config.Common.FocusRange" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_EXTFOCUSSTATUS_NAME "OMX.Symbian.Index.Config.Common.ExtFocusStatus" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_FLICKERREMOVAL_NAME "OMX.Symbian.Index.Config.Common.FlickerRemoval" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_FLASHCONTROL_NAME "OMX.Symbian.Index.Config.Common.FlashControl" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_AFASSISTANTLIGHT_NAME "OMX.Symbian.Index.Config.Common.AfAssistantLight" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_HINTPOWERVSQUALITY_NAME "OMX.Symbian.Index.Config.Common.HintPowerVsQuality" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_HINTDEPTHOFFIELD_NAME "OMX.Symbian.Index.Config.Common.HintDepthOfField" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_FOCUSREGION_NAME "OMX.Symbian.Index.Config.Common.FocusRegion" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_ROI_NAME "OMX.Symbian.Index.Config.Common.Roi" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_CAMERASENSORINFO_NAME "OMX.Symbian.Index.Config.Common.CameraSensorInfo" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_FLASHGUNINFO_NAME "OMX.Symbian.Index.Config.Common.FlashGunInfo" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_MOTIONLEVEL_NAME "OMX.Symbian.Index.Config.Common.MotionLevel" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_SHARPNESS_NAME "OMX.Symbian.Index.Config.Common.Sharpness" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_EXTCAPTURING_NAME "OMX.Symbian.Index.Config.Common.ExtCapturing" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_EXTCAPTUREMODE_NAME "OMX.Symbian.Index.Config.Common.ExtCaptureMode" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_XENONFLASHSTATUS_NAME "OMX.Symbian.Index.Config.Common.XenonFlashStatus" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_PRECAPTUREEXPOSURETIME_NAME "OMX.Symbian.Index.Config.Common.PreCaptureExposureTime" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_EXPOSUREINITIATED_NAME "OMX.Symbian.Index.Config.Common.ExposureInitiated" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_BRACKETING_NAME "OMX.Symbian.Index.Config.Common.Bracketing" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_RAWPRESET_NAME "OMX.Symbian.Index.Config.Common.RawPreset" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_APPLYUSERSETTINGS_NAME "OMX.Symbian.Index.Config.Common.ApplyUserSettings" +#define OMX_SYMBIAN_INDEX_CONFIG_COMMON_VIDEOLIGHT_NAME "OMX.Symbian.Index.Config.Common.VideoLight" + +/* Other configurations */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* OMX_Symbian_ExtensionNames_h */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_IVCommonExt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_IVCommonExt.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,272 @@ +/* + OMX_Symbian_IVCommonExt.h + + Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which accompanies + this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + Initial Contributors: + Nokia Corporation - initial contribution. +*/ + +/** @file +@brief Symbian OpenMAX IL Extension Data Structures Common for Imaging and Video. + +This file contains the extension structures for the Symbian IL extensions that +are common to Imaging and Video domains. + +@publishedDeviceAbstraction +*/ + +#ifndef OMX_Symbian_IVCommonExt_h +#define OMX_Symbian_IVCommonExt_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ +#include +#include +#include +#include + + +/* Extensions to standard enums */ +/* ---------------------------- */ + + +/** + * Offset to Symbian extensions + */ +#define OMX_SYMBIAN_IV_COMMON_EXTENSIONS_START_OFFSET 0x00A00000 +#define OMX_SYMBIAN_CAMERA_EXTENSIONS_START_OFFSET 0x00B00000 +#define OMX_SYMBIAN_VIDEO_EXTENSIONS_START_OFFSET 0x00C00000 + +/* Extended generic types */ +/* ---------------------- */ + + +/** + * Generic point type + * Point coordinates in 2D space +*/ +typedef struct OMX_SYMBIAN_POINTTYPE { + OMX_S32 nX; + OMX_S32 nY; +} OMX_SYMBIAN_POINTTYPE; + +/** + * Generic size type + * Size of rectangle in 2D space +*/ +typedef struct OMX_SYMBIAN_SIZETYPE { + OMX_S32 nWidth; + OMX_S32 nHeight; +} OMX_SYMBIAN_SIZETYPE; + +/** + * Generic rectangle type. + * Rectangle represented by top left corner coordinates + * and the size of the rectangle + * There exist also a rectangle config defined in the OMX IL standard. + * The purpose of this addition is to provide a generic rectangle type to + * be used by other configs and params. +*/ +typedef struct OMX_SYMBIAN_RECTTYPE { + OMX_SYMBIAN_POINTTYPE sTopLeft; + OMX_SYMBIAN_SIZETYPE sSize; +} OMX_SYMBIAN_RECTTYPE; + +/** + * Relative rectangle type. + * The purpose of this type is to represent a rectangular + * region relative to certain reference size. + * + * Example: + * The location of an object detected in camera scene can be represendted + * with relative rect. Let the object be located in rectangular are which has + * top left coordintes (10,20) and size (90,120). The object detection algorithm + * has used 320x240 sized image for analysis and that will be used as the + * reference size in the relative rect. The object location in 2 megapixel + * (1600x1200 pixels) captured image can be calculated by scaling the top left + * X-coordinate and rectangle width with reference size's width's faction 1600/320=5. + * Likewise for the Y-coordinate and height 1200/240=5. In the captured image + * the object is located inside a rectangular region that has top left coordinates + * (10*5, 20*5) = (50, 100) and size (90*5, 120*5) = (450, 600). +*/ +typedef struct OMX_SYMBIAN_RELATIVERECTTYPE { + OMX_SYMBIAN_RECTTYPE sRect; /**< Rectangle represented as concerete top left coordinates and size */ + OMX_SYMBIAN_SIZETYPE sReference; /**< Reference size. Since sRect is relative to this reference size + it can be scaled up or down to represent the same rectangular + region in relation to bigger or smaller reference sizes */ +} OMX_SYMBIAN_RELATIVERECTTYPE; + + + +/* Extended generic config and param structs */ +/* ----------------------------------------- */ + + +/** + * Generic signed 32-bit integer config struct. +*/ +typedef struct OMX_SYMBIAN_CONFIG_S32TYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_S32 nValue; /**< signed 32-bit value */ +} OMX_SYMBIAN_CONFIG_S32TYPE; + +/** + * Generic unsigned 32-bit integer param struct. +*/ +typedef OMX_SYMBIAN_CONFIG_S32TYPE OMX_SYMBIAN_PARAM_S32TYPE; + +/** + * Generic unsigned 32-bit integer config struct. +*/ +typedef struct OMX_SYMBIAN_CONFIG_U32TYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nValue; /**< Unsigned 32-bit value */ +} OMX_SYMBIAN_CONFIG_U32TYPE; + +/** + * Generic unsigned 32-bit integer param struct. +*/ +typedef OMX_SYMBIAN_CONFIG_U32TYPE OMX_SYMBIAN_PARAM_U32TYPE; + +/** + * Port specific generic boolean config struct + * OMX spec already has boolean config but + * without port index +*/ +typedef struct OMX_SYMBIAN_CONFIG_BOOLEANTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_BOOL bEnabled; /**< Boolean value */ +} OMX_SYMBIAN_CONFIG_BOOLEANTYPE; + +/** + * Generic point config struct +*/ +typedef struct OMX_SYMBIAN_CONFIG_POINTTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_SYMBIAN_POINTTYPE sPoint; /**< Point coordinates */ +} OMX_SYMBIAN_CONFIG_POINTTYPE; + + + +/* Extended params and configs */ +/* --------------------------- */ + +/** + * Enumeration of possible flicker removal values + */ +typedef enum OMX_SYMBIAN_FLICKERREMOVALTYPE { + OMX_SYMBIAN_FlickerRemovalOff, /**< Flicker removal disabled */ + OMX_SYMBIAN_FlickerRemovalAuto, /**< Automatically detected AC frequency */ + OMX_SYMBIAN_FlickerRemoval50, /**< Flicker removal for 50 Hz AC frequency */ + OMX_SYMBIAN_FlickerRemoval60, /**< Flicker removal for 60 Hz AC frequency */ + OMX_SYMBIAN_FlickerRemovalMax = 0x7FFFFFFF +} OMX_SYMBIAN_FLICKERREMOVALTYPE; + +/** + * Flicker Removal. +*/ +typedef struct OMX_SYMBIAN_CONFIG_FLICKERREMOVALTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_SYMBIAN_FLICKERREMOVALTYPE eFlickerRemoval; /**< Flicker removal mode */ +}OMX_SYMBIAN_CONFIG_FLICKERREMOVALTYPE; + +/** + * Classification of algorithm comlexity values + */ +typedef enum OMX_SYMBIAN_ALGORITHMCOMPLEXITYTYPE { + OMX_SYMBIAN_AlgComplexityLow, + OMX_SYMBIAN_AlgComplexityMedium, + OMX_SYMBIAN_AlgComplexityHigh, + OMX_SYMBIAN_AlgComplexityMax = 0x7FFFFFFF +} OMX_SYMBIAN_ALGORITHMCOMPLEXITYTYPE; + +/** + * Algorithm complexity config + */ +typedef struct OMX_SYMBIAN_CONFIG_ALGORITHMCOMPLEXITYTYPE { + OMX_U32 nSize; /**< Size of the structure in bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_SYMBIAN_ALGORITHMCOMPLEXITYTYPE eComplexity; /**< Algorithm complexity to use */ +} OMX_SYMBIAN_CONFIG_ALGORITHMCOMPLEXITYTYPE; + +/** Color format extensions. */ +typedef enum OMX_SYMBIAN_COLOR_FORMATTYPE { + OMX_SYMBIAN_COLOR_FormatYUV420MBPackedSemiPlanar = OMX_COLOR_FormatVendorStartUnused + OMX_SYMBIAN_IV_COMMON_EXTENSIONS_START_OFFSET, + OMX_SYMBIAN_COLOR_FormatRawBayer12bit, + OMX_SYMBIAN_COLOR_FormatMax = 0x7FFFFFFF +} OMX_SYMBIAN_COLOR_FORMATTYPE; + +/** Primary color enumeration. */ +typedef enum OMX_SYMBIAN_COLORPRIMARYTYPE { + OMX_SYMBIAN_ColorPrimaryBT601FullRange, + OMX_SYMBIAN_ColorPrimaryBT601LimitedRange, + OMX_SYMBIAN_ColorPrimaryBT709FullRange, + OMX_SYMBIAN_ColorPrimaryBT709LimitedRange, + OMX_SYMBIAN_ColorMax = 0x7FFFFFFF +} OMX_SYMBIAN_COLORPRIMARYTYPE; + +/** YUV data color range. + +The index specified for this structure is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Param.Common.ColorPrimary". +*/ +typedef struct OMX_SYMBIAN_PARAM_COLORPRIMARYTYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_SYMBIAN_COLORPRIMARYTYPE eColorPrimary; +} OMX_SYMBIAN_PARAM_COLORPRIMARYTYPE; + + +/** Extradata type extensions. + +The index used to query or enable the generation of this payload is retrieved using +OMX_GetExtensionIndex() with the extension string +"OMX.Symbian.Index.Config.Common.ExtraVideoStabilizationData". +*/ +typedef enum OMX_SYMBIAN_EXTRADATATYPE { + OMX_SYMBIAN_ExtraDataVideoStabilization = OMX_ExtraDataVendorStartUnused + OMX_SYMBIAN_IV_COMMON_EXTENSIONS_START_OFFSET, + OMX_SYMBIAN_ExtraDataMax = 0x7FFFFFFF +} OMX_SYMBIAN_EXTRADATATYPE; + +/** Video stabilization extradata content struct */ +typedef struct OMX_SYMBIAN_DIGITALVIDEOSTABTYPE { + OMX_BOOL bState; //**< The state of digital image stabilization */ + OMX_U32 nTopLeftCropVectorX; //**< Horizontal coordinate of the crop vector from top left angle, absolute wrt overscanning width */ + OMX_U32 nTopLeftCropVectorY; //**< Vertical coordinate of the crop vector from top left angle, absolute wrt overscanning height */ + OMX_U32 nMaxOverscannedWidth; //**< Max W+30% */ + OMX_U32 nMaxOverscannedHeight; //**< Max H+30% */ +} OMX_SYMBIAN_DIGITALVIDEOSTABTYPE; + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* OMX_Symbian_IVCommonExt_h */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_OtherExt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/symbian_api/shaiext_api/inc/OMX_Symbian_OtherExt.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,63 @@ +/* + OMX_Symbian_OtherExt.h + + Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + All rights reserved. + + This program and the accompanying materials are made available + under the terms of the Eclipse Public License v1.0 which accompanies + this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + Initial Contributors: + Nokia Corporation - initial contribution. +*/ + +/** @file +@brief Symbian OpenMAX IL Extension Data Structures for the 'Other' Domain. + +This file contains the extension structures for the Symbian IL extensions in the +'Other' domain. + +@publishedDeviceAbstraction +*/ + +#ifndef OMX_Symbian_OtherExt_h +#define OMX_Symbian_OtherExt_h + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* Each OMX header must include all required header files to allow the + * header to compile without errors. The includes below are required + * for this header file to compile successfully + */ +#include + + +/** @name Extradata extension */ + +/*@{*/ + +/** Extradata base type. + +This is a helper struct that can be used as part of the definitions of +Symbian-specific extra data types. It is exactly the same as the standard +OMX_OTHER_EXTRADATATYPE save for the missing data field. +*/ +typedef struct OMX_SYMBIAN_OTHER_EXTRADATABASETYPE { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_EXTRADATATYPE eType; + OMX_U32 nDataSize; +} OMX_SYMBIAN_OTHER_EXTRADATABASETYPE; + +/*@}*/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* OMX_Symbian_OtherExt_h */ diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/test_api/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/test_api/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,30 @@ +// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +PRJ_TESTEXPORTS + +// +// Test headers +// +../inc/omxiltestmd5param.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/extensions/test/omxiltestmd5param.h) +../inc/warning.txt SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/extensions/test/warning.txt) + +PRJ_EXPORTS + +// Obsolete extensions for NGMA buffer src/sink components +../inc/mmfbuffershared.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(multimedia/mmfbuffershared.h) +../inc/omxilsymbianbuffersextensions.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/extensions/omxilsymbianbuffersextensions.h) +../inc/omxilsymbiansharedchunkextensions.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(openmax/il/extensions/omxilsymbiansharedchunkextensions.h) diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/test_api/inc/mmfbuffershared.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/test_api/inc/mmfbuffershared.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** + @file + @internalComponent +*/ + +#ifndef MMFBUFFERSHARED_H +#define MMFBUFFERSHARED_H + +#include + +const TInt KMinBuffers = 1; +const TInt KMinBufferSize = 4000; + +/** + * The T class holds the filled buffer information for each buffer. + */ +class TFilledBufferHeaderV2 + { +public: + /** Amount of buffer filled with actual data */ + TUint iFilledLength; + /** Any timestamp associated with the buffer */ + TInt64 iTimeStamp; + /** Combination of OMX_BUFFERFLAG_*, specified at page 68 in the OpenMAX spec. */ + TUint iFlags; + /** offset **/ + TUint32 iOffset; + }; + +/** Shared chunk buffers information. It can be set by the user. */ +class TMMSharedChunkBufConfig + { +public: + /** The number of buffers. */ + TInt iNumBuffers; + /** The size of each buffer in bytes. */ + TInt iBufferSizeInBytes; + }; + +struct TBufSrcComponentHandles + { + /** The descriptor containing the name of the global chunk to be opened */ + TName iChunkName; + /** The descriptor containing the name of the global message queue + for the available buffer notification */ + TName iBufferAvailMsgQueue; + /** The descriptor containing the name of the global message queue + for the filled buffer */ + TName iBufferFilledMsgQueue; + }; + +#endif // MMFBUFFERSHARED_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/test_api/inc/omxilsymbianbuffersextensions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/test_api/inc/omxilsymbianbuffersextensions.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILSYMBIANBUFFERSOURCEEXTENSIONS_H +#define OMXILSYMBIANBUFFERSOURCEEXTENSIONS_H + +#include + +/** + * The string that the Symbian's OpenMAX IL Buffer components will + * translate into a 32-bit OpenMAX IL index to support the message queue communication + * with user client + */ +#if 1 +const char sOmxSymbianBufferMsgQueue [] = "OMX.SYMBIAN.INDEX.PARAM.BUFFERMSGQUEUE"; +#endif +const char sOmxSymbianBufferSize[] = "OMX.SYMBIAN.INDEX.PARAM.BUFFERSIZE"; +const char sOmxSymbianBufferChunk[] = "OMX.SYMBIAN.INDEX.PARAM.BUFFERCHUNK"; + +/* + * Custom index used by Symbian's OpenMAX IL Buffers to select the + * structure for getting message queue global names + * + * Vendor specific structures should be in the range of 0x7F000000 to 0x7FFFFFFE. + * This range is not broken out by vendor, so private indexes are not guaranteed unique + * and therefore should only be sent to the appropriate component. + */ +#if 1 +#define OMX_SymbianIndexParamBufferMsgQueueData 0x7F000006 // TBC +#endif +#define OMX_SymbianIndexParamBufferSize 0x7F000007 +#define OMX_SymbianIndexParam3PlaneBufferChunk 0x7F000008 + +#if 1 +/** + * Custom OpenMAX IL structure to be used as a container for message queue global names + */ +struct OMX_SYMBIAN_PARAM_BUFFER_MSGQUEUE + { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_PTR pBufSrcComponentHandles; /** This is a pointer to TBufSrcComponentHandles */ + }; +#endif + +/** + Custom OpenMAX IL structure used as container for buffer size on RChunk backed buffers + */ + +struct OMX_SYMBIAN_PARAM_BUFFER_SIZE + { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_S32 nBufferSize; /**< Buffer size in bytes */ + }; + +struct OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA + { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nChunk; /**< Chunk */ + OMX_U32 nFilledBufferQueue; /**< FilledBufferQueue */ + OMX_U32 nAvailableBufferQueue; /**< AVailableBufferQueue */ + OMX_U64 nThreadId; /**< The thread which creates the chunk */ + }; + +#endif // OMXILSYMBIANBUFFERSOURCEEXTENSIONS_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/test_api/inc/omxilsymbiansharedchunkextensions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/test_api/inc/omxilsymbiansharedchunkextensions.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** + @file + @internalComponent +*/ + +#ifndef OMXILSYMBIANSHAREDCHUNKTENSIONS_H +#define OMXILSYMBIANSHAREDCHUNKTENSIONS_H + +#include + +/** + * The string that the OpenMAX IL component will translate into a 32-bit + * OpenMAX IL index to support the communication of Symbian shared chunk + * metadata with a tunnelled component + */ +const char sOmxSymbianSharedChunkMetadata [] = "OMX.SYMBIAN.INDEX.CONFIG.SHAREDCHUNKMETADATA"; + + +/* + * Custom index used by an OpenMAX IL component to select the structure for + * getting/setting the Symbian share chunk metadata + * + * Vendor specific structures should be in the range of 0x7F000000 to 0x7FFFFFFE. + * This range is not broken out by vendor, so private indexes are not guaranteed unique + * and therefore should only be sent to the appropriate component. + */ +#define OMX_SymbianIndexConfigSharedChunkMetadata 0x7FD19E5C // TBC + +/* + * This constant defines the max number of share chunk offsets + */ +#define OMX_SYMBIAN_SHARED_CHUNK_OFFSETS_MAX 128 + +/** + * Custom OpenMAX IL structure to be used as a container for Symbian shared + * chunk related information + */ +struct OMX_SYMBIAN_CONFIG_SHARED_CHUNK_METADATA + { + OMX_U32 nSize; /**< Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ + OMX_U32 nPortIndex; /**< Port that this structure applies to */ + OMX_U32 nHandleId; /** This is a handle id of the shared chunk */ + OMX_U64 nOwnerThreadId; /** This is thread that contains the handle */ + }; + +#endif // OMXILSYMBIANSHAREDCHUNKTENSIONS_H + diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/test_api/inc/omxiltestmd5param.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/test_api/inc/omxiltestmd5param.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +* WARNING - This is a test extension which +* a) Maybe REMOVED without warning +* b) Maybe CHANGED without warning +* c) Is only intended for use by internal test code, and should NEVER be used by production code or in a real device +* +*/ + + +/** +@file +@internalComponent +*/ + +#ifndef OMXILTESTMD5PARAM_H +#define OMXILTESTMD5PARAM_H + +#include + +const OMX_INDEXTYPE OMX_IndexParam_Symbian_MD5 = static_cast(0x7FD19E5C); + +struct OMX_PARAM_SYMBIAN_MD5TYPE + { + OMX_VERSIONTYPE nVersion; + OMX_U8 pHash[16]; + }; + +#endif //OMXILTESTMD5PARAM_H diff -r 000000000000 -r 0e4a32b9112d openmaxil_plat/test_api/inc/warning.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/openmaxil_plat/test_api/inc/warning.txt Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,4 @@ +This directory contains test extension headers which + a) Maybe REMOVED without warning + b) Maybe CHANGED without warning + c) Are only intended for use by internal test code, and should NEVER be used by production code or in a real device diff -r 000000000000 -r 0e4a32b9112d package_definition.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/package_definition.xml Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 0e4a32b9112d package_map.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/package_map.xml Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,1 @@ + diff -r 000000000000 -r 0e4a32b9112d sysdef_1_4_0.dtd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysdef_1_4_0.dtd Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,20 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +#include "../tools/t_videoframesupplier/group/bld.inf" +#include "../xmlclient/group/bld.inf" +#include "../te_xmlomxclient/group/bld.inf" + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/layers.sysdef.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/layers.sysdef.xml Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,36 @@ + + + + +]> + + + + + + + + + + + + + + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +PRJ_TESTEXPORTS +./te_xmlomxclient.iby /epoc32/rom/include/te_xmlomxclient.iby + +../scripts/te_xmlomxclient.ini z:/mm/omx/te_xmlomxclient.ini + +../scripts/audio/te_omx_audio_dm_play.script z:/mm/omx/te_omx_audio_dm_play.script +../scripts/audio/te_omx_audio_dm_play.xml z:/mm/omx/te_omx_audio_dm_play.xml +../scripts/audio/te_omx_audio_dm_play_symbian.xml z:/mm/omx/te_omx_audio_dm_play_symbian.xml + +PRJ_TESTMMPFILES +te_xmlomxclient.mmp diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/group/component_test.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/group/component_test.pkg Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,46 @@ +; +; Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of the License "Symbian Foundation License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; + + +"\epoc32\release\armv5\urel\te_xmlomxclient.exe"-"c:\sys\bin\te_xmlomxclient.exe" + +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink.ini"-"c:\omxil\tef\te_omx_filesink.ini" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_audio.script"-"c:\omxil\tef\te_omx_filesink_audio.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_audio.xml"-"c:\omxil\tef\te_omx_filesink_audio.xml" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_image.script"-"c:\omxil\tef\te_omx_filesink_image.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_image.xml"-"c:\omxil\tef\te_omx_filesink_image.xml" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_other.script"-"c:\omxil\tef\te_omx_filesink_other.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_other.xml"-"c:\omxil\tef\te_omx_filesink_other.xml" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_video.script"-"c:\omxil\tef\te_omx_filesink_video.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_video.xml"-"c:\omxil\tef\te_omx_filesink_video.xml" + +; The following is commented out because we don't have OMX.SYMBIAN.OTHER.CONTAINER_DEMUXER.3GP in Vasco +; "\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_video_compatibility.script"-"c:\omxil\tef\te_omx_filesink_video_compatibility.script" +; "\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesink\tests\unit\te_omx_filesink_video_compatibility.xml"-"c:\omxil\tef\te_omx_filesink_video_compatibility.xml" + +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_audio.script"-"c:\omxil\tef\te_omx_filesource_audio.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_audio.xml"-"c:\omxil\tef\te_omx_filesource_audio.xml" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_image.script"-"c:\omxil\tef\te_omx_filesource_image.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_image.xml"-"c:\omxil\tef\te_omx_filesource_image.xml" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_other.script"-"c:\omxil\tef\te_omx_filesource_other.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_other.xml"-"c:\omxil\tef\te_omx_filesource_other.xml" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_video.script"-"c:\omxil\tef\te_omx_filesource_video.script" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesource_video.xml"-"c:\omxil\tef\te_omx_filesource_video.xml" +"\sf\adapt\openmaxil.nokia\omxilcomp\omxilgeneric\filesource\tests\unit\te_omx_filesrc.ini"-"c:\omxil\tef\te_omx_filesrc.ini" + +"\ext\os\openmaxil_ext\omxiltests\khronosconf\data\aac.stream"-"c:\omxil\data\aac.stream" +"\ext\os\openmaxil_ext\omxiltests\khronosconf\data\aac.stream.length"-"c:\omxil\data\aac.stream.length" + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/group/te_xmlomxclient.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/group/te_xmlomxclient.iby Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef TE_XMLOMXCLIENT_IBY +#define TE_XMLOMXCLIENT_IBY + +#include +#include + +file=ABI_DIR\BUILD_DIR\te_xmlomxclient.exe sys\bin\te_xmlomxclient.exe + +data=EPOCROOT##epoc32\data\z\mm\omx\te_xmlomxclient.ini \mm\omx\te_xmlomxclient.ini + +#endif //TE_XMLOMXCLIENT_IBY + + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/group/te_xmlomxclient.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/group/te_xmlomxclient.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +TARGET te_xmlomxclient.exe +TARGETTYPE exe +UID 0x1000007A 0x1028668B +CAPABILITY ALL -TCB + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +USERINCLUDE ..\src + +SOURCEPATH ..\src +SOURCE te_xmlomxclient.cpp +SOURCE omxxmltestblockcontroller.cpp +SOURCE omxxmltestwrapper.cpp +SOURCE omxxmltestrunner.cpp + +LIBRARY euser.lib +LIBRARY testexecuteutils.lib +LIBRARY xmlomxclient.lib diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/scripts/audio/te_omx_audio_dm_play.script --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/scripts/audio/te_omx_audio_dm_play.script Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,118 @@ +// +// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +LOAD_SUITE te_xmlomxclient + +PRINT Using Bellagio components where possible... + +START_TESTCASE TEST-OMX-DM-AUDIO-001 + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play.xml + COMMAND InstanceName RunTest DemuxMuxAAC_LC + END_TEST_BLOCK + + + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play.xml + COMMAND InstanceName RunTest PlayAAC_LC + END_TEST_BLOCK +END_TESTCASE TEST-OMX-DM-AUDIO-001 + + +START_TESTCASE TEST-OMX-DM-AUDIO-001 + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play.xml + COMMAND InstanceName RunTest DemuxMuxAAC_SBR + END_TEST_BLOCK + + + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play.xml + COMMAND InstanceName RunTest PlayAAC_SBR + END_TEST_BLOCK +END_TESTCASE TEST-OMX-DM-AUDIO-001 + + +START_TESTCASE TEST-OMX-DM-AUDIO-001 + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play.xml + COMMAND InstanceName RunTest DemuxMuxAAC_HEv2 + END_TEST_BLOCK + + + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play.xml + COMMAND InstanceName RunTest PlayAAC_HEv2 + END_TEST_BLOCK +END_TESTCASE TEST-OMX-DM-AUDIO-001 + + +PRINT Using Symbian components where possible... + +START_TESTCASE TEST-OMX-DM-AUDIO-001-SYM + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play_symbian.xml + COMMAND InstanceName RunTest DemuxMuxAAC_LC_Symbian + END_TEST_BLOCK + + + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play_symbian.xml + COMMAND InstanceName RunTest PlayAAC_LC_Symbian + END_TEST_BLOCK +END_TESTCASE TEST-OMX-DM-AUDIO-001-SYM + + +START_TESTCASE TEST-OMX-DM-AUDIO-001-SYM + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play_symbian.xml + COMMAND InstanceName RunTest DemuxMuxAAC_SBR_Symbian + END_TEST_BLOCK + + + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play_symbian.xml + COMMAND InstanceName RunTest PlayAAC_SBR_Symbian + END_TEST_BLOCK +END_TESTCASE TEST-OMX-DM-AUDIO-001-SYM + + +START_TESTCASE TEST-OMX-DM-AUDIO-001-SYM + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play_symbian.xml + COMMAND InstanceName RunTest DemuxMuxAAC_HEv2_Symbian + END_TEST_BLOCK + + + START_TEST_BLOCK !Heap=1572864 1000 te_xmlomxclient z:\mm\omx\te_xmlomxclient.ini + CREATE_OBJECT OmxXmlTestWrapper InstanceName + COMMAND InstanceName New z:\mm\omx\te_omx_audio_dm_play_symbian.xml + COMMAND InstanceName RunTest PlayAAC_HEv2_Symbian + END_TEST_BLOCK +END_TESTCASE TEST-OMX-DM-AUDIO-001-SYM + +PRINT Complete te_omx_audio Tests diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/scripts/audio/te_omx_audio_dm_play.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/scripts/audio/te_omx_audio_dm_play.xml Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/scripts/audio/te_omx_audio_dm_play_symbian.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/scripts/audio/te_omx_audio_dm_play_symbian.xml Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/scripts/te_xmlomxclient.ini --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/scripts/te_xmlomxclient.ini Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,2 @@ +[InstanceName] +name=OmxXmlTestObject diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestblockcontroller.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestblockcontroller.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "omxxmltestblockcontroller.h" +#include "omxxmltestwrapper.h" + +_LIT(KOmxXmlTestWrapper, "OmxXmlTestWrapper"); + +COmxXmlTestBlockController* COmxXmlTestBlockController::NewL() + { + return new(ELeave) COmxXmlTestBlockController(); + } + +COmxXmlTestBlockController::COmxXmlTestBlockController() + { + + } + +CDataWrapper* COmxXmlTestBlockController::CreateDataL(const TDesC& aData) + { + CDataWrapper* wrapper = NULL; + if(aData == KOmxXmlTestWrapper) + { + wrapper = COmxXmlTestWrapper::NewL(); + } + return wrapper; + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestblockcontroller.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestblockcontroller.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef OMXXMLTESTBLOCKCONTROLLER_H +#define OMXXMLTESTBLOCKCONTROLLER_H + +#include + +class COmxXmlTestBlockController : public CTestBlockController + { +public: + static COmxXmlTestBlockController* NewL(); + + CDataWrapper* CreateDataL(const TDesC& aData); + +private: + COmxXmlTestBlockController(); + }; + +#endif ///OMXXMLTESTBLOCKCONTROLLER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestrunner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestrunner.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "omxxmltestrunner.h" +#include + +COmxXmlTestRunner* COmxXmlTestRunner::NewL(CTestExecuteLogger& aLogger) + { + COmxXmlTestRunner* self = new(ELeave) COmxXmlTestRunner(aLogger); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +COmxXmlTestRunner::COmxXmlTestRunner(CTestExecuteLogger& aLogger): +iTestExecuteLogger(aLogger) + { + } + +void COmxXmlTestRunner::ConstructL() + { + iScript = COmxXmlScript::NewL(*this); + } + +COmxXmlTestRunner::~COmxXmlTestRunner() + { + delete iFilename; + delete iScript; + } + +void COmxXmlTestRunner::SetFilenameL(const TDesC& aFilename) + { + iFilename = aFilename.AllocL(); + } + +void COmxXmlTestRunner::RunTestL(const TDesC& aSectionName) + { + // TODO check for memory leaks + // TODO how to fail test block without causing E32USER-CBase 47 panic + iScript->RunScriptL(*iFilename, aSectionName); + } + +void COmxXmlTestRunner::Log(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, const TDes& aMessage) + { + // TEF Severity values are not the same as OMX Script + TLogSeverity tefSeverity; + switch(aSeverity) + { + case EOmxScriptSevErr: + tefSeverity = ESevrErr; + break; + case EOmxScriptSevWarn: + tefSeverity = ESevrWarn; + break; + case EOmxScriptSevInfo: + tefSeverity = ESevrInfo; + break; + default: + tefSeverity = ESevrAll; + } + + iTestExecuteLogger.LogExtra(aFile, aLine, tefSeverity, aMessage); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestrunner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestrunner.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef OMXXMLTESTRUNNER_H +#define OMXXMLTESTRUNNER_H + +#include +#include + +class CTestExecuteLogger; + +class COmxXmlTestRunner : public CBase, public MOmxScriptTestLogger + { +public: + static COmxXmlTestRunner* NewL(CTestExecuteLogger& aLogger); + ~COmxXmlTestRunner(); + + void SetFilenameL(const TDesC& aFilename); + void RunTestL(const TDesC& aSectionName); + + // from MOmxScriptTestLogger + void Log(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, const TDes& aMessage); + +private: + COmxXmlTestRunner(CTestExecuteLogger& aLogger); + void ConstructL(); + + CTestExecuteLogger& iTestExecuteLogger; + HBufC* iFilename; + COmxXmlScript* iScript; + }; + +#endif //OMXXMLTESTRUNNER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestwrapper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestwrapper.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "omxxmltestwrapper.h" +#include "omxxmltestrunner.h" + +// SCRIPT commands +_LIT(KNewCmd, "New"); +_LIT(KRunTestCmd, "RunTest"); + +COmxXmlTestWrapper* COmxXmlTestWrapper::NewL() + { + COmxXmlTestWrapper* self = new(ELeave) COmxXmlTestWrapper(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +COmxXmlTestWrapper::COmxXmlTestWrapper() + { + + } + +void COmxXmlTestWrapper::ConstructL() + { + iActiveCallback = CActiveCallback::NewL(*this); + } + +COmxXmlTestWrapper::~COmxXmlTestWrapper() + { + delete iTestRunner; + delete iActiveCallback; + } + +TBool COmxXmlTestWrapper::DoCommandL(const TTEFFunction& aCommand, + const TTEFSectionName& aSection, + const TInt /*aAsyncErrorIndex*/) + { + TBool ret = ETrue; + TInt err = KErrNone; + if(aCommand == KNewCmd()) + { + // XML file name is specified in aSection + TRAP(err, DoNewCmdL(aSection)); + } + else if(aCommand == KRunTestCmd()) + { + // XML section name is specified in aSection + TRAP(err, DoRunTestCmdL(aSection)); + } + else + { + ERR_PRINTF2(_L("Unrecognized command %S"), &aCommand); + ret = EFalse; + } + + if(err != KErrNone) + { + ret = EFalse; + } + + return ret; + } + +TAny* COmxXmlTestWrapper::GetObject() + { + return iTestRunner; + } + +void COmxXmlTestWrapper::DoNewCmdL(const TDesC& aFilename) + { + COmxXmlTestRunner* newRunner = COmxXmlTestRunner::NewL(Logger()); + CleanupStack::PushL(newRunner); + newRunner->SetFilenameL(aFilename); + CleanupStack::Pop(newRunner); + delete iTestRunner; + iTestRunner = newRunner; + } + +void COmxXmlTestWrapper::DoRunTestCmdL(const TDesC& aSectionName) + { + iTestRunner->RunTestL(aSectionName); + } + +void COmxXmlTestWrapper::RunL(CActive* aActive, TInt aIndex) + { + TInt err = aActive->iStatus.Int(); + SetAsyncError(aIndex, err); + DecOutstanding(); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestwrapper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/omxxmltestwrapper.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef OMXXMLTESTWRAPPER_H +#define OMXXMLTESTWRAPPER_H + +#include + +class COmxXmlTestRunner; + +class COmxXmlTestWrapper : public CDataWrapper + { +public: + static COmxXmlTestWrapper* NewL(); + ~COmxXmlTestWrapper(); + + TBool DoCommandL(const TTEFFunction& aCommand, + const TTEFSectionName& aSection, + const TInt aAsyncErrorIndex); + + TAny* GetObject(); + + void RunL(CActive* aActive, TInt aIndex); + +private: + COmxXmlTestWrapper(); + void ConstructL(); + + void DoNewCmdL(const TDesC& aFilename); + void DoRunTestCmdL(const TDesC& aScriptSection); + + CActiveCallback* iActiveCallback; + COmxXmlTestRunner* iTestRunner; + }; + +#endif //OMXXMLTESTWRAPPER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/te_xmlomxclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/te_xmlomxclient.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,104 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "te_xmlomxclient.h" +#include "omxxmltestblockcontroller.h" + +CTe_XmlOmxClient* CTe_XmlOmxClient::NewL() +/** + * @return - Instance of the test server + * Same code for Secure and non-secure variants + * Called inside the MainL() function to create and start the + * CTestServer derived server. + */ + { + CTe_XmlOmxClient * server = new (ELeave) CTe_XmlOmxClient(); + CleanupStack::PushL(server); + server->ConstructL(); + CleanupStack::Pop(server); + return server; + } + + +// Secure variants much simpler +// For EKA2, just an E32Main and a MainL() +LOCAL_C void MainL() +/** + * Secure variant + * Much simpler, uses the new Rendezvous() call to sync with the client + */ + { + // Leave the hooks in for platform security +#if (defined __DATA_CAGING__) + RProcess().DataCaging(RProcess::EDataCagingOn); + RProcess().DataCaging(RProcess::ESecureApiOn); +#endif + CActiveScheduler* sched=NULL; + sched=new(ELeave) CActiveScheduler; + CActiveScheduler::Install(sched); + CTe_XmlOmxClient* server = NULL; + // Create the CTestServer derived server + TRAPD(err,server = CTe_XmlOmxClient::NewL()); + if(!err) + { + // Sync with the client and enter the active scheduler + RProcess::Rendezvous(KErrNone); + sched->Start(); + } + delete server; + delete sched; + } + + + +GLDEF_C TInt E32Main() +/** + * @return - Standard Epoc error code on process exit + * Secure variant only + * Process entry point. Called by client using RProcess API + */ + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + if(cleanup == NULL) + { + return KErrNoMemory; + } + TRAPD(err,MainL()); + delete cleanup; + __UHEAP_MARKEND; + return err; + } + + +CTestStep* CTe_XmlOmxClient::CreateTestStep(const TDesC& /*aStepName*/) +/** + * @return - A CTestStep derived instance + * Secure and non-secure variants + * Implementation of CTestServer pure virtual + */ + { + return NULL; + } + +CTestBlockController* CTe_XmlOmxClient::CreateTestBlock() + { + CTestBlockController* controller = NULL; + TRAP_IGNORE(controller = COmxXmlTestBlockController::NewL()); + return controller; + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/te_xmlomxclient/src/te_xmlomxclient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/te_xmlomxclient/src/te_xmlomxclient.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef TE_XMLOMXCLIENT_H +#define TE_XMLOMXCLIENT_H + +#include + +class CTe_XmlOmxClient : public CTestServer2 + { +public: + static CTe_XmlOmxClient* NewL(); + // Base class pure virtual override + virtual CTestStep* CreateTestStep(const TDesC& aStepName); + + CTestBlockController* CreateTestBlock(); + }; + +#endif //TE_XMLOMXCLIENT_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,18 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "../t_videoframesupplier/group/bld.inf" \ No newline at end of file diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/bwins/t_videoframesupplieru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/bwins/t_videoframesupplieru.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,8 @@ +EXPORTS + ?NewL@CVideoFrameSupplier@@SAPAV1@ABVTDesC16@@W4TVideoFileType@1@@Z @ 1 NONAME ; class CVideoFrameSupplier * CVideoFrameSupplier::NewL(class TDesC16 const &, enum CVideoFrameSupplier::TVideoFileType) + ?LargestFrameSize@CVideoFrameSupplier@@QBEHXZ @ 2 NONAME ; int CVideoFrameSupplier::LargestFrameSize(void) const + ??1CVideoFrameSupplier@@UAE@XZ @ 3 NONAME ; CVideoFrameSupplier::~CVideoFrameSupplier(void) + ?NextFrameData@CVideoFrameSupplier@@QAEHPAEAAH@Z @ 4 NONAME ; int CVideoFrameSupplier::NextFrameData(unsigned char *, int &) + ?IsLastFrame@CVideoFrameSupplier@@QBEHXZ @ 5 NONAME ; int CVideoFrameSupplier::IsLastFrame(void) const + ?CurrentFrame@CVideoFrameSupplier@@QBEHXZ @ 6 NONAME ; int CVideoFrameSupplier::CurrentFrame(void) const + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/eabi/t_videoframesupplieru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/eabi/t_videoframesupplieru.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,12 @@ +EXPORTS + _ZN19CVideoFrameSupplier13NextFrameDataEPhRi @ 1 NONAME + _ZN19CVideoFrameSupplier4NewLERK7TDesC16NS_14TVideoFileTypeE @ 2 NONAME + _ZN19CVideoFrameSupplierD0Ev @ 3 NONAME + _ZN19CVideoFrameSupplierD1Ev @ 4 NONAME + _ZN19CVideoFrameSupplierD2Ev @ 5 NONAME + _ZNK19CVideoFrameSupplier11IsLastFrameEv @ 6 NONAME + _ZNK19CVideoFrameSupplier12CurrentFrameEv @ 7 NONAME + _ZNK19CVideoFrameSupplier16LargestFrameSizeEv @ 8 NONAME + _ZTI19CVideoFrameSupplier @ 9 NONAME + _ZTV19CVideoFrameSupplier @ 10 NONAME + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +PRJ_PLATFORMS +DEFAULT +ARMv6 + +PRJ_TESTEXPORTS +..\inc\t_videoframesupplier.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(multimedia/t_videoframesupplier.h) +t_videoframesupplier.iby /epoc32/rom/include/t_videoframesupplier.iby + +PRJ_TESTMMPFILES +t_videoframesupplier.mmp diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/group/t_videoframesupplier.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/group/t_videoframesupplier.iby Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,23 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef __T_VIDEOFRAMESUPPLIER_IBY__ +#define __T_VIDEOFRAMESUPPLIER_IBY__ + +file=ABI_DIR\BUILD_DIR\t_videoframesupplier.dll System\Libs\t_videoframesupplier.dll + +#endif diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/group/t_videoframesupplier.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/group/t_videoframesupplier.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +TARGET t_videoframesupplier.dll +TARGETTYPE dll +UID 0x1000008d 0xEDB08359 +CAPABILITY All -TCB + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +USERINCLUDE ..\inc + +SOURCEPATH ..\src + +SOURCE t_videoframesupplier.cpp +SOURCE t_videoframesupplierDllMain.cpp + +LIBRARY euser.lib +LIBRARY efsrv.lib + +#ifdef ENABLE_ABIV2_MODE + DEBUGGABLE_UDEBONLY +#endif + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/inc/t_videoframesupplier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/inc/t_videoframesupplier.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef __T_VIDEOFRAMESUPPLIER_H__ +#define __T_VIDEOFRAMESUPPLIER_H__ + + +#include +#include +#include + +typedef struct + { + TInt iPosition; // From start of the file. + TInt iLength; + } +TFrameData; + +typedef enum + { + ESearchForZero = 0, + ESearchForZeroZero, + ESearchForZeroZeroOne, + ESearchForStartCode, + EBeginningOfFrame + } +TMPEG4ParseState; + +// +// +// +class CVideoFrameSupplier : public CBase + { +public: + + typedef enum + { + EVideoFileTypeMPEG4 + } + TVideoFileType; + + IMPORT_C static CVideoFrameSupplier* NewL(const TDesC& aFileName, TVideoFileType aFileType); + IMPORT_C ~CVideoFrameSupplier(); + +public: + IMPORT_C TInt LargestFrameSize() const; + IMPORT_C TInt CurrentFrame() const; + IMPORT_C TInt NextFrameData(TUint8* aPtr, TInt& aFrameLength); + IMPORT_C TBool IsLastFrame() const; + +private: + CVideoFrameSupplier(); + void ConstructL(const TDesC& aFileName, TVideoFileType aFileType); + void ParseMPEG4FileL(); + TInt AppendFrameData(TInt aPosition, TInt aLength); + TInt ProcessMPEG4Byte(TUint8 aByte, TInt aBytePosition); + +private: + RFs iFs; + RFile iFile; + RArray iFrames; + TInt iLargestFrameSize; + TInt iCurrentFrame; + TMPEG4ParseState iState; + TInt iFrameStartPosition; + }; + +#endif // __T_VIDEOFRAMESUPPLIER_H__ + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/src/t_videoframesupplier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/src/t_videoframesupplier.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,260 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "t_videoframesupplier.h" + + +// +// +// +CVideoFrameSupplier::CVideoFrameSupplier() + : iLargestFrameSize(KErrNotFound) + { + } + +// +// +// +EXPORT_C CVideoFrameSupplier::~CVideoFrameSupplier() + { + iFrames.Close(); + iFile.Close(); + iFs.Close(); + } + + +// +// +// +EXPORT_C CVideoFrameSupplier* CVideoFrameSupplier::NewL(const TDesC& aFileName, TVideoFileType aFileType) + { + CVideoFrameSupplier* self = new(ELeave) CVideoFrameSupplier(); + CleanupStack::PushL(self); + self->ConstructL(aFileName, aFileType); + CleanupStack::Pop(self); + return self; + } + + +// +// +// +void CVideoFrameSupplier::ConstructL(const TDesC& aFileName, TVideoFileType aFileType) + { + User::LeaveIfError(iFs.Connect()); + TInt err = iFile.Open(iFs, aFileName, EFileRead); + if (err != KErrNone) + { + RDebug::Print(_L("*** CVideoFrameSupplier: Error %d opening file %S"), err, &aFileName); + User::Leave(err); + } + + switch (aFileType) + { + case EVideoFileTypeMPEG4: + ParseMPEG4FileL(); + break; + + default: + User::Leave(KErrNotSupported); + } + } + + +// +// +// +EXPORT_C TInt CVideoFrameSupplier::LargestFrameSize() const + { + return iLargestFrameSize; + } + + +// +// +// +EXPORT_C TInt CVideoFrameSupplier::CurrentFrame() const + { + return iCurrentFrame; + } + + +// +// +// +EXPORT_C TBool CVideoFrameSupplier::IsLastFrame() const + { + return iCurrentFrame >= (iFrames.Count() - 1); + } + + +// +// +// +EXPORT_C TInt CVideoFrameSupplier::NextFrameData(TUint8* aPtr, TInt& aFrameLength) + { + aFrameLength = KErrNotFound; + + if (!aPtr) + { + return KErrArgument; + } + + if (iCurrentFrame >= iFrames.Count()) + { + return KErrEof; + } + + TFrameData data = iFrames[iCurrentFrame++]; + TInt pos = data.iPosition; + TInt err = iFile.Seek(ESeekStart, pos); + if (err == KErrNone) + { + TPtr8 des(aPtr, data.iLength); + err = iFile.Read(des); + if (err == KErrNone) + { + aFrameLength = data.iLength; + } + } + + return err; + } + + +// +// +// +TInt CVideoFrameSupplier::AppendFrameData(TInt aPosition, TInt aLength) + { + ASSERT(aPosition >= 0); + ASSERT(aLength > 0); + + TFrameData data; + data.iPosition = aPosition; + data.iLength = aLength; + + if (aLength > iLargestFrameSize) + { + iLargestFrameSize = aLength; + } + + return iFrames.Append(data); + } + + +// +// +// +void CVideoFrameSupplier::ParseMPEG4FileL() + { + iFrames.Reset(); + + const TInt KBufferSize = 1024; + + iState = ESearchForZero; + iLargestFrameSize = KErrNotFound; + iFrameStartPosition = KErrNotFound; + + TBuf8 data; + TInt filePosition = 0; + TBool lastBuffer = EFalse; + TInt err = KErrNone; + + do + { + data.Zero(); + err = iFile.Read(data); + lastBuffer = (data.Length() != KBufferSize); + + if (err == KErrNone) + { + for (TInt i = 0; i < data.Length(); i++) + { + err = ProcessMPEG4Byte(data[i], filePosition + i); + } + + filePosition += KBufferSize; + } + } + while (!lastBuffer); + } + + +// +// +// +TInt CVideoFrameSupplier::ProcessMPEG4Byte(TUint8 aByte, TInt aBytePosition) + { + ASSERT(aBytePosition >= 0); + + TInt err = KErrNone; + + switch (iState) + { + case ESearchForZero: + iState = (aByte == 0x00 ? ESearchForZeroZero : iState); + break; + + case ESearchForZeroZero: + iState = (aByte == 0x00 ? ESearchForZeroZeroOne : ESearchForZero); + break; + + case ESearchForZeroZeroOne: + if (aByte == 0x00) + { + // Do nothing. It is allowed to have more than two leading zero bytes. + break; + } + + iState = (aByte == 0x01 ? ESearchForStartCode : ESearchForZero); + break; + + case ESearchForStartCode: + if (iFrameStartPosition != KErrNotFound) + { + // If we are currently in a frame then it ends at this start code. + TInt length = (aBytePosition - 3) - iFrameStartPosition; + err = AppendFrameData(iFrameStartPosition, length); + iFrameStartPosition = KErrNotFound; + } + + iState = (aByte == 0xB6 ? EBeginningOfFrame : ESearchForZero); + break; + + case EBeginningOfFrame: + iFrameStartPosition = aBytePosition - 4; // The 0x000001B6 bytes count too. + if (iFrames.Count() == 0) + { + if (iFrameStartPosition != 0) + { + // There was a header before the frame. The ST-E decoder + // requires that this data is prepended to the frame data (first frame only). + // We assume that all bytes before this frame are valid header bytes! + iFrameStartPosition = 0; + } + } + + iState = ESearchForZero; + break; + + default: + ASSERT(EFalse); + } + + return err; + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/tools/t_videoframesupplier/src/t_videoframesupplierDllMain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/tools/t_videoframesupplier/src/t_videoframesupplierDllMain.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include + + +#ifndef EKA2 // for EKA1 only +EXPORT_C TInt E32Dll(TDllReason /*aReason*/) +// Called when the DLL is loaded and unloaded. Note: have to define +// epoccalldllentrypoints in MMP file to get this called in THUMB. + { + return KErrNone; + } +#endif + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/bwins/xmlomxclient.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/bwins/xmlomxclient.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,4 @@ +EXPORTS + ?RunScriptL@COmxXmlScript@@QAEXABVTDesC16@@0@Z @ 1 NONAME ; void COmxXmlScript::RunScriptL(class TDesC16 const &, class TDesC16 const &) + ?NewL@COmxXmlScript@@SAPAV1@AAVMOmxScriptTestLogger@@@Z @ 2 NONAME ; class COmxXmlScript * COmxXmlScript::NewL(class MOmxScriptTestLogger &) + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/eabi/xmlomxclient.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/eabi/xmlomxclient.def Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,8 @@ +EXPORTS + _ZN13COmxXmlScript10RunScriptLERK7TDesC16S2_ @ 1 NONAME + _ZN13COmxXmlScript4NewLER20MOmxScriptTestLogger @ 2 NONAME + _ZTI14CWindowManager @ 3 NONAME + _ZTI15CThreadedLogger @ 4 NONAME + _ZTV14CWindowManager @ 5 NONAME + _ZTV15CThreadedLogger @ 6 NONAME + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/group/bld.inf Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +PRJ_PLATFORMS +DEFAULT +ARMv6 + +PRJ_TESTMMPFILES +xmlclient.mmp +omxscript.mmp + +PRJ_TESTEXPORTS +../inc/omx_xml_script.h SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(multimedia/omx_xml_script.h) +xmlomxclient.iby /epoc32/rom/include/xmlomxclient.iby + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/group/omxscript.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/group/omxscript.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +TARGET omxscript.exe +TARGETTYPE exe +UID 0 0x1028668F +CAPABILITY MultimediaDD UserEnvironment ReadUserData WriteUserData WriteDeviceData ProtServ NetworkControl + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN + +SOURCEPATH ..\src +SOURCE omxscript.cpp + +LIBRARY euser.lib +LIBRARY xmlomxclient.lib 3gplibrary.lib + +#ifdef ENABLE_ABIV2_MODE +DEBUGGABLE +#endif diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/group/xmlclient.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/group/xmlclient.mmp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +TARGET xmlomxclient.dll +TARGETTYPE DLL +UID 0 0x10286694 +CAPABILITY All -TCB + +OS_LAYER_SYSTEMINCLUDE_SYMBIAN +OS_LAYER_LIBC_SYSTEMINCLUDE + +USERINCLUDE ../inc +USERINCLUDE ../src + + +SOURCEPATH ../src +SOURCE omx_xml_script.cpp +SOURCE asbreakeventhandler.cpp +SOURCE paramconversion.cpp +SOURCE statedes.cpp +SOURCE omxscriptparser.cpp +SOURCE omxscripttest.cpp +SOURCE omxutil.cpp +SOURCE nontunneledhandler.cpp +SOURCE videotesttimer.cpp +SOURCE videobufferhandler.cpp +SOURCE videobuffersinkhandler.cpp +SOURCE videobufferhandler_mpeg4.cpp +SOURCE transition.cpp +SOURCE parsemap.c +SOURCE baseprofilehandler.cpp +SOURCE baseprofiletimestamping.cpp +SOURCE omxthreadrequest.cpp +SOURCE portbufferhandler.cpp +SOURCE threadedlogger.cpp +SOURCE windowmanager.cpp + +#ifdef ENABLE_ABIV2_MODE +DEBUGGABLE +#endif + +LIBRARY euser.lib +LIBRARY omxilcoreclient.lib +LIBRARY t_videoframesupplier.lib + +NOSTRICTDEF + +LIBRARY 3gpmp4lib.lib +LIBRARY hash.lib +LIBRARY inetprotutil.lib +LIBRARY ws32.lib +LIBRARY efsrv.lib +LIBRARY ecom.lib +LIBRARY xmlframework.lib +LIBRARY bafl.lib +LIBRARY charconv.lib +LIBRARY libc.lib 3gplibrary.lib diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/group/xmlomxclient.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/group/xmlomxclient.iby Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef XML_OMX_CLIENT_IBY +#define XML_OMX_CLIENT_IBY + +#include +#include +#include +#include <3gplibrary.iby> +#include <3gpmp4lib.iby> + +file=ABI_DIR\DEBUG_DIR\xmlomxclient.dll System\Libs\xmlomxclient.dll +file=ABI_DIR\DEBUG_DIR\omxscript.exe Sys\Bin\omxscript.exe + +#endif //XML_OMX_CLIENT_IBY diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/inc/omx_xml_script.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/inc/omx_xml_script.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef OMX_XML_SCRIPT_H_ +#define OMX_XML_SCRIPT_H_ + +#include + +/** + * Bitmask flags for logging severity levels. + */ +enum TOmxScriptSeverity + { + EOmxScriptSevErr = 0x0001, + EOmxScriptSevWarn = 0x0002, + EOmxScriptSevInfo = 0x0004, + EOmxScriptSevVer = 0x0007, + EOmxScriptSevAll = 0x0007 + }; + +/** + * Interface to receive messages from ROmxScriptTest. + */ +NONSHARABLE_CLASS(MOmxScriptTestLogger) + { +public: + IMPORT_C virtual void Log(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, const TDes& aMessage) = 0; + }; + +NONSHARABLE_CLASS(COmxXmlScript) : public CBase + { +public: + IMPORT_C static COmxXmlScript* NewL(MOmxScriptTestLogger& aLogger); + ~COmxXmlScript(); + + IMPORT_C void RunScriptL(const TDesC& aScriptFilename, const TDesC& aScriptSection); + +private: + COmxXmlScript(MOmxScriptTestLogger& aLogger); + +private: + MOmxScriptTestLogger& iLogger; + }; + +#endif /*OMX_XML_SCRIPT_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/inc/omxildroppedframeeventextension.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/inc/omxildroppedframeeventextension.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@ipublishedPartner +*/ + +#ifndef OMXILDROPPEDFRAMEEVENTEXTENSION_H_ +#define OMXILDROPPEDFRAMEEVENTEXTENSION_H_ + +#include + +/** + * The string that can be passed to get the index for the dropped frame event extension + */ +const char sOmxNokiaIndexParamDroppedFrameEvent [] = "OMX.NOKIA.INDEX.PARAM.DROPPEDFRAMEEVENT"; + +/** + * Custom OpenMAX IL structure for the dropped frame error extension. + */ +struct OMX_NOKIA_PARAM_DROPPEDFRAMEEVENT + { + OMX_U32 nSize; /** Size of this structure, in Bytes */ + OMX_VERSIONTYPE nVersion; /** OMX specification version information */ + OMX_U32 nPortIndex; /** Port that this structure applies to */ + OMX_BOOL bEnabled; /** Flag to indicate whether to generate the event */ + }; + +#endif /* OMXILDROPPEDFRAMEEVENTEXTENSION_H_ */ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/inc/omxilsymbianvideographicsinkextensions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/inc/omxilsymbianvideographicsinkextensions.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +/** + @file + @internalComponent +*/ + +#ifndef OMXILSYMBIANVIDEOGRAPHICSINKEXTENSIONS_H +#define OMXILSYMBIANVIDEOGRAPHICSINKEXTENSIONS_H + + +#include + + +/** + * The string that the Symbian's OpenMAX IL Graphic Sink component will + * translate into a 32-bit OpenMAX IL index to support the TSurfaceConfig class + */ +const char sOmxSymbianGfxSurfaceConfig [] = "OMX.SYMBIAN.INDEX.PARAM.VIDEO.GFX.SURFACECONFIG"; + + +/** + * Custom OpenMAX IL structure to be used as a container for an + * TSurfaceConfig class + */ +struct OMX_SYMBIAN_VIDEO_PARAM_SURFACECONFIGURATION + { + OMX_U32 nSize; // Size of this structure, in Bytes + OMX_VERSIONTYPE nVersion; // OMX specification version information + OMX_U32 nPortIndex; // Port that this structure applies to + OMX_PTR pSurfaceConfig; // This is a pointer to TSurfaceConfig class + }; + + +#endif // OMXILSYMBIANVIDEOGRAPHICSINKEXTENSIONS_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/asbreakeventhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/asbreakeventhandler.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,219 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#include +#include "asbreakeventhandler.h" + +const TDesC* StateDes(OMX_STATETYPE); + +RASBreakEventHandler::RASBreakEventHandler(MASBreakCallback& aHandler): +iHandler(aHandler), +iCounter(0), +iMode(EIdle) + { + iOmxCallbackType.EventHandler = EventHandler; + + // do nothing function is set for these callbacks, rather than using NULL + iOmxCallbackType.EmptyBufferDone = EmptyBufferDone; + iOmxCallbackType.FillBufferDone = FillBufferDone; + } + +TInt RASBreakEventHandler::Create() + { + return iMutex.CreateLocal(); + } + +void RASBreakEventHandler::Close() + { + for(TInt aIndex = 0, aCount = iComponents.Count(); aIndex < aCount; aIndex++) + { + delete iComponents[aIndex].iName; + } + iComponents.Close(); + iCounter = 0; + iMode = EIdle; + iMutex.Close(); + } + +void RASBreakEventHandler::AddComponentL(OMX_COMPONENTTYPE* aComponent, const TDesC& aName) + { + ASSERT(iMode == EIdle); + TComponentInfo componentInfo; + componentInfo.iHandle = aComponent; + componentInfo.iName = HBufC::NewLC(aName.Length()); + *(componentInfo.iName) = aName; + componentInfo.iComplete = EFalse; + User::LeaveIfError(iComponents.Append(componentInfo)); + CleanupStack::Pop(componentInfo.iName); + } + +OMX_ERRORTYPE RASBreakEventHandler::FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) + { + return reinterpret_cast(pAppData)->DoBufferDone(reinterpret_cast(hComponent), pBuffer, ETrue); + } + +OMX_ERRORTYPE RASBreakEventHandler::EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) + { + return reinterpret_cast(pAppData)->DoBufferDone(reinterpret_cast(hComponent), pBuffer, EFalse); + } + +OMX_ERRORTYPE RASBreakEventHandler::DoBufferDone(OMX_COMPONENTTYPE* aComponent, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) + { + iHandler.BufferDone(aComponent, aBufHdr, aSource); + return OMX_ErrorNone; + } + +OMX_ERRORTYPE RASBreakEventHandler::EventHandler(OMX_HANDLETYPE hComponent, + OMX_PTR pAppData, + OMX_EVENTTYPE eEvent, + OMX_U32 nData1, + OMX_U32 nData2, + OMX_PTR pEventData) + { + return reinterpret_cast(pAppData)->DoEventHandler(reinterpret_cast(hComponent), eEvent, nData1, nData2, pEventData); + } + +OMX_ERRORTYPE RASBreakEventHandler::DoEventHandler(OMX_COMPONENTTYPE* aComponent, OMX_EVENTTYPE aEvent, TUint32 aData1, TUint32 aData2, TAny* aEventData) + { + iMutex.Wait(); + if((iMode == EAwaitingTransition || iMode == EAwaitingSingleTransition) && aEvent == OMX_EventCmdComplete && aData1 == OMX_CommandStateSet) + { + StateSet(aComponent, (OMX_STATETYPE) aData2); + } + else if(iMode == EAwaitingEOS && aEvent == OMX_EventBufferFlag && aData2 & OMX_BUFFERFLAG_EOS) + { + EndOfStream(aComponent); + } + else + { + iHandler.EventReceived(aComponent, aEvent, aData1, aData2, aEventData); + } + iMutex.Signal(); + return OMX_ErrorNone; + } + +void RASBreakEventHandler::StateSet(OMX_COMPONENTTYPE* aComponent, OMX_STATETYPE aState) + { + RDebug::Print(_L("State transition: component %S is in state %S\n"), ComponentName(aComponent), StateDes(aState)); + if(iMode == EAwaitingTransition) + { + __ASSERT_ALWAYS(aState == iNewState, User::Panic(_L("RASBreakEventHandler"), 2)); + if(--iCounter == 0) + { + iMode = EIdle; + iHandler.AllComponentsTransitioned(iNewState, iOldState); + } + } + else if (iMode == EAwaitingSingleTransition) + { + __ASSERT_ALWAYS(aState == iNewState, User::Panic(_L("RASBreakEventHandler"), 2)); + iMode = EIdle; + iHandler.ComponentTransitioned(iNewState, iOldState); + } + } + +void RASBreakEventHandler::EndOfStream(OMX_COMPONENTTYPE* aComponent) + { + RDebug::Print(_L("End of stream from component %S\n"), ComponentName(aComponent)); + if(iMode == EAwaitingEOS) + { + TInt index = iComponents.Find(aComponent, TComponentInfo::CompareHandle); + // panic if component was not found + __ASSERT_ALWAYS(index >= 0, User::Invariant()); + + // only respond to EOS changing state, to allow potential duplicates + if(!iComponents[index].iComplete) + { + iComponents[index].iComplete = ETrue; + iCounter--; + // if iEOSComponent is NULL, wait for all components, otherwise wait for individual component + if(iEOSComponent == NULL && iCounter == 0 || iEOSComponent == aComponent) + { + iMode = EIdle; + iHandler.AllComponentsEOS(); + } + } + } + } + +void RASBreakEventHandler::AwaitTransition(OMX_STATETYPE aNewState, OMX_STATETYPE aOldState) + { + RDebug::Print(_L("Awaiting all components to transition from %S to %S\n"), StateDes(aOldState), StateDes(aNewState)); + ASSERT(iMode == EIdle); + iMode = EAwaitingTransition; + iNewState = aNewState; + iOldState = aOldState; + iCounter = iComponents.Count(); + } + +void RASBreakEventHandler::AwaitSingleTransition(OMX_COMPONENTTYPE* aComponent, OMX_STATETYPE aNewState, OMX_STATETYPE aOldState) + { + RDebug::Print(_L("Awaiting %S components to transition from %S to %S\n"), ComponentName(aComponent), StateDes(aOldState), StateDes(aNewState)); + ASSERT(iMode == EIdle); + iMode = EAwaitingSingleTransition; + iNewState = aNewState; + iOldState = aOldState; + } + +void RASBreakEventHandler::AwaitEOS() + { + RDebug::Print(_L("Awaiting End Of Stream flag from all components\n")); + ASSERT(iMode == EIdle); + iMode = EAwaitingEOS; + iEOSComponent = NULL; // wait for all components, not an individual component + for(iCounter = 0; iCounter < iComponents.Count(); iCounter++) + { + iComponents[iCounter].iComplete = EFalse; + } + } + +void RASBreakEventHandler::AwaitEOS(OMX_COMPONENTTYPE* aComponent) + { + RDebug::Print(_L("Awaiting End Of Stream flag from component %S\n"), ComponentName(aComponent)); + ASSERT(iMode == EIdle); + iMode = EAwaitingEOS; + iEOSComponent = aComponent; + for(iCounter = 0; iCounter < iComponents.Count(); iCounter++) + { + iComponents[iCounter].iComplete = EFalse; + } + } + +const TDesC* RASBreakEventHandler::ComponentName(OMX_COMPONENTTYPE* aComponent) + { + TInt index = iComponents.Find(aComponent, TComponentInfo::CompareHandle); + if(index == KErrNotFound) + { + return NULL; + } + return iComponents[index].iName; + } + +OMX_CALLBACKTYPE& RASBreakEventHandler::CallbackStruct() + { + return iOmxCallbackType; + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/asbreakeventhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/asbreakeventhandler.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#ifndef ASBREAKEVENTHANDLER_H_ +#define ASBREAKEVENTHANDLER_H_ + +#include + +#include + +class MASBreakCallback + { +public: + virtual void AllComponentsEOS() = 0; + virtual void AllComponentsTransitioned(OMX_STATETYPE aNewState, + OMX_STATETYPE aOldState) = 0; + virtual void EventReceived(OMX_COMPONENTTYPE* aComponent, OMX_EVENTTYPE aEvent, TUint32 aData1, TUint32 aData2, TAny* aEventData) = 0; + virtual void ComponentTransitioned(OMX_STATETYPE aNewState, + OMX_STATETYPE aOldState) = 0; + virtual void BufferDone(OMX_COMPONENTTYPE* aComp, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) = 0; + }; + +class RASBreakEventHandler + { +public: + RASBreakEventHandler(MASBreakCallback& aHandler); + TInt Create(); + void Close(); + + void InstallIntoL(OMX_COMPONENTTYPE* aComponent, const TDesC& aName); + void AddComponentL(OMX_COMPONENTTYPE* aComponent, const TDesC& aName); + + void AwaitTransition(OMX_STATETYPE aNewState, OMX_STATETYPE aOldState); + void AwaitEOS(); + void AwaitEOS(OMX_COMPONENTTYPE* aComponent); + void AwaitSingleTransition(OMX_COMPONENTTYPE* aComponent, OMX_STATETYPE aNewState, OMX_STATETYPE aOldState); + + OMX_CALLBACKTYPE& CallbackStruct(); + + static OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent, + OMX_PTR pAppData, + OMX_EVENTTYPE eEvent, + OMX_U32 nData1, + OMX_U32 nData2, + OMX_PTR pEventData); + static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + +private: + void StateSet(OMX_COMPONENTTYPE* aComponent, OMX_STATETYPE aState); + void EndOfStream(OMX_COMPONENTTYPE* aComponent); + OMX_ERRORTYPE DoBufferDone(OMX_COMPONENTTYPE* aComponent, + OMX_BUFFERHEADERTYPE* aBufHdr, + TBool aSource); + OMX_ERRORTYPE DoEventHandler(OMX_COMPONENTTYPE* aComponent, + OMX_EVENTTYPE aEvent, + OMX_U32 aData1, + OMX_U32 aData2, + OMX_PTR aEventData); + const TDesC* ComponentName(OMX_COMPONENTTYPE* aComponent); + + OMX_CALLBACKTYPE iOmxCallbackType; + + OMX_STATETYPE iNewState; + OMX_STATETYPE iOldState; + + enum TMode { EIdle, EAwaitingTransition, EAwaitingEOS, EAwaitingSingleTransition }; + MASBreakCallback& iHandler; + + class TComponentInfo + { + public: + static TBool CompareHandle(OMX_COMPONENTTYPE* const * a1, const TComponentInfo& a2) + { + return (*a1) == a2.iHandle; + } + + OMX_COMPONENTTYPE* iHandle; + TBool iComplete; + HBufC* iName; + }; + + RArray iComponents; + TInt iCounter; + TMode iMode; + RMutex iMutex; + + OMX_COMPONENTTYPE* iEOSComponent; // from which component we expect EOS. all components if NULL + }; + +#endif /*ASBREAKEVENTHANDLER_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/baseprofilehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/baseprofilehandler.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,359 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "baseprofilehandler.h" + +_LIT(KErrDialogInvalidPortIndex, "Base Profile support command called on port not configured for base profile comms, component: %S, port: %d"); +_LIT(KErrDialogBufferNumber, "Test script specified %d buffers, less than the port's minimum of %d, component: %S, port: %d"); +_LIT(KErrDialogFillBufferInvalidBufIndex, "Test script specified invalid buffer index on a FillThisBuffer call, component: %S, port: %d, buffer index passed: %d"); +_LIT(KErrDialogEmptyBufferInvalidBufIndex, "Test script specified invalid buffer index on a EmptyThisBuffer call, component: %S, port: %d, buffer index passed: %d"); + + +CBaseProfileHandler::CBaseProfileHandler(ROmxScriptTest& aTestOwner, RASBreakEventHandler& aParentEventHandler) +: iErrorCallbacks(aTestOwner), iEventHandlerCallbacks(aParentEventHandler) + { + iOmxCallbacks.EmptyBufferDone = EmptyBufferDone; + iOmxCallbacks.EventHandler = EventHandler; + iOmxCallbacks.FillBufferDone = FillBufferDone; + iMutex.CreateLocal(); + } + +CBaseProfileHandler::~CBaseProfileHandler() + { + iMutex.Close(); + delete iXmlName; + iBufferHeaders.ResetAndDestroy(); + iPortsUsingBaseProfile.Close(); + } + +void CBaseProfileHandler::AddPortSupportL(TInt aPortIndex) + { + TPortInfo portInfo; + portInfo.iPortIndex = aPortIndex; + portInfo.iAutoMode = EFalse; + portInfo.iWeAreBufferSupplier = ETrue; + iPortsUsingBaseProfile.AppendL(portInfo); + } + +void CBaseProfileHandler::SetBufferSupplier(TInt aPortIndex, TBool aComponentBufferSupplier) + { + TInt portIndex = iPortsUsingBaseProfile.Find(aPortIndex, CBaseProfileHandler::PortIndexMatchComparison); + if (portIndex == KErrNotFound) + { + TBuf<140> errorString; + errorString.Format(KErrDialogInvalidPortIndex, iXmlName, aPortIndex); + iErrorCallbacks.FailTest(errorString); + return; + } + iPortsUsingBaseProfile[portIndex].iWeAreBufferSupplier = !aComponentBufferSupplier; + } + +void CBaseProfileHandler::SetAutoMode(TInt aPortIndex, TBool aAutoMode) + { + TInt portIndex = iPortsUsingBaseProfile.Find(aPortIndex, CBaseProfileHandler::PortIndexMatchComparison); + if (portIndex == KErrNotFound) + { + TBuf<140> errorString; + errorString.Format(KErrDialogInvalidPortIndex, iXmlName, aPortIndex); + iErrorCallbacks.FailTest(errorString); + return; + } + iPortsUsingBaseProfile[portIndex].iAutoMode = aAutoMode; + } + +TInt CBaseProfileHandler::LocateBufferForPort(TInt aPortIndex, TInt aBufferIndexInPort) + { + //Implementation based on the fact that: + //-All the buffers for a port are allocated and appended to iBufferHeaders + //in a single contiguous block. + //-So once the first relevant buffer is found this index marks the zero index + //for the set of indexed buffers relevant to that port. + + TInt result = -1; + TInt bufferCount = iBufferHeaders.Count(); + for (TInt bufferIndex = 0; bufferIndex < bufferCount; bufferIndex++) + { + if (iBufferHeaders[bufferIndex]->iPortIndex != aPortIndex) + { + continue; + } + + //Safety check that the script hasn't made a manual Fill/Empty call on + //an invalid buffer index + if (iBufferHeaders[bufferIndex]->iPortIndex == iBufferHeaders[(bufferIndex + aBufferIndexInPort)]->iPortIndex) + { + result = bufferIndex + aBufferIndexInPort; + } + break; + } + return result; + } + +void CBaseProfileHandler::FillThisBuffer(TInt aPortIndex, TInt aBufferIndexInPort) + { + TInt bufHeaderIndex = LocateBufferForPort(aPortIndex, aBufferIndexInPort); + if (bufHeaderIndex >= 0) + { + iBufferHeaders[bufHeaderIndex]->iBufferAvailable = EFalse; + iOmxComponent->FillThisBuffer(iOmxComponent, iBufferHeaders[bufHeaderIndex]->iBufferHeader); + } + else + { + TBuf<140> errorString; + errorString.Format(KErrDialogFillBufferInvalidBufIndex, iXmlName, aPortIndex, aBufferIndexInPort); + iErrorCallbacks.FailTest(errorString); + } + } + +void CBaseProfileHandler::EmptyThisBuffer(TInt aPortIndex, TInt aBufferIndexInPort) + { + TInt bufHeaderIndex = LocateBufferForPort(aPortIndex, aBufferIndexInPort); + if (bufHeaderIndex >= 0) + { + iBufferHeaders[bufHeaderIndex]->iBufferAvailable = EFalse; + iOmxComponent->EmptyThisBuffer(iOmxComponent, iBufferHeaders[bufHeaderIndex]->iBufferHeader); + } + else + { + TBuf<140> errorString; + errorString.Format(KErrDialogEmptyBufferInvalidBufIndex, iXmlName, aPortIndex, aBufferIndexInPort); + iErrorCallbacks.FailTest(errorString); + } + } + +void CBaseProfileHandler::WaitForBufferCompletion(TInt aPortIndex, TInt aBufferIndexInPort) + { + TInt bufHeaderIndex = LocateBufferForPort(aPortIndex, aBufferIndexInPort); + iMutex.Wait(); + if (iBufferHeaders[bufHeaderIndex]->iBufferAvailable) + { + //Buffer has already completed either while waiting on another buffer or as a result of test command processing delay, no need to wait + iMutex.Signal(); + } + else + { + iWaitingOnBuffer = iBufferHeaders[bufHeaderIndex]->iBufferHeader; + iMutex.Signal(); + iErrorCallbacks.BeginWait(); + } + + } + +OMX_ERRORTYPE CBaseProfileHandler::EventHandler(OMX_HANDLETYPE /*hComponent*/, OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData) + { + reinterpret_cast(pAppData)->HandleEventReceived(eEvent, nData1, nData2, pEventData); + return OMX_ErrorNone; + } + +OMX_ERRORTYPE CBaseProfileHandler::FillBufferDone(OMX_IN OMX_HANDLETYPE /*hComponent*/, OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) + { + reinterpret_cast(pAppData)->HandleFillBufferDone(pBuffer); + return OMX_ErrorNone; + } + +OMX_ERRORTYPE CBaseProfileHandler::EmptyBufferDone(OMX_IN OMX_HANDLETYPE /*hComponent*/, OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) + { + reinterpret_cast(pAppData)->HandleEmptyBufferDone(pBuffer); + return OMX_ErrorNone; + } + +void CBaseProfileHandler::HandleEventReceived(OMX_EVENTTYPE aeEvent, OMX_U32 anData1, OMX_U32 anData2, OMX_PTR apEventData) + { + DoEventReceived(aeEvent, anData1, anData2, apEventData); + iEventHandlerCallbacks.EventHandler(iOmxComponent, &iEventHandlerCallbacks, aeEvent, anData1, anData2, apEventData); + } + +void CBaseProfileHandler::HandleFillBufferDone(OMX_IN OMX_BUFFERHEADERTYPE* aFilledBuffer) + { + iMutex.Wait(); + DoFillBufferDone(aFilledBuffer); + TInt bufferIndex = iBufferHeaders.Find(*aFilledBuffer, CBaseProfileHandler::BufferHeaderMatchComparison); + iBufferHeaders[bufferIndex]->iBufferAvailable = ETrue; + TInt portIndex = iPortsUsingBaseProfile.Find((*iBufferHeaders[bufferIndex]).iPortIndex, CBaseProfileHandler::PortIndexMatchComparison); + + if (iPortsUsingBaseProfile[portIndex].iAutoMode) + { + iBufferHeaders[bufferIndex]->iBufferAvailable = EFalse; + iOmxComponent->FillThisBuffer(iOmxComponent, aFilledBuffer); + } + + if (iWaitingOnBuffer == iBufferHeaders[bufferIndex]->iBufferHeader) + { + iWaitingOnBuffer = NULL; + iErrorCallbacks.EndWait(); + } + + iMutex.Signal(); + } + +void CBaseProfileHandler::HandleEmptyBufferDone(OMX_IN OMX_BUFFERHEADERTYPE* aEmptiedBuffer) + { + iMutex.Wait(); + DoEmptyBufferDone(aEmptiedBuffer); + TInt bufferIndex = iBufferHeaders.Find(*aEmptiedBuffer, CBaseProfileHandler::BufferHeaderMatchComparison); + iBufferHeaders[bufferIndex]->iBufferAvailable = ETrue; + TInt portIndex = iPortsUsingBaseProfile.Find((*iBufferHeaders[bufferIndex]).iPortIndex, CBaseProfileHandler::PortIndexMatchComparison); + + if (iPortsUsingBaseProfile[portIndex].iAutoMode) + { + iBufferHeaders[bufferIndex]->iBufferAvailable = EFalse; + iOmxComponent->EmptyThisBuffer(iOmxComponent, aEmptiedBuffer); + } + + if (iWaitingOnBuffer == iBufferHeaders[bufferIndex]->iBufferHeader) + { + iWaitingOnBuffer = NULL; + iErrorCallbacks.EndWait(); + } + + iMutex.Signal(); + } + +OMX_COMPONENTTYPE* CBaseProfileHandler::LoadComponentL(const TDesC8& aTestSpecificName, const TDesC8& aOmxName) + { + + iXmlName = HBufC::NewL(aTestSpecificName.Length()); + iXmlName->Des().Copy(aTestSpecificName); + // allow room for the '\0' used in call to OMX_GetHandle + HBufC8* omxNameToLoad = HBufC8::NewL(aOmxName.Length() + 1); + *omxNameToLoad = aOmxName; + + OMX_ERRORTYPE error = OMX_GetHandle((TAny**) &iOmxComponent, (OMX_STRING) omxNameToLoad->Des().PtrZ(), this, &iOmxCallbacks); + delete omxNameToLoad; + if (error != OMX_ErrorNone) + { + iErrorCallbacks.FailWithOmxError(_L("OMX_GetHandle()"), error); + } + + return iOmxComponent; + } + +void CBaseProfileHandler::FreeAllocatedBuffersL() + { + for (TInt i = 0; i < iBufferHeaders.Count(); ++i) + { + delete iBufferHeaders[i]; + } + iBufferHeaders.Reset(); + } + +void CBaseProfileHandler::SetupBuffersL(TInt aPortIndex, TInt aNumberBuffers) + { + TInt portInfoIndex = iPortsUsingBaseProfile.Find(aPortIndex, CBaseProfileHandler::PortIndexMatchComparison); + if (portInfoIndex == KErrNotFound) + { + TBuf<140> errorString; + errorString.Format(KErrDialogInvalidPortIndex, iXmlName, aPortIndex); + iErrorCallbacks.FailTest(errorString); + return; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = iOmxComponent->GetParameter(iOmxComponent, OMX_IndexParamPortDefinition, &portDef); + if(error != OMX_ErrorNone) + { + iErrorCallbacks.FailWithOmxError(_L("GetParameter"), error); + return; + } + + if (aNumberBuffers < portDef.nBufferCountMin) + { + TBuf<140> errorString; + errorString.Format(KErrDialogBufferNumber, aNumberBuffers, portDef.nBufferCountMin, iXmlName, aPortIndex); + iErrorCallbacks.FailTest(errorString); + return; + } + + TInt bufSize = portDef.nBufferSize; + + for (TInt bufIndex=0; bufIndex < aNumberBuffers; bufIndex++) + { + CBufferHeaderInfo* headerInfo = new (ELeave) CBufferHeaderInfo(*this); + iBufferHeaders.AppendL(headerInfo); + headerInfo->iPortIndex = aPortIndex; + + if (iPortsUsingBaseProfile[portInfoIndex].iWeAreBufferSupplier) + { + OMX_U8* buffer = new (ELeave) OMX_U8[bufSize]; + iOmxComponent->UseBuffer(iOmxComponent, &(headerInfo->iBufferHeader), aPortIndex, NULL, bufSize, buffer); + } + else + { + iOmxComponent->AllocateBuffer(iOmxComponent, &(headerInfo->iBufferHeader), aPortIndex, NULL, bufSize); + } + } + } + +void CBaseProfileHandler::DoEventReceived(OMX_EVENTTYPE /*aeEvent*/, OMX_U32 /*anData1*/, OMX_U32 /*anData2*/, OMX_PTR /*apEventData*/) + { + //Uninterested + } + +void CBaseProfileHandler::DoFillBufferDone(OMX_BUFFERHEADERTYPE* /*aFilledBuffer*/) + { + //Uninterested + } + +void CBaseProfileHandler::DoEmptyBufferDone(OMX_BUFFERHEADERTYPE* /*aEmptiedBuffer*/) + { + //Uninterested + } + +CBaseProfileHandler::CBufferHeaderInfo::CBufferHeaderInfo(CBaseProfileHandler& aParent) +: iBufferAvailable(ETrue), iParent(aParent) + { + } + +CBaseProfileHandler::CBufferHeaderInfo::~CBufferHeaderInfo() + { + OMX_U8* buffer = iBufferHeader->pBuffer; + OMX_ERRORTYPE error = iParent.iOmxComponent->FreeBuffer(iParent.iOmxComponent, iPortIndex, iBufferHeader); + if (error != OMX_ErrorNone) + { + iParent.iErrorCallbacks.FailWithOmxError(_L("OMX_FreeBuffer()"), error); + return; + } + + TInt portInfoIndex = iParent.iPortsUsingBaseProfile.Find(iPortIndex, CBaseProfileHandler::PortIndexMatchComparison); + if (iParent.iPortsUsingBaseProfile[portInfoIndex].iWeAreBufferSupplier) + { + delete[] buffer; + } + } + +TBool CBaseProfileHandler::PortIndexMatchComparison(const TInt* aPortIndex, const TPortInfo& aPortInfo) + { + if (*aPortIndex == aPortInfo.iPortIndex) + { + return ETrue; + } + return EFalse; + } + +TBool CBaseProfileHandler::BufferHeaderMatchComparison(const OMX_BUFFERHEADERTYPE* aBufferHeader, const CBufferHeaderInfo& aBufferHeaderInfo) + { + if (aBufferHeader == aBufferHeaderInfo.iBufferHeader) + { + return ETrue; + } + return EFalse; + } + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/baseprofilehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/baseprofilehandler.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef BASEPROFILEHANDLER_H_ +#define BASEPROFILEHANDLER_H_ + +#include + +#include +#include + +#include "asbreakeventhandler.h" +#include "omxscripttest.h" + + +NONSHARABLE_CLASS(CBaseProfileHandler) : public CBase + { +public: + CBaseProfileHandler(ROmxScriptTest& aTestOwner, RASBreakEventHandler& aParentEventHandler); + ~CBaseProfileHandler(); + + OMX_COMPONENTTYPE* LoadComponentL(const TDesC8& aTestSpecificName, const TDesC8& aOmxName); + + void AddPortSupportL(TInt aPortIndex); + void SetBufferSupplier(TInt aPortIndex, TBool aComponentBufferSupplier); + void SetAutoMode(TInt aPortIndex, TBool aAutoMode); + void SetupBuffersL(TInt aPortIndex, TInt aNumberBuffers); + void FreeAllocatedBuffersL(); + void FillThisBuffer(TInt aPortIndex, TInt aBufferIndexInPort); + void EmptyThisBuffer(TInt aPortIndex, TInt aBufferIndexInPort); + void WaitForBufferCompletion(TInt aPortIndex, TInt aBufferIndexInPort); + + //OpenMAX IL callbacks + static OMX_ERRORTYPE EventHandler(OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData); + static OMX_ERRORTYPE FillBufferDone(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + static OMX_ERRORTYPE EmptyBufferDone(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer); + + void HandleEventReceived(OMX_EVENTTYPE aeEvent, OMX_U32 anData1, OMX_U32 anData2, OMX_PTR apEventData); + void HandleFillBufferDone(OMX_IN OMX_BUFFERHEADERTYPE* aFilledBuffer); + void HandleEmptyBufferDone(OMX_IN OMX_BUFFERHEADERTYPE* aEmptiedBuffer); + +protected: + + NONSHARABLE_CLASS(CBufferHeaderInfo) : public CBase + { + public: + CBufferHeaderInfo(CBaseProfileHandler& aParent); + ~CBufferHeaderInfo(); + + public: + OMX_BUFFERHEADERTYPE* iBufferHeader; + TBool iBufferAvailable; //EFalse if buffer currently with IL Component + TInt iPortIndex; //Port the buffer is assigned to + CBaseProfileHandler& iParent; + }; + + struct TPortInfo + { + TInt iPortIndex; + TBool iWeAreBufferSupplier; + TBool iAutoMode; + }; + + virtual void DoEventReceived(OMX_EVENTTYPE aeEvent, OMX_U32 anData1, OMX_U32 anData2, OMX_PTR apEventData); + virtual void DoFillBufferDone(OMX_IN OMX_BUFFERHEADERTYPE* aFilledBuffer); + virtual void DoEmptyBufferDone(OMX_IN OMX_BUFFERHEADERTYPE* aEmptiedBuffer); + + static TBool PortIndexMatchComparison(const TInt* aPortIndex, const TPortInfo& aPortInfo); + static TBool BufferHeaderMatchComparison(const OMX_BUFFERHEADERTYPE* aBufferHeader, const CBufferHeaderInfo& aBufferHeaderInfo); + + //aBufferIndexInPort starts at 0 for the first buffer + TInt LocateBufferForPort(TInt aPortIndex, TInt aBufferIndexInPort); + +protected: + OMX_CALLBACKTYPE iOmxCallbacks; + OMX_COMPONENTTYPE* iOmxComponent; //Not owned + + RPointerArray iBufferHeaders; + + RArray iPortsUsingBaseProfile; + + HBufC* iXmlName; + + ROmxScriptTest& iErrorCallbacks; + RASBreakEventHandler& iEventHandlerCallbacks; + + OMX_BUFFERHEADERTYPE* iWaitingOnBuffer; //Not owned, only ever one wait request pending at any one time so this suffices + + RMutex iMutex; //Used to ensure serialised execution of buffer completions and calls to wait on buffer completions + }; + +#endif /* BASEPROFILEHANDLER_H_ */ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/baseprofiletimestamping.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/baseprofiletimestamping.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "baseprofiletimestamping.h" + +_LIT(KErrDialogTimestampCheckFailed, "A timestamp check failed on Component: %S, Port: %d. Expected time: %u +/- %u, actual: %Lu"); +_LIT(KErrDialogTimestampComparisonFailed, "A timestamp compare with clock media time failed on Component: %S, Port: %d. Media time: %Lu, delay allowed: %u, actual: %Lu"); + +CBaseProfileTimestampHandling::CBaseProfileTimestampHandling(ROmxScriptTest& aTestOwner, RASBreakEventHandler& aParentEventHandler) +: CBaseProfileHandler(aTestOwner, aParentEventHandler) + { + } + +CBaseProfileTimestampHandling::~CBaseProfileTimestampHandling() + { + iPendingTimestampChecks.Close(); + } + +void CBaseProfileTimestampHandling::SetClockComponent(OMX_COMPONENTTYPE* aClockComponent) + { + iClockComponent = aClockComponent; + } + +void CBaseProfileTimestampHandling::QueueTimestampCheckL(TInt aPortIndex, TUint aTime, TUint aTolerance) + { + TTimestampCheckingInfo timestampCheck; + timestampCheck.iPortIndex = aPortIndex; + timestampCheck.iExpectedTime = aTime; + timestampCheck.iTolerance = aTolerance; + timestampCheck.iCompareWithRefClock = EFalse; + + iPendingTimestampChecks.AppendL(timestampCheck); + } + +void CBaseProfileTimestampHandling::QueueCompareWithRefClockL(TInt aPortIndex, TUint aTolerance) + { + TTimestampCheckingInfo timestampCheck; + timestampCheck.iPortIndex = aPortIndex; + timestampCheck.iExpectedTime = 0; + timestampCheck.iTolerance = aTolerance; + timestampCheck.iCompareWithRefClock = ETrue; + + iPendingTimestampChecks.AppendL(timestampCheck); + } + +void CBaseProfileTimestampHandling::DoFillBufferDone(OMX_BUFFERHEADERTYPE* aFilledBuffer) + { + CheckTimestamp(aFilledBuffer); + } + +void CBaseProfileTimestampHandling::DoEmptyBufferDone(OMX_BUFFERHEADERTYPE* aEmptiedBuffer) + { + CheckTimestamp(aEmptiedBuffer); + } + +void CBaseProfileTimestampHandling::CheckTimestamp(OMX_BUFFERHEADERTYPE* aBuffer) + { + TInt bufferIndex = iBufferHeaders.Find(*aBuffer, CBaseProfileHandler::BufferHeaderMatchComparison); + + for (TInt index=0; index < iPendingTimestampChecks.Count(); index++) + { + if (iBufferHeaders[bufferIndex]->iPortIndex != iPendingTimestampChecks[index].iPortIndex) + { + continue; + } + TTimestampCheckingInfo passCriteria = iPendingTimestampChecks[index]; + iPendingTimestampChecks.Remove(index); + + if (passCriteria.iCompareWithRefClock) + { + OMX_TIME_CONFIG_TIMESTAMPTYPE timeInfo; + timeInfo.nSize = sizeof(timeInfo); + timeInfo.nVersion = KOmxVersion; + timeInfo.nPortIndex = passCriteria.iPortIndex; + + OMX_ERRORTYPE error = iClockComponent->GetConfig(iClockComponent, OMX_IndexConfigTimeCurrentMediaTime, &timeInfo); + + if (error != OMX_ErrorNone) + { + iErrorCallbacks.FailWithOmxError(_L("OMX_GetConfig(OMX_IndexConfigTimeCurrentMediaTime)"), error); + } + else if ((aBuffer->nTimeStamp > timeInfo.nTimestamp) || (aBuffer->nTimeStamp < (timeInfo.nTimestamp - passCriteria.iTolerance))) + { + TBuf<200> errorString; + errorString.Format(KErrDialogTimestampComparisonFailed, iXmlName, passCriteria.iPortIndex, timeInfo.nTimestamp, passCriteria.iTolerance, aBuffer->nTimeStamp); + iErrorCallbacks.FailTest(errorString); + } + } + else + { + if ((aBuffer->nTimeStamp < (passCriteria.iExpectedTime - passCriteria.iTolerance)) || (aBuffer->nTimeStamp > (passCriteria.iExpectedTime + passCriteria.iTolerance))) + { + TBuf<200> errorString; + errorString.Format(KErrDialogTimestampCheckFailed, iXmlName, passCriteria.iPortIndex, passCriteria.iExpectedTime, passCriteria.iTolerance, aBuffer->nTimeStamp); + iErrorCallbacks.FailTest(errorString); + } + } + + break; + } + } + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/baseprofiletimestamping.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/baseprofiletimestamping.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef BASEPROFILETIMESTAMPING_H_ +#define BASEPROFILETIMESTAMPING_H_ + +#include "baseprofilehandler.h" + +NONSHARABLE_CLASS(CBaseProfileTimestampHandling) : public CBaseProfileHandler + { +public: + CBaseProfileTimestampHandling(ROmxScriptTest& aTestOwner, RASBreakEventHandler& aParentEventHandler); + ~CBaseProfileTimestampHandling(); + + void SetClockComponent(OMX_COMPONENTTYPE* aClockComponent); + void QueueTimestampCheckL(TInt aPortIndex, TUint aTime, TUint aTolerance); + void QueueCompareWithRefClockL(TInt aPortIndex, TUint aTolerance); + +protected: + + struct TTimestampCheckingInfo + { + TInt iPortIndex; //Index in the component + TUint iExpectedTime; + TUint iTolerance; + TBool iCompareWithRefClock; + }; + + virtual void DoFillBufferDone(OMX_BUFFERHEADERTYPE* aFilledBuffer); + virtual void DoEmptyBufferDone(OMX_BUFFERHEADERTYPE* aEmptiedBuffer); + + void CheckTimestamp(OMX_BUFFERHEADERTYPE* aBuffer); + + + +private: + OMX_COMPONENTTYPE* iClockComponent; //Not owned, if non null used as the reference clock for cmparison with the current set of timestamps + RArray iPendingTimestampChecks; + + }; + +#endif /* BASEPROFILETIMESTAMPING_H_ */ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/log.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/log.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef LOG_H_ +#define LOG_H_ + +#include "omx_xml_script.h" + +#define __FILE8__ REINTERPRET_CAST(const TText8*, __FILE__) + +#define INFO_PRINTF1(p1) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1)) +#define INFO_PRINTF2(p1, p2) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2)) +#define INFO_PRINTF3(p1, p2, p3) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2), (p3)) +#define INFO_PRINTF4(p1, p2, p3, p4) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2), (p3), (p4)) +#define INFO_PRINTF5(p1, p2, p3, p4, p5) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2), (p3), (p4), (p5)) +#define INFO_PRINTF6(p1, p2, p3, p4, p5, p6) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2), (p3), (p4), (p5), (p6)) +#define INFO_PRINTF7(p1, p2, p3, p4, p5, p6, p7) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7)) +#define INFO_PRINTF8(p1, p2, p3, p4, p5, p6, p7, p8) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8)) +#define INFO_PRINTF9(p1, p2, p3, p4, p5, p6, p7, p8, p9) LogExtra(__FILE8__, __LINE__, EOmxScriptSevInfo, (p1), (p2), (p3), (p4), (p5), (p6), (p7), (p8), (p9)) + +#define WARN_PRINTF1(p1) LogExtra(__FILE8__, __LINE__, EOmxScriptSevWarn, (p1)) +#define WARN_PRINTF2(p1, p2) LogExtra(__FILE8__, __LINE__, EOmxScriptSevWarn, (p1), (p2)) +#define WARN_PRINTF3(p1, p2, p3) LogExtra(__FILE8__, __LINE__, EOmxScriptSevWarn, (p1), (p2), (p3)) +#define WARN_PRINTF4(p1, p2, p3, p4) LogExtra(__FILE8__, __LINE__, EOmxScriptSevWarn, (p1), (p2), (p3), (p4)) +#define WARN_PRINTF5(p1, p2, p3, p4, p5) LogExtra(__FILE8__, __LINE__, EOmxScriptSevWarn, (p1), (p2), (p3), (p4), (p5)) +#define WARN_PRINTF6(p1, p2, p3, p4, p5, p6) LogExtra(__FILE8__, __LINE__, EOmxScriptSevWarn, (p1), (p2), (p3), (p4), (p5), (p6)) +#define WARN_PRINTF7(p1, p2, p3, p4, p5, p6, p7) LogExtra(__FILE8__, __LINE__, EOmxScriptSevWarn, (p1), (p2), (p3), (p4), (p5), (p6), (p7)) + +#define ERR_PRINTF1(p1) LogExtra(__FILE8__, __LINE__, EOmxScriptSevErr, (p1)) +#define ERR_PRINTF2(p1, p2) LogExtra(__FILE8__, __LINE__, EOmxScriptSevErr, (p1), (p2)) +#define ERR_PRINTF3(p1, p2, p3) LogExtra(__FILE8__, __LINE__, EOmxScriptSevErr, (p1), (p2), (p3)) ; +#define ERR_PRINTF4(p1, p2, p3, p4) LogExtra(__FILE8__, __LINE__, EOmxScriptSevErr, (p1), (p2), (p3), (p4)) +#define ERR_PRINTF5(p1, p2, p3, p4, p5) LogExtra(__FILE8__, __LINE__, EOmxScriptSevErr, (p1), (p2), (p3), (p4), (p5)) +#define ERR_PRINTF6(p1, p2, p3, p4, p5, p6) LogExtra(__FILE8__, __LINE__, EOmxScriptSevErr, (p1), (p2), (p3), (p4), (p5), (p6)) +#define ERR_PRINTF7(p1, p2, p3, p4, p5, p6, p7) LogExtra(__FILE8__, __LINE__, EOmxScriptSevErr, (p1), (p2), (p3), (p4), (p5), (p6), (p7)) + +#endif /* LOG_H_ */ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/nontunneledhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/nontunneledhandler.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,417 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "nontunneledhandler.h" + +CNonTunneledHandler::CNonTunneledHandler() + { + } + +CNonTunneledHandler::~CNonTunneledHandler() + { + } + +void CNonTunneledHandler::AddLinkL(OMX_COMPONENTTYPE* aSourceComp, + TInt aSourcePort, + OMX_COMPONENTTYPE* aSinkComp, + TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier, + TInt aNumBufs, TInt aBufSize) + { + CComponentInfo* compInfo = NULL; + TInt pos = iComponents.Find(*aSourceComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + compInfo = iComponents[pos]; + } + else + { + compInfo = new (ELeave) CComponentInfo(aSourceComp); + CleanupStack::PushL(compInfo); + iComponents.AppendL(compInfo); + CleanupStack::Pop(compInfo); + } + + CPortInfo* sourcePortInfo = compInfo->AddPortL(aSourcePort, ETrue, aNumBufs, aBufSize, aSupplier); + + pos = iComponents.Find(*aSinkComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + compInfo = iComponents[pos]; + } + else + { + compInfo = new (ELeave) CComponentInfo(aSinkComp); + CleanupStack::PushL(compInfo); + iComponents.AppendL(compInfo); + CleanupStack::Pop(compInfo); + } + + CPortInfo* sinkPortInfo = compInfo->AddPortL(aSinkPort, EFalse, aNumBufs, aBufSize, aSupplier); + + sourcePortInfo->SetPeer(sinkPortInfo); + sinkPortInfo->SetPeer(sourcePortInfo); + } + +void CNonTunneledHandler::AllocateBuffersL(OMX_COMPONENTTYPE* aComp) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->AllocateBuffersL(); + } + } + +void CNonTunneledHandler::FillBuffers(OMX_COMPONENTTYPE* aComp) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->FillBuffers(); + } + } + +void CNonTunneledHandler::BufferDone(OMX_COMPONENTTYPE* aComp, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->BufferDone(aBufHdr, aSource); + } + } + +void CNonTunneledHandler::HoldBuffers(OMX_COMPONENTTYPE* aComp) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->HoldBuffers(); + } + } + +void CNonTunneledHandler::FreeBuffers(OMX_COMPONENTTYPE* aComp) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->FreeBuffers(); + } + } + +CNonTunneledHandler::CComponentInfo::CComponentInfo(OMX_COMPONENTTYPE* aComp) : + iComp(aComp) + { + } + +CNonTunneledHandler::CComponentInfo::~CComponentInfo() + { + iPorts.ResetAndDestroy(); + } + +CNonTunneledHandler::CPortInfo* CNonTunneledHandler::CComponentInfo::AddPortL(TInt aPortNum, TBool aSource, TInt aNumBufs, TInt aBufSize, OMX_BUFFERSUPPLIERTYPE aSupplier) + { + __ASSERT_ALWAYS(iPorts.Find(aPortNum, CPortInfo::ComparePortNum) == KErrNotFound, User::Invariant()); + + CPortInfo* portInfo = new (ELeave) CPortInfo(iComp, aPortNum, aSource, aNumBufs, aBufSize, aSupplier); + CleanupStack::PushL(portInfo); + iPorts.AppendL(portInfo); + CleanupStack::Pop(portInfo); + + return portInfo; + } + +void CNonTunneledHandler::CComponentInfo::AllocateBuffersL() + { + TInt numPorts = iPorts.Count(); + + for (TInt port = 0; port < numPorts; ++port) + { + iPorts[port]->AllocateBuffersL(); + } + } + +void CNonTunneledHandler::CComponentInfo::FillBuffers() + { + TInt numPorts = iPorts.Count(); + + for (TInt port = 0; port < numPorts; ++port) + { + iPorts[port]->FillBuffers(); + } + } + +void CNonTunneledHandler::CComponentInfo::BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) + { + TInt pos = KErrNotFound; + + if (aSource) + { + pos = iPorts.Find(static_cast(aBufHdr->nOutputPortIndex), CPortInfo::ComparePortNum); + } + else + { + pos = iPorts.Find(static_cast(aBufHdr->nInputPortIndex), CPortInfo::ComparePortNum); + } + + __ASSERT_ALWAYS(pos != KErrNotFound, User::Invariant()); + + iPorts[pos]->BufferDone(aBufHdr); + } + +void CNonTunneledHandler::CComponentInfo::HoldBuffers() + { + for (TInt port = 0; port < iPorts.Count(); ++port) + { + iPorts[port]->HoldBuffers(); + } + } + +void CNonTunneledHandler::CComponentInfo::FreeBuffers() + { + for (TInt port = 0; port < iPorts.Count(); ++port) + { + iPorts[port]->FreeBuffers(); + } + } + +TBool CNonTunneledHandler::CComponentInfo::CompareComp(const OMX_COMPONENTTYPE* aComp, const CComponentInfo& aComponentInfo) + { + return (aComp == aComponentInfo.iComp); + } + +CNonTunneledHandler::CPortInfo::CPortInfo(OMX_COMPONENTTYPE* aComp, TInt aPortNum, TBool aSource, TInt aNumBufs, TInt aBufSize, OMX_BUFFERSUPPLIERTYPE aSupplier) : + iComp(aComp), + iPortNum(aPortNum), + iSource(aSource), + iNumBufs(aNumBufs), + iBufSize(aBufSize), + iSupplier(aSupplier), + iEosSignalledtoInput(FALSE) + { + } + +CNonTunneledHandler::CPortInfo::~CPortInfo() + { + DeleteAllBuffers(); + } + +void CNonTunneledHandler::CPortInfo::SetPeer(CPortInfo* aPeer) + { + iPeer = aPeer; + } + +void CNonTunneledHandler::CPortInfo::AllocateBuffersL() + { + OMX_BUFFERHEADERTYPE* bufHdr = NULL; + + if (iSource) + { + if (iSupplier == OMX_BufferSupplyUnspecified) + { + OMX_U8* newBuffer = NULL; + + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + newBuffer = new (ELeave) OMX_U8[iBufSize]; + CleanupStack::PushL(newBuffer); + iBuffers.AppendL(newBuffer); + CleanupStack::Pop(newBuffer); + iComp->UseBuffer(iComp, &bufHdr, iPortNum, NULL, iBufSize, newBuffer); + iBufferHeaders.AppendL(bufHdr); + SendAllocatedBufferToPeerL(newBuffer); + } + } + else if (iSupplier == OMX_BufferSupplyOutput) + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + iComp->AllocateBuffer(iComp, &bufHdr, iPortNum, NULL, iBufSize); + iBufferHeaders.AppendL(bufHdr); + SendAllocatedBufferToPeerL(bufHdr->pBuffer); + } + } + else + { + TInt bufCount = iBuffers.Count(); + + for (TInt buf = 0; buf < bufCount; ++buf) + { + iComp->UseBuffer(iComp, &bufHdr, iPortNum, NULL, iBufSize, iBuffers[buf]); + iBufferHeaders.AppendL(bufHdr); + } + + if (bufCount < iNumBufs) + { + iWaitingForBuffers = ETrue; + } + } + } + else + { + if (iSupplier == OMX_BufferSupplyInput) + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + iComp->AllocateBuffer(iComp, &bufHdr, iPortNum, NULL, iBufSize); + iBufferHeaders.AppendL(bufHdr); + SendAllocatedBufferToPeerL(bufHdr->pBuffer); + } + } + else + { + TInt bufCount = iBuffers.Count(); + + for (TInt buf = 0; buf < bufCount; ++buf) + { + iComp->UseBuffer(iComp, &bufHdr, iPortNum, NULL, iBufSize, iBuffers[buf]); + iBufferHeaders.AppendL(bufHdr); + } + + if (bufCount < iNumBufs) + { + iWaitingForBuffers = ETrue; + } + } + } + } + +void CNonTunneledHandler::CPortInfo::SendAllocatedBufferToPeerL(OMX_U8* aBuffer) + { + __ASSERT_ALWAYS(iPeer, User::Invariant()); + + iPeer->ReceiveAllocatedBufferFromPeerL(aBuffer); + } + +void CNonTunneledHandler::CPortInfo::ReceiveAllocatedBufferFromPeerL(OMX_U8* aBuffer) + { + if (iWaitingForBuffers) + { + OMX_BUFFERHEADERTYPE* bufHdr = NULL; + + iComp->UseBuffer(iComp, &bufHdr, iPortNum, NULL, iBufSize, aBuffer); + iBufferHeaders.AppendL(bufHdr); + + if (iBufferHeaders.Count() == iNumBufs) + { + iWaitingForBuffers = EFalse; + } + } + else + { + iBuffers.AppendL(aBuffer); + } + } + +void CNonTunneledHandler::CPortInfo::FillBuffers() + { + iHoldingBuffers = EFalse; + if (iSource) + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + iComp->FillThisBuffer(iComp, iBufferHeaders[buf]); + } + } + } + +void CNonTunneledHandler::CPortInfo::BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr) + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + if (iBufferHeaders[buf] == aBufHdr) + { + iPeer->ReceiveBufferFromPeer(buf, aBufHdr); + } + } + } + +void CNonTunneledHandler::CPortInfo::SendBufferToPeer(TInt aBufHdrOffset, OMX_BUFFERHEADERTYPE* aPeerBufHdr) + { + __ASSERT_ALWAYS(iPeer, User::Invariant()); + + iPeer->ReceiveBufferFromPeer(aBufHdrOffset, aPeerBufHdr); + } + +void CNonTunneledHandler::CPortInfo::ReceiveBufferFromPeer(TInt aBufHdrOffset, OMX_BUFFERHEADERTYPE* aPeerBufHdr) + { + __ASSERT_ALWAYS(aBufHdrOffset < iNumBufs, User::Invariant()); + + if (!iHoldingBuffers) + { + iBufferHeaders[aBufHdrOffset]->nOffset = aPeerBufHdr->nOffset; + iBufferHeaders[aBufHdrOffset]->nFilledLen = aPeerBufHdr->nFilledLen; + + if (iSource) + { + iComp->FillThisBuffer(iComp, iBufferHeaders[aBufHdrOffset]); + } + else + { + iBufferHeaders[aBufHdrOffset]->hMarkTargetComponent = aPeerBufHdr->hMarkTargetComponent; + iBufferHeaders[aBufHdrOffset]->pMarkData = aPeerBufHdr->pMarkData; + iBufferHeaders[aBufHdrOffset]->nTimeStamp = aPeerBufHdr->nTimeStamp; + iBufferHeaders[aBufHdrOffset]->nFlags = aPeerBufHdr->nFlags; + + if(aPeerBufHdr->nFlags & OMX_BUFFERFLAG_EOS) + { + // TODO Logic for EOS + if(iEosSignalledtoInput == FALSE) + { + iComp->EmptyThisBuffer(iComp, iBufferHeaders[aBufHdrOffset]); + iEosSignalledtoInput = TRUE; + } + return; + } + iComp->EmptyThisBuffer(iComp, iBufferHeaders[aBufHdrOffset]); + } + } + } + +void CNonTunneledHandler::CPortInfo::HoldBuffers() + { + iHoldingBuffers = ETrue; + } + +void CNonTunneledHandler::CPortInfo::FreeBuffers() + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + iComp->FreeBuffer(iComp, iPortNum, iBufferHeaders[buf]); + } + + DeleteAllBuffers(); + } + +void CNonTunneledHandler::CPortInfo::DeleteAllBuffers() + { + iBufferHeaders.Reset(); + + if (iSource && iSupplier == OMX_BufferSupplyUnspecified) + { + iBuffers.ResetAndDestroy(); + } + else + { + iBuffers.Reset(); + } + } + +TBool CNonTunneledHandler::CPortInfo::ComparePortNum(const TInt* aPortNum, const CPortInfo& aPortInfo) + { + return (*aPortNum == aPortInfo.iPortNum); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/nontunneledhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/nontunneledhandler.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,95 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef NONTUNNELEDHANDLER_H +#define NONTUNNELEDHANDLER_H + +#include +#include + +NONSHARABLE_CLASS(CNonTunneledHandler) : public CBase + { +public: + CNonTunneledHandler(); + ~CNonTunneledHandler(); + + void AddLinkL(OMX_COMPONENTTYPE* aSourceComp, TInt aSourcePort, + OMX_COMPONENTTYPE* aSinkComp, TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier, TInt aNumBufs, TInt aBufSize); + void AllocateBuffersL(OMX_COMPONENTTYPE* aComp); + void FillBuffers(OMX_COMPONENTTYPE* aComp); + void BufferDone(OMX_COMPONENTTYPE* aComp, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource); + void HoldBuffers(OMX_COMPONENTTYPE* aComp); + void FreeBuffers(OMX_COMPONENTTYPE* aComp); + +private: + NONSHARABLE_CLASS(CPortInfo) : public CBase + { + public: + CPortInfo(OMX_COMPONENTTYPE* aComp, TInt aPortNum, TBool aSource, TInt aNumBufs, TInt aBufSize, OMX_BUFFERSUPPLIERTYPE aSupplier); + ~CPortInfo(); + void SetPeer(CPortInfo* aPeer); + void AllocateBuffersL(); + void FillBuffers(); + void SendAllocatedBufferToPeerL(OMX_U8* aBuffer); + void ReceiveAllocatedBufferFromPeerL(OMX_U8* aBuffer); + void BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr); + void SendBufferToPeer(TInt aBufHdrOffset, OMX_BUFFERHEADERTYPE* aPeerBufHdr); + void ReceiveBufferFromPeer(TInt aBufHdrOffset, OMX_BUFFERHEADERTYPE* aPeerBufHdr); + void HoldBuffers(); + void FreeBuffers(); + void DeleteAllBuffers(); + static TBool ComparePortNum(const TInt* aPortNum, const CPortInfo& aPortInfo); + + private: + OMX_COMPONENTTYPE* iComp; + TInt iPortNum; + TBool iSource; + TInt iNumBufs; + TInt iBufSize; + OMX_BUFFERSUPPLIERTYPE iSupplier; + RPointerArray iBuffers; + RPointerArray iBufferHeaders; + CPortInfo* iPeer; + TBool iWaitingForBuffers; + TBool iHoldingBuffers; + TBool iEosSignalledtoInput; + }; + + NONSHARABLE_CLASS(CComponentInfo) : public CBase + { + public: + CComponentInfo(OMX_COMPONENTTYPE* aComp); + ~CComponentInfo(); + CPortInfo* AddPortL(TInt aPortNum, TBool aSource, TInt aNumBufs, TInt aBufSize, OMX_BUFFERSUPPLIERTYPE aSupplier); + void AllocateBuffersL(); + void FillBuffers(); + void BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource); + void HoldBuffers(); + void FreeBuffers(); + static TBool CompareComp(const OMX_COMPONENTTYPE* aSource, const CComponentInfo& aComponentInfo); + + private: + OMX_COMPONENTTYPE* iComp; + RPointerArray iPorts; + }; + + RPointerArray iComponents; + }; + +#endif // NONTUNNELEDHANDLER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omx_xml_script.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omx_xml_script.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "omx_xml_script.h" +#include "omxscripttest.h" +#include "threadedlogger.h" + +EXPORT_C COmxXmlScript* COmxXmlScript::NewL(MOmxScriptTestLogger& aLogger) + { + return new(ELeave) COmxXmlScript(aLogger); + } + +COmxXmlScript::COmxXmlScript(MOmxScriptTestLogger& aLogger): +iLogger(aLogger) + { + } + +COmxXmlScript::~COmxXmlScript() + { + // do nothing + } + +EXPORT_C void COmxXmlScript::RunScriptL(const TDesC& aScriptFilename, const TDesC& aScriptSection) + { + CThreadedLogger* threadedLogger = CThreadedLogger::NewLC(iLogger); + ROmxScriptTest impl(*threadedLogger); + CleanupClosePushL(impl); + impl.RunTestL(aScriptFilename, aScriptSection); + CleanupStack::PopAndDestroy(2, threadedLogger); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxscript.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxscript.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,263 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include +#include // Console +#include +#include + +// Constants + +_LIT(KTextConsoleTitle, "Console"); +_LIT(KTextFailed, " failed, leave code = %d"); +_LIT(KTextPressAnyKey, " [press any key]\n"); + +// Global Variables + +LOCAL_D CConsoleBase* console; // write all messages to this + + +// Local Functions + +/** + * Logs script output to console and RDebug. + */ +class TConsoleLogger : public MOmxScriptTestLogger + { + void Log(const TText8* aFile, TInt aLine, TOmxScriptSeverity /*aSeverity*/, const TDes& aMessage) + { + TPtrC8 fileDes8(aFile); + TBuf<255> fileDes; + fileDes.Copy(fileDes8); + console->Printf(_L("%S:%d %S\n"), &fileDes, aLine, &aMessage); + RDebug::Print(_L("%S:%d %S"), &fileDes, aLine, &aMessage); + } + }; + +LOCAL_C void ShowUsage() + { + console->Write(_L("Usage: omxscript
\n")); + } + +LOCAL_C TInt ParseSize(const TDesC& aDes) + { + TLex lex(aDes); + TInt val; + if(lex.Val(val) != KErrNone || val < 0) + { + return KErrArgument; + } + switch(lex.Get()) + { + case 0: // no modifier + break; + case 'K': + val <<= 10; + break; + case 'M': + val <<= 20; + break; + default: // bad modifier + return KErrArgument; + } + if(lex.Get() != 0) + { + // trailing text + return KErrArgument; + } + return val; + } + +/** + * Extracts parameters from the command line. + * This method must not use the cleanup stack; there may not be one allocated since we may be switching heaps. + */ +LOCAL_C TInt ParseCommandLineArgs(TDes& commandLine, TPtrC& aFilename, TPtrC& aSection, TInt &aHeapSize) + { + // copy the command line + if(User::CommandLineLength() > commandLine.MaxLength()) + { + return KErrTooBig; + } + User::CommandLine(commandLine); + + // parse filename, section and other args from the command line + TInt heapSize = KErrNotFound; + TPtrC filename(KNullDesC); + TPtrC section(KNullDesC); + TLex lex(commandLine); + lex.SkipSpaceAndMark(); + while(!lex.Eos()) + { + lex.SkipCharacters(); + TPtrC arg = lex.MarkedToken(); + lex.SkipSpaceAndMark(); + if(arg == _L("-heap")) + { + if(lex.Eos()) + { + // no param following + return KErrArgument; + } + lex.SkipCharacters(); + TPtrC heapArg = lex.MarkedToken(); + lex.SkipSpaceAndMark(); + heapSize = ParseSize(heapArg); + if(heapSize == KErrArgument) + { + return KErrArgument; + } + } + else if(filename.Length() == 0) + { + filename.Set(arg); + } + else if(section.Length() == 0) + { + section.Set(arg); + } + else + { + // to many unnamed params + return KErrArgument; + } + } + if(section.Length() == 0) + { + return KErrArgument; + } + aHeapSize = heapSize; + aFilename.Set(filename); + aSection.Set(section); + return KErrNone; + } + +LOCAL_C void MainL() + { + RBuf commandLine; + commandLine.CreateL(User::CommandLineLength()); + CleanupClosePushL(commandLine); + TPtrC filename(KNullDesC); + TPtrC section(KNullDesC); + TInt heapSize = KErrNotFound; + TInt error = ParseCommandLineArgs(commandLine, filename, section, heapSize); + if(error) + { + ShowUsage(); + User::Leave(error); + } + + //logs script output to console and RDebug + TConsoleLogger logger; + + COmxXmlScript* script = COmxXmlScript::NewL(logger); + CleanupStack::PushL(script); + script->RunScriptL(filename, section); + CleanupStack::PopAndDestroy(2, &commandLine); + } + +LOCAL_C void DoStartL() + { + // Create active scheduler (to run active objects) + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + MainL(); + + // Delete active scheduler + CleanupStack::PopAndDestroy(scheduler); + } + +/** + * Invokes ParseCommandLineArgs() to retrieve any heap size specified on the command line. + * The command line descriptor is allocated on the stack (since we are avoiding heap allocations at this point). + * The descriptors are then thrown away (to avoid consuming too much stack space). + * Later, the command line will be parsed again but on the heap. + */ +LOCAL_C TInt ParseHeapSize() + { + TInt heapSize = KErrNotFound; + TPtrC filename(KNullDesC); + TPtrC section(KNullDesC); + TBuf<255> commandLine; + // ignore error + ParseCommandLineArgs(commandLine, filename, section, heapSize); + return heapSize; + } + +// Global Functions + +GLDEF_C TInt E32Main() + { + + + TInt heapSize = ParseHeapSize(); + + + // switch heap if specified + RHeap* oldHeap = NULL; + RHeap* newHeap = NULL; + + if(heapSize != KErrNotFound) + { + const TInt KMinHeapGrowBy = 1; + const TInt KByteAlignment = 0; + const TBool KSingleThreaded = EFalse; + newHeap = User::ChunkHeap(NULL, heapSize, heapSize, KMinHeapGrowBy, KByteAlignment, KSingleThreaded); + if(newHeap == NULL) + { + return KErrNoMemory; + } + oldHeap = User::SwitchHeap(newHeap); + } + + // Create cleanup stack + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + + // Create output console + TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen,KConsFullScreen))); + if (createError) + return createError; + + // Run application code inside TRAP harness, wait keypress when terminated + TRAPD(mainError, DoStartL()); + + + if(mainError) + { + console->Printf(KTextFailed, mainError); + } + console->Printf(KTextPressAnyKey); + console->Getch(); + + delete console; + delete cleanup; + __UHEAP_MARKEND; + + if(newHeap != NULL) + { + User::SwitchHeap(oldHeap); + newHeap->Close(); + } + + return KErrNone; + } + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxscriptparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxscriptparser.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,2236 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "omxscriptparser.h" +#include +#include +#include "parsemap.h" +//#include + +#if defined(NCP_COMMON_BRIDGE_FAMILY) && !defined(__WINSCW__) +// These definitions are from /epoc32/include/osi/video/VFM_Types.h +// We can't include the header itself because it does not obey symbian foundation +// rules on header file inclusion paths. +const TInt OMX_COLOR_FormatSTYUV420PackedSemiPlanarMB = (OMX_COLOR_FormatMax-1); +const TInt OMX_COLOR_FormatSTYUV422PackedSemiPlanarMB = (OMX_COLOR_FormatMax-2); +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Temporary work-around for floating point issues on HREF 8500 ED hardware +// Using this macro, code that uses TReal will be #defined out if running on ED. +// TODO: Remove HREF_ED_WITHOUT_FLOATING_POINT and all of its conditional code +// once the floating point issue has been solved. +#if defined(NCP_COMMON_BRIDGE_FAMILY) && !defined(__WINSCW__) +#define HREF_ED_WITHOUT_FLOATING_POINT +#endif + +using Xml::CParser; + +COmxScriptParser* COmxScriptParser::NewL(RFs& aFs, const TDesC& aFilename, MOmxScriptIf& aCallback) + { + COmxScriptParser* self = new(ELeave) COmxScriptParser(aFs, aCallback); + CleanupStack::PushL(self); + self->ConstructL(aFilename); + CleanupStack::Pop(self); + return self; + } + +COmxScriptParser::~COmxScriptParser() + { + iFilename.Close(); + } + +COmxScriptParser::COmxScriptParser(RFs& aFs, MOmxScriptIf& aCallback): +iFs(aFs), iCallback(aCallback) + { + + } + +void COmxScriptParser::ConstructL(const TDesC& aFilename) + { + User::LeaveIfError(iFilename.Create(aFilename.Length())); + iFilename = aFilename; + } + +TBool COmxScriptParser::RunScriptL(const TDesC& aSectionName) + { + CParser* parser = CParser::NewLC(_L8("text/xml"), *this); + iSectionName = &aSectionName; + iInTest = EFalse; + iFoundTest = EFalse; + iCallbackAborted = EFalse; + TInt error = KErrNone; + TInt size = iFilename.Length(); + + TRAP(error, Xml::ParseL(*parser, iFs, iFilename)); + CleanupStack::PopAndDestroy(parser); + + if(error == KErrAbort && iCallbackAborted) + { + return EFalse; + } + User::LeaveIfError(error); + if(!iFoundTest) + { + User::Leave(KErrNotFound); + } + return ETrue; + } + +void COmxScriptParser::OnStartDocumentL(const RDocumentParameters& /*aDocParam*/, TInt /*aErrorCode*/) + { + // do nothing + } + +void COmxScriptParser::OnEndDocumentL(TInt /*aErrorCode*/) + { + // do nothing + } + +void COmxScriptParser::OnContentL(const TDesC8& /*aBytes*/, TInt /*aErrorCode*/) + { + // do nothing + } + +void COmxScriptParser::OnStartPrefixMappingL(const RString& /*aPrefix*/, const RString& /*aUri*/, + TInt /*aErrorCode*/) + { + // do nothing + } + +void COmxScriptParser::OnEndPrefixMappingL(const RString& /*aPrefix*/, TInt /*aErrorCode*/) + { + // do nothing + } + +void COmxScriptParser::OnIgnorableWhiteSpaceL(const TDesC8& /*aBytes*/, TInt /*aErrorCode*/) + { + // do nothing + } + +void COmxScriptParser::OnSkippedEntityL(const RString& /*aName*/, TInt /*aErrorCode*/) + { + User::Invariant(); + } + +void COmxScriptParser::OnProcessingInstructionL(const TDesC8& /*aTarget*/, const TDesC8& /*aData*/, + TInt /*aErrorCode*/) + { + // do nothing + } + +void COmxScriptParser::OnError(TInt aErrorCode) + { + (void) aErrorCode; // avoid unused parameter warning. useful to give parameter a name when debugging. + User::Invariant(); + } + +TAny* COmxScriptParser::GetExtendedInterface(const TInt32 /*aUid*/) + { + return 0; + } + +void COmxScriptParser::OnStartElementL(const RTagInfo& aElement, + const RAttributeArray& aAttributes, + TInt /*aErrorCode*/) + { + const TDesC8& elemName = aElement.LocalName().DesC(); + if(!iInTest) + { + if(elemName == _L8("Test")) + { + const TDesC8* testName8Bit = FindAttribute(aAttributes, _L8("name")); + if(testName8Bit) + { + HBufC* testName = HBufC::NewLC(testName8Bit->Length()); + testName->Des().Copy(*testName8Bit); + if(*testName == *iSectionName) + { + __ASSERT_ALWAYS(!iFoundTest, User::Invariant()); + iFoundTest = ETrue; + iInTest = ETrue; + } + CleanupStack::PopAndDestroy(testName); + } + } + } + else + { + // to trace out which command has been passed from xml file + TBuf<32> elemNameCopy; + elemNameCopy.Copy(elemName); + TBuf<44> message; + message.Append(_L("command: ")); + message.Append(elemNameCopy); + iCallback.MosParseError(message); + + if(elemName == _L8("LoadComponent")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& name = FindAttributeL(aAttributes, _L8("name")); + + TBool baseEnabled = EFalse; + const TDesC8* baseImpl = NULL; + const TDesC8* baseEnabledAttr = FindAttribute(aAttributes, _L8("baseprofilesupport")); + if (baseEnabledAttr != NULL) + { + baseEnabled = ParseBoolean(*baseEnabledAttr); + baseImpl = &(FindAttributeL(aAttributes, _L8("baseprofileimpl"))); + } + + TBool loadInCoreServerThread = EFalse; + const TDesC8* loadInCoreServerThreadAttr = FindAttribute(aAttributes, _L8("loadincoreserverthread")); + if(loadInCoreServerThreadAttr != NULL) + { + loadInCoreServerThread = ParseBoolean(*loadInCoreServerThreadAttr); + } + + CheckForAbortL(iCallback.MosLoadComponentL(comp, name, baseEnabled, baseImpl, loadInCoreServerThread)); + } + else if(elemName == _L8("LogAllEvents")) //utility + { + CheckForAbortL(iCallback.MosLogAllEventsL()); + } + + else if(elemName == _L8("SetSensorModeType")) //camera + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + + TPtrC8 comp; + TInt port = 0; + ParseCompPortL(compPort, comp, port); + + TInt frameRate = ParseOptionalIntL(aAttributes, _L8("frameRate"), -1); + + const TDesC8& oneShotStr = FindAttributeL(aAttributes, _L8("oneShot")); + TBool oneShot = ParseBooleanL(oneShotStr); + TInt width = ParseOptionalIntL(aAttributes, _L8("width"), -1); + TInt height = ParseOptionalIntL(aAttributes, _L8("height"), -1); + + CheckForAbortL(iCallback.MosSetSensorModeTypeL(comp, port, frameRate, oneShot, width, height)); + } + else if(elemName == _L8("DeleteFile")) //utility + { + const TDesC8& fileName8 = FindAttributeL(aAttributes, _L8("filename")); + + HBufC* fileName = HBufC::NewLC(fileName8.Length() + 1); + fileName->Des().Copy(fileName8); + fileName->Des().ZeroTerminate(); + + TBool fileMustExist = EFalse; + const TDesC8* fileMustExistAttr = FindAttribute(aAttributes, _L8("fileMustExist")); + if (fileMustExistAttr != NULL) + { + fileMustExist = ParseBoolean(*fileMustExistAttr); + } + + CheckForAbortL(iCallback.MosDeleteFileL(*fileName, fileMustExist)); + CleanupStack::PopAndDestroy(fileName); + } + else if(elemName == _L8("SetupTunnel")) + { + const TDesC8& source = FindAttributeL(aAttributes, _L8("output")); + const TDesC8& sink = FindAttributeL(aAttributes, _L8("input")); + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + + TPtrC8 sourceComp; + TPtrC8 sinkComp; + TInt sourcePort = 0; + TInt sinkPort = 0; + _LIT8(KTemp, ""); + const TDesC8& temp = KTemp; + if (source.Compare(temp)) + { + ParseCompPortL(source, sourceComp, sourcePort); + } + if(sink.Compare(temp)) + { + ParseCompPortL(sink, sinkComp, sinkPort); + } + CheckForAbortL(iCallback.MosSetupTunnel(sourceComp, sourcePort, sinkComp, sinkPort, expectedErrorInt)); + } + + else if (elemName == _L8("SetupNonTunnel")) + { + const TDesC8& source = FindAttributeL(aAttributes, _L8("output")); + const TDesC8& sink = FindAttributeL(aAttributes, _L8("input")); + const TDesC8& supplierDes = FindAttributeL(aAttributes, _L8("supplier")); + TPtrC8 sourceComp; + TPtrC8 sinkComp; + TInt sourcePort; + TInt sinkPort; + ParseCompPortL(source, sourceComp, sourcePort); + ParseCompPortL(sink, sinkComp, sinkPort); + OMX_BUFFERSUPPLIERTYPE supplier = ParseOmxSupplierL(supplierDes, ETrue); + CheckForAbortL(iCallback.MosSetupNonTunnel(sourceComp, sourcePort, sinkComp, sinkPort, supplier)); + } + else if (elemName == _L8("SetBufferForPort")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + + const TDesC8& filename8Bit = FindAttributeL(aAttributes, _L8("filename")); + HBufC* filename = HBufC::NewLC(filename8Bit.Length()); + filename->Des().Copy(filename8Bit); + TInt headerlength = KErrNone; + headerlength = ParseOptionalIntL(aAttributes, _L8("headerlength"), -1); + + const TDesC8* supplierDes = FindAttribute(aAttributes, _L8("supplier")); + OMX_BUFFERSUPPLIERTYPE supplier = OMX_BufferSupplyUnspecified; + if(supplierDes) + { + supplier = ParseOmxSupplierL(*supplierDes); + } + CheckForAbortL(iCallback.MosSetupBufferForPortL(comp,port,*filename,headerlength,supplier)); + CleanupStack::PopAndDestroy(filename); + } + else if(elemName == _L8("SetWindow")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + CheckForAbortL(iCallback.MosSetWindowL(comp)); + } + else if(elemName == _L8("AllTransition")) + { + const TDesC8& stateDes = FindAttributeL(aAttributes, _L8("state")); + OMX_STATETYPE state = ParseOmxStateL(stateDes); + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + const TDesC8* orderDes = FindAttribute(aAttributes, _L8("order")); + TTransitionOrder order = ELoadOrder; + if(orderDes != NULL) + { + if(*orderDes == _L8("auto")) + { + order = EAutoOrder; + } + else + { + User::Leave(KErrArgument); + } + } + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + CheckForAbortL(iCallback.MosAllTransitionL(state, expectedErrorInt, order)); + } + else if(elemName == _L8("Transition")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& stateDes = FindAttributeL(aAttributes, _L8("state")); + TBool async_behaviour = ParseOptionalBooleanL(aAttributes, _L8("async"), EFalse); + OMX_STATETYPE state = ParseOmxStateL(stateDes); + CheckForAbortL(iCallback.MosTransition(comp, state, async_behaviour)); + } + else if(elemName == _L8("FailingTransition")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& stateDes = FindAttributeL(aAttributes, _L8("state")); + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectederr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + OMX_STATETYPE state = ParseOmxStateL(stateDes); + CheckForAbortL(iCallback.MosFailingTransition(comp, state, expectedErrorInt)); + } + else if(elemName == _L8("WaitEOS")) + { + const TDesC8* comp = FindAttribute(aAttributes, _L8("comp")); + if(comp == NULL) + { + CheckForAbortL(iCallback.MosWaitEOS()); + } + else + { + CheckForAbortL(iCallback.MosWaitEOS(*comp)); + } + } + else if(elemName == _L8("Wait")) + { + const TDesC8& delay = FindAttributeL(aAttributes, _L8("delaytime")); + TLex8 lex(delay); + TInt delayInt; + User::LeaveIfError(lex.Val(delayInt)); + CheckForAbortL(iCallback.MosWaitL(delayInt)); + } + else if(elemName == _L8("WaitForAllEvents")) + { + CheckForAbortL(iCallback.MosWaitForAllEventsL()); + } + else if(elemName == _L8("SetFilename")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& filename8Bit = FindAttributeL(aAttributes, _L8("filename")); + HBufC* filename = HBufC::NewLC(filename8Bit.Length()); + filename->Des().Copy(filename8Bit); + CheckForAbortL(iCallback.MosSetFilename(comp, *filename)); + CleanupStack::PopAndDestroy(filename); + } + else if(elemName == _L8("SetFilename_Bellagio")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& filename8Bit = FindAttributeL(aAttributes, _L8("filename")); + char filepath[100]; + int i; + for(i=0;iDes().Copy(filename8Bit); + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + CheckForAbortL(iCallback.MosGetFilename(comp, *filename, expectedErrorInt)); + CleanupStack::PopAndDestroy(filename); + } + + else if(elemName == _L8("SetBufferCount")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + const TDesC8& count = FindAttributeL(aAttributes, _L8("count")); + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + + TPtrC8 comp; + TInt portIndex = 0; + ParseCompPortL(port, comp, portIndex); + TLex8 lex(count); + TInt countInt; + User::LeaveIfError(lex.Val(countInt)); + CheckForAbortL(iCallback.MosSetBufferCount(comp, portIndex, countInt, expectedErrorInt)); + } + else if(elemName == _L8("CompareFiles")) + { + const TDesC8& file18Bit = FindAttributeL(aAttributes, _L8("file1")); + const TDesC8& file28Bit = FindAttributeL(aAttributes, _L8("file2")); + TBuf<64> file1, file2; + file1.Copy(file18Bit); + file2.Copy(file28Bit); + CheckForAbortL(iCallback.MosCompareFilesL(file1, file2)); + } + else if(elemName == _L8("FilterAndCompareFiles")) + { + + const TDesC8& file18Bit = FindAttributeL(aAttributes, _L8("file1")); + const TDesC8& file28Bit = FindAttributeL(aAttributes, _L8("file2")); + TBuf<64> file1, file2; + file1.Copy(file18Bit); + file2.Copy(file28Bit); + + const TDesC8* f1filter1 = FindAttribute(aAttributes, _L8("file1filter1")); + const TDesC8* f1filter2 = FindAttribute(aAttributes, _L8("file1filter2")); + const TDesC8* f1filter3 = FindAttribute(aAttributes, _L8("file1filter3")); + + const TDesC8* f2filter1 = FindAttribute(aAttributes, _L8("file2filter1")); + const TDesC8* f2filter2 = FindAttribute(aAttributes, _L8("file2filter2")); + const TDesC8* f2filter3 = FindAttribute(aAttributes, _L8("file2filter3")); + + CheckForAbortL( + iCallback.MosFilterAndCompareFilesL(file1, f1filter1 ? *f1filter1 : KNullDesC8, f1filter2 ? *f1filter2 : KNullDesC8, f1filter3 ? *f1filter3 : KNullDesC8, + file2, f2filter1 ? *f2filter1 : KNullDesC8, f2filter2 ? *f2filter2 : KNullDesC8, f2filter3 ? *f2filter3 : KNullDesC8) + ); + } + else if(elemName == _L8("BufferSupplierOverride")) + { + const TDesC8& output = FindAttributeL(aAttributes, _L8("output")); + const TDesC8& input = FindAttributeL(aAttributes, _L8("input")); + const TDesC8& supplierDes = FindAttributeL(aAttributes, _L8("supplier")); + const TDesC8* expectedError1 = FindAttribute(aAttributes, _L8("expectedomxerr1")); + OMX_ERRORTYPE expectedError1Int = OMX_ErrorNone; + if (expectedError1) + { + expectedError1Int = ParseOmxErrorCode(*expectedError1); + } + const TDesC8* expectedError2 = FindAttribute(aAttributes, _L8("expectedomxerr2")); + OMX_ERRORTYPE expectedError2Int = OMX_ErrorNone; + if (expectedError2) + { + expectedError2Int = ParseOmxErrorCode(*expectedError2); + } + TPtrC8 sourceComp; + TPtrC8 sinkComp; + TInt sourcePort = 0; + TInt sinkPort = 0; + ParseCompPortL(output, sourceComp, sourcePort); + ParseCompPortL(input, sinkComp, sinkPort); + OMX_BUFFERSUPPLIERTYPE supplier = ParseOmxSupplierL(supplierDes); + CheckForAbortL(iCallback.MosBufferSupplierOverrideL(sourceComp, sourcePort, sinkComp, sinkPort, supplier, expectedError1Int, expectedError2Int)); + } + else if(elemName == _L8("SetCameraOneShot")) + { + //TODO DL + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + TInt isOneShot = ParseOptionalIntL(aAttributes, _L8("isoneshot"), 1); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + CheckForAbortL(iCallback.MosSetCameraOneShotL(comp, isOneShot, expectedErrorInt)); + } + else if(elemName == _L8("SetCameraCapture")) + { + //TODO DL + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + TInt isCapturing = ParseOptionalIntL(aAttributes, _L8("iscapturing"), 1); + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp1; + TInt portIndex = 0; + ParseCompPortL(port, comp1, portIndex); + + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + CheckForAbortL(iCallback.MosSetCameraCaptureL(comp, portIndex, isCapturing, expectedErrorInt)); + } + else if(elemName == _L8("SetVideoPortDef")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TInt width = ParseOptionalIntL(aAttributes, _L8("width"), -1); + TInt height = ParseOptionalIntL(aAttributes, _L8("height"), -1); + OMX_COLOR_FORMATTYPE colorFormat = OMX_COLOR_FormatMax; + OMX_COLOR_FORMATTYPE* colorFormatPtr = NULL; + const TDesC8* colorFormatDes = FindAttribute(aAttributes, _L8("colorFormat")); + if(colorFormatDes) + { + colorFormat = ParseOmxColorFormatL(*colorFormatDes); + colorFormatPtr = &colorFormat; + } + OMX_VIDEO_CODINGTYPE codingType = OMX_VIDEO_CodingMax; + OMX_VIDEO_CODINGTYPE* codingTypePtr = NULL; + const TDesC8* codingDes = FindAttribute(aAttributes, _L8("codingType")); + if(codingDes) + { + codingType = ParseOmxVideoCodingL(*codingDes); + codingTypePtr = &codingType; + } + TInt stride = ParseOptionalIntL(aAttributes, _L8("stride"), -1); + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + +#ifdef HREF_ED_WITHOUT_FLOATING_POINT + CheckForAbortL(iCallback.MosSetVideoPortDefL(comp, port, width, height, colorFormatPtr, codingTypePtr, stride, 0, expectedErrorInt)); +#else + TReal32 fps = ParseOptionalRealL(aAttributes, _L8("fps"), -1); + CheckForAbortL(iCallback.MosSetVideoPortDefL(comp, port, width, height, colorFormatPtr, codingTypePtr, stride, fps, expectedErrorInt)); +#endif //HREF_ED_WITHOUT_FLOATING_POINT + } + else if(elemName == _L8("ExpectEvent")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& eventDes = FindAttributeL(aAttributes, _L8("event")); + const TDesC8& nData1Des = FindAttributeL(aAttributes, _L8("nData1")); + const TDesC8& nData2Des = FindAttributeL(aAttributes, _L8("nData2")); + TLex8 lex(nData1Des); + TUint32 nData1; + OMX_EVENTTYPE event = ParseOmxEventL(eventDes); + switch(event) + { + // ParseOmxErrorL and ParseOmxCommandL will also parse literal integers + case OMX_EventError: + nData1 = static_cast(ParseOmxErrorL(nData1Des)); + break; + case OMX_EventCmdComplete: + nData1 = static_cast(ParseOmxCommandL(nData1Des)); + break; + default: + nData1 = ParseUint32L(nData1Des); + break; + } + TUint32 nData2 = ParseUint32L(nData2Des); + CheckForAbortL(iCallback.MosExpectEventL(comp, event, nData1, nData2)); + } + else if(elemName == _L8("CheckState")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& stateDes = FindAttributeL(aAttributes, _L8("state")); + OMX_STATETYPE state = ParseOmxStateL(stateDes); + CheckForAbortL(iCallback.MosCheckStateL(comp, state)); + } + else if(elemName == _L8("CheckVideoPortDef")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + const TDesC8& widthDes = FindAttributeL(aAttributes, _L8("width")); + const TDesC8& heightDes = FindAttributeL(aAttributes, _L8("height")); + TInt width; + TInt height; + TLex8 lex(widthDes); + User::LeaveIfError(lex.Val(width)); + lex = TLex8(heightDes); + User::LeaveIfError(lex.Val(height)); + const TDesC8& codingDes = FindAttributeL(aAttributes, _L8("coding")); + OMX_VIDEO_CODINGTYPE coding = ParseOmxVideoCodingL(codingDes); + const TDesC8& colorFormatDes = FindAttributeL(aAttributes, _L8("colorFormat")); + OMX_COLOR_FORMATTYPE colorFormat = ParseOmxColorFormatL(colorFormatDes); + CheckForAbortL(iCallback.MosCheckVideoPortDefL(comp, port, width, height, coding, colorFormat)); + } + else if(elemName == _L8("CheckMetaData")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + const TDesC8& scopeDes = FindAttributeL(aAttributes, _L8("scope")); + OMX_METADATASCOPETYPE scope = ParseOmxScopeTypeL(scopeDes); + const TDesC8& atomType = FindAttributeL(aAttributes, _L8("atomType")); + const TDesC8& atomIndexDes = FindAttributeL(aAttributes, _L8("atomIndex")); + TLex8 lex(atomIndexDes); + TUint32 atomIndex = ParseUint32L(atomIndexDes); + const TDesC8& data = FindAttributeL(aAttributes, _L8("data")); + CheckForAbortL(iCallback.MosCheckMetaDataL(comp, port, scope, atomType, atomIndex, data)); + } + else if(elemName == _L8("GetParameterUnknownType")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + const TDesC8& scopeDes = FindAttributeL(aAttributes, _L8("scope")); + OMX_METADATASCOPETYPE scope = ParseOmxScopeTypeL(scopeDes); + const TDesC8& atomType = FindAttributeL(aAttributes, _L8("atomType")); + const TDesC8& atomIndexDes = FindAttributeL(aAttributes, _L8("atomIndex")); + TLex8 lex(atomIndexDes); + TUint32 atomIndex = ParseUint32L(atomIndexDes); + const TDesC8& data = FindAttributeL(aAttributes, _L8("data")); + CheckForAbortL(iCallback.MosGetParameterUnknownIndexTypeL(comp, port, scope, atomType, atomIndex, data)); + } + else if(elemName == _L8("SetParameterUnknownType")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + const TDesC8& scopeDes = FindAttributeL(aAttributes, _L8("scope")); + OMX_METADATASCOPETYPE scope = ParseOmxScopeTypeL(scopeDes); + const TDesC8& atomType = FindAttributeL(aAttributes, _L8("atomType")); + const TDesC8& atomIndexDes = FindAttributeL(aAttributes, _L8("atomIndex")); + TLex8 lex(atomIndexDes); + TUint32 atomIndex = ParseUint32L(atomIndexDes); + const TDesC8& data = FindAttributeL(aAttributes, _L8("data")); + CheckForAbortL(iCallback.MosSetParameterUnknownIndexTypeL(comp, port, scope, atomType, atomIndex, data)); + } + else if(elemName == _L8("DisablePort")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(port, comp, portIndex); + CheckForAbortL(iCallback.MosDisablePort(comp, portIndex)); + } + else if(elemName == _L8("EnablePort")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(port, comp, portIndex); + CheckForAbortL(iCallback.MosEnablePort(comp, portIndex)); + } + else if(elemName == _L8("IgnoreEvent")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& eventDes = FindAttributeL(aAttributes, _L8("event")); + const TDesC8& nData1Des = FindAttributeL(aAttributes, _L8("nData1")); + const TDesC8& nData2Des = FindAttributeL(aAttributes, _L8("nData2")); + TLex8 lex(nData1Des); + TUint32 nData1; + OMX_EVENTTYPE event = ParseOmxEventL(eventDes); + switch(event) + { + // ParseOmxErrorL and ParseOmxCommandL will also parse literal integers + case OMX_EventError: + nData1 = static_cast(ParseOmxErrorL(nData1Des)); + break; + case OMX_EventCmdComplete: + nData1 = static_cast(ParseOmxCommandL(nData1Des)); + break; + default: + nData1 = ParseUint32L(nData1Des); + break; + } + TUint32 nData2 = ParseUint32L(nData2Des); + CheckForAbortL(iCallback.MosIgnoreEventL(comp, event, nData1, nData2)); + } + else if(elemName == _L8("SetAudioPortDef")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + OMX_AUDIO_CODINGTYPE codingType = OMX_AUDIO_CodingMax; + OMX_AUDIO_CODINGTYPE* codingTypePtr = NULL; + const TDesC8* codingDes = FindAttribute(aAttributes, _L8("codingType")); + if(codingDes) + { + codingType = ParseOmxAudioCodingL(*codingDes); + codingTypePtr = &codingType; + } + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + + CheckForAbortL(iCallback.MosSetAudioPortDefL(comp, port, codingTypePtr, expectedErrorInt)); + } + else if(elemName == _L8("SetAACProfile")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + // TODO allow some values to be unspecified (preserved from existing settings) + TInt channels = ParseUint32L(FindAttributeL(aAttributes, _L8("channels"))); + TInt samplingrate = ParseUint32L(FindAttributeL(aAttributes, _L8("samplingrate"))); + TInt bitrate = ParseUint32L(FindAttributeL(aAttributes, _L8("bitrate"))); + TInt audioBandwidth = ParseUint32L(FindAttributeL(aAttributes, _L8("bandwidth"))); + TInt frameLength = ParseUint32L(FindAttributeL(aAttributes, _L8("frameLength"))); + // TODO allow multiple flags in disjunctive form + TInt aacTools = ParseUint32L(FindAttributeL(aAttributes, _L8("aacTools"))); + TInt aacerTools = ParseUint32L(FindAttributeL(aAttributes, _L8("aacerTools"))); + OMX_AUDIO_AACPROFILETYPE profile = ParseOmxAACProfileL(FindAttributeL(aAttributes, _L8("profile"))); + OMX_AUDIO_AACSTREAMFORMATTYPE streamFormat = ParseOmxAACStreamFormatL(FindAttributeL(aAttributes, _L8("streamFormat"))); + OMX_AUDIO_CHANNELMODETYPE channelMode = ParseOmxAudioChannelModeL(FindAttributeL(aAttributes, _L8("channelMode"))); + + CheckForAbortL(iCallback.MosSetAACProfileL(comp, port, channels, samplingrate, bitrate, audioBandwidth, frameLength, aacTools, aacerTools, profile, streamFormat, channelMode)); + } + else if(elemName == _L8("SetPcmAudioPortDef")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TInt channels = ParseOptionalIntL(aAttributes, _L8("channels"), -1); + TInt samplingrate = ParseOptionalIntL(aAttributes, _L8("samplingrate"), -1); + TInt bitspersample = ParseOptionalIntL(aAttributes, _L8("bitspersample"), -1); + OMX_NUMERICALDATATYPE numData = OMX_NumercialDataMax; + const TDesC8* des = FindAttribute(aAttributes, _L8("numericalData")); + if(des != NULL) + { + numData = ParseNumericalDataL(*des); + } + else + { + numData = static_cast(-1); + } + OMX_ENDIANTYPE endian = OMX_EndianMax; + des = FindAttribute(aAttributes, _L8("endian")); + if(des != NULL) + { + endian = ParseEndianL(*des); + } + else + { + endian = static_cast(-1); + } + OMX_BOOL* interleaved = NULL; + OMX_BOOL interleavedData; + des = FindAttribute(aAttributes, _L8("interleaved")); + if(des != NULL) + { + interleavedData = ParseBoolL(*des); + interleaved = &interleavedData; + } + const TDesC8* encoding = FindAttribute(aAttributes, _L8("encoding")); + CheckForAbortL(iCallback.MosSetPcmAudioPortDefL(comp, port, channels, samplingrate, bitspersample, numData, endian, interleaved, encoding)); + } + else if(elemName == _L8("SetAudioMute")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TBool mute = EFalse; + const TDesC8* muteAttr = FindAttribute(aAttributes, _L8("mute")); + if (muteAttr != NULL) + { + mute = ParseBooleanL(*muteAttr); + } + else + { + User::Leave(KErrArgument); + } + CheckForAbortL(iCallback.MosSetConfigAudioMuteL(comp, port, mute)); + } + else if(elemName == _L8("CheckAudioMute")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TBool mute = EFalse; + const TDesC8* muteAttr = FindAttribute(aAttributes, _L8("mute")); + if (muteAttr != NULL) + { + mute = ParseBooleanL(*muteAttr); + } + else + { + User::Leave(KErrArgument); + } + CheckForAbortL(iCallback.MosCheckConfigAudioMuteL(comp, port, mute)); + } + else if(elemName == _L8("SetAudioVolume")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TBool linear = EFalse; + const TDesC8* linearScaleAttr = FindAttribute(aAttributes, _L8("linearscale")); + if (linearScaleAttr != NULL) + { + linear = ParseBooleanL(*linearScaleAttr); + } + TInt minVolume = ParseOptionalIntL(aAttributes, _L8("min"), -1); + TInt maxVolume = ParseOptionalIntL(aAttributes, _L8("max"), -1); + TInt volume = ParseOptionalIntL(aAttributes, _L8("volume"), -1); + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + + CheckForAbortL(iCallback.MosSetConfigAudioVolumeL(comp, port, linear, minVolume, maxVolume, volume, expectedErrorInt)); + } + else if(elemName == _L8("CheckAudioVolume")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TBool linear = EFalse; + const TDesC8* linearScaleAttr = FindAttribute(aAttributes, _L8("linearscale")); + if (linearScaleAttr != NULL) + { + linear = ParseBooleanL(*linearScaleAttr); + } + TInt minVolume = ParseOptionalIntL(aAttributes, _L8("min"), -1); + TInt maxVolume = ParseOptionalIntL(aAttributes, _L8("max"), -1); + TInt volume = ParseOptionalIntL(aAttributes, _L8("volume"), -1); + CheckForAbortL(iCallback.MosCheckConfigAudioVolumeL(comp, port, linear, minVolume, maxVolume, volume)); + } + else if(elemName == _L8("SetAacAudioPortDef")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TInt channels = ParseOptionalIntL(aAttributes, _L8("channels"), -1); + TInt samplingRate = ParseOptionalIntL(aAttributes, _L8("samplingrate"), -1); + TInt bitRate = ParseOptionalIntL(aAttributes, _L8("bitrate"), -1); + TInt audioBandwidth = ParseOptionalIntL(aAttributes, _L8("audiobandwidth"), -1); + TInt frameLength = ParseOptionalIntL(aAttributes, _L8("framelength"), -1); + TInt aacTools = ParseOptionalIntL(aAttributes, _L8("aactools"), -1); + TInt aacErTools = ParseOptionalIntL(aAttributes, _L8("aacertools"), -1); + + OMX_AUDIO_AACPROFILETYPE profile; + const TDesC8* attbval = FindAttribute(aAttributes, _L8("profile")); + if ( NULL != attbval ) + { + profile = ParseOmxAACProfileL( *attbval ); + } + else + { + profile = static_cast (-1); + } + OMX_AUDIO_AACSTREAMFORMATTYPE streamFormat = ParseOmxAACStreamFormatL(FindAttributeL(aAttributes, _L8("streamFormat"))); + OMX_AUDIO_CHANNELMODETYPE channelMode = ParseOmxAudioChannelModeL(FindAttributeL(aAttributes, _L8("channelMode"))); + + CheckForAbortL(iCallback.MosSetAacAudioPortDefL(comp, port, channels, samplingRate, bitRate, audioBandwidth, frameLength, aacTools, aacErTools, profile, streamFormat, channelMode)); + } + else if(elemName == _L8("SetClockReference")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& refDes = FindAttributeL(aAttributes, _L8("ref")); + OMX_TIME_REFCLOCKTYPE refClockType = ParseOmxRefClockTypeL(refDes); + CheckForAbortL(iCallback.MosSetRefClockTypeL(comp, refClockType)); + } + else if(elemName == _L8("SetClockState")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& stateDes = FindAttributeL(aAttributes, _L8("state")); + OMX_TIME_CLOCKSTATE clockState = ParseOmxClockStateL(stateDes); + const TDesC8& maskDes = FindAttributeL(aAttributes, _L8("mask")); + TUint32 mask = ParseUint32L(maskDes); + TInt startTime = ParseOptionalIntL(aAttributes, _L8("start"), 0); + TInt offset = ParseOptionalIntL(aAttributes, _L8("offset"), 0); + CheckForAbortL(iCallback.MosSetClockStateL(comp, clockState, startTime, offset, mask)); + } + else if(elemName == _L8("SetVideoFitMode")) + { + const TDesC8& modeDes = FindAttributeL(aAttributes, _L8("mode")); + TVideoFitMode mode = ParseVideoFitModeL(modeDes); + CheckForAbortL(iCallback.MosSetVideoFitModeL(mode)); + } + else if(elemName == _L8("SetActiveStream")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& id = FindAttributeL(aAttributes, _L8("id")); + TLex8 lex(id); + TInt streamId; + User::LeaveIfError(lex.Val(streamId)); + CheckForAbortL(iCallback.MosSetActiveStream(comp, streamId)); + } + else if(elemName == _L8("GetActiveStream")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& id = FindAttributeL(aAttributes, _L8("id")); + TLex8 lex(id); + TInt streamId; + User::LeaveIfError(lex.Val(streamId)); + CheckForAbortL(iCallback.MosGetActiveStream(comp, streamId)); + } + else if(elemName == _L8("LoadBufferHandler")) + { + // Load buffer component handler + // Buffer component tests + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& filename = FindAttributeL(aAttributes, _L8("filename")); + const TDesC8* type = FindAttribute(aAttributes, _L8("type")); + TBuf name; + User::LeaveIfError(CnvUtfConverter::ConvertToUnicodeFromUtf8(name,filename)); + + // Call test script to create buffer handler + CheckForAbortL(iCallback.InitialiseBufferHandlerL(comp, name, type)); + } + else if(elemName == _L8("StartBufferHandler")) + { + iCallback.StartBufferHandler(); + } + else if (elemName == _L8("SendInvalidBufferId")) + { + const TDesC8& id = FindAttributeL(aAttributes, _L8("id")); + TInt idValue = ParseUint32L(id); + iCallback.SendInvalidBufferId(idValue); + } + else if(elemName == _L8("EndBufferHandler")) + { + iCallback.StopBufferHandler(); + } + else if(elemName == _L8("LoadBufferSinkHandler")) + { + // Load buffer component handler + // Buffer component tests + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& filename = FindAttributeL(aAttributes, _L8("filename")); + TBuf name; + User::LeaveIfError(CnvUtfConverter::ConvertToUnicodeFromUtf8(name,filename)); + + // Call test script to create buffer handler + CheckForAbortL(iCallback.InitialiseBufferSinkHandlerL(comp, name)); + } + else if (elemName == _L8("StartBufferSinkHandler")) + { + iCallback.StartBufferSinkHandler(); + } + else if (elemName == _L8("EndBufferSinkHandler")) + { + iCallback.StopBufferSinkHandler(); + } + else if(elemName == _L8("NegativeSetDataChunk")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + + const TDesC8* expectedSystemError = FindAttribute(aAttributes, _L8("expectederror")); + TInt expectedSystemErrorInt = KErrNone; + if (expectedSystemError) + { + expectedSystemErrorInt = ParseSystemErrorCode(*expectedSystemError); + } + + CheckForAbortL(iCallback.MosNegativeSetDataChunk(comp, expectedErrorInt, expectedSystemErrorInt)); + } + else if(elemName == _L8("SetBufferSize")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + const TDesC8& value = FindAttributeL(aAttributes, _L8("size")); + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + TInt portIndex = 0; + TPtrC8 comp; + ParseCompPortL(port, comp, portIndex); + TLex8 lex(value); + TInt valInt = 0; + User::LeaveIfError(lex.Val(valInt)); + CheckForAbortL(iCallback.MosSetBufferSize(comp, portIndex, valInt, expectedErrorInt)); + } + else if(elemName == _L8("GetAndCompareBufferCount")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + const TDesC8& value = FindAttributeL(aAttributes, _L8("count")); + TInt portIndex = 0; + TPtrC8 comp; + ParseCompPortL(port, comp, portIndex); + TLex8 lex(value); + TInt countInt = 0; + User::LeaveIfError(lex.Val(countInt)); + CheckForAbortL(iCallback.MosGetAndCompareBufferCount(comp, portIndex, countInt)); + } + else if(elemName == _L8("GetAndCompareBufferSize")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + const TDesC8& value = FindAttributeL(aAttributes, _L8("size")); + TInt portIndex = 0; + TPtrC8 comp; + ParseCompPortL(port, comp, portIndex); + TLex8 lex(value); + TInt valInt = 0; + User::LeaveIfError(lex.Val(valInt)); + CheckForAbortL(iCallback.MosGetAndCompareBufferSize(comp, portIndex, valInt)); + } + else if(elemName == _L8("FlushBuffer")) + { + const TDesC8& expectedError = FindAttributeL(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = ParseOmxErrorCode(expectedError); + + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex = 0; + ParseCompPortL(port, comp, portIndex); + CheckForAbortL(iCallback.MosFlushBuffer(comp, portIndex, expectedErrorInt)); + } + else if(elemName == _L8("ForceBufferSourceFlushBuffer")) + { + const TDesC8& expectedError = FindAttributeL(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = ParseOmxErrorCode(expectedError); + + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex = 0; + ParseCompPortL(port, comp, portIndex); + CheckForAbortL(iCallback.MosForceBufferSourceFlushBufferL(comp, portIndex, expectedErrorInt)); + } + else if(elemName == _L8("ForceBufferSinkFlushBuffer")) + { + const TDesC8& expectedError = FindAttributeL(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = ParseOmxErrorCode(expectedError); + + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex = 0; + ParseCompPortL(port, comp, portIndex); + CheckForAbortL(iCallback.MosForceBufferSinkFlushBuffer(comp, portIndex, expectedErrorInt)); + } + else if(elemName == _L8("SetVideoEncQuant")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + + TInt qpb = ParseOptionalIntL(aAttributes, _L8("qpb"), -1); + + CheckForAbortL(iCallback.MosSetVideoEncQuantL(comp, port,qpb)); + } + else if(elemName == _L8("SetVideoEncMotionVect")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + + TInt accuracy = ParseOptionalIntL(aAttributes, _L8("accuracy"), -1); + TInt sxsearchrange = ParseOptionalIntL(aAttributes, _L8("sxsearchrange"), -1); + TInt sysearchrange = ParseOptionalIntL(aAttributes, _L8("sysearchrange"), -1); + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedOmxError = OMX_ErrorNone; + if (expectedError) + { + expectedOmxError = ParseOmxErrorCode(*expectedError); + } + + CheckForAbortL(iCallback.MosSetVideoEncMotionVectL(comp, port, accuracy, sxsearchrange, sysearchrange, expectedOmxError)); + } + else if(elemName == _L8("SetVideoEncMpeg4Type")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + const TDesC8* mpeg4Profile = FindAttribute(aAttributes, _L8("mpeg4profile")); + OMX_VIDEO_MPEG4PROFILETYPE profile = OMX_VIDEO_MPEG4ProfileMax; + if (mpeg4Profile) + { + profile = ParseOmxMpeg4ProfileL(*mpeg4Profile); + } + + OMX_VIDEO_MPEG4LEVELTYPE level = OMX_VIDEO_MPEG4LevelMax; + const TDesC8* mpeg4Level = FindAttribute(aAttributes, _L8("mpeg4level")); + if (mpeg4Level) + { + level = ParseOmxMpeg4LevelL(*mpeg4Level); + } + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedOmxError = OMX_ErrorNone; + if (expectedError) + { + expectedOmxError = ParseOmxErrorCode(*expectedError); + } + + CheckForAbortL(iCallback.MosSetVideoEncMpeg4TypeL(comp, port, profile, level, expectedOmxError)); + } + else if(elemName == _L8("SetVideoEncBitRate")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + + const TDesC8* controlRate = FindAttribute(aAttributes, _L8("controlrate")); + OMX_VIDEO_CONTROLRATETYPE omxControlRate = OMX_Video_ControlRateMax; + if (controlRate) + { + omxControlRate = ParseOmxControlRateL(*controlRate); + } + + TInt targetBitrate = ParseOptionalIntL(aAttributes, _L8("targetbitrate"), -1); + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedOmxError = OMX_ErrorNone; + if (expectedError) + { + expectedOmxError = ParseOmxErrorCode(*expectedError); + } + + CheckForAbortL(iCallback.MosSetVideoEncBitRateL(comp, port, omxControlRate, targetBitrate, expectedOmxError)); + } + else if(elemName == _L8("ChangeFilledBufferLength")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& value = FindAttributeL(aAttributes, _L8("data")); + TLex8 lex(value); + TInt valInt = 0; + User::LeaveIfError(lex.Val(valInt)); + CheckForAbortL(iCallback.MosChangeFilledBufferLength(comp, valInt)); + } + else if(elemName == _L8("SetOMX_SymbianIndexParamBufferMsgQueueData")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& expectedError = FindAttributeL(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = ParseOmxErrorCode(expectedError); + + CheckForAbortL(iCallback.MosSetOMX_SymbianIndexParamBufferMsgQueueData(comp, expectedErrorInt)); + } + else if(elemName == _L8("GetExtensionIndex")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& paramName = FindAttributeL(aAttributes, _L8("parametername")); + + const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr")); + OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone; + if (expectedError) + { + expectedErrorInt = ParseOmxErrorCode(*expectedError); + } + + CheckForAbortL(iCallback.MosGetExtensionIndex(comp, paramName, expectedErrorInt)); + } + else if(elemName == _L8("SetCaptureModeType")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + + TPtrC8 comp; + TInt port = 0; + ParseCompPortL(compPort, comp, port); + + const TDesC8& continuousStr = FindAttributeL(aAttributes, _L8("continuous")); + TBool continuous = ParseBooleanL(continuousStr); + const TDesC8& framelimitedStr = FindAttributeL(aAttributes, _L8("framelimited")); + TBool framelimited = ParseBooleanL(framelimitedStr); + TInt framelimit = ParseOptionalIntL(aAttributes, _L8("framelimit"), -1); + + CheckForAbortL(iCallback.MosSetCaptureModeTypeL(comp, port, continuous, framelimited, framelimit)); + } + + else if(elemName == _L8("GetTimeClockState")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& expectedState = FindAttributeL(aAttributes, _L8("expectedstate")); + OMX_TIME_CLOCKSTATE expectedStateInt = ParseOmxClockStateL(expectedState); + + CheckForAbortL(iCallback.MosCheckTimeClockState(comp, expectedStateInt)); + } + else if(elemName == _L8("CheckMediaTime")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + + ParseCompPortL(compPort, comp, port); + + TBool moreThan = ETrue; + const TDesC8* mediatime = FindAttribute(aAttributes, _L8("mediatimelessthan")); + + if (mediatime) + { + moreThan = EFalse; + } + else + { + const TDesC8& mTime = FindAttributeL(aAttributes, _L8("mediatimemorethan")); + mediatime = &mTime; + } + + + OMX_TICKS mediatimeTick; + TLex8 lex(*mediatime); + User::LeaveIfError(lex.Val(mediatimeTick)); + CheckForAbortL(iCallback.MosCheckMediaTime(comp, port, mediatimeTick, moreThan)); + } + else if(elemName == _L8("SetClockTimeScale")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& scale = FindAttributeL(aAttributes, _L8("scale")); + + TReal32 xscale = ParseReal32L(scale); + + CheckForAbortL(iCallback.MosSetClockTimeScale(comp,xscale * 65536)); + } + else if(elemName == _L8("Base_AddPortSupport")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + CheckForAbortL(iCallback.MosBaseSupportPortL(comp, portIndex)); + } + else if(elemName == _L8("Base_SetAutonomous")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + const TDesC8& enabledValue = FindAttributeL(aAttributes, _L8("enabled")); + TBool enabled = ParseBooleanL(enabledValue); + CheckForAbortL(iCallback.MosBaseSetAutonomous(comp, portIndex, enabled)); + } + else if(elemName == _L8("Base_AllocateBuffers")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + + const TDesC8& numberValue = FindAttributeL(aAttributes, _L8("number")); + TInt numberBuffs; + TLex8 lex(numberValue); + User::LeaveIfError(lex.Val(numberBuffs)); + + CheckForAbortL(iCallback.MosBaseAllocateBuffersL(comp, portIndex, numberBuffs)); + } + else if(elemName == _L8("Base_FreeAllocatedBuffers")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + + CheckForAbortL(iCallback.MosBaseFreeAllocatedBuffersL(comp)); + } + else if(elemName == _L8("Base_SetBufSupplierPref")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + + const TDesC8& componentSupplierValue = FindAttributeL(aAttributes, _L8("iscomponentsupplier")); + TBool componentSupplier = ParseBooleanL(componentSupplierValue); + CheckForAbortL(iCallback.MosBaseSetBufSupplier(comp, portIndex, componentSupplier)); + } + else if(elemName == _L8("Base_FillThisBuffer")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + + const TDesC8& bufIndexValue = FindAttributeL(aAttributes, _L8("portrelativebufferindex")); + TInt bufIndex; + TLex8 lex(bufIndexValue); + User::LeaveIfError(lex.Val(bufIndex)); + + CheckForAbortL(iCallback.MosBaseFillThisBuffer(comp, portIndex, bufIndex)); + } + else if(elemName == _L8("Base_EmptyThisBuffer")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + + const TDesC8& bufIndexValue = FindAttributeL(aAttributes, _L8("portrelativebufferindex")); + TInt bufIndex; + TLex8 lex(bufIndexValue); + User::LeaveIfError(lex.Val(bufIndex)); + + CheckForAbortL(iCallback.MosBaseEmptyThisBuffer(comp, portIndex, bufIndex)); + } + else if(elemName == _L8("Base_WaitForBuffer")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + + const TDesC8& bufIndexValue = FindAttributeL(aAttributes, _L8("bufferindexinport")); + TInt bufIndex; + TLex8 lex(bufIndexValue); + User::LeaveIfError(lex.Val(bufIndex)); + + CheckForAbortL(iCallback.MosBaseWaitForBuffer(comp, portIndex, bufIndex)); + } + else if(elemName == _L8("BaseTimestamp_PassClockHandle")) + { + const TDesC8& receivingComp = FindAttributeL(aAttributes, _L8("receiver")); + const TDesC8& clockToPass = FindAttributeL(aAttributes, _L8("handle")); + + CheckForAbortL(iCallback.MosBaseTimestampPassClock(receivingComp, clockToPass)); + } + else if(elemName == _L8("BaseTimestamp_CheckTimestamp")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + + const TDesC8& timeValue = FindAttributeL(aAttributes, _L8("time")); + TUint time; + TLex8 lex(timeValue); + User::LeaveIfError(lex.Val(time)); + + const TDesC8& toleranceValue = FindAttributeL(aAttributes, _L8("tolerance")); + TUint tolerance; + lex.Assign(toleranceValue); + User::LeaveIfError(lex.Val(tolerance)); + + CheckForAbortL(iCallback.MosBaseTimestampCheckTimestampL(comp, portIndex, time, tolerance)); + } + else if(elemName == _L8("BaseTimestamp_CompareWithRefClock")) + { + const TDesC8& portValue = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(portValue, comp, portIndex); + + const TDesC8& toleranceValue = FindAttributeL(aAttributes, _L8("tolerance")); + TUint tolerance; + TLex8 lex(toleranceValue); + User::LeaveIfError(lex.Val(tolerance)); + + CheckForAbortL(iCallback.MosBaseTimestampCompareWithRefClockL(comp, portIndex, tolerance)); + } + else if(elemName == _L8("CheckClockState")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& stateDes = FindAttributeL(aAttributes, _L8("clockstate")); + OMX_TIME_CLOCKSTATE clockState = ParseOmxClockStateL(stateDes); + CheckForAbortL(iCallback.MosCheckClockStateL(comp, clockState)); + } + else if(elemName == _L8("CheckTimePosition")) + { + // Use with caution: increments position as a side-effect. + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(port, comp, portIndex); + + TInt timestamp = ParseOptionalIntL(aAttributes, _L8("timestamp"), 0); + + CheckForAbortL(iCallback.MosCheckTimePositionL(comp, portIndex, timestamp)); + } + else if(elemName == _L8("SetTimePosition")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(port, comp, portIndex); + + TInt timestamp = ParseOptionalIntL(aAttributes, _L8("timestamp"), 0); + + CheckForAbortL(iCallback.MosSetTimePositionL(comp, portIndex, timestamp)); + } + else if(elemName == _L8("StartBuffersforPort")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + + CheckForAbortL(iCallback.MosStartBuffersforPort( comp,port)); + } + else if(elemName == _L8("CheckFrameCount")) + { + const TDesC8& fileName8 = FindAttributeL(aAttributes, _L8("filename")); + TInt count = ParseOptionalIntL(aAttributes, _L8("count"), 0); + + HBufC* fileName = HBufC::NewLC(fileName8.Length()); + fileName->Des().Copy(fileName8); + CheckForAbortL(iCallback.MosCheckFrameCountL(*fileName, count)); + CleanupStack::PopAndDestroy(fileName); + } + + else if(elemName == _L8("MarkBuffer")) + { + const TDesC8& port = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt portIndex; + ParseCompPortL(port, comp, portIndex); + const TDesC8& targetComp = FindAttributeL(aAttributes, _L8("targetComp")); + TInt markData = ParseOptionalIntL(aAttributes, _L8("markData"), 0); + CheckForAbortL(iCallback.MosMarkBuffer(comp, portIndex, targetComp, markData)); + } +#ifdef OLD_ADPCM_EXTENSION + else if (elemName == _L8("SetAdPcmAudioPortDef")) + { + const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port")); + TPtrC8 comp; + TInt port; + ParseCompPortL(compPort, comp, port); + TInt channels = ParseOptionalIntL(aAttributes, _L8("channels"), -1); + TInt samplingrate = ParseOptionalIntL(aAttributes, _L8("samplingrate"), -1); + TInt bitspersample = ParseOptionalIntL(aAttributes, _L8("bitspersample"), -1); + CheckForAbortL(iCallback.MosSetAdPcmAudioPortDefL(comp, port, channels, samplingrate, bitspersample)); + } + else if (elemName == _L8("SetAdPcmDecoderBlockAlign")) + { + const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp")); + const TDesC8& blockAlign = FindAttributeL(aAttributes, _L8("blockalign")); + TLex8 lex(blockAlign); + TInt blockAlignValue; + User::LeaveIfError(lex.Val(blockAlignValue)); + CheckForAbortL(iCallback.MosConfigAdPcmDecoderBlockAlign(comp, blockAlignValue)); + } +#endif + else + { + // element name is not recognized + TBuf<32> elemNameCopy; + elemNameCopy.Copy(elemName); + TBuf<44> message; + message.Append(_L("Unrecognized command: ")); + message.Append(elemNameCopy); + iCallback.MosParseError(message); + User::Leave(KErrArgument); + } + } + } + +TInt COmxScriptParser::ParseSystemErrorCode(const TDesC8& aErrorCode) + { + TInt error = KErrNone; + + if (aErrorCode == _L8("KErrNotFound")) + { + error = KErrNotFound; + } + + // TODO: the other error code will be added in demand + + return error; + } + +// TODO duplication with ParseOmxErrorL +OMX_ERRORTYPE COmxScriptParser::ParseOmxErrorCode(const TDesC8& aErrorCode) + { + #define DEFERR(e) if(aErrorCode == _L8(#e)) return e; + + DEFERR(OMX_ErrorNone); + DEFERR(OMX_ErrorInsufficientResources); + DEFERR(OMX_ErrorUndefined); + DEFERR(OMX_ErrorInvalidComponentName); + DEFERR(OMX_ErrorComponentNotFound); + DEFERR(OMX_ErrorInvalidComponent); + DEFERR(OMX_ErrorBadParameter); + DEFERR(OMX_ErrorNotImplemented); + DEFERR(OMX_ErrorUnderflow); + DEFERR(OMX_ErrorOverflow); + DEFERR(OMX_ErrorHardware); + DEFERR(OMX_ErrorInvalidState); + DEFERR(OMX_ErrorStreamCorrupt); + DEFERR(OMX_ErrorPortsNotCompatible); + DEFERR(OMX_ErrorResourcesLost); + DEFERR(OMX_ErrorNoMore); + DEFERR(OMX_ErrorVersionMismatch); + DEFERR(OMX_ErrorNotReady); + DEFERR(OMX_ErrorTimeout); + DEFERR(OMX_ErrorSameState); + DEFERR(OMX_ErrorResourcesPreempted); + DEFERR(OMX_ErrorPortUnresponsiveDuringAllocation); + DEFERR(OMX_ErrorPortUnresponsiveDuringDeallocation); + DEFERR(OMX_ErrorPortUnresponsiveDuringStop); + DEFERR(OMX_ErrorIncorrectStateTransition); + DEFERR(OMX_ErrorIncorrectStateOperation); + DEFERR(OMX_ErrorUnsupportedSetting); + DEFERR(OMX_ErrorUnsupportedIndex); + DEFERR(OMX_ErrorBadPortIndex); + DEFERR(OMX_ErrorPortUnpopulated); + DEFERR(OMX_ErrorComponentSuspended); + DEFERR(OMX_ErrorDynamicResourcesUnavailable); + DEFERR(OMX_ErrorMbErrorsInFrame); + DEFERR(OMX_ErrorFormatNotDetected); + DEFERR(OMX_ErrorContentPipeOpenFailed); + DEFERR(OMX_ErrorContentPipeCreationFailed); + DEFERR(OMX_ErrorSeperateTablesUsed); + DEFERR(OMX_ErrorTunnelingUnsupported); + DEFERR(OMX_ErrorKhronosExtensions); + DEFERR(OMX_ErrorVendorStartUnused); + #undef DEFERR + + return OMX_ErrorMax; + } + +void COmxScriptParser::OnEndElementL(const RTagInfo& aElement, TInt /*aErrorCode*/) + { + if(iInTest) + { + const TDesC8& elemName = aElement.LocalName().DesC(); + if(elemName == _L8("Test")) + { + iInTest = EFalse; + } + } + } + +const TDesC8* COmxScriptParser::FindAttribute(const RArray& aArray, const TDesC8& aAttribName) + { + for(TInt index = 0, count = aArray.Count(); index < count; index++) + { + const RAttribute& attribute = aArray[index]; + const TDesC8& name = attribute.Attribute().LocalName().DesC(); + if(name == aAttribName) + { + return &(attribute.Value().DesC()); + } + } + return NULL; + } + +const TDesC8& COmxScriptParser::FindAttributeL(const RArray& aArray, const TDesC8& aAttribName) + { + const TDesC8* result = FindAttribute(aArray, aAttribName); + if(!result) + { + TBuf<32> nameCopy; + nameCopy.Copy(aAttribName); + TBuf<52> msg; + msg.Append(_L("Attribute ")); + msg.Append(nameCopy); + msg.Append(_L(" not found")); + iCallback.MosParseError(msg); + User::Leave(KErrNotFound); + } + return *result; + } + +void COmxScriptParser::ParseCompPortL(const TDesC8& aInput, TPtrC8& aNameOut, TInt& aPortOut) + { + TInt offset = aInput.Locate(':'); + User::LeaveIfError(offset); + aNameOut.Set(aInput.Left(offset)); + TPtrC8 port = aInput.Right(aInput.Length() - offset - 1); + if (port == _L8("all")) + { + aPortOut = static_cast(OMX_ALL); + } + else + { + TLex8 lex(port); + User::LeaveIfError(lex.Val(aPortOut)); + } + } + + +// The order of these entries does not matter, but for clarity's sake please +// maintain alphabetical order + +PARSE_MAP_START(OMX_AUDIO_AACPROFILETYPE) + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, ERLC), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, HE), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, HE_PS), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, LC), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, LD), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, LTP), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, Main), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, Null), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, Scalable), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACObject, SSR) +PARSE_MAP_END(OMX_AUDIO_AACPROFILETYPE) + +PARSE_MAP_START(OMX_AUDIO_AACSTREAMFORMATTYPE) + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACStreamFormat, ADIF), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACStreamFormat, MP2ADTS), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACStreamFormat, MP4ADTS), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACStreamFormat, MP4FF), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACStreamFormat, MP4LATM), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACStreamFormat, MP4LOAS), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_AACStreamFormat, RAW) +PARSE_MAP_END(OMX_AUDIO_AACSTREAMFORMATTYPE) + +PARSE_MAP_START(OMX_AUDIO_CHANNELMODETYPE) + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_ChannelMode, Dual), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_ChannelMode, JointStereo), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_ChannelMode, Mono), + PARSE_MAP_PREFIXENTRY(OMX_AUDIO_ChannelMode, Stereo) +PARSE_MAP_END(OMX_AUDIO_CHANNELMODETYPE) + +PARSE_MAP_START(OMX_COMMANDTYPE) + PARSE_MAP_PREFIXENTRY(OMX_Command, StateSet), + PARSE_MAP_PREFIXENTRY(OMX_Command, Flush), + PARSE_MAP_PREFIXENTRY(OMX_Command, PortDisable), + PARSE_MAP_PREFIXENTRY(OMX_Command, PortEnable), + PARSE_MAP_PREFIXENTRY(OMX_Command, MarkBuffer) +PARSE_MAP_END(OMX_COMMANDTYPE) + +PARSE_MAP_START(OMX_COLOR_FORMATTYPE) + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, Unused), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, Max), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, 12bitRGB444), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, 16bitRGB565), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, 24bitBGR888), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, 32bitARGB8888), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, 32bitBGRA8888), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, CbYCrY), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, YCbYCr), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, YCrYCb), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, YUV420PackedPlanar), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, YUV422PackedPlanar), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, YUV420Planar), +#if defined(NCP_COMMON_BRIDGE_FAMILY) && !defined(__WINSCW__) + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, YUV422Planar), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, STYUV420PackedSemiPlanarMB), + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, STYUV422PackedSemiPlanarMB) +#else + PARSE_MAP_PREFIXENTRY(OMX_COLOR_Format, YUV422Planar) +#endif //NCP_COMMON_BRIDGE_FAMILY +PARSE_MAP_END(OMX_COLOR_FORMATTYPE) + +PARSE_MAP_START(OMX_ERRORTYPE) + PARSE_MAP_PREFIXENTRY(OMX_Error, BadParameter), + PARSE_MAP_PREFIXENTRY(OMX_Error, BadPortIndex), + PARSE_MAP_PREFIXENTRY(OMX_Error, ContentPipeOpenFailed), + PARSE_MAP_PREFIXENTRY(OMX_Error, Hardware), + PARSE_MAP_PREFIXENTRY(OMX_Error, IncorrectStateOperation), + PARSE_MAP_PREFIXENTRY(OMX_Error, None), + PARSE_MAP_PREFIXENTRY(OMX_Error, NotReady), + PARSE_MAP_PREFIXENTRY(OMX_Error, PortsNotCompatible), + PARSE_MAP_PREFIXENTRY(OMX_Error, Underflow), + PARSE_MAP_PREFIXENTRY(OMX_Error, UnsupportedIndex), + PARSE_MAP_PREFIXENTRY(OMX_Error, UnsupportedSetting) +PARSE_MAP_END(OMX_ERRORTYPE) + +PARSE_MAP_START(OMX_EVENTTYPE) + PARSE_MAP_PREFIXENTRY(OMX_Event, BufferFlag), + PARSE_MAP_PREFIXENTRY(OMX_Event, CmdComplete), + PARSE_MAP_PREFIXENTRY(OMX_Event, Error), + PARSE_MAP_PREFIXENTRY(OMX_Event, Mark), + PARSE_MAP_PREFIXENTRY(OMX_Event, PortFormatDetected), + PARSE_MAP_PREFIXENTRY(OMX_Event, PortSettingsChanged), +PARSE_MAP_END(OMX_EVENTTYPE) + +// PARSE_MAP_PREFIXENTRY(OMX_EventNokia, FirstFrameDisplayed), +// PARSE_MAP_PREFIXENTRY(OMX_EventNokia, DroppedFrame) + + +PARSE_MAP_START(OMX_STATETYPE) + PARSE_MAP_PREFIXENTRY(OMX_State, Loaded), + PARSE_MAP_PREFIXENTRY(OMX_State, Idle), + PARSE_MAP_PREFIXENTRY(OMX_State, Executing), + PARSE_MAP_PREFIXENTRY(OMX_State, Pause), + PARSE_MAP_PREFIXENTRY(OMX_State, WaitForResources), + PARSE_MAP_PREFIXENTRY(OMX_State, Invalid) +PARSE_MAP_END(OMX_STATETYPE) + +/** + * Templated wrapper to a plain-C function generated by PARSE_MAP + * Accepts a descriptor as input and leaves with KErrArgument if parse fails. + */ +template T ParseL(const TDesC8& aDes, TInt (*parseFunc)(const char*, T*)) + { + if(aDes.Length() >= 64) + { + User::Leave(KErrArgument); + } + TBuf8<64> buf = aDes; + T result = (T) 0; + TInt success = parseFunc((char*) buf.PtrZ(), &result); + if(!success) + { + // value not recognized + // maybe add it to the PARSE_MAP ? + __BREAKPOINT(); + User::Leave(KErrArgument); + } + return result; + } + +OMX_AUDIO_AACPROFILETYPE COmxScriptParser::ParseOmxAACProfileL(const TDesC8& aProfileDes) + { + return ParseL(aProfileDes, parse_OMX_AUDIO_AACPROFILETYPE); + } + +OMX_AUDIO_AACSTREAMFORMATTYPE COmxScriptParser::ParseOmxAACStreamFormatL(const TDesC8& aFormatDes) + { + return ParseL(aFormatDes, parse_OMX_AUDIO_AACSTREAMFORMATTYPE); + } + +OMX_AUDIO_CHANNELMODETYPE COmxScriptParser::ParseOmxAudioChannelModeL(const TDesC8& aChannelModeDes) + { + return ParseL(aChannelModeDes, parse_OMX_AUDIO_CHANNELMODETYPE); + } + +OMX_STATETYPE COmxScriptParser::ParseOmxStateL(const TDesC8& aStateDes) + { + return ParseL(aStateDes, parse_OMX_STATETYPE); + } + +OMX_METADATASCOPETYPE COmxScriptParser::ParseOmxScopeTypeL(const TDesC8& aScopeDes) + { + if(aScopeDes == _L8("all")) + { + return OMX_MetadataScopeAllLevels; + } + else if(aScopeDes == _L8("top")) + { + return OMX_MetadataScopeTopLevel; + } + else if(aScopeDes == _L8("port")) + { + return OMX_MetadataScopePortLevel; + } + else + { + User::Leave(KErrArgument); + return OMX_MetadataScopeTypeMax; // unreachable, prevents compiler warning + } + } + +OMX_BUFFERSUPPLIERTYPE COmxScriptParser::ParseOmxSupplierL(const TDesC8& aSupplierDes, TBool aAllowUnspecified) + { + if(aSupplierDes == _L8("input")) + { + return OMX_BufferSupplyInput; + } + else if(aSupplierDes == _L8("output")) + { + return OMX_BufferSupplyOutput; + } + else if (aAllowUnspecified && aSupplierDes == _L8("unspecified")) + { + return OMX_BufferSupplyUnspecified; + } + else + { + User::Leave(KErrArgument); + return OMX_BufferSupplyInput; // unreachable, prevents compiler warning + } + } + +void COmxScriptParser::CheckForAbortL(TBool success) + { + if(!success) + { + iCallbackAborted = ETrue; + User::Leave(KErrAbort); + } + } + +TInt COmxScriptParser::ParseOptionalIntL(const RArray& aArray, const TDesC8& aAttribName, TInt aDefaultValue) + { + const TDesC8* des = FindAttribute(aArray, aAttribName); + if(des == NULL) + { + return aDefaultValue; + } + else + { + TInt result; + TLex8 lex(*des); + User::LeaveIfError(lex.Val(result)); + return result; + } + } + +TReal COmxScriptParser::ParseOptionalRealL(const RArray& aArray, const TDesC8& aAttribName, TReal aDefaultValue) + { + const TDesC8* des = FindAttribute(aArray, aAttribName); + if(des == NULL) + { + return aDefaultValue; + } + else + { + TReal result; + TLex8 lex(*des); + User::LeaveIfError(lex.Val(result)); + return result; + } + } + +OMX_COLOR_FORMATTYPE COmxScriptParser::ParseOmxColorFormatL(const TDesC8& aDes) + { + return ParseL(aDes, parse_OMX_COLOR_FORMATTYPE); + } + + +OMX_COMMANDTYPE COmxScriptParser::ParseOmxCommandL(const TDesC8& aDes) + { + return ParseL(aDes, parse_OMX_COMMANDTYPE); + } + +OMX_ERRORTYPE COmxScriptParser::ParseOmxErrorL(const TDesC8& aDes) + { + return ParseL(aDes, parse_OMX_ERRORTYPE); + } + +OMX_EVENTTYPE COmxScriptParser::ParseOmxEventL(const TDesC8& aDes) + { + return ParseL(aDes, parse_OMX_EVENTTYPE); + } + +TBool COmxScriptParser::ParseOptionalBooleanL(const RArray& aArray, const TDesC8& aAttribName, TBool aDefaultValue) + { + const TDesC8* des = FindAttribute(aArray, aAttribName); + if(des == NULL) + { + return aDefaultValue; + } + + return ParseBooleanL(*des); + } + +TBool COmxScriptParser::ParseBooleanL(const TDesC8& aBool) + { + if ((aBool == _L8("true")) || + (aBool == _L8("yes")) || + (aBool == _L8("1")) || + (aBool == _L8("ETrue")) || + (aBool == _L8("OMX_TRUE"))) + { + return ETrue; + } + + if ((aBool == _L8("false")) || + (aBool == _L8("no")) || + (aBool == _L8("0")) || + (aBool == _L8("EFalse")) || + (aBool == _L8("OMX_FALSE"))) + { + return EFalse; + } + + User::Leave(KErrArgument); + return EFalse; + } + + +TUint32 COmxScriptParser::ParseUint32L(const TDesC8& aDes) + { + TUint32 result; + if(aDes.Find(_L8("0x")) == 0) + { + TLex8 lex(aDes.Mid(2)); + User::LeaveIfError(lex.Val(result, EHex)); + } + else + { + TLex8 lex(aDes); + User::LeaveIfError(lex.Val(result, EDecimal)); + } + return result; + } + +TBool COmxScriptParser::ParseBoolean(const TDesC8& aDes) + { + if (aDes == _L8("true")) + { + return ETrue; + } + return EFalse; + } + +TReal32 COmxScriptParser::ParseReal32L(const TDesC8& aDes) + { + TReal32 result; + TLex8 lex(aDes); + User::LeaveIfError(lex.Val(result)); + return result; + } + +OMX_VIDEO_CODINGTYPE COmxScriptParser::ParseOmxVideoCodingL(const TDesC8& aDes) + { + if(aDes == _L8("unused")) + { + return OMX_VIDEO_CodingUnused; + } + else if (aDes == _L8("autodetect")) + { + return OMX_VIDEO_CodingAutoDetect; + } + else if(aDes == _L8("mpeg4")) + { + return OMX_VIDEO_CodingMPEG4; + } + else if(aDes == _L8("avc")) + { + return OMX_VIDEO_CodingAVC; + } + else if(aDes == _L8("max")) + { + return OMX_VIDEO_CodingMax; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + } + + return OMX_VIDEO_CodingUnused; + } + +OMX_AUDIO_CODINGTYPE COmxScriptParser::ParseOmxAudioCodingL(const TDesC8& aDes) + { + if(aDes == _L8("unused")) + { + return OMX_AUDIO_CodingUnused; + } + else if (aDes == _L8("autodetect")) + { + return OMX_AUDIO_CodingAutoDetect; + } + else if(aDes == _L8("pcm")) + { + return OMX_AUDIO_CodingPCM; + } + else if(aDes == _L8("aac")) + { + return OMX_AUDIO_CodingAAC; + } + else if(aDes == _L8("max")) + { + return OMX_AUDIO_CodingMax; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + } + + return OMX_AUDIO_CodingUnused; + } + +OMX_TIME_REFCLOCKTYPE COmxScriptParser::ParseOmxRefClockTypeL(const TDesC8& aDes) + { + if(aDes == _L8("none")) + { + return OMX_TIME_RefClockNone; + } + else if (aDes == _L8("audio")) + { + return OMX_TIME_RefClockAudio; + } + else if(aDes == _L8("video")) + { + return OMX_TIME_RefClockVideo; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + } + + return OMX_TIME_RefClockNone; + } + +OMX_TIME_CLOCKSTATE COmxScriptParser::ParseOmxClockStateL(const TDesC8& aDes) + { + if(aDes == _L8("stopped")) + { + return OMX_TIME_ClockStateStopped; + } + else if (aDes == _L8("waiting")) + { + return OMX_TIME_ClockStateWaitingForStartTime; + } + else if(aDes == _L8("running")) + { + return OMX_TIME_ClockStateRunning; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + return OMX_TIME_ClockStateMax; // unreachable, to prevent compiler warning + } + } + +TVideoFitMode COmxScriptParser::ParseVideoFitModeL(const TDesC8& aMode) + { + if(aMode == _L8("centre")) + { + return EVideoFitCentre; + } + else if(aMode == _L8("scaleAndCentre")) + { + return EVideoFitScaleAndCentre; + } + else if(aMode == _L8("rotateScaleAndCentre")) + { + return EVideoFitRotateScaleAndCentre; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + return EVideoFitCentre; // unreachable, prevent compiler warning + } + } + +OMX_VIDEO_MPEG4PROFILETYPE COmxScriptParser::ParseOmxMpeg4ProfileL(const TDesC8& aDes) + { + if(aDes == _L8("simple")) + { + return OMX_VIDEO_MPEG4ProfileSimple; + } + else if(aDes == _L8("main")) + { + return OMX_VIDEO_MPEG4ProfileMain; + } + else if (aDes == _L8("advancedrealtime")) + { + return OMX_VIDEO_MPEG4ProfileAdvancedRealTime; + } + else if (aDes == _L8("advancedcoding")) + { + return OMX_VIDEO_MPEG4ProfileAdvancedCoding; + } + else if (aDes == _L8("core")) + { + return OMX_VIDEO_MPEG4ProfileCore; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + } + return OMX_VIDEO_MPEG4ProfileMax; // unreachable, prevents compiler warning + } + +OMX_VIDEO_MPEG4LEVELTYPE COmxScriptParser::ParseOmxMpeg4LevelL(const TDesC8& aDes) + { + if(aDes == _L8("level0")) + { + return OMX_VIDEO_MPEG4Level0; + } + else if(aDes == _L8("level0b")) + { + return OMX_VIDEO_MPEG4Level0b; + } + else if (aDes == _L8("level1")) + { + return OMX_VIDEO_MPEG4Level1; + } + else if (aDes == _L8("level2")) + { + return OMX_VIDEO_MPEG4Level2; + } + else if (aDes == _L8("level3")) + { + return OMX_VIDEO_MPEG4Level3; + } + else if(aDes == _L8("level4")) + { + return OMX_VIDEO_MPEG4Level4; + } + else if (aDes == _L8("level5")) + { + return OMX_VIDEO_MPEG4Level5; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + } + return OMX_VIDEO_MPEG4LevelMax; // unreachable, prevents compiler warning + } + +OMX_VIDEO_CONTROLRATETYPE COmxScriptParser::ParseOmxControlRateL(const TDesC8& aDes) + { + if(aDes == _L8("disable")) + { + return OMX_Video_ControlRateDisable; + } + else if(aDes == _L8("variable")) + { + return OMX_Video_ControlRateVariable; + } + else if (aDes == _L8("constant")) + { + return OMX_Video_ControlRateConstant; + } + else + { + __BREAKPOINT(); + User::Leave(KErrArgument); + } + return OMX_Video_ControlRateMax; // unreachable, prevents compiler warning + } + +OMX_AUDIO_AACSTREAMFORMATTYPE COmxScriptParser::ParseAacStreamFormatL(const TDesC8& aStreamFormatStr) + { + if(aStreamFormatStr == _L8("mp2adts")) + { + return OMX_AUDIO_AACStreamFormatMP2ADTS; + } + else if(aStreamFormatStr == _L8("mp4adts")) + { + return OMX_AUDIO_AACStreamFormatMP4ADTS; + } + else if(aStreamFormatStr == _L8("mp4loas")) + { + return OMX_AUDIO_AACStreamFormatMP4LOAS; + } + else if(aStreamFormatStr == _L8("mp4latm")) + { + return OMX_AUDIO_AACStreamFormatMP4LATM; + } + else if(aStreamFormatStr == _L8("adif")) + { + return OMX_AUDIO_AACStreamFormatADIF; + } + else if(aStreamFormatStr == _L8("mp4ff")) + { + return OMX_AUDIO_AACStreamFormatMP4FF; + } + else if(aStreamFormatStr == _L8("raw")) + { + return OMX_AUDIO_AACStreamFormatRAW; + } + else + { + User::Leave(KErrArgument); + return OMX_AUDIO_AACStreamFormatMax; + } + } + + OMX_NUMERICALDATATYPE COmxScriptParser::ParseNumericalDataL(const TDesC8& aDes) + { + if(aDes == _L8("signed")) + { + return OMX_NumericalDataSigned; + } + else if(aDes == _L8("unsigned")) + { + return OMX_NumericalDataUnsigned; + } + else + { + User::Leave(KErrArgument); + return OMX_NumercialDataMax; + } + } + + OMX_ENDIANTYPE COmxScriptParser::ParseEndianL(const TDesC8& aDes) + { + if(aDes == _L8("big")) + { + return OMX_EndianBig; + } + else if(aDes == _L8("little")) + { + return OMX_EndianLittle; + } + else + { + User::Leave(KErrArgument); + return OMX_EndianMax; + } + } + + OMX_BOOL COmxScriptParser::ParseBoolL(const TDesC8& aDes) + { + if(aDes == _L8("true")) + { + return OMX_TRUE; + } + else if(aDes == _L8("false")) + { + return OMX_FALSE; + } + else + { + User::Leave(KErrArgument); + return OMX_FALSE; + } + } + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxscriptparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxscriptparser.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,262 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef OMXSCRIPTPARSER_H_ +#define OMXSCRIPTPARSER_H_ + +#include +#include +#include + +#include + + +// a bit naughty, bit it will do for now +using namespace Xml; + +enum TVideoFitMode + { + EVideoFitCentre, + EVideoFitScaleAndCentre, + EVideoFitRotateScaleAndCentre + }; + +enum TTransitionOrder + { + ELoadOrder, + EAutoOrder + }; + +/** + * High-level elementary test actions. This interface can be driven by the COmxScriptParser. + */ +class MOmxScriptIf + { +public: + virtual TBool MosLoadComponentL(const TDesC8& aComp, const TDesC8& aName, TBool aBaseProfile, const TDesC8* aBaseImpl, TBool aLoadInCoreServerThread) = 0; + virtual TBool MosSetupTunnel(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetupNonTunnel(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier) = 0; + virtual TBool MosSetWindowL(const TDesC8& aComp) = 0; + virtual TBool MosAllTransitionL(OMX_STATETYPE aState,OMX_ERRORTYPE aExpectedError, TTransitionOrder order) = 0; + virtual TBool MosTransition(const TDesC8& aComp, OMX_STATETYPE aState, TBool aAsync) = 0; + virtual TBool MosFailingTransition(const TDesC8& aComp, OMX_STATETYPE aState, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosWaitEOS() = 0; + virtual TBool MosSetFilename(const TDesC8& aComp, const TDesC& aFilename) = 0; + //meena + virtual TBool MosSetFilename_bellagio(const TDesC8& aComp, char *aFilename) = 0; + + virtual TBool MosGetFilename(const TDesC8& aComp, TDesC& aFilename, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetBadFilename(const TDesC8& aComp) = 0; + + virtual TBool MosSetBufferCount(const TDesC8& aComp, TInt aPortIndex, TInt aCount, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosCompareFilesL(const TDesC& aFileOne, const TDesC& aFileTwo) = 0; + virtual TBool MosFilterAndCompareFilesL(const TDesC& aFileOne, const TDesC8& aFile1Filter1, const TDesC8& aFile1Filter2, const TDesC8& aFile1Filter3, + const TDesC& aFileTwo, const TDesC8& aFile2Filter1, const TDesC8& aFile2Filter2, const TDesC8& aFile2Filter3) = 0; + virtual TBool MosBufferSupplierOverrideL(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_ERRORTYPE aExpectedSourceError, OMX_ERRORTYPE aExpectedSinkError) = 0; + virtual TBool MosSetVideoPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aWidth, TInt aHeight, OMX_COLOR_FORMATTYPE* aColorFormat, OMX_VIDEO_CODINGTYPE* aCodingType, TInt aStride, TReal aFps, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetCameraOneShotL(const TDesC8& aComp, TInt aIsOneShot, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetCameraCaptureL(const TDesC8& aComp, TInt aPortIndex, TInt aIsCapturing, OMX_ERRORTYPE aExpectedError) = 0; + virtual void MosParseError(const TDesC& aError) = 0; + virtual TBool MosWaitL(TTimeIntervalMicroSeconds32 aDelay) = 0; + virtual TBool MosExpectEventL(const TDesC8& aComp, OMX_EVENTTYPE aEvent, TUint32 nData1, TUint32 nData2) = 0; + virtual TBool MosWaitForAllEventsL() = 0; + virtual TBool MosCheckStateL(const TDesC8& aComp, OMX_STATETYPE aState) = 0; + virtual TBool MosCheckVideoPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aWidth, TInt aHeight, OMX_VIDEO_CODINGTYPE aCoding, OMX_COLOR_FORMATTYPE aColorFormat) = 0; + virtual TBool MosCheckMetaDataL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& aData) = 0; + virtual TBool MosGetParameterUnknownIndexTypeL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& aData) = 0; + virtual TBool MosSetParameterUnknownIndexTypeL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& aData) = 0; + + virtual TBool MosDisablePort(const TDesC8& aComp, TInt aPortIndex) = 0; + virtual TBool MosEnablePort(const TDesC8& aComp, TInt aPortIndex) = 0; + virtual TBool MosIgnoreEventL(const TDesC8& aComp, OMX_EVENTTYPE aEvent, TUint32 nData1, TUint32 nData2) = 0; + virtual TBool MosSetPcmAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aNumChannels, TInt aSamplingRate, TInt aBitsperSample, OMX_NUMERICALDATATYPE aNumData, OMX_ENDIANTYPE aEndian, OMX_BOOL* aInterleaved, const TDesC8* aEncoding) = 0; + virtual TBool MosSetConfigAudioVolumeL(const TDesC8& aComp, TInt aPortIndex, TBool aLinear, TInt aMinVolume, TInt aMaxVolume, TInt aVolume, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosCheckConfigAudioVolumeL(const TDesC8& aComp, TInt aPortIndex, TBool aLinear, TInt aMinVolume, TInt aMaxVolume, TInt aVolume) = 0; + virtual TBool MosCheckConfigAudioMuteL(const TDesC8& aComp, TInt aPortIndex, TBool aMute) = 0; + virtual TBool MosSetConfigAudioMuteL(const TDesC8& aComp, TInt aPortIndex, TBool aMute) = 0; + virtual TBool MosSetAacAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aNumChannels, TInt aSamplingRate, TInt aBitRate, TInt aAudioBandwidth, TInt aFrameLength, TInt aAacTools, TInt aAacErTools, TInt aProfile, TInt aStreamFormat, TInt aChannelMode) = 0; + virtual TBool MosSetAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, OMX_AUDIO_CODINGTYPE* aCodingType, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetRefClockTypeL(const TDesC8& aComp, OMX_TIME_REFCLOCKTYPE aRefClockType) = 0; + virtual TBool MosSetClockTimeScale(const TDesC8& aComp, OMX_S32 aScale) = 0; + virtual TBool MosSetClockStateL(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aClockState, TInt aStartTime, TInt aOffset, TUint32 aWaitMask) = 0; + virtual TBool MosCheckClockStateL(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aClockState) = 0; + virtual TBool MosCheckTimePositionL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) = 0; + virtual TBool MosSetTimePositionL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) = 0; + virtual TBool MosSetClientStartTimeL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) = 0; + virtual TBool MosSetCurrentAudioReferenceTimeL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) = 0; + virtual TBool MosSetVideoFitModeL(TVideoFitMode aVideoFitMode) = 0; + virtual TBool MosNegativeSetDataChunk(const TDesC8& aComp, OMX_ERRORTYPE aExpectedError, TInt aExpectedSystemError) = 0; + virtual TBool MosSetBufferSize(const TDesC8& aComp, TInt aPortIndex, TInt aCount, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosGetAndCompareBufferCount(const TDesC8& aComp, TInt aPortIndex, TInt aDataToCompare) = 0; + virtual TBool MosGetAndCompareBufferSize(const TDesC8& aComp, TInt aPortIndex, TInt aDataToCompare) = 0; + virtual TBool MosFlushBuffer(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosForceBufferSourceFlushBufferL(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosForceBufferSinkFlushBuffer(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetActiveStream(const TDesC8& aComp, TUint32 aPortIndex)= 0; + virtual TBool MosGetActiveStream(const TDesC8& aComp, TUint32 aPortIndex) = 0; + virtual TBool MosSetDroppedFrameEvent(const TDesC8& aComp, const TDesC8& aAction) = 0; + virtual TBool MosCheckFrameCountL(const TDesC& aFilename, TInt aCount) = 0; + virtual TBool MosMarkBuffer(const TDesC8& aComp, TInt aPortIndex, const TDesC8& aTargetComp, TInt markData) = 0; + // mpeg4 encoder component + virtual TBool MosSetVideoEncQuantL(const TDesC8& aComp, TInt aPortIndex, TInt aQpb) = 0; + virtual TBool MosSetVideoEncMotionVectL(const TDesC8& aComp, TInt aPortIndex, TInt aAccuracy, TInt aSxSearchrange, TInt aSySearchrange, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetVideoEncMpeg4TypeL(const TDesC8& aComp, TInt aPortIndex, OMX_VIDEO_MPEG4PROFILETYPE aMpeg4Profile, OMX_VIDEO_MPEG4LEVELTYPE aMpeg4Level, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosSetVideoEncBitRateL(const TDesC8& aComp, TInt aPortIndex, OMX_VIDEO_CONTROLRATETYPE aControlRate, TInt aTargetBitrate, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosChangeFilledBufferLength(const TDesC8& aComp, TInt aValue) = 0; + virtual TBool MosSetOMX_SymbianIndexParamBufferMsgQueueData(const TDesC8& aComp, OMX_ERRORTYPE aExpectedError) = 0; + virtual TBool MosGetExtensionIndex(const TDesC8& aComp, const TDesC8& aParameterName, OMX_ERRORTYPE aExpectedError) = 0; + + virtual TBool MosCheckTimeClockState(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aExpectedState) = 0; + virtual TBool MosCheckMediaTime(const TDesC8& aComp, TInt aPortIndex, OMX_TICKS aMediaTime, TBool aMoreThan) = 0; + + // Buffer component handler + virtual TBool InitialiseBufferHandlerL(const TDesC8& aComp, TDesC& aName, const TDesC8* aType) = 0; + virtual void StartBufferHandler() = 0; + virtual void StopBufferHandler() = 0; + virtual TBool InitialiseBufferSinkHandlerL(const TDesC8& aComp, TDesC& aName) = 0; + virtual void StartBufferSinkHandler() = 0; + virtual void StopBufferSinkHandler() = 0; + virtual void SendInvalidBufferId(TInt aInvalidId) = 0; + + virtual TBool MosWaitEOS(const TDesC8& aComp) = 0; + + virtual TBool MosSetAACProfileL(const TDesC8& aComp, TInt aPortIndex, TInt aChannels, TInt aSamplingRate, TInt aBitRate, TInt aAudioBandwidth, TInt aFrameLength, TInt aAACTools, TInt aAACERTools, OMX_AUDIO_AACPROFILETYPE aProfile, OMX_AUDIO_AACSTREAMFORMATTYPE aStreamFormat, OMX_AUDIO_CHANNELMODETYPE aChannelMode) = 0; + virtual TBool MosSetupBufferForPortL(const TDesC8& comp,TInt aPortIndex, const TDesC& aFileName,TInt aHeaderLength,OMX_BUFFERSUPPLIERTYPE aSupplier) = 0; + + // Camera + + virtual TBool MosSetSensorModeTypeL(const TDesC8& aComp, TInt aPort, TInt aFrameRate, TBool aOneShot, TInt aWidth, TInt aHeight) = 0; + virtual TBool MosSetCaptureModeTypeL(const TDesC8& aComp, TInt aPort, TBool aContinuous, TBool aFrameLimited, TInt aFrameLimit) = 0; + + + // Debugging/Utility functions. + virtual TBool MosDeleteFileL(const TDesC& aFileName, TBool aFileMustExist) = 0; + virtual TBool MosLogAllEventsL() = 0; + + // Methods supporting generic Base Profile communications support with components + virtual TBool MosBaseSupportPortL(const TDesC8& aComp, TInt aPortIndex) = 0; + virtual TBool MosBaseSetAutonomous(const TDesC8& aComp, TInt aPortIndex, TBool aEnabled) = 0; + virtual TBool MosBaseAllocateBuffersL(const TDesC8& aComp, TInt aPortIndex, TInt aNumberBuffers) = 0; + virtual TBool MosBaseFreeAllocatedBuffersL(const TDesC8& aComp) = 0; + virtual TBool MosBaseSetBufSupplier(const TDesC8& aComp, TInt aPortIndex, TBool aComponentSupplier) = 0; + virtual TBool MosBaseFillThisBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex) = 0; + virtual TBool MosBaseEmptyThisBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex) = 0; + virtual TBool MosBaseWaitForBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex) = 0; + + // Methods supporting the Timestamp checking implementation for Base Profile testing + virtual TBool MosBaseTimestampPassClock(const TDesC8& aCompReceiving, const TDesC8& aClockCompToPass) = 0; + virtual TBool MosBaseTimestampCheckTimestampL(const TDesC8& aComp, TInt aPortIndex, TUint aExpectedTime, TUint aTolerance) = 0; + virtual TBool MosBaseTimestampCompareWithRefClockL(const TDesC8& aComp, TInt aPortIndex, TUint aTolerance) = 0; + + virtual TBool MosStartBuffersforPort( const TDesC8& aComp, TInt aPortIndex) = 0; +#ifdef OLD_ADPCM_EXTENSION + virtual TBool MosSetAdPcmAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aNumChannels, TInt aSamplingRate, TInt aBitsperSample) = 0; + virtual TBool MosConfigAdPcmDecoderBlockAlign(const TDesC8& aComp, OMX_S32 aBlockAlign) = 0; +#endif + }; + +/** + * This parses an XML file to drive the operation of a MOmxScriptIf. + */ +NONSHARABLE_CLASS(COmxScriptParser) : public CBase, public Xml::MContentHandler + { +public: + static COmxScriptParser* NewL(RFs& aFs, const TDesC& aFilename, MOmxScriptIf& aCallback); + ~COmxScriptParser(); + + TBool RunScriptL(const TDesC& aSectionName); + + // Xml::MContentHandler interface + void OnStartDocumentL(const RDocumentParameters& aDocParam, TInt aErrorCode); + void OnEndDocumentL(TInt aErrorCode); + void OnStartElementL(const RTagInfo& aElement, const RAttributeArray& aAttributes, + TInt aErrorCode); + void OnEndElementL(const RTagInfo& aElement, TInt aErrorCode); + void OnContentL(const TDesC8& aBytes, TInt aErrorCode); + void OnStartPrefixMappingL(const RString& aPrefix, const RString& aUri, + TInt aErrorCode); + void OnEndPrefixMappingL(const RString& aPrefix, TInt aErrorCode); + void OnIgnorableWhiteSpaceL(const TDesC8& aBytes, TInt aErrorCode); + void OnSkippedEntityL(const RString& aName, TInt aErrorCode); + void OnProcessingInstructionL(const TDesC8& aTarget, const TDesC8& aData, + TInt aErrorCode); + void OnError(TInt aErrorCode); + TAny* GetExtendedInterface(const TInt32 aUid); + +protected: + COmxScriptParser(RFs& aFs, MOmxScriptIf& aCallback); + void ConstructL(const TDesC& aFilename); + +private: + static const TDesC8* FindAttribute(const RArray& aArray, const TDesC8& aAttribName); + const TDesC8& FindAttributeL(const RArray& aArray, const TDesC8& aAttribName); + static void ParseCompPortL(const TDesC8& aInput, TPtrC8& aNameOut, TInt& aPortOut); + static OMX_STATETYPE ParseOmxStateL(const TDesC8& aStateDes); + static OMX_BUFFERSUPPLIERTYPE ParseOmxSupplierL(const TDesC8& aSupplierDes, TBool aAllowUnspecified = EFalse); + void CheckForAbortL(TBool success); + static TInt ParseOptionalIntL(const RArray& aArray, const TDesC8& aAttribName, TInt aDefaultValue); + static TReal ParseOptionalRealL(const RArray& aArray, const TDesC8& aAttribName, TReal aDefaultValue); + static OMX_COLOR_FORMATTYPE ParseOmxColorFormatL(const TDesC8& aDes); + static OMX_EVENTTYPE ParseOmxEventL(const TDesC8& aEventDes); + static TUint32 ParseUint32L(const TDesC8& aDes); + static TReal32 ParseReal32L(const TDesC8& aDes); + static OMX_VIDEO_CODINGTYPE ParseOmxVideoCodingL(const TDesC8& aDes); + static TBool ParseOptionalBooleanL(const RArray& aArray, const TDesC8& aAttribName, TBool aDefaultValue); + static TBool ParseBooleanL(const TDesC8& aBool); + + static OMX_METADATASCOPETYPE ParseOmxScopeTypeL(const TDesC8& aScopeDes); + static OMX_AUDIO_CODINGTYPE ParseOmxAudioCodingL(const TDesC8& aDes); + static OMX_TIME_REFCLOCKTYPE ParseOmxRefClockTypeL(const TDesC8& aDes); + static OMX_TIME_CLOCKSTATE ParseOmxClockStateL(const TDesC8& aDes); + static TVideoFitMode ParseVideoFitModeL(const TDesC8& aMode); + static OMX_COMMANDTYPE ParseOmxCommandL(const TDesC8& aDes); + static OMX_ERRORTYPE ParseOmxErrorL(const TDesC8& aDes); + static TBool ParseBoolean(const TDesC8& aDes); + + static OMX_ERRORTYPE ParseOmxErrorCode(const TDesC8& aErrorCode); + static OMX_VIDEO_MPEG4PROFILETYPE ParseOmxMpeg4ProfileL(const TDesC8& aDes); + static OMX_VIDEO_MPEG4LEVELTYPE ParseOmxMpeg4LevelL(const TDesC8& aDes); + static OMX_VIDEO_CONTROLRATETYPE ParseOmxControlRateL(const TDesC8& aDes); + static OMX_AUDIO_AACPROFILETYPE ParseOmxAACProfileL(const TDesC8& aProfileDes); + static OMX_AUDIO_AACSTREAMFORMATTYPE ParseOmxAACStreamFormatL(const TDesC8& aFormatDes); + static OMX_AUDIO_CHANNELMODETYPE ParseOmxAudioChannelModeL(const TDesC8& aChannelModeDes); + static TInt ParseSystemErrorCode(const TDesC8& aErrorCode); + static OMX_AUDIO_AACSTREAMFORMATTYPE ParseAacStreamFormatL(const TDesC8& aStreamFormatStr); + static OMX_NUMERICALDATATYPE ParseNumericalDataL(const TDesC8& aDes); + static OMX_ENDIANTYPE ParseEndianL(const TDesC8& aDes); + static OMX_BOOL ParseBoolL(const TDesC8& aDes); + +private: + RFs& iFs; + RBuf iFilename; + MOmxScriptIf& iCallback; + + // state to allow filtering for a specific section within the XML document + const TDesC* iSectionName; // not owned + TBool iInTest; + TBool iFoundTest; + TBool iCallbackAborted; + }; + +#endif /*OMXSCRIPTPARSER_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxscripttest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxscripttest.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,4118 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "omxscripttest.h" +#include "paramconversion.h" +#include "statedes.h" + +#include "omxilsymbianvideographicsinkextensions.h" +#include +#include +#include +#include "omxutil.h" +#include "nontunneledhandler.h" +#include "videobufferhandler.h" +#include "videobufferhandler_mpeg4.h" // for mpeg4 +#include "videobuffersinkhandler.h" +#include "log.h" +#include "omx_xml_script.h" +#include "transition.h" +#include "parsemap.h" +#include +#include "omxildroppedframeeventextension.h" +#include +#include "baseprofilehandler.h" +#include "baseprofiletimestamping.h" +#include "windowmanager.h" +#ifdef OLD_ADPCM_EXTENSION +#include +#endif + +/////////////////////////////////////////////////////////////////////////////// +// Temporary work-around for floating point issues on HREF 8500 ED hardware +// Using this macro, code that uses TReal will be #defined out if running on ED. +// TODO: Remove HREF_ED_WITHOUT_FLOATING_POINT and all of its conditional code +// once the floating point issue has been solved. +#if defined(NCP_COMMON_BRIDGE_FAMILY) && !defined(__WINSCW__) +#define HREF_ED_WITHOUT_FLOATING_POINT +#endif + +DECL_PARSETYPE(OMX_EVENTTYPE); + +_LIT8(KILTypeString, "LOGICAL"); + +static TInt StopScheduler(TAny* unused); + +/** + * Runs an OMX test specified in an XML file. + * @param aScriptFilename path to XML file + * @param aScriptSection section name in XML file + */ +void ROmxScriptTest::RunTestL(const TDesC& aScriptFilename, const TDesC& aScriptSection) + { + User::LeaveIfError(iEventHandler.Create()); + iStopSchedulerCallback = new(ELeave) CAsyncCallBack(StopScheduler, CActive::EPriorityHigh); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + INFO_PRINTF3(_L("Executing test steps in section %S of %S"), &aScriptSection, &aScriptFilename); + + TPtrC filename; + COmxScriptParser* parser = COmxScriptParser::NewL(fs, aScriptFilename, *this); + CleanupStack::PushL(parser); + + // this drives the methods from MOmxScriptIf + TBool success = parser->RunScriptL(aScriptSection); + if(success) + { + StopTest(EPass); + } + else + { + ERR_PRINTF1(_L("Script did not complete")); + StopTest(EFail); + } + + CleanupStack::PopAndDestroy(2, &fs); // fs, parser + + User::LeaveIfError(Reason()); + } + +/** + * Constructs an object to parse and execute an OMX test case specified in + * an XML file. + * @param reference to logger interface to receive test messages + */ +ROmxScriptTest::ROmxScriptTest(MOmxScriptTestLogger& aLogger): + iCoreLoaded(EFalse), + iEventHandler(*this), + iState(OMX_StateLoaded), + iWindowManager(NULL), + iVideoFitMode(EVideoFitRotateScaleAndCentre), + iTimer(NULL), + iWaitingForEvents(EFalse), + iNonTunneledHandler(NULL), + iBufferHandler(NULL), + iBufferSinkHandler(NULL), + iReason(KErrNone), + iVerdict(EPending), + iLogger(aLogger), + iStopSchedulerCallback(NULL), + iPortBufferHandler(NULL) + { + } + +/** + * Destroys all resources created by this object. + */ +void ROmxScriptTest::Close() + { + // release memory and unload components + // ~CComponentInfo unloads component in correct thread + iComponents.ResetAndDestroy(); + + if(iCoreLoaded) + { + INFO_PRINTF1(_L("OMX_Deinit()")); + iCoreLoaded = EFalse; + OMX_ERRORTYPE error = OMX_Deinit(); + if(error) + { + FailWithOmxError(_L("OMX_Deinit"), error); + } + } + REComSession::FinalClose(); + iEventHandler.Close(); + delete iWindowManager; + iWindowManager = NULL; + iState = OMX_StateLoaded; + + if (iTimer) + { + iTimer->Cancel(); + delete iTimer; + iTimer = NULL; + } + + iExpectedEvents.Close(); + iIgnoredEvents.Close(); + + if (iNonTunneledHandler) + { + delete iNonTunneledHandler; + iNonTunneledHandler = NULL; + } + + if(iPortBufferHandler) + { + delete iPortBufferHandler; + iPortBufferHandler = NULL; + } + + // Buffer component + delete iBufferHandler; + iBufferHandler = NULL; + + delete iBufferSinkHandler; + iBufferSinkHandler = NULL; + + delete iStopSchedulerCallback; + iStopSchedulerCallback = NULL; + + iTunnels.Close(); + } + +// allows OMX components to be placed on the cleanup stack +//void ROmxScriptTest::CleanupOmxComponent(TAny* aPtr) +// { +// OMX_COMPONENTTYPE* component = static_cast(aPtr); +// OMX_ERRORTYPE error = OMX_FreeHandle(component); +// // if this method is called, we are already in an error condition, +// // but OMX_FreeHandle should still succeed. Perhaps a cleaner way of +// // reporting any error is desired, but this is a static method so we +// // lack the context to call the standard logging mechanism. +// __ASSERT_DEBUG(!error, User::Invariant()); +// } + +TBool ROmxScriptTest::MosLoadComponentL(const TDesC8& aComp, const TDesC8& aName, TBool aBaseProfile, const TDesC8* aBaseImpl, TBool aLoadInCoreServerThread) + { + if(!iCoreLoaded) + { + INFO_PRINTF1(_L("OMX_Init()")); + OMX_ERRORTYPE error = OMX_Init(); + if(error) + { + CleanupStack::PopAndDestroy(2); + FailWithOmxError(_L("OMX_Init()"), error); + return EFalse; + } + iCoreLoaded = ETrue; + } + + // convert from 8-bit descriptor for logging + TBuf<64> nameCopy; + nameCopy.Copy(aName); + INFO_PRINTF2(_L("Loading component %S"), &nameCopy); + + CComponentInfo* componentInfo = CComponentInfo::NewL(*this); + CleanupStack::PushL(componentInfo); + componentInfo->iShortName = HBufC8::NewL(aComp.Length()); + *(componentInfo->iShortName) = aComp; + // allow room for the '\0' used in call to OMX_GetHandle + componentInfo->iComponentName = HBufC8::NewL(aName.Length() + 1); + *(componentInfo->iComponentName) = aName; + + + OMX_ERRORTYPE error = OMX_ErrorNone; + if (aBaseProfile) + { + if (*aBaseImpl == _L8("base")) + { + componentInfo->iBaseHandler = new (ELeave) CBaseProfileHandler(*this, iEventHandler); + componentInfo->iComponent = componentInfo->iBaseHandler->LoadComponentL(*componentInfo->iShortName, *componentInfo->iComponentName); + + } + else if (*aBaseImpl == _L8("timestampcheck")) + { + componentInfo->iBaseHandler = new (ELeave) CBaseProfileTimestampHandling(*this, iEventHandler); + componentInfo->iComponent = componentInfo->iBaseHandler->LoadComponentL(*componentInfo->iShortName, *componentInfo->iComponentName); + + } + + } + else + { + OMX_CALLBACKTYPE& callbacks = iEventHandler.CallbackStruct(); + // NOTE componentInfo.iShortName and componentInfo.iComponentName still on the cleanup stack + + if(aLoadInCoreServerThread) + { + INFO_PRINTF2(_L("Loading component %S in Core Server thread"), &nameCopy); + if(componentInfo->iThreadRequest == NULL) + { + componentInfo->iThreadRequest = COmxThreadRequest::NewL(); + } + error = componentInfo->iThreadRequest->GetHandle((TAny**) &(componentInfo->iComponent), (OMX_STRING) componentInfo->iComponentName->Des().PtrZ(), &iEventHandler, &callbacks); + } + else + { + INFO_PRINTF2(_L("Loading component %S in Client thread"), &nameCopy); + error = OMX_GetHandle((TAny**) &(componentInfo->iComponent), (OMX_STRING) componentInfo->iComponentName->Des().PtrZ(), &iEventHandler, &callbacks); + } + } + if(error || (componentInfo->iComponent == NULL)) + { + CleanupStack::PopAndDestroy(); // delete component info + FailWithOmxError(_L("OMX_GetHandle()"), error); + return EFalse; + } + + RDebug::Print(_L("OMX_GetHandle name=%S handle=0x%08X"), &nameCopy, componentInfo->iComponent); + iEventHandler.AddComponentL(componentInfo->iComponent, nameCopy); + iComponents.AppendL(componentInfo); + CleanupStack::Pop(1, componentInfo); + return ETrue; + } + +TBool ROmxScriptTest::MosSetupTunnel(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* source = NULL; + OMX_COMPONENTTYPE* sink = NULL; + if(aSourceComp!=KNullDesC8) + { + source = ComponentByName(aSourceComp); + } + + if(aSinkComp!=KNullDesC8) + { + sink = ComponentByName(aSinkComp); + } + + //support for testing tunnel breakup + if(source || sink) + { + OMX_ERRORTYPE error = OMX_SetupTunnel(source, aSourcePort, sink, aSinkPort); + // TODO check tunnel reconfiguration + if(error == OMX_ErrorNone) + { + RegisterTunnel(source, aSourcePort, sink, aSinkPort); + } + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosSetupTunnel OMX_SetupTunnel: Error 0x%X does not match expected error 0x%X"), error, aExpectedError); + TBuf8<64> msg8; + msg8.Format(_L8("source=%S:%d sink=%S:%d"), &aSourceComp, aSourcePort, &aSinkComp, aSinkPort); + TBuf<64> msg; + msg.Copy(msg8); + INFO_PRINTF1(msg); + return EFalse; + } + return ETrue; + } + else + { + // source or sink names not recognized + return EFalse; + } + } + +TBool ROmxScriptTest::MosSetupNonTunnel(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier) + { + OMX_COMPONENTTYPE* source = ComponentByName(aSourceComp); + OMX_COMPONENTTYPE* sink = ComponentByName(aSinkComp); + if(source && sink) + { + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = aSourcePort; + OMX_ERRORTYPE error = source->GetParameter(source, OMX_IndexParamPortDefinition, &portDef); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + TInt numBufs = portDef.nBufferCountActual; + TInt bufSize = portDef.nBufferSize; + + portDef.nPortIndex = aSinkPort; + error = sink->GetParameter(sink, OMX_IndexParamPortDefinition, &portDef); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + if (portDef.nBufferCountActual != numBufs) + { + ERR_PRINTF1(_L("Number of buffers does not match for non tunneled setup")); + return EFalse; + } + + if (portDef.nBufferSize > bufSize) + { + bufSize = portDef.nBufferSize; + } + + if (!iNonTunneledHandler) + { + iNonTunneledHandler = new CNonTunneledHandler(); + + if (!iNonTunneledHandler) + { + return EFalse; + } + } + + TRAPD(err, iNonTunneledHandler->AddLinkL(source, aSourcePort, sink, aSinkPort, aSupplier, numBufs, bufSize)); + if (err != KErrNone) + return EFalse; + + return ETrue; + } + else + { + // source or sink names not recognized + return EFalse; + } + } + + +TBool ROmxScriptTest::MosSetupBufferForPortL(const TDesC8& aComp,TInt aPortIndex, const TDesC& aFileName,TInt aHeaderLength,OMX_BUFFERSUPPLIERTYPE aSupplier) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF3(_L("MosSetupBufferForPort comp %S port %d"), &compConverted, aPortIndex); + OMX_COMPONENTTYPE* comp = ComponentByName(aComp); + + if(comp) + { + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = comp->GetParameter(comp, OMX_IndexParamPortDefinition, &portDef); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + OMX_DIRTYPE portDirType = portDef.eDir; + + if(!iPortBufferHandler) + { + iPortBufferHandler = new (ELeave)CPortBufferHandler; + } + + iPortBufferHandler->AddPortL(comp,aPortIndex,aFileName,aSupplier,portDirType,iLogger,aHeaderLength); + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetWindowL(const TDesC8& aComp) + { + if(iWindowManager) + { + delete iWindowManager; + iWindowManager = NULL; + } + iWindowManager = CWindowManager::NewL(); + TSize screenSize = iWindowManager->ScreenSize(); + INFO_PRINTF3(_L("Screen size is %dx%d"), screenSize.iWidth, screenSize.iHeight); + + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + iGraphicSink = component; + + OMX_ERRORTYPE error = OMX_GetExtensionIndex(component, const_cast(sOmxSymbianGfxSurfaceConfig), &iExtSurfaceConfigIndex); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetExtensionIndex(sOmxSymbianGfxSurfaceConfig)"), error); + return EFalse; + } + + //Temporary Hack: This is for Logical IL Video Tests: SurfaceId is supposed to be set in response to PortSettingsChanged event from + //MMHP. Currently, there is no support for it. Hence, we are temporarily setting here + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = 0; + error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + error = component->SetParameter(component, OMX_IndexParamPortDefinition, &portDef); + + if(error==OMX_ErrorIncorrectStateOperation) + { + OMX_SYMBIAN_VIDEO_PARAM_SURFACECONFIGURATION surfaceConfigParam; + surfaceConfigParam.nSize = sizeof(OMX_SYMBIAN_VIDEO_PARAM_SURFACECONFIGURATION); + surfaceConfigParam.nVersion = KOmxVersion; + surfaceConfigParam.nPortIndex = 0; + + // define must be removed when hack is removed - OMX_GetExtensionIndex() should be used but hack for when this + // returns an error + #define OMX_SymbianIndexParamVideoGFXSurfaceConfig 0x7F000011 + OMX_ERRORTYPE omxError = component->GetParameter(component, (OMX_INDEXTYPE) OMX_SymbianIndexParamVideoGFXSurfaceConfig, &surfaceConfigParam); + if(omxError != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter(OMX_SymbianIndexParamVideoGFXSurfaceConfig)"), omxError); + return EFalse; + } + + TSurfaceConfiguration& surfaceConfig = *reinterpret_cast(surfaceConfigParam.pSurfaceConfig); + + TRect rect(0,0,320,240); + TInt err = surfaceConfig.SetExtent(rect); + if (err == KErrNone) + { + err =iWindowManager->SetBackgroundSurface(surfaceConfig, ETrue); + } + + if(err) + { + FailWithOmxError(_L("SetParameter"), error); + return EFalse; + } + } + else if(error) + { + FailWithOmxError(_L("SetParameter"), error); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosSetDroppedFrameEvent(const TDesC8& aComp, const TDesC8& aAction) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + TBuf8<80> extension; + + if (aAction == _L8("invalidextension")) + { + extension.Append(_L8("OMX.NOKIA.INDEX.PARAM.INVALIDEXTENSION")); + } + else + { + extension.Append(_L8("OMX.NOKIA.INDEX.PARAM.DROPPEDFRAMEEVENT")); + } + + OMX_INDEXTYPE indexType = OMX_IndexMax; + OMX_ERRORTYPE error = component->GetExtensionIndex(component, (OMX_STRING) extension.PtrZ(), &indexType); + + if (aAction == _L8("invalidextension")) + { + if (error != OMX_ErrorUnsupportedIndex) + { + ERR_PRINTF2(_L("GetExtensionIndex with invalid extension incorrectly returned error 0x%X"), error); + StopTest(EFail); + return EFalse; + } + return ETrue; + } + + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetExtensionIndex"), error); + return EFalse; + } + + OMX_NOKIA_PARAM_DROPPEDFRAMEEVENT exten; + exten.nSize = sizeof(exten); + exten.nVersion = KOmxVersion; + exten.nPortIndex = 0; + + if(aAction == _L8("enable")) + { + exten.bEnabled = OMX_TRUE; + error = component->SetParameter(component, indexType, &exten); + if(error) + { + FailWithOmxError(_L("SetParameter"), error); + return EFalse; + } + return ETrue; + } + else + { + exten.bEnabled = OMX_FALSE; + error = component->SetParameter(component, indexType, &exten); + if(error) + { + FailWithOmxError(_L("SetParameter"), error); + return EFalse; + } + return ETrue; + } + } + +TBool ROmxScriptTest::MosAllTransitionL(OMX_STATETYPE aState, OMX_ERRORTYPE aExpectedError, TTransitionOrder aOrder) + { + INFO_PRINTF2(_L("Transitioning all components to %S"), StateDes(aState)); + if(aOrder == ELoadOrder && aState == OMX_StateIdle && iState == OMX_StateLoaded) + { + WARN_PRINTF1(_L("Using component load order for loaded -> idle transition order")); + } + iEventHandler.AwaitTransition(aState, iState); + RArray order; + CleanupClosePushL(order); + order.ReserveL(iComponents.Count()); + if(aOrder == ELoadOrder) + { + for(TInt index = 0; index < iComponents.Count(); index++) + { + order.Append(index); + } + } + else if(aOrder == EAutoOrder) + { + TRAPD(error, FindTransitionOrderL(iComponents, iTunnels, order)); + if(error != KErrNone) + { + ERR_PRINTF2(_L("Error determining transition order, error=%d"), error); + User::Leave(error); + } + } + + if(aState == OMX_StateIdle && iState == OMX_StateExecuting) + { + // use reverse order for Idle->Executing transition + TInt left = 0, right = order.Count() - 1; + while(left < right) + { + TInt tmp = order[left]; + order[left] = order[right]; + order[right] = tmp; + left++; + right--; + } + } + + if(aOrder == EAutoOrder) + { + TBuf<128> orderDes; + for(TInt index = 0, count = order.Count(); index < count; index++) + { + HBufC8* name8 = iComponents[order[index]]->iShortName; + TBuf<16> name; + name.Copy(*name8); + if(index > 0) + { + orderDes.Append(_L(", ")); + } + orderDes.Append(name); + } + INFO_PRINTF2(_L("Auto-detected transition order: %S"), &orderDes); + } + + TBool commandError = EFalse; + TBool ret = EFalse; + for(TInt orderIndex = 0, count = order.Count(); orderIndex < count; orderIndex++) + { + TInt index = order[orderIndex]; + CComponentInfo* compInfo = iComponents[index]; + OMX_COMPONENTTYPE* component = compInfo->iComponent; + OMX_ERRORTYPE error = component->SendCommand(component, OMX_CommandStateSet, aState, NULL); + if(error) + { + TBuf<128> msg; + msg.Format(_L("SendCommand(OMX_CommandStateSet, %S)"), StateDes(aState)); + if(error != aExpectedError) + { + FailWithOmxError(compInfo->iShortName->Des(), msg, error); + ret = EFalse; + } + else //Need to stop the tests now be cause an error has occurred, even if it is expected. + { + StopTest(EPass); + ret = ETrue; + } + commandError = ETrue; + break; + } + + if (!HandleNonTunneledBuffers(aState, component)) + { + commandError = ETrue; + ret = EFalse; + break; + } + if(!HandlePortBufferHandler(aState, component)) + { + return EFalse; + } + } + CleanupStack::PopAndDestroy(&order); + if(commandError) + { + return ret; + } + + // wait for the transitions to complete + // use a nested loop of the active scheduler + // AllComponentsTransitioned() calls EndWait() + BeginWait(); + return Reason() == KErrNone; + } + +TBool ROmxScriptTest::MosTransition(const TDesC8& aComp, OMX_STATETYPE aState, TBool aAsync) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF3(_L("Transitioning %S component to %S"), &compConverted, StateDes(aState)); + + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + if (!aAsync) + { + iEventHandler.AwaitSingleTransition(component, aState, iState); + } + else + { + //Don't want to force a wait on this state transition so instead of using the event handler add the event to the expected list + TExpectedEvent event; + event.iComponent = component; + event.iEvent = OMX_EventCmdComplete; + event.iData1 = OMX_CommandStateSet; + event.iData2 = aState; + event.iEventData = NULL; + TRAPD(err, iExpectedEvents.AppendL(event)); + if (err != KErrNone) + return EFalse; + } + + OMX_ERRORTYPE error = component->SendCommand(component, OMX_CommandStateSet, aState, NULL); + if(error) + { + FailWithOmxError(_L("SendCommand(OMX_CommandStateSet)"), error); + return EFalse; + } + + if (!HandleNonTunneledBuffers(aState, component)) + { + return EFalse; + } + + if(!HandlePortBufferHandler(aState, component)) + { + return EFalse; + } + + if (!aAsync) + { + BeginWait(); + } + return Reason() == KErrNone; + } + +TBool ROmxScriptTest::MosFailingTransition(const TDesC8& aComp, OMX_STATETYPE aState,OMX_ERRORTYPE aExpectedError) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF3(_L("Transitioning %S component to %S"), &compConverted, StateDes(aState)); + + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_ERRORTYPE error = component->SendCommand(component, OMX_CommandStateSet, aState, NULL); + if(error == aExpectedError) + { + return ETrue; + } + else + { + return EFalse; + } + } + +TBool ROmxScriptTest::MosWaitEOS() + { + // AllComponentsEOS() calls EndWait() + INFO_PRINTF1(_L("Waiting for End of Stream from all components")); + iEventHandler.AwaitEOS(); + BeginWait(); + return ETrue; + } + +TBool ROmxScriptTest::MosWaitEOS(const TDesC8& aComp) + { + // AllComponentsEOS() calls EndWait() + TBuf<16> comp16; + comp16.Copy(aComp); + INFO_PRINTF2(_L("Waiting for End of Stream from component %S"), &comp16); + OMX_COMPONENTTYPE* compHandle = ComponentByName(aComp); + if(compHandle == NULL) + { + return EFalse; + } + iEventHandler.AwaitEOS(compHandle); + BeginWait(); + return ETrue; + } + +TBool ROmxScriptTest::MosWaitL(TTimeIntervalMicroSeconds32 aDelay) + { + if (iTimer) + { + iTimer->Cancel(); + } + else + { + iTimer = CVideoTestTimer::NewL(*this); + } + + iTimer->Start(aDelay); + BeginWait(); + return ETrue; + } + +TBool ROmxScriptTest::MosExpectEventL(const TDesC8& aComp, OMX_EVENTTYPE aEvent, TUint32 aData1, TUint32 aData2) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + TExpectedEvent event; + event.iComponent = component; + event.iEvent = aEvent; + event.iData1 = aData1; + event.iData2 = aData2; + event.iEventData = NULL; + iExpectedEvents.AppendL(event); + + return ETrue; + } + +TBool ROmxScriptTest::MosWaitForAllEventsL() + { + if(iExpectedEvents.Count() > 0) + { + iWaitingForEvents = ETrue; + BeginWait(); + iWaitingForEvents = EFalse; + __ASSERT_ALWAYS(iExpectedEvents.Count() == 0, User::Invariant()); + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetFilename(const TDesC8& aComp, const TDesC& aFilename) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF3(_L("Setting filename on component %S to %S"), &compConverted, &aFilename); + + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_CONTENTURITYPE* contentURI = NULL; + TRAPD(err, contentURI = ParamConversion::FilenameAsContentUriStructV1_1L(aFilename)); + if(err==KErrBadName)//logical IL tests pass just the filename. so try adding the directory path + { + TBuf<64> fileName; + fileName.Copy(KPortDirectoryPath); + fileName.Append(aFilename); + err=KErrNone; + TRAP(err, contentURI = ParamConversion::FilenameAsContentUriStructV1_1L(fileName)); + } + if(err) + { + ERR_PRINTF2(_L("Error converting filename to OMX_CONTENTURI (%d)"), err); + return EFalse; + } + OMX_ERRORTYPE error = component->SetParameter(component, OMX_IndexParamContentURI, contentURI); + delete contentURI; + if(error) + { + FailWithOmxError(_L("SetParameter(OMX_IndexParamContentURI)"), error); + return EFalse; + } + else + { + return ETrue; + } + } + +TBool ROmxScriptTest::MosSetFilename_bellagio(const TDesC8& aComp, char *filepath) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + + //INFO_PRINTF3(_L("Setting filename on component %S to %S"), &compConverted, filepath); + + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + + if(!component) + { + return EFalse; + } + OMX_INDEXTYPE indexType; + OMX_ERRORTYPE omx_err; + + // Setting the input file name for File Source Component + omx_err = OMX_GetExtensionIndex(component, "OMX.Nokia.index.config.filename",&indexType); + + if(omx_err != OMX_ErrorNone) + { + return EFalse; + } + + OMX_ERRORTYPE error = OMX_SetConfig(component,indexType,filepath); + + if(error) + { + return EFalse; + } + else + { + return ETrue; + } + + } + +TBool ROmxScriptTest::MosSetBadFilename(const TDesC8& aComp) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF2(_L("Setting filename on component %S"), &compConverted); + + TText8 cstr[6] = {':', 'e' ,'l' ,'l' ,'o','\0'}; + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + OMX_PARAM_CONTENTURITYPE* contentURI = reinterpret_cast(new TUint8[15]); + if (!contentURI) + return EFalse; + + TPtr8 uriStructDes(contentURI->contentURI, sizeof(cstr)); + uriStructDes = cstr; + + OMX_ERRORTYPE error = component->SetParameter(component, OMX_IndexParamContentURI, contentURI); + delete contentURI; + + return ETrue; + + } + +TBool ROmxScriptTest::MosGetFilename(const TDesC8& aComp, TDesC& aFilename, OMX_ERRORTYPE aExpectedError) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF2(_L("Getting filename on component %S"), &compConverted); + + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + OMX_PARAM_CONTENTURITYPE* contentURI = NULL; + TRAPD(err, contentURI = ParamConversion::FilenameAsContentUriStructV1_1L(aFilename)); + if(err) + { + ERR_PRINTF2(_L("Error converting filename to OMX_CONTENTURI (%d)"), err); + return EFalse; + } + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamContentURI, contentURI); + delete contentURI; + if((error != aExpectedError) && (error != OMX_ErrorOverflow) && (error != OMX_ErrorUnsupportedSetting)) + { + TBuf<64> errorDes; + OMXUtil::ErrorDes(error, errorDes); + TBuf<64> expectedErrorDes; + OMXUtil::ErrorDes(aExpectedError, expectedErrorDes); + ERR_PRINTF3(_L("GetParameter(OMX_IndexParamContentURI) returned %S but expected %S OMX_ErrorOverflow or OMX_ErrorUnsupportedSetting"), + &errorDes, &expectedErrorDes); + StopTest(EFail); + return EFalse; + } + else + { + return ETrue; + } + } + + +void ROmxScriptTest::FormatHex(const TDesC8& bin, TDes& hex) + { + __ASSERT_DEBUG(hex.MaxLength() == bin.Length() * 2, User::Invariant()); + hex.SetLength(0); + for(TInt index = 0, length = bin.Length(); index < length; index++) + { + TUint8 octet = bin[index]; + hex.AppendFormat(_L("%02X"), octet); + } + } + +TBool ROmxScriptTest::MosSetBufferCount(const TDesC8& aComp, TInt aPortIndex, TInt aCount, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nVersion = KOmxVersion; + portDef.nSize = sizeof(portDef); + portDef.nPortIndex = aPortIndex; + + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error) + { + FailWithOmxError(_L("OMX_GetParameter()"), error); + return EFalse; + } + + portDef.nBufferCountActual = aCount; + + INFO_PRINTF3(_L("MosSetBufferCount count %d; dir %d"), portDef.nBufferCountActual, portDef.eDir); + + error = component->SetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(aExpectedError != error) + { + ERR_PRINTF3(_L("MosSetBufferCount OMX_SetParameter() error 0x%X, expecting 0x%X"), error, aExpectedError); + return EFalse; + } + return ETrue; + } + + +TBool ROmxScriptTest::MosFilterAndCompareFilesL( + const TDesC& aFileOne, const TDesC8& aFile1Filter1, const TDesC8& aFile1Filter2, const TDesC8& aFile1Filter3, + const TDesC& aFileTwo, const TDesC8& aFile2Filter1, const TDesC8& aFile2Filter2, const TDesC8& aFile2Filter3) + { + TBuf8<16> aHashOne, aHashTwo; + + THashFilter f1filter1 = GetHashFilterByName(aFile1Filter1); + THashFilter f1filter2 = GetHashFilterByName(aFile1Filter2); + THashFilter f1filter3 = GetHashFilterByName(aFile1Filter3); + + THashFilter f2filter1 = GetHashFilterByName(aFile2Filter1); + THashFilter f2filter2 = GetHashFilterByName(aFile2Filter2); + THashFilter f2filter3 = GetHashFilterByName(aFile2Filter3); + + HashFileL(aFileOne, aHashOne, f1filter1, f1filter2, f1filter3 ); + HashFileL(aFileTwo, aHashTwo, f2filter1, f2filter2, f2filter3 ); + + if (aHashOne == aHashTwo) + { + INFO_PRINTF1(_L("Filter and compare files = MATCH")); + } + else + { + INFO_PRINTF1(_L("Filter and compare files = FAIL")); + } + + return aHashOne == aHashTwo; + } + +TBool ROmxScriptTest::MosCompareFilesL(const TDesC& aFileOne, const TDesC& aFileTwo) + { + TBuf8<16> aHashOne, aHashTwo; + HashFileL(aFileOne, aHashOne); + HashFileL(aFileTwo, aHashTwo); + return aHashOne == aHashTwo; + } + + +TBool ROmxScriptTest::MosBufferSupplierOverrideL( + const TDesC8& aSourceComp, + TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_ERRORTYPE aExpectedSourceError, + OMX_ERRORTYPE aExpectedSinkError + ) + { + OMX_COMPONENTTYPE* source = ComponentByName(aSourceComp); + OMX_COMPONENTTYPE* sink = ComponentByName(aSinkComp); + if(!source || !sink) + { + return EFalse; + } + + OMX_PARAM_BUFFERSUPPLIERTYPE param; + param.nSize = sizeof(param); + param.nVersion = KOmxVersion; + param.nPortIndex = aSourcePort; + param.eBufferSupplier = aSupplier; + OMX_ERRORTYPE error = source->SetParameter(source, OMX_IndexParamCompBufferSupplier, ¶m); + if(error != aExpectedSourceError) + { + ERR_PRINTF3(_L("MosBufferSupplierOverrideL source->SetParameter error 0x%X, expected 0x%X"), error, aExpectedSourceError); + return EFalse; + } + + param.nPortIndex = aSinkPort; + error = sink->SetParameter(sink, OMX_IndexParamCompBufferSupplier, ¶m); + if(error != aExpectedSinkError) + { + ERR_PRINTF3(_L("MosBufferSupplierOverrideL sink->SetParameter error 0x%X, expected 0x%X"), error, aExpectedSinkError); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetCameraOneShotL(const TDesC8& aComp, TInt aIsOneShot, OMX_ERRORTYPE aExpectedError) + { + //TODO DL + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_SENSORMODETYPE sensorModeType; + sensorModeType.nSize = sizeof(OMX_PARAM_SENSORMODETYPE); + sensorModeType.nVersion = KOmxVersion; + sensorModeType.nPortIndex = OMX_ALL; + OMX_ERRORTYPE error = component->GetParameter(component,OMX_IndexParamCommonSensorMode,&sensorModeType); + if(error) + { + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + + sensorModeType.bOneShot = aIsOneShot ? static_cast(ETrue) : static_cast(EFalse); + error = component->SetParameter(component,OMX_IndexParamCommonSensorMode,&sensorModeType); + + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosSetCameraOneShotL SetParameter() error 0x%X, expected 0x%X"), error, aExpectedError); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosSetCameraCaptureL(const TDesC8& aComp, TInt aPortIndex, TInt aIsCapturing, OMX_ERRORTYPE aExpectedError) + { + //TODO DL + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_SYMBIAN_CONFIG_BOOLEANTYPE isCapturing; + isCapturing.nSize = sizeof(OMX_SYMBIAN_CONFIG_BOOLEANTYPE); + isCapturing.nVersion = KOmxVersion; + isCapturing.nPortIndex = aPortIndex; + OMX_INDEXTYPE index; + isCapturing.bEnabled = aIsCapturing ? OMX_TRUE : OMX_FALSE; + + OMX_ERRORTYPE check = OMX_GetExtensionIndex(component,"OMX.Symbian.Index.Config.Common.ExtCapturing",&index); + + if(check != OMX_ErrorNone) + { + return EFalse; + } + + OMX_ERRORTYPE error = component->SetConfig(component,/*(OMX_INDEXTYPE)*/index,&isCapturing); + + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosSetCameraCaptureL SetConfig() error 0x%X, expected 0x%X"), error, aExpectedError); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosSetVideoPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aWidth, TInt aHeight, OMX_COLOR_FORMATTYPE* aColorFormat, OMX_VIDEO_CODINGTYPE* aCodingType, TInt aStride, TReal aFps, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error) + { + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + if(aWidth != -1) + { + portDef.format.video.nFrameWidth = aWidth; + } + if(aHeight != -1) + { + portDef.format.video.nFrameHeight = aHeight; + } + + if (aColorFormat) + { + portDef.format.video.eColorFormat = *aColorFormat; + } + + if (aCodingType) + { + portDef.format.video.eCompressionFormat = *aCodingType; + } + + if(aStride != -1) + { + portDef.format.video.nStride = aStride; + } +#ifndef HREF_ED_WITHOUT_FLOATING_POINT + if(aFps != -1) + { + //TODO Fixup by removing below camera case, once camera team make appropiate changes to validateframerate function. + //Currently the camera function only allows fps >=15 AND <=120 and it isnt in the Q16 format that is required. + //Leave in the next two lines uncommented. + //TUint32 fpsQ16 = (TUint32) (aFps * 65536 + 0.5); + //portDef.format.video.xFramerate = fpsQ16; + //Changed xml file from 10fps to 15fps due to camera constraint.Will need to be changed back also + //BEGIN HACK CODE + _LIT8(KCamera,"OMX.SYMBIAN.VIDEO.CAMERASOURCE"); + _LIT8(KLogicalILCamera,"OMX.SYMBIAN.LOGICAL.VIDEO.CAMERASOURCE"); + TBool cameraTest = EFalse; + for(TInt index = 0, count = iComponents.Count(); index < count; index++) + { + const CComponentInfo* componentInfo = iComponents[index]; + if(componentInfo->iComponent == component) + { + if((*(componentInfo->iComponentName) == KCamera)||(*(componentInfo->iComponentName) == KLogicalILCamera)) + { + portDef.format.video.xFramerate = aFps; + cameraTest = ETrue; + } + break; + } + } + if(cameraTest == EFalse) + { + TUint32 fpsQ16 = (TUint32) (aFps * 65536 + 0.5); + portDef.format.video.xFramerate = fpsQ16; + } + } + //END HACK CODE. +#else + portDef.format.video.xFramerate = 0; +#endif //HREF_ED_WITHOUT_FLOATING_POINT + error = component->SetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosSetVideoPortDefL SetParameter() error 0x%X, expected 0x%X"), error, aExpectedError); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosCheckStateL(const TDesC8& aComp, OMX_STATETYPE aState) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + OMX_STATETYPE state; + OMX_ERRORTYPE error = component->GetState(component, &state); + if(error) + { + FailWithOmxError(_L("GetState()"), error); + return EFalse; + } + if(state != aState) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + ERR_PRINTF4(_L("Expected component %S to be in state %S, actually in %S"), &compConverted, StateDes(aState), StateDes(state)); + StopTest(EFail); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosCheckVideoPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aWidth, TInt aHeight, OMX_VIDEO_CODINGTYPE aCoding, OMX_COLOR_FORMATTYPE aColorFormat) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error) + { + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + OMX_VIDEO_PORTDEFINITIONTYPE& vidDef = portDef.format.video; + if( vidDef.nFrameWidth == aWidth && + vidDef.nFrameHeight == aHeight && + vidDef.eCompressionFormat == aCoding && + vidDef.eColorFormat == aColorFormat) + { + return ETrue; + } + else + { + ERR_PRINTF1(_L("video port definition did not match expected values")); + StopTest(EFail); + return EFalse; + } + } + +TBool ROmxScriptTest::MosCheckMetaDataL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& aData) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_CONFIG_METADATAITEMTYPE* metadata = reinterpret_cast(new(ELeave) TUint8[102400]); + CleanupStack::PushL(metadata); + + metadata->nSize = 102400; + metadata->nVersion = KOmxVersion; + metadata->eScopeMode = aScope; + metadata->nScopeSpecifier = aPortIndex; + metadata->nMetadataItemIndex = aAtomIndex; + metadata->nKeySizeUsed = aAtomType.Length(); + + TPtr8 keyDes(metadata->nKey, metadata->nKeySizeUsed); + keyDes = aAtomType; + + metadata->nValueMaxSize = metadata->nSize - _FOFF(OMX_CONFIG_METADATAITEMTYPE, nValue); + + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexConfigMetadataItem, metadata); + if(error) + { + CleanupStack::PopAndDestroy(metadata); + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + + TPtrC8 valueDes(metadata->nValue, metadata->nValueSizeUsed); + if(valueDes.Compare(aData) == 0) + { + CleanupStack::PopAndDestroy(metadata); + return ETrue; + } + else + { + ERR_PRINTF1(_L("Did not read metedata")); + CleanupStack::PopAndDestroy(metadata); + StopTest(EFail); + return EFalse; + } + } + +TBool ROmxScriptTest::MosGetParameterUnknownIndexTypeL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& /*aData*/) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_CONFIG_METADATAITEMTYPE* metadata = reinterpret_cast(new(ELeave) TUint8[102400]); + CleanupStack::PushL(metadata); + + metadata->nSize = 102400; + metadata->nVersion = KOmxVersion; + metadata->eScopeMode = aScope; + metadata->nScopeSpecifier = aPortIndex; + metadata->nMetadataItemIndex = aAtomIndex; + metadata->nKeySizeUsed = aAtomType.Length(); + + TPtr8 keyDes(metadata->nKey, metadata->nKeySizeUsed); + keyDes = aAtomType; + + metadata->nValueMaxSize = metadata->nSize - _FOFF(OMX_CONFIG_METADATAITEMTYPE, nValue); + + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamAudioG723, metadata); + INFO_PRINTF2(_L("MosGetParameterUnknownIndexTypeL: %d"), error); + + CleanupStack::PopAndDestroy(metadata); + + if(error) + { + // This is what we expected + return ETrue; + } + + ERR_PRINTF1(_L("MosGetParameterUnknownIndexTypeL unexpectedly received OMX_ErrorNone")); + StopTest(EFail); + return EFalse; + } + +TBool ROmxScriptTest::MosSetParameterUnknownIndexTypeL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& /*aData*/) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_CONFIG_METADATAITEMTYPE* metadata = reinterpret_cast(new(ELeave) TUint8[102400]); + CleanupStack::PushL(metadata); + + metadata->nSize = 102400; + metadata->nVersion = KOmxVersion; + metadata->eScopeMode = aScope; + metadata->nScopeSpecifier = aPortIndex; + metadata->nMetadataItemIndex = aAtomIndex; + metadata->nKeySizeUsed = aAtomType.Length(); + + TPtr8 keyDes(metadata->nKey, metadata->nKeySizeUsed); + keyDes = aAtomType; + + metadata->nValueMaxSize = metadata->nSize - _FOFF(OMX_CONFIG_METADATAITEMTYPE, nValue); + + OMX_ERRORTYPE error = component->SetParameter(component, OMX_IndexParamAudioG723, metadata); + + CleanupStack::PopAndDestroy(metadata); + + if(error) + { + // This is what we expected + return ETrue; + } + + ERR_PRINTF1(_L("MosSetParameterUnknownIndexTypeL unexpectedly received OMX_ErrorNone")); + StopTest(EFail); + return EFalse; + } +TBool ROmxScriptTest::MosDisablePort(const TDesC8& aComp, TInt aPortIndex) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_ERRORTYPE error = component->SendCommand(component, OMX_CommandPortDisable, aPortIndex, NULL); + if(error) + { + FailWithOmxError(aComp, _L("OMX_SendCommand(OMX_CommandPortDisable)"), error); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosEnablePort(const TDesC8& aComp, TInt aPortIndex) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_ERRORTYPE error = component->SendCommand(component, OMX_CommandPortEnable, aPortIndex, NULL); + if(error) + { + FailWithOmxError(aComp, _L("OMX_SendCommand(OMX_CommandPortEnable)"), error); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosIgnoreEventL(const TDesC8& aComp, OMX_EVENTTYPE aEvent, TUint32 aData1, TUint32 aData2) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + TExpectedEvent event; + event.iComponent = component; + event.iEvent = aEvent; + event.iData1 = aData1; + event.iData2 = aData2; + event.iEventData = NULL; + iIgnoredEvents.AppendL(event); + + return ETrue; + } + +TBool ROmxScriptTest::MosSetPcmAudioPortDefL(const TDesC8& aComp, + TInt aPortIndex, + TInt aNumChannels, + TInt aSamplingRate, + TInt aBitsperSample, + OMX_NUMERICALDATATYPE aNumData, + OMX_ENDIANTYPE aEndian, + OMX_BOOL* aInterleaved, + const TDesC8* aEncoding ) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_AUDIO_PARAM_PCMMODETYPE pcmModeType; + pcmModeType.nSize = sizeof(pcmModeType); + pcmModeType.nVersion = KOmxVersion; + pcmModeType.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamAudioPcm, &pcmModeType); + if(error) + { + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + if(aNumChannels != KErrNotFound) + { + pcmModeType.nChannels = aNumChannels; + } + if(aSamplingRate != KErrNotFound) + { + pcmModeType.nSamplingRate = aSamplingRate; + } + if(aBitsperSample != KErrNotFound) + { + pcmModeType.nBitPerSample = aBitsperSample; + } + if((aNumData != OMX_NumercialDataMax) && (aNumData != KErrNotFound)) + { + pcmModeType.eNumData = aNumData; + } + if((aEndian != OMX_EndianMax) && (aEndian != KErrNotFound)) + { + pcmModeType.eEndian = aEndian; + } + if(aInterleaved != NULL) + { + pcmModeType.bInterleaved = *aInterleaved; + } + if (aEncoding) + { + if (*aEncoding==_L8("linear")) pcmModeType.ePCMMode = OMX_AUDIO_PCMModeLinear; + else if (*aEncoding==_L8("alaw")) pcmModeType.ePCMMode = OMX_AUDIO_PCMModeALaw; + else if (*aEncoding==_L8("mulaw")) pcmModeType.ePCMMode = OMX_AUDIO_PCMModeMULaw; + else FailWithOmxError(_L("Invalid PCM encoding parameter"), OMX_ErrorBadParameter); + } + error = component->SetParameter(component, OMX_IndexParamAudioPcm, &pcmModeType); + if(error) + { + FailWithOmxError(_L("SetParameter()"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetConfigAudioMuteL(const TDesC8& aComp, + TInt aPortIndex, + TBool aMute) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_AUDIO_CONFIG_MUTETYPE audioMuteType; + audioMuteType.nSize = sizeof(audioMuteType); + audioMuteType.nVersion = KOmxVersion; + audioMuteType.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetConfig(component, OMX_IndexConfigAudioMute, &audioMuteType); + if(error) + { + FailWithOmxError(_L("GetConfig()"), error); + return EFalse; + } + audioMuteType.bMute = (aMute ? OMX_TRUE : OMX_FALSE); + + error = component->SetConfig(component, OMX_IndexConfigAudioMute, &audioMuteType); + if(error) + { + FailWithOmxError(_L("SetConfig()"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosCheckConfigAudioMuteL(const TDesC8& aComp, + TInt aPortIndex, + TBool aMute) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + User::Leave(KErrGeneral); + } + + OMX_AUDIO_CONFIG_MUTETYPE audioMuteType; + audioMuteType.nSize = sizeof(audioMuteType); + audioMuteType.nVersion = KOmxVersion; + audioMuteType.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetConfig(component, OMX_IndexConfigAudioMute, &audioMuteType); + if(error) + { + FailWithOmxError(_L("GetConfig()"), error); + return EFalse; + } + + if(audioMuteType.bMute != aMute) + { + ERR_PRINTF1(_L("Mute not what expected.")); + StopTest(KErrGeneral, EFail); + return EFalse; + } + return ETrue; + } + + + + +TBool ROmxScriptTest::MosSetConfigAudioVolumeL(const TDesC8& aComp, + TInt aPortIndex, + TBool aLinear, + TInt aMinVolume, + TInt aMaxVolume, + TInt aVolume, + OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_AUDIO_CONFIG_VOLUMETYPE audioVolumeType; + audioVolumeType.nSize = sizeof(audioVolumeType); + audioVolumeType.nVersion = KOmxVersion; + audioVolumeType.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetConfig(component, OMX_IndexConfigAudioVolume, &audioVolumeType); + if(error) + { + FailWithOmxError(_L("GetConfig()"), error); + return EFalse; + } + if(aMinVolume != -1) + { + audioVolumeType.sVolume.nMin = aMinVolume; + } + if(aMaxVolume != -1) + { + audioVolumeType.sVolume.nMax = aMaxVolume; + } + if(aVolume != -1) + { + audioVolumeType.sVolume.nValue = aVolume; + } + audioVolumeType.bLinear = (aLinear ? OMX_TRUE : OMX_FALSE); + + error = component->SetConfig(component, OMX_IndexConfigAudioVolume, &audioVolumeType); + if(error != aExpectedError) + { + FailWithOmxError(_L("SetConfig()"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosCheckConfigAudioVolumeL(const TDesC8& aComp, + TInt aPortIndex, + TBool aLinear, + TInt aMinVolume, + TInt aMaxVolume, + TInt aVolume) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + User::Leave(KErrGeneral); + } + + OMX_AUDIO_CONFIG_VOLUMETYPE audioVolumeType; + audioVolumeType.nSize = sizeof(audioVolumeType); + audioVolumeType.nVersion = KOmxVersion; + audioVolumeType.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetConfig(component, OMX_IndexConfigAudioVolume, &audioVolumeType); + if(error) + { + FailWithOmxError(_L("GetConfig()"), error); + User::Leave(KErrGeneral); + } + if(aMinVolume != -1) + { + if (audioVolumeType.sVolume.nMin != aMinVolume) + { + ERR_PRINTF1(_L("Min volume not what expected.")); + StopTest(KErrGeneral, EFail); + return EFalse; + } + } + if(aMaxVolume != -1) + { + if (audioVolumeType.sVolume.nMax != aMaxVolume) + { + ERR_PRINTF1(_L("Max volume not what expected.")); + StopTest(KErrGeneral, EFail); + return EFalse; + } + } + if(aVolume != -1) + { + if (audioVolumeType.sVolume.nValue != aVolume) + { + ERR_PRINTF1(_L("Volume not what expected.")); + StopTest(KErrGeneral, EFail); + return EFalse; + } + } + if(audioVolumeType.bLinear != aLinear) + { + ERR_PRINTF1(_L("Linear not what expected.")); + StopTest(KErrGeneral, EFail); + return EFalse; + } + return ETrue; + } + + +TBool ROmxScriptTest::MosSetAacAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aNumChannels, TInt aSamplingRate, TInt aBitRate, TInt aAudioBandwidth, TInt aFrameLength, TInt aAacTools, TInt aAacErTools, TInt aProfile, TInt aStreamFormat, TInt aChannelMode) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_AUDIO_PARAM_AACPROFILETYPE aacProfile; + aacProfile.nSize = sizeof(aacProfile); + aacProfile.nVersion = KOmxVersion; + aacProfile.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamAudioAac, &aacProfile); + if(error) + { + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + + if(aNumChannels != -1) + { + aacProfile.nChannels = aNumChannels; + } + if(aSamplingRate != -1) + { + aacProfile.nSampleRate = aSamplingRate; + } + if(aBitRate != -1) + { + aacProfile.nBitRate = aBitRate; + } + if(aAudioBandwidth != -1) + { + aacProfile.nAudioBandWidth = aAudioBandwidth; + } + if(aFrameLength != -1) + { + aacProfile.nFrameLength = aFrameLength; + } + if(aAacTools != -1) + { + aacProfile.nAACtools = aAacTools; + } + if(aAacErTools != -1) + { + aacProfile.nAACERtools = aAacErTools; + } + if(aProfile != -1) + { + aacProfile.eAACProfile = static_cast(aProfile); + } + if(aStreamFormat != -1) + { + aacProfile.eAACStreamFormat = static_cast(aStreamFormat); + } + if(aChannelMode != -1) + { + aacProfile.eChannelMode = static_cast(aChannelMode); + } + + error = component->SetParameter(component, OMX_IndexParamAudioAac, &aacProfile); + if(error) + { + FailWithOmxError(_L("SetParameter()"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, OMX_AUDIO_CODINGTYPE* aCodingType, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error) + { + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + if(aCodingType) + { + portDef.format.audio.eEncoding = *aCodingType; + } + error = component->SetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error != aExpectedError) + { + TBuf<64> errorDes; + OMXUtil::ErrorDes(error, errorDes); + TBuf<64> expectedErrorDes; + OMXUtil::ErrorDes(aExpectedError, expectedErrorDes); + ERR_PRINTF4(_L("SetParameter(OMX_IndexParamPortDefinition) portDef.format.audio.eEncoding %d returned %S but expected %S OMX_ErrorOverflow or OMX_ErrorUnsupportedSetting"), + portDef.format.audio.eEncoding, &errorDes, &expectedErrorDes); + StopTest(EFail); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetRefClockTypeL(const TDesC8& aComp, OMX_TIME_REFCLOCKTYPE aRefClockType) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE conf; + conf.nVersion = KOmxVersion; + conf.nSize = sizeof(conf); + conf.eClock = aRefClockType; + + OMX_ERRORTYPE error = component->SetConfig(component, OMX_IndexConfigTimeActiveRefClock, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_SetConfig(OMX_IndexConfigTimeActiveRefClock)"), error); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosSetClockTimeScale(const TDesC8& aComp, OMX_S32 aScale) +{ + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + INFO_PRINTF2(_L("MosSetClockTimeScale %d"), aScale); + + OMX_TIME_CONFIG_SCALETYPE conf; + conf.nSize = sizeof(conf); + conf.nVersion = KOmxVersion; + conf.xScale = aScale; + + OMX_ERRORTYPE error = component->SetConfig(component, OMX_IndexConfigTimeScale, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_SetConfig(OMX_IndexConfigTimeClockState)"), error); + return EFalse; + } + + return ETrue; +} + +TBool ROmxScriptTest::MosSetClockStateL(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aClockState, TInt aStartTime, TInt aOffset, TUint32 aWaitMask) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_TIME_CONFIG_CLOCKSTATETYPE conf; + conf.nVersion = KOmxVersion; + conf.nSize = sizeof(conf); + conf.eState = aClockState; + conf.nStartTime = aStartTime; + conf.nOffset = aOffset; + conf.nWaitMask = aWaitMask; + + OMX_ERRORTYPE error = component->SetConfig(component, OMX_IndexConfigTimeClockState, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_SetConfig(OMX_IndexConfigTimeClockState)"), error); + return EFalse; + } + + return ETrue; + } + +// Buffer component handler +TBool ROmxScriptTest::InitialiseBufferHandlerL(const TDesC8& aComp, TDesC& aName, const TDesC8* aType) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + // Buffer component + _LIT8(extensionBuf1, "OMX.SYMBIAN.INDEX.PARAM.BUFFERCHUNK"); + TBuf8<45> extension; + extension.Copy(extensionBuf1); + + OMX_INDEXTYPE indexType = OMX_IndexMax; + OMX_ERRORTYPE error = component->GetExtensionIndex(component, (OMX_STRING) extension.PtrZ(), &indexType); + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetExtensionIndex"), error); + return EFalse; + } + + OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA chunkData; + chunkData.nSize = sizeof(chunkData); + chunkData.nVersion = KOmxVersion; + chunkData.nPortIndex = 0; + error = component->GetParameter(component, indexType, &chunkData); + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = 0; + + error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + OMX_SYMBIAN_PARAM_BUFFER_SIZE bufferSize; + bufferSize.nSize = sizeof(bufferSize); + bufferSize.nVersion = KOmxVersion; + bufferSize.nPortIndex = 0; + + error = component->GetParameter(component, static_cast(OMX_SymbianIndexParamBufferSize), &bufferSize); + + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + if ((aType != NULL) && (*aType == _L8("mpeg4"))) + { + iBufferHandler = CVideoBufferHandlerMPEG4::NewL(aName, chunkData, bufferSize, portDef); + } + else + { + iBufferHandler = CVideoBufferHandler::NewL(aName, chunkData, bufferSize, portDef); + } + + return ETrue; + } + +void ROmxScriptTest::StartBufferHandler() + { + if ( !iBufferHandler ) + { + ERR_PRINTF1(_L("ROmxScriptTest::StartBufferHander() Exception: Buffer handler not created")); + StopTest(EFail); + } + + iBufferHandler->Start(); + } + + +void ROmxScriptTest::SendInvalidBufferId(TInt aInvalidId) + { + if ( !iBufferHandler ) + { + ERR_PRINTF1(_L("ROmxScriptTest::SendInvalidBufferId() Exception: Buffer handler not created")); + StopTest(EFail); + } + + iBufferHandler->SetSendInvalidBufferId(aInvalidId); + iBufferHandler->Start(); + } + + + + +void ROmxScriptTest::StopBufferHandler() + { + if ( !iBufferHandler ) + { + ERR_PRINTF1(_L("ROmxScriptTest::StopBufferHandler() Exception: Buffer handler not stopped")); + StopTest(EFail); + } + + iBufferHandler->Cancel(); + } + +// Buffer sink component handler +TBool ROmxScriptTest::InitialiseBufferSinkHandlerL(const TDesC8& aComp, TDesC& aName) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + // Buffer component + _LIT8(extensionBuf1, "OMX.SYMBIAN.INDEX.PARAM.BUFFERCHUNK"); + TBuf8<45> extension; + extension.Copy(extensionBuf1); + + OMX_INDEXTYPE indexType = OMX_IndexMax; + OMX_ERRORTYPE error = component->GetExtensionIndex(component, (OMX_STRING) extension.PtrZ(), &indexType); + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetExtensionIndex"), error); + return EFalse; + } + + OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA chunkData; + chunkData.nSize = sizeof(chunkData); + chunkData.nVersion = KOmxVersion; + chunkData.nPortIndex = 0; + error = component->GetParameter(component, indexType, &chunkData); + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = 0; + + error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + OMX_SYMBIAN_PARAM_BUFFER_SIZE bufferSize; + bufferSize.nSize = sizeof(bufferSize); + bufferSize.nVersion = KOmxVersion; + bufferSize.nPortIndex = 0; + + error = component->GetParameter(component, static_cast(OMX_SymbianIndexParamBufferSize), &bufferSize); + + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + iBufferSinkHandler = CVideoBufferSinkHandler::NewL(aName, chunkData, bufferSize, portDef); + + return ETrue; + } + +void ROmxScriptTest::StartBufferSinkHandler() + { + if ( !iBufferSinkHandler ) + { + ERR_PRINTF1(_L("ROmxScriptTest::StartBufferSinkHandler() Exception: Buffer sink handler not created")); + StopTest(EFail); + } + + iBufferSinkHandler->Start(); + } + +void ROmxScriptTest::StopBufferSinkHandler() + { + if ( !iBufferSinkHandler ) + { + ERR_PRINTF1(_L("ROmxScriptTest::StopBufferSinkHandler() Exception: Buffer sink handler not stopped")); + StopTest(EFail); + } + + iBufferSinkHandler->Cancel(); + } + +TBool ROmxScriptTest::MosNegativeSetDataChunk(const TDesC8& aComp, OMX_ERRORTYPE aExpectedError, TInt /*aExpectedSystemError*/) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + // Buffer component + _LIT8(extensionBuf1, "OMX.SYMBIAN.INDEX.PARAM.BUFFERCHUNK"); + TBuf8<45> extension; + extension.Copy(extensionBuf1); + + OMX_INDEXTYPE indexType = OMX_IndexMax; + OMX_ERRORTYPE error = component->GetExtensionIndex(component, (OMX_STRING) extension.PtrZ(), &indexType); + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetExtensionIndex"), error); + return EFalse; + } + + OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA chunkData; + chunkData.nSize = sizeof(chunkData); + chunkData.nVersion = KOmxVersion; + chunkData.nPortIndex = 0; + error = component->GetParameter(component, indexType, &chunkData); + + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + if (NULL == chunkData.nChunk ) + { + FailWithOmxError(_L("NULL TBufSrcComponentHandles"), OMX_ErrorInvalidState); + return EFalse; + } + + chunkData.nChunk = 666; + error = component->SetParameter(component, indexType , &chunkData); + + if (aExpectedError != error) + { + FailWithOmxError(_L("SetParameter"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosChangeFilledBufferLength(const TDesC8& aComp, TInt aValue) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + iBufferHandler->ChangeFilledBufferLength(aValue); + + return ETrue; + } + +TBool ROmxScriptTest::MosSetOMX_SymbianIndexParamBufferMsgQueueData(const TDesC8& aComp, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_SYMBIAN_PARAM_BUFFER_MSGQUEUE bufferMsgQueue; + bufferMsgQueue.nSize = sizeof(bufferMsgQueue); + bufferMsgQueue.nVersion = KOmxVersion; + bufferMsgQueue.nPortIndex = 0; + + OMX_ERRORTYPE error = component->SetParameter(component, static_cast(OMX_SymbianIndexParamBufferMsgQueueData), &bufferMsgQueue); + if(aExpectedError != error) + { + ERR_PRINTF3(_L("MosSetOMX_SymbianIndexParamBufferMsgQueueData SetParameter() error 0x%X, expected 0x%X"), error, aExpectedError); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetBufferSize(const TDesC8& aComp, TInt aPortIndex, TInt aData, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + OMX_SYMBIAN_PARAM_BUFFER_SIZE bufferSize; + bufferSize.nSize = sizeof(bufferSize); + bufferSize.nVersion = KOmxVersion; + bufferSize.nPortIndex = aPortIndex; + bufferSize.nBufferSize = aData; + + OMX_ERRORTYPE error = component->SetParameter(component, static_cast(OMX_SymbianIndexParamBufferSize), &bufferSize); + if(aExpectedError != error) + { + ERR_PRINTF3(_L("MosSetBufferSize SetParameter() error 0x%X, expected 0x%X"), error, aExpectedError); + return EFalse; + } + return ETrue; + } + + +TBool ROmxScriptTest::MosGetAndCompareBufferCount(const TDesC8& aComp, TInt aPortIndex, TInt aDataToCompare) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nVersion = KOmxVersion; + portDef.nSize = sizeof(portDef); + portDef.nPortIndex = aPortIndex; + + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error) + { + FailWithOmxError(_L("OMX_GetParameter()"), error); + return EFalse; + } + if (aDataToCompare != portDef.nBufferCountActual) + { + ERR_PRINTF3(_L("Compare buffer source count - expecting %d, actual %d"), aDataToCompare, portDef.nBufferCountActual); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosGetAndCompareBufferSize(const TDesC8& aComp, TInt aPortIndex, TInt aDataToCompare) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_SYMBIAN_PARAM_BUFFER_SIZE bufferSize; + bufferSize.nSize = sizeof(bufferSize); + bufferSize.nVersion = KOmxVersion; + bufferSize.nPortIndex = aPortIndex; + + OMX_ERRORTYPE error = component->GetParameter(component, static_cast(OMX_SymbianIndexParamBufferSize), &bufferSize); + if(error) + { + FailWithOmxError(_L("OMX_GetParameter()"), error); + return EFalse; + } + if (bufferSize.nBufferSize != aDataToCompare) + { + ERR_PRINTF3(_L("Compare buffer source size - expecting %d, actual %d"), aDataToCompare, bufferSize.nBufferSize); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosSetVideoEncQuantL(const TDesC8& aComp, TInt aPortIndex, TInt aQpb) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_VIDEO_PARAM_QUANTIZATIONTYPE videoQuantization; + videoQuantization.nSize = sizeof(videoQuantization); + videoQuantization.nVersion = KOmxVersion; + videoQuantization.nPortIndex = aPortIndex; + videoQuantization.nQpB = aQpb; + + OMX_ERRORTYPE error = component->SetParameter(component, static_cast(OMX_IndexParamVideoQuantization), &videoQuantization); + if(error) + { + FailWithOmxError(_L("MosSetVideoEncQuantL SetParameter()"), error); + return EFalse; + } + + error = component->GetParameter(component, OMX_IndexParamVideoQuantization, &videoQuantization); + if(error) + { + FailWithOmxError(_L("MosSetVideoEncQuantL GetParameter()"), error); + return EFalse; + } + + if (videoQuantization.nQpB != aQpb) + { + ERR_PRINTF3(_L("MosSetVideoEncQuantL Compare QPB failed - Got %d, Expected %d"), videoQuantization.nQpB, aQpb); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosSetVideoEncMotionVectL(const TDesC8& aComp, TInt aPortIndex, + TInt aAccuracy, TInt aSxSearchrange, TInt aSySearchrange, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_VIDEO_PARAM_MOTIONVECTORTYPE motionVect; + motionVect.nSize = sizeof(motionVect); + motionVect.nVersion = KOmxVersion; + motionVect.nPortIndex = aPortIndex; + motionVect.eAccuracy = (OMX_VIDEO_MOTIONVECTORTYPE)aAccuracy; + motionVect.sXSearchRange = aSxSearchrange; + motionVect.sYSearchRange = aSySearchrange; + + OMX_ERRORTYPE error = component->SetParameter(component, static_cast(OMX_IndexParamVideoMotionVector), &motionVect); + if(aExpectedError != error) + { + ERR_PRINTF3(_L("MosSetVideoEncMotionVectL SetParameter() returned error 0x%X, expected error 0x%X"), error, aExpectedError); + return EFalse; + } + + if (aExpectedError) + { + return ETrue; + } + + error = component->GetParameter(component, OMX_IndexParamVideoMotionVector, &motionVect); + if(error) + { + FailWithOmxError(_L("MosSetVideoEncMotionVectL GetParameter()"), error); + return EFalse; + } + + if (motionVect.eAccuracy != aAccuracy || motionVect.sXSearchRange != aSxSearchrange || + motionVect.sYSearchRange != aSySearchrange) + { + ERR_PRINTF1(_L("MosSetVideoEncMotionVectL GetParameter() did not return expeccted value")); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosSetVideoEncMpeg4TypeL(const TDesC8& aComp, TInt aPortIndex, + OMX_VIDEO_MPEG4PROFILETYPE aMpeg4Profile, OMX_VIDEO_MPEG4LEVELTYPE aMpeg4Level, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_VIDEO_PARAM_MPEG4TYPE mpeg4; + mpeg4.nSize = sizeof(mpeg4); + mpeg4.nVersion = KOmxVersion; + mpeg4.nPortIndex = aPortIndex; + mpeg4.eProfile = aMpeg4Profile; + mpeg4.eLevel = aMpeg4Level; + + OMX_ERRORTYPE error = component->SetParameter(component, static_cast(OMX_IndexParamVideoMpeg4), &mpeg4); + if(aExpectedError != error) + { + ERR_PRINTF3(_L("MosSetVideoEncMpeg4TypeL SetParameter() returned error 0x%X, expected error 0x%X"), error, aExpectedError); + return EFalse; + } + if (aExpectedError) + { + return ETrue; + } + + error = component->GetParameter(component, OMX_IndexParamVideoMpeg4, &mpeg4); + if(error) + { + FailWithOmxError(_L("MosSetVideoEncMpeg4TypeL GetParameter()"), error); + return EFalse; + } + + if (mpeg4.eProfile != aMpeg4Profile || mpeg4.eLevel != aMpeg4Level) + { + ERR_PRINTF1(_L("MosSetVideoEncMpeg4TypeL GetParameter() did not return expeccted value")); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosSetVideoEncBitRateL(const TDesC8& aComp, TInt aPortIndex, + OMX_VIDEO_CONTROLRATETYPE aControlRate, TInt aTargetBitrate, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_VIDEO_PARAM_BITRATETYPE bitRate; + bitRate.nSize = sizeof(bitRate); + bitRate.nVersion = KOmxVersion; + bitRate.nPortIndex = aPortIndex; + bitRate.eControlRate = aControlRate; + bitRate.nTargetBitrate = aTargetBitrate; + + OMX_ERRORTYPE error = component->SetParameter(component, static_cast(OMX_IndexParamVideoBitrate), &bitRate); + if(aExpectedError != error) + { + ERR_PRINTF3(_L("MosSetVideoEncBitRateL SetParameter() returned error 0x%X, expected error 0x%X"), error, aExpectedError); + return EFalse; + } + if (aExpectedError) + { + return ETrue; + } + + error = component->GetParameter(component, OMX_IndexParamVideoBitrate, &bitRate); + if(error) + { + FailWithOmxError(_L("MosSetVideoEncBitRateL GetParameter()"), error); + return EFalse; + } + + if (bitRate.eControlRate != aControlRate || bitRate.nTargetBitrate != aTargetBitrate) + { + ERR_PRINTF1(_L("MosSetVideoEncBitRateL GetParameter() did not return expeccted value")); + return EFalse; + } + return ETrue; + } + +void ROmxScriptTest::WriteInt32(TUint8* aPtr, TInt32 aData) + { + aPtr[0] = TUint8(aData>>24); + aPtr[1] = TUint8(aData>>16); + aPtr[2] = TUint8(aData>>8); + aPtr[3] = TUint8(aData); + } + + +TBool ROmxScriptTest::ShortNameMatchComparison(const TDesC8* aShortName, const CComponentInfo& aComponentInfo) + { + if (*aShortName == *aComponentInfo.iShortName) + { + return ETrue; + } + return EFalse; + } + +TBool ROmxScriptTest::ComponentLogicalIL(const TDesC8& aName) + { + for(TInt index = 0, count = iComponents.Count(); index < count; index++) + { + CComponentInfo* component = iComponents[index]; + if(*(component->iShortName) == aName) + { + if(component->iComponentName->FindC(KILTypeString()) == KErrNotFound) + { + // is not LIL + return EFalse; + } + else + { + // is LIL + return ETrue; + } + } + } + ERR_PRINTF1(_L("LogicalILComponent() - Component not found")); + StopTest(EFail); + + return EFalse; + } + +TBool ROmxScriptTest::ComponentPhysicalIL(const TDesC8& aName) + { + for(TInt index = 0, count = iComponents.Count(); index < count; index++) + { + CComponentInfo* component = iComponents[index]; + if(*(component->iShortName) == aName) + { + if(component->iComponentName->FindC(KILTypeString) == KErrNotFound) + { + // is PIL + return ETrue; + } + else + { + // is not PIL + return EFalse; + } + } + } + ERR_PRINTF1(_L("PhysicalILComponent() - Component not found")); + StopTest(EFail); + + return EFalse; + } + +OMX_COMPONENTTYPE* ROmxScriptTest::ComponentByName(const TDesC8& aName) + { + for(TInt index = 0, count = iComponents.Count(); index < count; index++) + { + CComponentInfo* component = iComponents[index]; + if(*(component->iShortName) == aName) + { + return component->iComponent; + } + } + HBufC* name = HBufC::New(aName.Length()); + if(!name) + { + ERR_PRINTF1(_L("Component not found")); + StopTest(EFail); + } + else + { + name->Des().Copy(aName); + ERR_PRINTF2(_L("Component %S not found"), name); + delete name; + StopTest(EFail); + } + return NULL; + } + + + +void ROmxScriptTest::GetComponentName(const OMX_COMPONENTTYPE* aHandle, TDes& aName) + { + for(TInt index = 0, count = iComponents.Count(); index < count; index++) + { + const CComponentInfo* component = iComponents[index]; + if(component->iComponent == aHandle) + { + aName.Copy(*(component->iShortName)); + return; + } + } + ERR_PRINTF1(_L("Invalid component handle")); + StopTest(EFail); + aName = _L(""); + } + +void ROmxScriptTest::FailWithOmxError(const TDesC& aOperation, OMX_ERRORTYPE aError) + { + if(aError != OMX_ErrorNone) + { + TBuf<64> errorDes; + OMXUtil::ErrorDes(aError, errorDes); + ERR_PRINTF3(_L("%S returned %S"), &aOperation, &errorDes); + StopTest(EFail); + } + } + +void ROmxScriptTest::FailWithOmxError(const TDesC8& aComponent, const TDesC& aOperation, OMX_ERRORTYPE aError) + { + if(aError != OMX_ErrorNone) + { + TBuf<64> errorDes; + TBuf<64> componentDes16; + componentDes16.Copy(aComponent); + OMXUtil::ErrorDes(aError, errorDes); + ERR_PRINTF4(_L("%S->%S returned %S"), &componentDes16, &aOperation, &errorDes); + StopTest(EFail); + } + } + +void ROmxScriptTest::AllComponentsEOS() + { + EndWait(); + } + +void ROmxScriptTest::AllComponentsTransitioned(OMX_STATETYPE aNewState, + OMX_STATETYPE aOldState) + { + __ASSERT_ALWAYS(aOldState == iState, User::Invariant()); + iState = aNewState; + EndWait(); + } + +void ROmxScriptTest::EventReceived(OMX_COMPONENTTYPE* aComponent, OMX_EVENTTYPE aEvent, TUint32 aData1, TUint32 aData2, TAny* aEventData) + { + + if ((iMsgQueue.Handle()) && (aEvent == OMX_EventCmdComplete)) + { + iMsgQueue.Close(); + } + + + // If the Graphic Sink has created a surface, assign it to the window + if(aEvent == OMX_EventPortSettingsChanged) + { + if(aComponent == iGraphicSink) + { + if (aData1 == iExtSurfaceConfigIndex || + aData1 == OMX_IndexConfigCommonScale || + aData1 == OMX_IndexConfigCommonOutputSize || + aData1 == OMX_IndexConfigCommonInputCrop || + aData1 == OMX_IndexConfigCommonOutputCrop || + aData1 == OMX_IndexConfigCommonExclusionRect) + { + INFO_PRINTF1(_L("Surface configuration changed")); + + OMX_SYMBIAN_VIDEO_PARAM_SURFACECONFIGURATION surfaceConfigParam; + surfaceConfigParam.nSize = sizeof(OMX_SYMBIAN_VIDEO_PARAM_SURFACECONFIGURATION); + surfaceConfigParam.nVersion = KOmxVersion; + surfaceConfigParam.nPortIndex = 0; + + OMX_ERRORTYPE omxError = aComponent->GetParameter(aComponent, iExtSurfaceConfigIndex, &surfaceConfigParam); + if(omxError != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter(OMX_SymbianIndexParamVideoGFXSurfaceConfig)"), omxError); + return; + } + TSurfaceConfiguration& surfaceConfig = *reinterpret_cast(surfaceConfigParam.pSurfaceConfig); + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); + portDef.nVersion = KOmxVersion; + portDef.nPortIndex = 0; + omxError = aComponent->GetParameter(aComponent, OMX_IndexParamPortDefinition, &portDef); + if(omxError != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter(OMX_IndexParamPortDefinition)"), omxError); + return; + } + TSize inputSize(portDef.format.video.nFrameWidth, portDef.format.video.nFrameHeight); + INFO_PRINTF3(_L("Input size is %dx%d"), inputSize.iWidth, inputSize.iHeight); + + TSurfaceId surfaceId; + surfaceConfig.GetSurfaceId(surfaceId); + TInt err = iWindowManager->RegisterSurface(surfaceId); + if(KErrNone != err) + { + ERR_PRINTF1(_L("RegisterSurface failed")); + StopTest(err, EFail); + } + + // scale, rotate and centre to fit + // assumes square pixels + + TSize screenSize = iWindowManager->ScreenSize(); + + TBool iInputLandscape = inputSize.iWidth > inputSize.iHeight; + TBool iScreenLandscape = screenSize.iWidth > screenSize.iHeight; + + if (iVideoFitMode == EVideoFitRotateScaleAndCentre && + (iInputLandscape ^ iScreenLandscape)) + { + surfaceConfig.SetOrientation(CFbsBitGc::EGraphicsOrientationRotated270); + TInt tmp = inputSize.iWidth; + inputSize.iWidth = inputSize.iHeight; + inputSize.iHeight = tmp; + } + + TRect rect; + if( iVideoFitMode == EVideoFitScaleAndCentre || + iVideoFitMode == EVideoFitRotateScaleAndCentre) + { + if(!iScreenLandscape) + { + TInt displayHeight = screenSize.iWidth * inputSize.iHeight / inputSize.iWidth; + TInt top = screenSize.iHeight - displayHeight >> 1; + TInt bottom = top + displayHeight; + rect = TRect(0, top, screenSize.iWidth, bottom); + } + else + { + TInt displayWidth = screenSize.iHeight * inputSize.iWidth / inputSize.iHeight; + TInt left = screenSize.iWidth - displayWidth >> 1; + TInt right = left + displayWidth; + rect = TRect(left, 0, right, screenSize.iHeight); + } + } + else + { + TInt left = screenSize.iWidth - inputSize.iWidth >> 1; + TInt top = screenSize.iHeight - inputSize.iHeight >> 1; + rect = TRect(left, top, left + inputSize.iWidth, top + inputSize.iHeight); + } + + surfaceConfig.SetExtent(rect); + + err = iWindowManager->SetBackgroundSurface(surfaceConfig, ETrue); + if(KErrNone != err) + { + ERR_PRINTF2(_L("SetBackgroundSurface failed (%d)"), err); + StopTest(err, EFail); + return; + } + INFO_PRINTF1(_L("SetBackgroundSurface OK")); + iWindowManager->Flush(); + return; + } + } + } + + // ignore buffer flag events except EOS + if((aEvent == OMX_EventBufferFlag && (aData2 & OMX_BUFFERFLAG_EOS) == 0) /*|| (aEvent == OMX_EventNokiaFirstFrameDisplayed)*/) + { + return; + } + + TInt index = 0; + TInt count = iExpectedEvents.Count(); + for(; index < count; index++) + { + const TExpectedEvent& event = iExpectedEvents[index]; + if( event.iComponent == aComponent && + event.iEvent == aEvent && + event.iData1 == aData1 && + event.iData2 == aData2 && + event.iEventData == aEventData) + { + break; + } + } + if(index == count) + { + // event was not expected, see if we can ignore this event + TInt count1 = iIgnoredEvents.Count(); + TInt index1 = 0; + for(; index1 < count1; index1++) + { + const TExpectedEvent& event = iIgnoredEvents[index1]; + if( event.iComponent == aComponent && + event.iEvent == aEvent && + event.iData1 == aData1 && + event.iData2 == aData2 && + event.iEventData == aEventData) + { + return; + } + } + + // event was not expected and we can't ignore the event, so fail the test + TBuf<64> name; + GetComponentName(aComponent, name); + char hexBuf[11]; + TBuf<32> eventWideChar; + eventWideChar.Copy(TPtrC8((unsigned char*) format_OMX_EVENTTYPE(aEvent, hexBuf))); + ERR_PRINTF2(_L("Unexpected event received from component %S"), &name); + ERR_PRINTF5(_L("aEvent=%S aData1=0x%08X aData2=0x%08X, aEventData=0x%08X"), &eventWideChar, aData1, aData2, aEventData); + StopTest(EFail); + return; + } + iExpectedEvents.Remove(index); + if(iWaitingForEvents && iExpectedEvents.Count() == 0) + { + EndWait(); + } + } + +void ROmxScriptTest::ComponentTransitioned(OMX_STATETYPE aNewState, + OMX_STATETYPE aOldState) + { + __ASSERT_ALWAYS(aOldState == iState, User::Invariant()); + iState = aNewState; + EndWait(); + } + +void ROmxScriptTest::BufferDone(OMX_COMPONENTTYPE* aComponent, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) + { + if (iNonTunneledHandler) + { + iNonTunneledHandler->BufferDone(aComponent, aBufHdr, aSource); + } + + if(iPortBufferHandler) + { + iPortBufferHandler->BufferDone(aComponent, aBufHdr, aSource); + } + + } + +void ROmxScriptTest::TimerExpired() + { + EndWait(); + } + +void ROmxScriptTest::HashFileL(const TDesC& aFileName, TDes8& aHash, void (*aFilter1)(RBuf8&), void (*aFilter2)(RBuf8&), void (*aFilter3)(RBuf8&)) + { + const TInt KBufferSize = 1024; + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFile file; + User::LeaveIfError(file.Open(fs, aFileName, EFileRead | EFileShareReadersOnly)); + CleanupClosePushL(file); + + RBuf8 buf; + User::LeaveIfError(buf.Create(KBufferSize)); + CleanupClosePushL(buf); + + CMD5* md5 = CMD5::NewL(); + CleanupStack::PushL(md5); + + while(true) + { + User::LeaveIfError(file.Read(buf)); + if(buf.Length() == 0) + { + break; + } + + if (aFilter1) aFilter1(buf); + if (aFilter2) aFilter2(buf); + if (aFilter3) aFilter3(buf); + + md5->Hash(buf); + } + + aHash = md5->Final(); + + CleanupStack::PopAndDestroy(4); // fs, file, buf, md5 + } + + + +TBool ROmxScriptTest::HandleNonTunneledBuffers(OMX_STATETYPE aNewState, OMX_COMPONENTTYPE* aComp) + { + if (iNonTunneledHandler) + { + if (iState == OMX_StateLoaded && aNewState == OMX_StateIdle) + { + TRAPD(err, iNonTunneledHandler->AllocateBuffersL(aComp)); + if (err != KErrNone) + { + ERR_PRINTF2(_L("Non-tunneled AllocateBuffersL failed (%d)"), err); + return EFalse; + } + } + else if (iState == OMX_StateIdle && aNewState == OMX_StateExecuting) + { + TRAPD(err, iNonTunneledHandler->FillBuffers(aComp)); + if (err != KErrNone) + { + ERR_PRINTF2(_L("Non-tunneled FillBuffersL failed (%d)"), err); + return EFalse; + } + } + else if (iState == OMX_StateExecuting && aNewState == OMX_StateIdle) + { + TRAPD(err, iNonTunneledHandler->HoldBuffers(aComp)); + if (err != KErrNone) + { + ERR_PRINTF2(_L("Non-tunneled HoldBuffersL failed (%d)"), err); + return EFalse; + } + } + else if (iState == OMX_StateIdle && aNewState == OMX_StateLoaded) + { + TRAPD(err, iNonTunneledHandler->FreeBuffers(aComp)); + if (err != KErrNone) + { + ERR_PRINTF2(_L("Non-tunneled FreeBuffersL failed (%d)"), err); + return EFalse; + } + } + } + + return ETrue; + } + + +TBool ROmxScriptTest::HandlePortBufferHandler(OMX_STATETYPE aNewState, OMX_COMPONENTTYPE* aComp) + { + if(iPortBufferHandler) + { + if (iState == OMX_StateLoaded && aNewState == OMX_StateIdle) + { + TRAPD(err, iPortBufferHandler->AllocateBuffersL(aComp)); + if (err != KErrNone) + { + ERR_PRINTF2(_L("PortBufferHandler AllocateBuffersL failed (%d)"), err); + return EFalse; + } + } + else if (iState == OMX_StateIdle && aNewState == OMX_StateExecuting) + { + + } + else if (iState == OMX_StateExecuting && aNewState == OMX_StateIdle) + { + } + else if (iState == OMX_StateIdle && aNewState == OMX_StateLoaded) + { + TRAPD(err, iPortBufferHandler->FreeBuffers(aComp)); + if (err != KErrNone) + { + ERR_PRINTF2(_L("PortBufferHandler FreeBuffersL failed (%d)"), err); + return EFalse; + } + } + } + return ETrue; + } + +TBool ROmxScriptTest::MosFlushBuffer(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_ERRORTYPE error = component->SendCommand(component, OMX_CommandFlush, aPortIndex, NULL); + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosFlushBuffer SendCommand() error 0x%X, expected 0x%X"), error, aExpectedError); + return EFalse; + } + + return ETrue; + } + +/* + * This is a test to force the buffer(s) to require being flushed. + */ +TBool ROmxScriptTest::MosForceBufferSourceFlushBufferL(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError) + { + // setup the msg queue + TBuf<255> compWide; + compWide.Copy(aComp); + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + _LIT8(extensionBuf1, "OMX.SYMBIAN.INDEX.PARAM.BUFFERCHUNK"); + TBuf8<45> extension; + extension.Copy(extensionBuf1); + + OMX_INDEXTYPE indexType = OMX_IndexMax; + OMX_ERRORTYPE error = component->GetExtensionIndex(component, (OMX_STRING) extension.PtrZ(), &indexType); + + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetExtensionIndex"), error); + return EFalse; + } + + OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA chunkData; + + chunkData.nSize = sizeof(chunkData); + chunkData.nVersion = KOmxVersion; + chunkData.nPortIndex = 0; + error = component->GetParameter(component, indexType, &chunkData); + + if (error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + if (NULL == chunkData.nChunk ) + { + FailWithOmxError(_L("NULL TBufSrcComponentHandles"), OMX_ErrorInvalidState); + return EFalse; + } + + OMX_SYMBIAN_PARAM_BUFFER_SIZE bufferSize; + bufferSize.nSize = sizeof(bufferSize); + bufferSize.nVersion = KOmxVersion; + bufferSize.nPortIndex = 0; + error = component->GetParameter(component, static_cast(OMX_SymbianIndexParamBufferSize), &bufferSize); + + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("GetParameter"), error); + return EFalse; + } + + RChunk msgsChunk; + msgsChunk.SetHandle(chunkData.nChunk); + CleanupClosePushL(msgsChunk); + User::LeaveIfError(msgsChunk.Duplicate(RThread())); + + iMsgQueue.SetHandle(chunkData.nFilledBufferQueue); + User::LeaveIfError(iMsgQueue.Duplicate(RThread())); + + // fill it up with 2 messages + TInt numMessages = 2; // change this to alter the number of buffers stacked up. + TInt message = 0; + TMMSharedChunkBufConfig bufConfig; + bufConfig.iNumBuffers = numMessages; + bufConfig.iBufferSizeInBytes = bufferSize.nBufferSize; //passed into ConstructL() + TUint8* chunkBase = msgsChunk.Base(); + __ASSERT_ALWAYS(message < numMessages, User::Invariant()); + + TUint8* bufBase1 = chunkBase + (message * (bufConfig.iBufferSizeInBytes)); + TFilledBufferHeaderV2 header1; + header1.iOffset = bufBase1 - chunkBase; + header1.iFilledLength = 3; + header1.iTimeStamp = 0; + header1.iFlags = ETrue ? OMX_BUFFERFLAG_STARTTIME : 0; //is the first buffer. + + TInt sendError = iMsgQueue.Send(header1); + + if (sendError != KErrNone) + { + ERR_PRINTF2(_L("MosForceBufferSourceFlushBuffer MsgQueue Send() error 0x%X"), sendError); + iMsgQueue.Close(); + CleanupStack::PopAndDestroy(); // msgsChunk + return EFalse; + } + + message++; + TUint8* bufBase2 = chunkBase + (message * (bufConfig.iBufferSizeInBytes)); + TFilledBufferHeaderV2 header2; + header2.iOffset = bufBase2 - chunkBase; + header2.iFilledLength = 3; + header2.iTimeStamp = 0; + header2.iFlags = EFalse ? OMX_BUFFERFLAG_STARTTIME : 0; //is NOT the first buffer. + User::LeaveIfError(iMsgQueue.Send(header2)); + + // flush them while they're still outstanding + error = component->SendCommand(component, OMX_CommandFlush, aPortIndex, NULL); + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosForceBufferSourceFlushBuffer SendCommand() error 0x%X, expected 0x%X"), error, aExpectedError); + iMsgQueue.Close(); + CleanupStack::PopAndDestroy(); // msgsChunk + return EFalse; + } + + CleanupStack::PopAndDestroy(); // msgsChunk + return ETrue; + } + + + +TBool ROmxScriptTest::MosForceBufferSinkFlushBuffer(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError) + { + + + TBuf<255> compWide; + compWide.Copy(aComp); + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + + OMX_ERRORTYPE error = component->SendCommand(component, OMX_CommandFlush, aPortIndex, NULL); + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosForceFlushBufferSinkBuffer error 0x%X, expected 0x%X"), error, aExpectedError); + iMsgQueue.Close(); + return EFalse; + } + + return ETrue; + } + + + +TBool ROmxScriptTest::MosSetActiveStream(const TDesC8& aComp, TUint32 aPortIndex) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nVersion = KOmxVersion; + portDef.nSize = sizeof(portDef); + portDef.nPortIndex = aPortIndex; + + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamPortDefinition, &portDef); + if(error) + { + FailWithOmxError(_L("OMX_GetParameter()"), error); + return EFalse; + } + + error = component->SetParameter(component, OMX_IndexParamActiveStream, &portDef); + if((error != OMX_ErrorNone) && (error != OMX_ErrorUnsupportedSetting)) + { + FailWithOmxError(_L("SetParameter"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosGetActiveStream(const TDesC8& aComp, TUint32 aPortIndex) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nVersion = KOmxVersion; + portDef.nSize = sizeof(portDef); + portDef.nPortIndex = aPortIndex; + + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamActiveStream, &portDef); + if(error) + { + FailWithOmxError(_L("OMX_GetParameter()"), error); + return EFalse; + } + + return ETrue; + } + + +TBool ROmxScriptTest::MosSetVideoFitModeL(TVideoFitMode aVideoFitMode) + { + iVideoFitMode = aVideoFitMode; + return ETrue; + } + +// FIXME duplication with MosSetAacAudioPortDefL +TBool ROmxScriptTest::MosSetAACProfileL(const TDesC8& aComp, TInt aPortIndex, TInt aChannels, TInt aSamplingRate, TInt aBitRate, TInt aAudioBandwidth, TInt aFrameLength, TInt aAACTools, TInt aAACERTools, OMX_AUDIO_AACPROFILETYPE aProfile, OMX_AUDIO_AACSTREAMFORMATTYPE aStreamFormat, OMX_AUDIO_CHANNELMODETYPE aChannelMode) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_AUDIO_PARAM_AACPROFILETYPE param; + param.nSize = sizeof(param); + param.nVersion = KOmxVersion; + param.nPortIndex = aPortIndex; + + OMX_ERRORTYPE error = OMX_GetParameter(component, OMX_IndexParamAudioAac, ¶m); + if(error) + { + FailWithOmxError(_L("OMX_GetParameter(AudioAAC)"), error); + return EFalse; + } + + // TODO don't overwrite unspecified values + param.nChannels = aChannels; + param.nSampleRate = aSamplingRate; + param.nBitRate = aBitRate; + param.nAudioBandWidth = aAudioBandwidth; + param.nFrameLength = aFrameLength; + param.nAACtools = aAACTools; + param.nAACERtools = aAACERTools; + param.eAACProfile = aProfile; + param.eAACStreamFormat = aStreamFormat; + param.eChannelMode = aChannelMode; + + error = OMX_SetParameter(component, OMX_IndexParamAudioAac, ¶m); + if(error) + { + FailWithOmxError(_L("OMX_SetParameter(AudioAAC)"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosGetExtensionIndex(const TDesC8& aComp, const TDesC8& aParameterName, OMX_ERRORTYPE aExpectedError) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + TBuf8<128> extension; + extension.Copy(aParameterName); + + OMX_INDEXTYPE indexType = OMX_IndexMax; + OMX_ERRORTYPE error = component->GetExtensionIndex(component, (OMX_STRING) extension.PtrZ(), &indexType); + if(error != aExpectedError) + { + ERR_PRINTF3(_L("MosGetExtensionIndex GetExtensionIndex() error 0x%X, expected 0x%X"), error, aExpectedError); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosCheckTimeClockState(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aExpectedState) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + + if (!component) + { + StopTest(EFail); + return EFalse; + } + + OMX_TIME_CONFIG_CLOCKSTATETYPE timeClockState; + timeClockState.nSize = sizeof(timeClockState); + timeClockState.nVersion = KOmxVersion; + + if(component->GetConfig(component, OMX_IndexConfigTimeClockState, &timeClockState) != OMX_ErrorNone) + { + StopTest(EFail); + return EFalse; + } + + if (timeClockState.eState != aExpectedState) + { + ERR_PRINTF3(_L("Clock state %d does not match expected %d"), timeClockState.eState, aExpectedState); + StopTest(EFail); + return EFalse; + } + + return ETrue; + } + +TBool ROmxScriptTest::MosCheckMediaTime(const TDesC8& aComp, TInt aPortIndex, OMX_TICKS aMediaTime, TBool aMoreThan) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + + if (!component) + { + StopTest(EFail); + return EFalse; + } + + OMX_TIME_CONFIG_TIMESTAMPTYPE timeInfo; + timeInfo.nSize = sizeof(timeInfo); + timeInfo.nVersion = KOmxVersion; + timeInfo.nPortIndex = aPortIndex; + + if (component->GetConfig(component, OMX_IndexConfigTimeCurrentMediaTime, &timeInfo) != OMX_ErrorNone) + { + StopTest(EFail); + return EFalse; + } + + if (aMoreThan) + { + INFO_PRINTF3(_L("MosCheckMediaTime() %ld > %ld"), timeInfo.nTimestamp, aMediaTime); + + if (timeInfo.nTimestamp < aMediaTime) + { + INFO_PRINTF3(_L("FAILED! MosCheckMediaTime() Expecting %ld > %ld"), timeInfo.nTimestamp, aMediaTime); + StopTest(EFail); + return EFalse; + } + } + else + { + INFO_PRINTF3(_L("MosCheckMediaTime() %ld < %ld"), timeInfo.nTimestamp, aMediaTime); + + if (timeInfo.nTimestamp > aMediaTime) + { + INFO_PRINTF3(_L("FAILED! MosCheckMediaTime() expecting %ld < %ld"), timeInfo.nTimestamp, aMediaTime); + StopTest(EFail); + return EFalse; + } + } + + return ETrue; + } + +TBool ROmxScriptTest::MosBaseSupportPortL(const TDesC8& aComp, TInt aPortIndex) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->AddPortSupportL(aPortIndex); + + return ETrue; + } + +TBool ROmxScriptTest::MosBaseSetAutonomous(const TDesC8& aComp, TInt aPortIndex, TBool aEnabled) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->SetAutoMode(aPortIndex, aEnabled); + return ETrue; + } + +TBool ROmxScriptTest::MosBaseAllocateBuffersL(const TDesC8& aComp, TInt aPortIndex, TInt aNumberBuffers) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->SetupBuffersL(aPortIndex,aNumberBuffers); + return ETrue; + } + +TBool ROmxScriptTest::MosBaseFreeAllocatedBuffersL(const TDesC8& aComp) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->FreeAllocatedBuffersL(); + return ETrue; + } + +TBool ROmxScriptTest::MosBaseSetBufSupplier(const TDesC8& aComp, TInt aPortIndex, TBool aComponentSupplier) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->SetBufferSupplier(aPortIndex, aComponentSupplier); + return ETrue; + } + +TBool ROmxScriptTest::MosBaseFillThisBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->FillThisBuffer(aPortIndex, aPortRelBufIndex); + return ETrue; + } + +TBool ROmxScriptTest::MosBaseEmptyThisBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->EmptyThisBuffer(aPortIndex, aPortRelBufIndex); + return ETrue; + } + +TBool ROmxScriptTest::MosBaseWaitForBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + iComponents[componentIndex]->iBaseHandler->WaitForBufferCompletion(aPortIndex, aPortRelBufIndex); + return ETrue; + } + +TBool ROmxScriptTest::MosBaseTimestampPassClock(const TDesC8& aCompReceiving, const TDesC8& aClockCompToPass) + { + TInt receiveCompIndex = iComponents.Find(aCompReceiving, ROmxScriptTest::ShortNameMatchComparison); + if (receiveCompIndex == KErrNotFound) + { + return EFalse; + } + + TInt clockCompIndex = iComponents.Find(aClockCompToPass, ROmxScriptTest::ShortNameMatchComparison); + if (clockCompIndex == KErrNotFound) + { + return EFalse; + } + + CBaseProfileTimestampHandling* timestampBaseHandler = static_cast(iComponents[receiveCompIndex]->iBaseHandler); + timestampBaseHandler->SetClockComponent(iComponents[clockCompIndex]->iComponent); + + return ETrue; + } + +TBool ROmxScriptTest::MosBaseTimestampCheckTimestampL(const TDesC8& aComp, TInt aPortIndex, TUint aExpectedTime, TUint aTolerance) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + + CBaseProfileTimestampHandling* timestampBaseHandler = static_cast(iComponents[componentIndex]->iBaseHandler); + timestampBaseHandler->QueueTimestampCheckL(aPortIndex, aExpectedTime, aTolerance); + + return ETrue; + } + +TBool ROmxScriptTest::MosBaseTimestampCompareWithRefClockL(const TDesC8& aComp, TInt aPortIndex, TUint aTolerance) + { + TInt componentIndex = iComponents.Find(aComp, ROmxScriptTest::ShortNameMatchComparison); + if (componentIndex == KErrNotFound) + { + return EFalse; + } + + CBaseProfileTimestampHandling* timestampBaseHandler = static_cast(iComponents[componentIndex]->iBaseHandler); + timestampBaseHandler->QueueCompareWithRefClockL(aPortIndex, aTolerance); + + return ETrue; + } + + +TBool ROmxScriptTest::MosStartBuffersforPort( const TDesC8& aComp, TInt aPortIndex) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + if(iPortBufferHandler) + { + iPortBufferHandler->Start(component,aPortIndex); + } + return ETrue; + } + +void ROmxScriptTest::BeginWait() + { + CActiveScheduler::Start(); + } + +void ROmxScriptTest::EndWait() + { + // use a CAsyncCallBack to call CActiveScheduler::Stop + // the main reason for doing this is to allow EndWait + // to be called from any thread but to stop the scheduler + // of the script parser thread. + iStopSchedulerCallback->CallBack(); + } + + + +// +TBool ROmxScriptTest::MosDeleteFileL(const TDesC& aFileName, TBool aFileMustExist) + { + RFs fs; + + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + TInt err = fs.Delete(aFileName); + if (err != KErrNone) + { + if (err != KErrNotFound || aFileMustExist) + { + ERR_PRINTF3(_L("Error %d deleting file %S"), err, &aFileName); + User::Leave(err); + } + } + + INFO_PRINTF2(_L("Deleted file %S"), &aFileName); + + CleanupStack::PopAndDestroy(&fs); + return ETrue; + } + +// +// +// +TBool ROmxScriptTest::MosLogAllEventsL() + { + return ETrue; + } + +// +// +// +TBool ROmxScriptTest::MosSetSensorModeTypeL(const TDesC8& aComp, TInt aPort, TInt aFrameRate, TBool aOneShot, TInt aWidth, TInt aHeight) + { + OMX_COMPONENTTYPE* comp = ComponentByName(aComp); + if (!comp) + { + return EFalse; + } + + OMX_PARAM_SENSORMODETYPE sensor; + sensor.nVersion = KOmxVersion; + sensor.nSize = sizeof(OMX_PARAM_SENSORMODETYPE); + sensor.nPortIndex = aPort; + sensor.sFrameSize.nSize = sizeof(OMX_FRAMESIZETYPE); + sensor.sFrameSize.nVersion = KOmxVersion; + sensor.sFrameSize.nPortIndex = aPort; + + OMX_ERRORTYPE omxErr = comp->GetParameter(comp, OMX_IndexParamCommonSensorMode, &sensor); + if (omxErr != OMX_ErrorNone) + { + ERR_PRINTF2(_L("Error %08X returned from GetParameter"), omxErr); + return EFalse; + } + + sensor.bOneShot = (aOneShot ? OMX_TRUE : OMX_FALSE); + if (aFrameRate != -1) sensor.nFrameRate = aFrameRate; + if (aWidth != -1) sensor.sFrameSize.nWidth = aWidth; + if (aHeight != -1) sensor.sFrameSize.nHeight = aHeight; + + omxErr = comp->SetParameter(comp, OMX_IndexParamCommonSensorMode, &sensor); + if (omxErr != OMX_ErrorNone) + { + ERR_PRINTF2(_L("Error %08X returned from SetParameter"), omxErr); + } + + return (omxErr == OMX_ErrorNone); + } + +// +// +// +TBool ROmxScriptTest::MosSetCaptureModeTypeL(const TDesC8& aComp, TInt aPort, TBool aContinuous, TBool aFrameLimited, TInt aFrameLimit) + { + OMX_COMPONENTTYPE* comp = ComponentByName(aComp); + if (!comp) + { + return EFalse; + } + + OMX_CONFIG_CAPTUREMODETYPE captureModeType; + captureModeType.nSize = sizeof(OMX_CONFIG_CAPTUREMODETYPE); + captureModeType.nVersion = KOmxVersion; + captureModeType.nPortIndex = aPort; + captureModeType.bContinuous = (aContinuous ? OMX_TRUE : OMX_FALSE); + captureModeType.bFrameLimited = (aFrameLimited ? OMX_TRUE : OMX_FALSE); + captureModeType.nFrameLimit = aFrameLimit; + OMX_ERRORTYPE omxErr = comp->SetConfig(comp,OMX_IndexConfigCaptureMode,&captureModeType); + + if (omxErr != OMX_ErrorNone) + { + ERR_PRINTF2(_L("Error %08X returned from SetConfig"), omxErr); + } + + return (omxErr == OMX_ErrorNone); + } + +// + +static TInt StopScheduler(TAny* /*unused*/) + { + CActiveScheduler::Stop(); + return 0; + } + +void ROmxScriptTest::StopTest(TOmxScriptTestVerdict aVerdict) + { + switch(aVerdict) + { + case EPass: + StopTest(KErrNone, EPass); + break; + case EFail: + StopTest(KErrGeneral, EFail); + break; + default: + User::Invariant(); + } + } + +/** + * Stores the result of the test case. If called multiple times, the first + * case of EFail will persist. + * @param aError system-wide error code + * @param aVerdict either EPass or EFail + */ +void ROmxScriptTest::StopTest(TInt aError, TOmxScriptTestVerdict aVerdict) + { + __ASSERT_ALWAYS(aVerdict != EPending, User::Invariant()); + // first negative result persists + if(iVerdict != EFail) + { + iReason = aError; + iVerdict = aVerdict; + } + } + +void ROmxScriptTest::FailTest(const TDesC& aErrorMsg) + { + ERR_PRINTF1(aErrorMsg); + StopTest(EFail); + } + +/** + * @return the error code set via StopTest. Defaults to KErrNone. + */ +TInt ROmxScriptTest::Reason() const + { + return iReason; + } + +/** + * @return the verdict set via StopTest. Defaults to EPending. + */ +ROmxScriptTest::TOmxScriptTestVerdict ROmxScriptTest::Verdict() const + { + return iVerdict; + } + +/** + * Overflow handler to generate a warning message if a log line will not fit + * in the descriptor. + */ +class TOverflowHandler : public TDes16Overflow + { +public: + void Overflow(TDes& aDes) + { + _LIT(KWarning, "[truncated]"); + if(aDes.Length() + KWarning().Length() > aDes.MaxLength()) + { + aDes.SetLength(aDes.Length() - KWarning().Length()); + } + aDes.Append(KWarning); + } + }; + +/** + * Target of ERR_PRINTFx, INFO_PRINTFx, WARN_PRINTFx macros. + * Message is formatted then passed to the MOmxScriptTestLogger. + */ +void ROmxScriptTest::LogExtra(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, + TRefByValue aFmt,...) + { + VA_LIST aList; + VA_START(aList, aFmt); + + TOverflowHandler overflow; + TBuf<255> msg; + msg.AppendFormatList(aFmt, aList, &overflow); + + iLogger.Log(aFile, aLine, aSeverity, msg); + + VA_END(aList); + } + +void ROmxScriptTest::RegisterTunnel(OMX_COMPONENTTYPE* aSourceComp, TInt aSourcePort, OMX_COMPONENTTYPE* aSinkComp, TInt aSinkPort) + { + // delete previous registration + for(TInt index = 0, count = iTunnels.Count(); index < count; index++) + { + const TTunnelInfo& info = iTunnels[index]; + if(info.iSourceComponent == aSourceComp && info.iSourcePort == aSourcePort || + info.iSinkComponent == aSinkComp && info.iSinkPort == aSinkPort) + { + iTunnels.Remove(index); + index--; + count--; + } + } + + TTunnelInfo info; + info.iSourceComponent = aSourceComp; + info.iSourcePort = aSourcePort; + info.iSinkComponent = aSinkComp; + info.iSinkPort = aSinkPort; + TInt error = iTunnels.Append(info); + if(error) + { + User::Panic(_L("omxscript"), KErrNoMemory); + } + } + +void ROmxScriptTest::FindTransitionOrderL(const RPointerArray& aComponents, + const RTunnelRelations& aTunnelRelations, + RArray& aOrder) + { + RPointerArray componentsSimple; + CleanupClosePushL(componentsSimple); + componentsSimple.ReserveL(aComponents.Count()); + for(TInt index = 0, count = aComponents.Count(); index < count; index++) + { + componentsSimple.AppendL(aComponents[index]->iComponent); + } + RSupplierRelations supplierRelations; + CleanupStack::PushL(TCleanupItem(CloseSupplierRelations, &supplierRelations)); + TInt numComponents = aComponents.Count(); + supplierRelations.ReserveL(numComponents); + for(TInt index = 0; index < numComponents; index++) + { + supplierRelations.Append(RArray()); + } + TInt numTunnels = aTunnelRelations.Count(); + for(TInt index = 0; index < numTunnels; index++) + { + const TTunnelInfo& tunnelInfo = aTunnelRelations[index]; + TInt outputCompIndex = componentsSimple.Find(tunnelInfo.iSourceComponent); + User::LeaveIfError(outputCompIndex); + TInt inputCompIndex = componentsSimple.Find(tunnelInfo.iSinkComponent); + User::LeaveIfError(inputCompIndex); + + OMX_PARAM_BUFFERSUPPLIERTYPE supplier; + supplier.nSize = sizeof(supplier); + supplier.nVersion = KOmxVersion; + supplier.nPortIndex = tunnelInfo.iSourcePort; + OMX_ERRORTYPE error = OMX_GetParameter(tunnelInfo.iSourceComponent, + OMX_IndexParamCompBufferSupplier, + &supplier); + if(error != OMX_ErrorNone) + { + User::Leave(KErrGeneral); + } + if(supplier.eBufferSupplier == OMX_BufferSupplyInput) + { + supplierRelations[inputCompIndex].AppendL(outputCompIndex); + } + else if(supplier.eBufferSupplier == OMX_BufferSupplyOutput) + { + supplierRelations[outputCompIndex].AppendL(inputCompIndex); + } + else + { + User::Leave(KErrArgument); + } + } + + ::FindTransitionOrderL(supplierRelations, aOrder); + + CleanupStack::PopAndDestroy(2, &componentsSimple); + } + +TBool ROmxScriptTest::MosCheckClockStateL(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aClockState) + { + /* + TODO: Verify that this is a clock component? + */ + + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_TIME_CONFIG_CLOCKSTATETYPE conf; + conf.nVersion = KOmxVersion; + conf.nSize = sizeof(conf); + /* + Completed by GetConfig() + + conf.eState + conf.nStartTime + conf.nOffset + conf.nWaitMask + */ + + OMX_ERRORTYPE error = component->GetConfig(component, OMX_IndexConfigTimeClockState, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_GetConfig(OMX_IndexConfigTimeClockState)"), error); + return EFalse; + } + + if(conf.eState != aClockState) + { +// TODO: What about the other values? + ERR_PRINTF3(_L("Clock component expected to be in clock state %S, is actually in %S"), ClockStateDes(aClockState), ClockStateDes(conf.eState)); + StopTest(EFail); + return EFalse; + } + + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF3(_L("State of %S is %S"), &compConverted, ClockStateDes(aClockState)); + + return ETrue; + } + +// for debugging... +TBool ROmxScriptTest::MosCheckTimePositionL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_TIME_CONFIG_TIMESTAMPTYPE conf; + conf.nVersion = KOmxVersion; + conf.nSize = sizeof(conf); + conf.nPortIndex = aPortIndex; + /* + To be filled by GetConfig() + conf.nTimestamp; + */ + + OMX_ERRORTYPE error = component->GetConfig(component, OMX_IndexConfigTimePosition, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_GetConfig(OMX_IndexConfigTimePosition)"), error); + return EFalse; + } + if(conf.nTimestamp != aTimestamp) + { + TBuf<64> compConverted; + compConverted.Copy(aComp); + ERR_PRINTF5(_L("Port %d of component %S time position expected to be %d, but is actually %d"), aPortIndex, &compConverted, aTimestamp, conf.nTimestamp); + StopTest(EFail); + return EFalse; + } + + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF4(_L("Port %d of component %S time position verified to be %d"), aPortIndex, &compConverted, conf.nTimestamp); + + return ETrue; + } + +TBool ROmxScriptTest::MosSetTimePositionL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_TIME_CONFIG_TIMESTAMPTYPE conf; + conf.nVersion = KOmxVersion; + conf.nSize = sizeof(conf); + conf.nPortIndex = aPortIndex; + conf.nTimestamp = aTimestamp; + + OMX_ERRORTYPE error = component->SetConfig(component, OMX_IndexConfigTimePosition, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_SetConfig(OMX_IndexConfigTimePosition)"), error); + return EFalse; + } + + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF4(_L("Port %d of component %S time position set to %d"), aPortIndex, &compConverted, aTimestamp); + + return ETrue; + } + +TBool ROmxScriptTest::MosCheckFrameCountL(const TDesC& aFilename, TInt aCount) + { + C3GPParse* parser = C3GPParse::NewL(); + CleanupStack::PushL(parser); + TInt err = parser->Open(aFilename); + if(err) + { + CleanupStack::PopAndDestroy(parser); + return EFalse; + } + else + { + TUint num; + err = parser->GetNumberOfVideoFrames(num); + CleanupStack::PopAndDestroy(parser); + if(err) + { + ERR_PRINTF1(_L("aParser->GetNumberOfVideoFrames() failed")); + return EFalse; + } + else + { + //assume 20 dropped frames is accepted normally + //if the frame count is smaller than 20, we just allow 10 dropped frames + TInt tmp = (aCount > 20) ? (aCount - 20): (aCount - 10); + if(num < tmp) + { + ERR_PRINTF1(_L("too many dropped frames, ROmxScriptTest->MosCheckFrameCountL() failed")); + return EFalse; + } + } + } + return ETrue; + } + +TBool ROmxScriptTest::MosMarkBuffer(const TDesC8& aComp, TInt aPortIndex, const TDesC8& aTargetComp, TInt markData) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + OMX_COMPONENTTYPE* targetComponent = ComponentByName(aTargetComp); + if(component == NULL || targetComponent == NULL) + { + return EFalse; + } + + OMX_MARKTYPE mark; + mark.hMarkTargetComponent = targetComponent; + mark.pMarkData = reinterpret_cast(markData); + + OMX_ERRORTYPE error = OMX_SendCommand(component, OMX_CommandMarkBuffer, aPortIndex, &mark); + if(error) + { + FailWithOmxError(aComp, _L("SendCommand(MarkBuffer)"), error); + return EFalse; + } + else + { + return ETrue; + } + } + +void ROmxScriptTest::MosParseError(const TDesC& aError) + { + ERR_PRINTF1(aError); + } + +ROmxScriptTest::CComponentInfo* ROmxScriptTest::CComponentInfo::NewL(ROmxScriptTest& aTestController) + { + CComponentInfo* self = new (ELeave) CComponentInfo(aTestController); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +void ROmxScriptTest::CComponentInfo::ConstructL() + { + } + +TBool ROmxScriptTest::MosSetClientStartTimeL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_TIME_CONFIG_TIMESTAMPTYPE conf; + conf.nVersion = KOmxVersion; + conf.nSize = sizeof(conf); + conf.nPortIndex = aPortIndex; + conf.nTimestamp = aTimestamp; + + OMX_ERRORTYPE error = component->SetConfig(component, OMX_IndexConfigTimeClientStartTime, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_SetConfig(OMX_IndexConfigTimeClientStartTime)"), error); + return EFalse; + } + + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF4(_L("Port %d of component %S time position set to %d"), aPortIndex, &compConverted, aTimestamp); + + return ETrue; + } + +TBool ROmxScriptTest::MosSetCurrentAudioReferenceTimeL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_TIME_CONFIG_TIMESTAMPTYPE conf; + conf.nVersion = KOmxVersion; + conf.nSize = sizeof(conf); + conf.nPortIndex = aPortIndex; + conf.nTimestamp = aTimestamp; + + OMX_ERRORTYPE error = component->SetConfig(component, OMX_IndexConfigTimeCurrentAudioReference, &conf); + if(error != OMX_ErrorNone) + { + FailWithOmxError(_L("OMX_SetConfig(OMX_IndexConfigTimeCurrentAudioReference)"), error); + return EFalse; + } + + TBuf<64> compConverted; + compConverted.Copy(aComp); + INFO_PRINTF4(_L("Port %d of component %S time position set to %d"), aPortIndex, &compConverted, aTimestamp); + + return ETrue; + } +#ifdef OLD_ADPCM_EXTENSION +TBool ROmxScriptTest::MosSetAdPcmAudioPortDefL(const TDesC8& aComp, + TInt aPortIndex, + TInt aNumChannels, + TInt aSamplingRate, + TInt aBitsperSample) + { + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + if(!component) + { + return EFalse; + } + + OMX_AUDIO_PARAM_ADPCMTYPE pcmModeType; + pcmModeType.nSize = sizeof(pcmModeType); + pcmModeType.nVersion = KOmxVersion; + pcmModeType.nPortIndex = aPortIndex; + OMX_ERRORTYPE error = component->GetParameter(component, OMX_IndexParamAudioAdpcm, &pcmModeType); + if(error) + { + FailWithOmxError(_L("GetParameter()"), error); + return EFalse; + } + if(aNumChannels != -1) + { + pcmModeType.nChannels = aNumChannels; + } + if(aSamplingRate != -1) + { + pcmModeType.nSampleRate = aSamplingRate; + } + if(aBitsperSample != -1) + { + pcmModeType.nBitsPerSample = aBitsperSample; + } + error = component->SetParameter(component, OMX_IndexParamAudioAdpcm, &pcmModeType); + if(error) + { + FailWithOmxError(_L("SetParameter()"), error); + return EFalse; + } + return ETrue; + } + +TBool ROmxScriptTest::MosConfigAdPcmDecoderBlockAlign(const TDesC8& aComp, OMX_S32 aBlockAlign) + { + // Create param + OMX_SYMBIAN_AUDIO_PARAM_ADPCMDECODER_BLOCKALIGN param; + param.nSize = sizeof(param); + param.nVersion = KAdPcmDecoderConfigVersion; + param.nPortIndex = 0; + param.nBlockAlign = aBlockAlign; + + // Show debugging info + INFO_PRINTF2(_L("Setting the size of the AdPcm block to %d"), aBlockAlign); + + // Get component + OMX_COMPONENTTYPE* component = ComponentByName(aComp); + + // Check component + if(!component) + return EFalse; + + // Set the config + OMX_ERRORTYPE error = component->SetParameter(component, static_cast(OMX_SymbianIndexParamAudioAdPcmDecoderBlockAlign), ¶m); + if(error) + { + FailWithOmxError(_L("SetParameter(OMX_SymbianIndexParamAudioAdPcmDecoderBlockAlign)"), error); + return EFalse; + } + else + { + return ETrue; + } + } +#endif + +ROmxScriptTest::CComponentInfo::CComponentInfo(ROmxScriptTest& aTestController) +: iTestController(aTestController) + { + } + +ROmxScriptTest::CComponentInfo::~CComponentInfo() + { + // convert from 8-bit descriptors for logging + TBuf<64> shortName; + TBuf<64> compName; + shortName.Copy(*iShortName); + compName.Copy(*iComponentName); + OMX_ERRORTYPE error = OMX_ErrorNone; + if(iComponent != NULL) + { + iTestController.INFO_PRINTF3(_L("Unloading component %S (%S)"), &shortName, &compName); + if(iThreadRequest != NULL) + { + error = iThreadRequest->FreeHandle(iComponent); + delete iShortName; + delete iComponentName; + delete iBaseHandler; + } + else + { + delete iShortName; + delete iComponentName; + delete iBaseHandler; + error = OMX_FreeHandle(iComponent); + } + } + + if(error) + { + iTestController.FailWithOmxError(_L("OMX_FreeHandle()"), error); + } + delete iThreadRequest; + } +void HashFilter_16bit_EndianSwap(RBuf8& aBuf) + { + for (TInt i=0;i +#include "omxthreadrequest.h" +#include "omx_xml_script.h" +//#include +#include +#include +#include "portbufferhandler.h" + +class CNonTunneledHandler; +class CVideoBufferHandler; +class CVideoBufferSinkHandler; +class CBaseProfileHandler; +class CWindowManager; + +const OMX_VERSIONTYPE KOmxVersion = { OMX_VERSION_MAJOR, OMX_VERSION_MINOR, OMX_VERSION_REVISION, OMX_VERSION_STEP }; + +/** + * Class to parse and execute an OMX test case specified in + * an XML file. + */ +NONSHARABLE_CLASS(ROmxScriptTest) : public MOmxScriptIf, public MASBreakCallback, public MTimerObserver + { +public: + + NONSHARABLE_CLASS(CComponentInfo) : public CBase + { + public: + static CComponentInfo* NewL(ROmxScriptTest& aTestController); + ~CComponentInfo(); + + private: + CComponentInfo(ROmxScriptTest& aTestController); + void ConstructL(); + + public: + HBufC8* iShortName; + HBufC8* iComponentName; + OMX_COMPONENTTYPE* iComponent; + CBaseProfileHandler* iBaseHandler; //NULL if not being used via OMX IL Base Profile + COmxThreadRequest* iThreadRequest; + + private: + ROmxScriptTest& iTestController; + }; + + class TExpectedEvent + { + public: + OMX_COMPONENTTYPE* iComponent; + OMX_EVENTTYPE iEvent; + TUint32 iData1; + TUint32 iData2; + TAny* iEventData; + }; + typedef void (*THashFilter)(RBuf8&); + THashFilter GetHashFilterByName(const TDesC8& aName); + + ROmxScriptTest(MOmxScriptTestLogger& aLogger); + void Close(); + + void RunTestL(const TDesC& aScriptFilename, const TDesC& aScriptSection); + + // MOmxScriptIf + TBool MosLoadComponentL(const TDesC8& aComp, const TDesC8& aName, TBool aBaseProfile, const TDesC8* aBaseImpl, TBool aLoadInCoreServerThread); + TBool MosSetupTunnel(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, OMX_ERRORTYPE aExpectedError); + TBool MosSetupNonTunnel(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier); + TBool MosSetWindowL(const TDesC8& aComp); + TBool MosSetDroppedFrameEvent(const TDesC8& aComp, const TDesC8& aAction); + TBool MosAllTransitionL(OMX_STATETYPE aState,OMX_ERRORTYPE aExpectedError, TTransitionOrder aOrder); + TBool MosWaitEOS(); + TBool MosWaitEOS(const TDesC8& aComp); + TBool MosSetFilename(const TDesC8& aComp, const TDesC& aFilename); + + TBool MosSetFilename_bellagio(const TDesC8& aComp, char *filepath); + + TBool MosSetBadFilename(const TDesC8& aComp); + TBool MosGetFilename(const TDesC8& aComp, TDesC& aFilename, OMX_ERRORTYPE aExpectedError); + + TBool MosSetBufferCount(const TDesC8& aComp, TInt aPortIndex, TInt aCount, OMX_ERRORTYPE aExpectedError); + TBool MosCompareFilesL(const TDesC& aFileOne, const TDesC& aFileTwo); + TBool MosFilterAndCompareFilesL( + const TDesC& aFileOne, const TDesC8& aFile1Filter1, const TDesC8& aFile1Filter2, const TDesC8& aFile1Filter3, + const TDesC& aFileTwo, const TDesC8& aFile2Filter1, const TDesC8& aFile2Filter2, const TDesC8& aFile2Filter3); + TBool MosBufferSupplierOverrideL(const TDesC8& aSourceComp, TInt aSourcePort, + const TDesC8& aSinkComp, TInt aSinkPort, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_ERRORTYPE aExpectedSourceError, OMX_ERRORTYPE aExpectedSinkError); + TBool MosSetVideoPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aWidth, TInt aHeight, OMX_COLOR_FORMATTYPE* aColorFormat, OMX_VIDEO_CODINGTYPE* aCodingType, TInt aStride, TReal aFps, OMX_ERRORTYPE aExpectedError); + TBool MosSetCameraOneShotL(const TDesC8& aComp, TInt aIsOneShot, OMX_ERRORTYPE aExpectedError); + TBool MosSetCameraCaptureL(const TDesC8& aComp, TInt aPortIndex, TInt aIsCapturing, OMX_ERRORTYPE aExpectedError); + void MosParseError(const TDesC& aError); + TBool MosWaitL(TTimeIntervalMicroSeconds32 aDelay); + TBool MosExpectEventL(const TDesC8& aComp, OMX_EVENTTYPE aEvent, TUint32 nData1, TUint32 nData2); + TBool MosWaitForAllEventsL(); + TBool MosTransition(const TDesC8& aComp, OMX_STATETYPE aState, TBool aAsync); + TBool MosFailingTransition(const TDesC8& aComp, OMX_STATETYPE aState,OMX_ERRORTYPE aExpectedError); + TBool MosCheckStateL(const TDesC8& aComp, OMX_STATETYPE aState); + TBool MosCheckVideoPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aWidth, TInt aHeight, OMX_VIDEO_CODINGTYPE aCoding, OMX_COLOR_FORMATTYPE aColorFormat); + TBool MosCheckMetaDataL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& aData); + TBool MosGetParameterUnknownIndexTypeL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& aData); + TBool MosSetParameterUnknownIndexTypeL(const TDesC8& aComp, TInt aPortIndex, OMX_METADATASCOPETYPE aScope, const TDesC8& aAtomType, TUint32 aAtomIndex, const TDesC8& aData); + + TBool MosDisablePort(const TDesC8& aComp, TInt aPortIndex); + TBool MosEnablePort(const TDesC8& aComp, TInt aPortIndex); + TBool MosIgnoreEventL(const TDesC8& aComp, OMX_EVENTTYPE aEvent, TUint32 nData1, TUint32 nData2); + TBool MosSetPcmAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aNumChannels, TInt aSamplingRate, TInt aBitsperSample, OMX_NUMERICALDATATYPE aNumData, OMX_ENDIANTYPE aEndian, OMX_BOOL* aInterleaved, const TDesC8* aEncoding); + TBool MosSetConfigAudioVolumeL(const TDesC8& aComp, TInt aPortIndex, TBool aLinear, TInt aMinVolume, TInt aMaxVolume, TInt aVolume, OMX_ERRORTYPE aExpectedError); + TBool MosCheckConfigAudioVolumeL(const TDesC8& aComp, TInt aPortIndex, TBool aLinear, TInt aMinVolume, TInt aMaxVolume, TInt aVolume); + TBool MosCheckConfigAudioMuteL(const TDesC8& aComp, TInt aPortIndex, TBool aMute); + TBool MosSetConfigAudioMuteL(const TDesC8& aComp, TInt aPortIndex, TBool aMute); + TBool MosSetAacAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aNumChannels, TInt aSamplingRate, TInt aBitRate, TInt aAudioBandwidth, TInt aFrameLength, TInt aAacTools, TInt aAacErTools, TInt aProfile, TInt aStreamFormat, TInt aChannelMode); + TBool MosSetAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, OMX_AUDIO_CODINGTYPE* aCodingType, OMX_ERRORTYPE aExpectedError); + TBool MosSetRefClockTypeL(const TDesC8& aComp, OMX_TIME_REFCLOCKTYPE aRefClockType); + TBool MosSetClockTimeScale(const TDesC8& aComp, OMX_S32 aScale); + TBool MosSetClockStateL(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aClockState, TInt aStartTime, TInt aOffset, TUint32 aWaitMask); + TBool MosCheckClockStateL(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aClockState); + TBool MosCheckTimePositionL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp); + TBool MosSetTimePositionL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp); + TBool MosSetClientStartTimeL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp); + TBool MosSetCurrentAudioReferenceTimeL(const TDesC8& aComp, TInt aPortIndex, TInt aTimestamp); + TBool MosSetVideoFitModeL(TVideoFitMode aVideoFitMode); + TBool MosNegativeSetDataChunk(const TDesC8& aComp, OMX_ERRORTYPE aExpectedError, TInt aExpectedSystemError); + TBool MosCheckFrameCountL(const TDesC& aFilename, TInt aCount); + TBool InitialiseBufferHandlerL(const TDesC8& aComp, TDesC& aName, const TDesC8* aType); + void StartBufferHandler(); + void StopBufferHandler(); + void SendInvalidBufferId(TInt aInvalidId); + TBool InitialiseBufferSinkHandlerL(const TDesC8& aComp, TDesC& aName); + void StartBufferSinkHandler(); + void StopBufferSinkHandler(); + + TBool MosSetBufferSize(const TDesC8& aComp, TInt aPortIndex, TInt aCount, OMX_ERRORTYPE aExpectedError); + TBool MosGetAndCompareBufferCount(const TDesC8& aComp, TInt aPortIndex, TInt aDataToCompare); + TBool MosGetAndCompareBufferSize(const TDesC8& aComp, TInt aPortIndex, TInt aDataToCompare); + TBool MosFlushBuffer(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError); + TBool MosForceFlushBuffer(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError); + TBool MosSetActiveStream(const TDesC8& aComp, TUint32 aPortIndex); + TBool MosGetActiveStream(const TDesC8& aComp, TUint32 aPortIndex); + TBool MosChangeFilledBufferLength(const TDesC8& aComp, TInt aValue); + TBool MosSetOMX_SymbianIndexParamBufferMsgQueueData(const TDesC8& aComp, OMX_ERRORTYPE aExpectedError); + TBool MosGetExtensionIndex(const TDesC8& aComp, const TDesC8& aParameterName, OMX_ERRORTYPE aExpectedError); + + TBool MosCheckTimeClockState(const TDesC8& aComp, OMX_TIME_CLOCKSTATE aExpectedState); + TBool MosCheckMediaTime(const TDesC8& aComp, TInt aPortIndex, OMX_TICKS aMediaTime, TBool aMoreThan); + TBool MosBaseSupportPortL(const TDesC8& aComp, TInt aPortIndex); + TBool MosBaseSetAutonomous(const TDesC8& aComp, TInt aPortIndex, TBool aEnabled); + TBool MosBaseAllocateBuffersL(const TDesC8& aComp, TInt aPortIndex, TInt aNumberBuffers); + TBool MosBaseFreeAllocatedBuffersL(const TDesC8& aComp); + TBool MosBaseSetBufSupplier(const TDesC8& aComp, TInt aPortIndex, TBool aComponentSupplier); + TBool MosBaseFillThisBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex); + TBool MosBaseEmptyThisBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex); + TBool MosBaseWaitForBuffer(const TDesC8& aComp, TInt aPortIndex, TInt aPortRelBufIndex); + TBool MosBaseTimestampPassClock(const TDesC8& aCompReceiving, const TDesC8& aClockCompToPass); + TBool MosBaseTimestampCheckTimestampL(const TDesC8& aComp, TInt aPortIndex, TUint aExpectedTime, TUint aTolerance); + TBool MosBaseTimestampCompareWithRefClockL(const TDesC8& aComp, TInt aPortIndex, TUint aTolerance); + TBool MosMarkBuffer(const TDesC8& aComp, TInt aPortIndex, const TDesC8& aTargetComp, TInt markData); + + // mpeg4 encoder component + TBool MosSetVideoEncQuantL(const TDesC8& aComp, TInt aPortIndex, TInt aQpb); + TBool MosSetVideoEncMotionVectL(const TDesC8& aComp, TInt aPortIndex, TInt aAccuracy, TInt aSxSearchrange, TInt aSySearchrange, OMX_ERRORTYPE aExpectedError); + TBool MosSetVideoEncMpeg4TypeL(const TDesC8& aComp, TInt aPortIndex, OMX_VIDEO_MPEG4PROFILETYPE aMpeg4Profile, OMX_VIDEO_MPEG4LEVELTYPE aMpeg4Level, OMX_ERRORTYPE aExpectedError); + TBool MosSetVideoEncBitRateL(const TDesC8& aComp, TInt aPortIndex, OMX_VIDEO_CONTROLRATETYPE aControlRate, TInt aTargetBitrate, OMX_ERRORTYPE aExpectedError); + + TBool MosSetAACProfileL(const TDesC8& aComp, TInt aPortIndex, TInt aChannels, TInt aSamplingRate, TInt aBitRate, TInt aAudioBandwidth, TInt aFrameLength, TInt aAACTools, TInt aAACERTools, OMX_AUDIO_AACPROFILETYPE aProfile, OMX_AUDIO_AACSTREAMFORMATTYPE aStreamFormat, OMX_AUDIO_CHANNELMODETYPE aChannelMode); + + // Camera + + TBool MosSetSensorModeTypeL(const TDesC8& aComp, TInt aPort, TInt aFrameRate, TBool aOneShot, TInt aWidth, TInt aHeight); + TBool MosSetCaptureModeTypeL(const TDesC8& aComp, TInt aPort, TBool aContinuous, TBool aFrameLimited, TInt aFrameLimit); + + + // Debugging/Utility functions. + TBool MosDeleteFileL(const TDesC& aFileName, TBool aFileMustExist); + TBool MosLogAllEventsL(); + + // MASBreakCallback + void AllComponentsEOS(); + void AllComponentsTransitioned(OMX_STATETYPE aNewState, + OMX_STATETYPE aOldState); + void EventReceived(OMX_COMPONENTTYPE* aComponent, OMX_EVENTTYPE aEvent, TUint32 aData1, TUint32 aData2, TAny* aEventData); + void ComponentTransitioned(OMX_STATETYPE aNewState, + OMX_STATETYPE aOldState); + void BufferDone(OMX_COMPONENTTYPE* aComponent, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource); + + // MTimerObserver + void TimerExpired(); + + TBool MosSetupBufferForPortL(const TDesC8& comp,TInt aPortIndex, const TDesC& aFileName,TInt aHeaderLength,OMX_BUFFERSUPPLIERTYPE aSupplier); + TBool MosStartBuffersforPort(const TDesC8& aComp, TInt aPortIndex); +#ifdef OLD_ADPCM_EXTENSION + TBool MosSetAdPcmAudioPortDefL(const TDesC8& aComp, TInt aPortIndex, TInt aNumChannels, TInt aSamplingRate, TInt aBitsperSample); + TBool MosConfigAdPcmDecoderBlockAlign(const TDesC8& aComp, OMX_S32 aBlockAlign); +#endif + +public: + enum TOmxScriptTestVerdict + { + EPass, EFail, EPending + }; + + TInt Reason() const; + TOmxScriptTestVerdict Verdict() const; + void FailWithOmxError(const TDesC& aOperation, OMX_ERRORTYPE aError); + void StopTest(TOmxScriptTestVerdict aVerdict); + void StopTest(TInt aError, TOmxScriptTestVerdict aVerdict); + void FailTest(const TDesC& aErrorMsg); + + TBool MosForceBufferSourceFlushBufferL(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError); + TBool MosForceBufferSinkFlushBuffer(const TDesC8& aComp, TInt aPortIndex, OMX_ERRORTYPE aExpectedError); + + static TBool ShortNameMatchComparison(const TDesC8* aShortName, const ROmxScriptTest::CComponentInfo& aComponentInfo); + + void BeginWait(); + void EndWait(); + +private: + TBool ComponentLogicalIL(const TDesC8& aName); + TBool ComponentPhysicalIL(const TDesC8& aName); + OMX_COMPONENTTYPE* ComponentByName(const TDesC8& aName); + void GetComponentName(const OMX_COMPONENTTYPE* aHandle, TDes& aName); + void FailWithOmxError(const TDesC8& aComponent, const TDesC& aOperation, OMX_ERRORTYPE aError); + // static void CleanupOmxComponent(TAny*); + static void FormatHex(const TDesC8& bin, TDes& hex); + void WriteInt32(TUint8* aPtr, TInt32 aData); + void HashFileL(const TDesC& aFileName, TDes8& aHash, void (*aFilter1)(RBuf8&) = NULL, void (*aFilter2)(RBuf8&) = NULL, void (*aFilter3)(RBuf8&) = NULL ); + TBool HandleNonTunneledBuffers(OMX_STATETYPE aNewState, OMX_COMPONENTTYPE* aComp); + TBool HandlePortBufferHandler(OMX_STATETYPE aNewState, OMX_COMPONENTTYPE* aComp); + + void LogExtra(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, + TRefByValue aFmt,...); + void RegisterTunnel(OMX_COMPONENTTYPE* aSourceComp, TInt aSourcePort, OMX_COMPONENTTYPE* aSinkComp, TInt aSinkPort); + + class TComponentInfo + { + public: + HBufC8* iShortName; + HBufC8* iComponentName; + OMX_COMPONENTTYPE* iComponent; + }; +class TFilledBufferHeaderV2 + { +public: + /** Amount of buffer filled with actual data */ + TUint iFilledLength; + /** Any timestamp associated with the buffer */ + TInt64 iTimeStamp; + /** Combination of OMX_BUFFERFLAG_*, specified at page 68 in the OpenMAX spec. */ + TUint iFlags; + /** offset **/ + TUint32 iOffset; + }; + class TTunnelInfo + { + public: + OMX_COMPONENTTYPE* iSourceComponent; + TInt iSourcePort; + OMX_COMPONENTTYPE* iSinkComponent; + TInt iSinkPort; + }; + + RArray iTunnels; + typedef RArray RTunnelRelations; + void FindTransitionOrderL(const RPointerArray& aComponents, + const RTunnelRelations& aTunnelRelations, + RArray& aOrder); + +private: + TBool iCoreLoaded; + RPointerArray iComponents; + RASBreakEventHandler iEventHandler; + OMX_STATETYPE iState; + + // Symbian graphic sink specialisation + CWindowManager* iWindowManager; + TVideoFitMode iVideoFitMode; + OMX_INDEXTYPE iExtSurfaceConfigIndex; + OMX_COMPONENTTYPE* iGraphicSink; + + CVideoTestTimer *iTimer; + + RArray iExpectedEvents; + TBool iWaitingForEvents; + + CNonTunneledHandler* iNonTunneledHandler; + RArray iIgnoredEvents; + + // Buffer component handler + CVideoBufferHandler* iBufferHandler; + CVideoBufferSinkHandler* iBufferSinkHandler; + + TInt iReason; + TOmxScriptTestVerdict iVerdict; + MOmxScriptTestLogger& iLogger; + + CAsyncCallBack* iStopSchedulerCallback; + + RMsgQueue iMsgQueue; + CPortBufferHandler* iPortBufferHandler; + }; + +#endif /*OMXSCRIPTTEST_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxthreadrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxthreadrequest.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,255 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#include "omxthreadrequest.h" + +COmxThreadRequest* COmxThreadRequest::NewL() + { + COmxThreadRequest* self = new (ELeave) COmxThreadRequest(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +COmxThreadRequest::COmxThreadRequest() + { + } + +void COmxThreadRequest::ConstructL() + { + //Parameters to send to the sub thread + TThreadParam param; + param.iThreadRequestObj = this; + + //Get a reference to this thread's heap + RHeap& thisHeap = User::Heap(); + + //Get the id of this thread + RThread thisThread; + TThreadId thisThreadId = thisThread.Id(); + param.iMainThreadId = thisThreadId; + + //Get a request to signal for setup completion + TRequestStatus setupComplete = KRequestPending; + param.iSetupComplete = &setupComplete; + + //current time and the "this" pointer for a unique key + _LIT(KFormatString,"%S.%020Lu.%08X"); + TName threadName; + TTime now; + now.UniversalTime(); + threadName.Format(KFormatString, &KXMLClientOMXThreadName, now.Int64(), reinterpret_cast(this)); + + //Create a new thread using the same heap as this thread + TInt result = iRequestThread.Create(threadName, + ThreadCreateFunction, + KDefaultStackSize, + &thisHeap, + ¶m); + User::LeaveIfError(result); + + //Run the thread under high priority + iRequestThread.SetPriority(EPriorityNormal); + + //Wait for thread startup to complete + TRequestStatus threadStatus = KRequestPending; + iRequestThread.Logon(threadStatus); + + //Start the thread + iRequestThread.Resume(); + User::WaitForRequest(threadStatus, setupComplete); + if(threadStatus != KRequestPending) + { + //Thread creation failed + TInt reason = iRequestThread.ExitReason(); + User::Leave(reason); + } + + // Thread creation was successfull + TInt error = iRequestThread.LogonCancel(threadStatus); + User::LeaveIfError(error); // There is no outstanding request + User::WaitForRequest(threadStatus); // Consume the signal + + iThreadCreated = ETrue; + User::LeaveIfError(setupComplete.Int()); + } + +/** +Main thread entry point for the omx sub-thread. +Create a cleanup stack for the thread and process the commands +inside a trap for cleanup behaviour. +@internalComponent + +@param aPtr Parameters to be used for creating the thread. +@return The error code for thread termination. +*/ +TInt COmxThreadRequest::ThreadCreateFunction(TAny* aPtr) + { + TInt error = KErrNone; + + // Create a cleanup stack for the thread + CTrapCleanup* cleanupStack = CTrapCleanup::New(); + if (cleanupStack) + { + if(error == KErrNone) + { + TRAP(error, ThreadTrapFunctionL(aPtr)); + } + } + else + { + error = KErrNoMemory; + } + + delete cleanupStack; + return error; + } + +/** +Function for thread execution. If the thread is successfully created signal +the main thread that the thread creation was successfull. Then enter OMX +request loop. + +@internalComponent + +@param aPtr A pointer to a TThreadParam object containing the startup parameters + for the thread. +*/ +void COmxThreadRequest::ThreadTrapFunctionL(TAny* aPtr) + { + TThreadParam* param = static_cast(aPtr); + COmxThreadRequest* iThreadRequestObj = param->iThreadRequestObj; + + // tell main thread that setup is complete + RThread mainThread; + mainThread.Open(param->iMainThreadId); + mainThread.RequestComplete(param->iSetupComplete, KErrNone); + mainThread.Close(); + + // loop to execute OMX commands in own thread + while(iThreadRequestObj->iFunction != EOMXFunctionCodeTerminate) + { + iThreadRequestObj->iRequestThreadStatus = KRequestPending; + + // block until client request is made + User::WaitForRequest(iThreadRequestObj->iRequestThreadStatus); + switch(iThreadRequestObj->iFunction) + { + case EOMXFunctionCodeGetHandle: + iThreadRequestObj->iErrorType = OMX_GetHandle( + iThreadRequestObj->ipHandle, + iThreadRequestObj->icComponentName, + iThreadRequestObj->ipAppData, + iThreadRequestObj->ipCallBacks); + break; + + case EOMXFunctionCodeFreeHandle: + iThreadRequestObj->iErrorType = OMX_FreeHandle( + iThreadRequestObj->ihComponent); + break; + + case EOMXFunctionCodeTerminate: + break; + + default: + // should never be reached + User::Panic(_L("COmxThreadRequest"), KErrNotSupported); + } + + // complete client request + TRequestStatus *status = iThreadRequestObj->iCallingStatus; + RThread callingThread; + callingThread.Open(iThreadRequestObj->iCallingThreadId); + callingThread.RequestComplete(status, KErrNone); + callingThread.Close(); + } + } + +COmxThreadRequest::~COmxThreadRequest() + { + if(iThreadCreated) + { + TRequestStatus status; + // Logon to ensure thread has completely terminated, not just broken out of message handling loop. + // In particular this ensures the cleanup stack is destroyed before the heap marks are inspected. + iRequestThread.Logon(status); + Terminate(); + User::WaitForRequest(status); + iThreadCreated = EFalse; + iRequestThread.Close(); + } + } + +OMX_ERRORTYPE COmxThreadRequest::GetHandle( + OMX_OUT OMX_HANDLETYPE* pHandle, + OMX_IN OMX_STRING cComponentName, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_CALLBACKTYPE* pCallBacks) + { + ipHandle = pHandle; + icComponentName = cComponentName; + ipAppData = pAppData; + ipCallBacks = pCallBacks; + + iFunction = EOMXFunctionCodeGetHandle; + DoRequest(); + + return iErrorType; + } + +OMX_ERRORTYPE COmxThreadRequest::FreeHandle( + OMX_IN OMX_HANDLETYPE hComponent) + { + ihComponent = hComponent; + + iFunction = EOMXFunctionCodeFreeHandle; + DoRequest(); + + return iErrorType; + } + +void COmxThreadRequest::Terminate() + { + iFunction = EOMXFunctionCodeTerminate; + DoRequest(); + } + +void COmxThreadRequest::DoRequest() + { + RThread me; + iCallingThreadId = me.Id(); + + TRequestStatus callingRequestStatus = KRequestPending; + iCallingStatus = &callingRequestStatus; + + // send request to request thread + RThread requestThread; + requestThread.Open(iRequestThread.Id()); + TRequestStatus* requestStatus = &iRequestThreadStatus; + requestThread.RequestComplete(requestStatus, KErrNone); + requestThread.Close(); + + // block calling request until OMX request completes + User::WaitForRequest(callingRequestStatus); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxthreadrequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxthreadrequest.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#include +#include + +#ifndef OMXTHREADREQUEST_H +#define OMXTHREADREQUEST_H + +_LIT(KXMLClientOMXThreadName, "XMLClientOMXThread"); + +NONSHARABLE_CLASS(COmxThreadRequest) : public CBase + { +public: + static COmxThreadRequest * NewL(); + ~COmxThreadRequest(); + + OMX_ERRORTYPE GetHandle( + OMX_OUT OMX_HANDLETYPE* pHandle, + OMX_IN OMX_STRING cComponentName, + OMX_IN OMX_PTR pAppData, + OMX_IN OMX_CALLBACKTYPE* pCallBacks); + + OMX_ERRORTYPE FreeHandle(OMX_IN OMX_HANDLETYPE hComponent); + +private: + enum TOMXCoreFunctionCode + { + EOMXFunctionCodeNone, + EOMXFunctionCodeGetHandle, + EOMXFunctionCodeFreeHandle, + EOMXFunctionCodeTerminate + + // ... more to be added when required + }; +private: + COmxThreadRequest(); + void ConstructL(); + void Terminate(); + void DoRequest(); + + static TInt ThreadCreateFunction(TAny* aPtr); + static void ThreadTrapFunctionL(TAny* aPtr); + +private: + + TOMXCoreFunctionCode iFunction; + + RThread iRequestThread; + TRequestStatus iRequestThreadStatus; + //TThreadId iRequestThreadId; + TBool iThreadCreated; + + TRequestStatus* iCallingStatus; // not owned + TThreadId iCallingThreadId; + + OMX_ERRORTYPE iErrorType; // not owned + OMX_HANDLETYPE* ipHandle; // not owned + OMX_STRING icComponentName; // not owned + OMX_PTR ipAppData; // not owned + OMX_CALLBACKTYPE* ipCallBacks; // not owned + OMX_HANDLETYPE ihComponent; // not owned + }; + +/** Internal class for passing parameter to OMX thread */ +class TThreadParam + { +public: + TThreadId iMainThreadId; + TRequestStatus* iSetupComplete; //Not owned + COmxThreadRequest* iThreadRequestObj; //Not owned + }; + +#endif //OMXTHREADREQUEST_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxutil.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "omxutil.h" + +void OMXUtil::ErrorDes(OMX_ERRORTYPE aError, TBuf<64>& aErrorDes) + { + switch(aError) + { +#define DEFERR(x) case x: aErrorDes = _L(#x); break; + DEFERR(OMX_ErrorNone); + DEFERR(OMX_ErrorInsufficientResources); + DEFERR(OMX_ErrorUndefined); + DEFERR(OMX_ErrorInvalidComponentName); + DEFERR(OMX_ErrorComponentNotFound); + DEFERR(OMX_ErrorInvalidComponent); + DEFERR(OMX_ErrorBadParameter); + DEFERR(OMX_ErrorNotImplemented); + DEFERR(OMX_ErrorUnderflow); + DEFERR(OMX_ErrorOverflow); + DEFERR(OMX_ErrorHardware); + DEFERR(OMX_ErrorInvalidState); + DEFERR(OMX_ErrorStreamCorrupt); + DEFERR(OMX_ErrorPortsNotCompatible); + DEFERR(OMX_ErrorResourcesLost); + DEFERR(OMX_ErrorNoMore); + DEFERR(OMX_ErrorVersionMismatch); + DEFERR(OMX_ErrorNotReady); + DEFERR(OMX_ErrorTimeout); + DEFERR(OMX_ErrorSameState); + DEFERR(OMX_ErrorResourcesPreempted); + DEFERR(OMX_ErrorPortUnresponsiveDuringAllocation); + DEFERR(OMX_ErrorPortUnresponsiveDuringDeallocation); + DEFERR(OMX_ErrorPortUnresponsiveDuringStop); + DEFERR(OMX_ErrorIncorrectStateTransition); + DEFERR(OMX_ErrorIncorrectStateOperation); + DEFERR(OMX_ErrorUnsupportedSetting); + DEFERR(OMX_ErrorUnsupportedIndex); + DEFERR(OMX_ErrorBadPortIndex); + DEFERR(OMX_ErrorPortUnpopulated); + DEFERR(OMX_ErrorComponentSuspended); + DEFERR(OMX_ErrorDynamicResourcesUnavailable); + DEFERR(OMX_ErrorMbErrorsInFrame); + DEFERR(OMX_ErrorFormatNotDetected); + DEFERR(OMX_ErrorContentPipeOpenFailed); + DEFERR(OMX_ErrorContentPipeCreationFailed); + DEFERR(OMX_ErrorSeperateTablesUsed); + DEFERR(OMX_ErrorTunnelingUnsupported); + DEFERR(OMX_ErrorKhronosExtensions); + DEFERR(OMX_ErrorVendorStartUnused); +#undef DEFERR + default: + aErrorDes.Format(_L("%u"), aError); + break; + } + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/omxutil.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/omxutil.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef OMXUTIL_H_ +#define OMXUTIL_H_ + +#include +#include + +class OMXUtil + { +public: + static void ErrorDes(OMX_ERRORTYPE aError, TBuf<64>& aErrorDes); + }; + +#endif /*OMXUTIL_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/paramconversion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/paramconversion.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#include "paramconversion.h" +#include +#include + +OMX_PARAM_CONTENTURITYPE* ParamConversion::FilenameAsContentUriStructV1_0L(const TDesC& aFileName) + { + CUri8* aFileUri = CUri8::CreateFileUriL(aFileName); + CleanupStack::PushL(aFileUri); + const TDesC8& aUriDes = aFileUri->Uri().UriDes(); + if(aUriDes.Length() > 255) + { + User::Leave(KErrTooBig); + } + OMX_PARAM_CONTENTURITYPE* aUriStruct = reinterpret_cast(new(ELeave) TUint8[264]); + aUriStruct->nSize = 264; + aUriStruct->nVersion.s.nVersionMajor = 1; + aUriStruct->nVersion.s.nVersionMinor = 0; + aUriStruct->nVersion.s.nRevision = 0; + aUriStruct->nVersion.s.nStep = 0; + TPtr8 aUriStructDes(aUriStruct->contentURI, aUriDes.Length()+1); + aUriStructDes = aUriDes; + aUriStructDes.Append('\0'); + CleanupStack::PopAndDestroy(aFileUri); + return aUriStruct; + } + +OMX_PARAM_CONTENTURITYPE* ParamConversion::FilenameAsContentUriStructV1_1L(const TDesC& aFileName) + { + CUri8* aFileUri = CUri8::CreateFileUriL(aFileName); + CleanupStack::PushL(aFileUri); + const TDesC8& aUriDes = aFileUri->Uri().UriDes(); + // sizeof(OMX_PARAM_CONTENTURITYPE) includes 1 byte for the URI name. counting this as well leaves room for a null terminator. + TInt aStructSize = 9 + aUriDes.Length(); + TUint8* aUriBytes = new(ELeave) TUint8[aStructSize]; + OMX_PARAM_CONTENTURITYPE* aUriStruct = reinterpret_cast(aUriBytes); + aUriStruct->nSize = aStructSize; + aUriStruct->nVersion.s.nVersionMajor = OMX_VERSION_MAJOR; + aUriStruct->nVersion.s.nVersionMinor = OMX_VERSION_MINOR; + aUriStruct->nVersion.s.nRevision = OMX_VERSION_REVISION; + aUriStruct->nVersion.s.nStep = OMX_VERSION_STEP; + TPtr8 aUriStructDes(aUriStruct->contentURI, aUriDes.Length()+1); + aUriStructDes = aUriDes; + aUriStructDes.Append('\0'); + CleanupStack::PopAndDestroy(aFileUri); + return aUriStruct; + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/paramconversion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/paramconversion.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#ifndef PARAMCONVERSION_H_ +#define PARAMCONVERSION_H_ + +#include + +struct OMX_PARAM_CONTENTURITYPE; + +class ParamConversion + { +public: + /** + * Converts a file name to a URI, then allocates and fills an + * OMX_PARAM_CONTENTURITYPE structure for OpenMAX IL v1.0. In OpenMax IL + * v1.0, this structure cannot contain URIs larger than 256 bytes + * (including the null terminator). If the converted URI exceeds this + * limit, this method leaves with KErrTooBig. + */ + static OMX_PARAM_CONTENTURITYPE* + FilenameAsContentUriStructV1_0L(const TDesC& aFileName); + + /** + * Converts a file name to a URI, then allocates and fills an + * OMX_PARAM_CONTENTURITYPE structure for OpenMAX IL v1.1. In OpenMax IL + * v1.1, this structure can contain URIs of arbitrary length. + */ + static OMX_PARAM_CONTENTURITYPE* + FilenameAsContentUriStructV1_1L(const TDesC& aFileName); + }; + +#endif /*PARAMCONVERSION_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/parsemap.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/parsemap.c Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "parsemap.h" +#include +#include +#include +#include + +/* function that searches untyped parseMap_XXX tables. also performs literal integer parsing. */ +PARSEMAP_LINKAGE int ParseMapSearch(const char* text, int* result, ParseMapEntry* entries, int numEntries) +{ + int textlen = strlen(text); + int i; + char* endptr = 0; + + /* search the parse map for the matching string */ + for(i = 0; i < numEntries; i++) { + if(entries[i].length == textlen && strcasecmp(text, entries[i].text) == 0) { + *result = entries[i].value; + return 1; + } + } + /* match not found */ + + /* try to parse string as an integer */ + errno = 0; + i = strtol(text, &endptr, 0); + if(errno == ERANGE) + { + errno = 0; + i = (int) strtoul(text, &endptr, 0); + if(errno == ERANGE) + { + return 0; + } + } + if(endptr == (text + textlen)) /* all of string must be part of number */ + { + *result = i; + return 1; + } + + /* fail */ + return 0; +} + +PARSEMAP_LINKAGE const char* ParseMapSearchReverse(int value, char not_found_buf[11], ParseMapEntry* entries, int numEntries) { + int i; + + /* search the parse map for the matching value */ + for(i = 0; i < numEntries; i++) { + if(entries[i].value == value) { + return entries[i].text; + } + } + + /* value not found in table, format hex string */ + sprintf(not_found_buf, "0x%08X", value); + return not_found_buf; +} diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/parsemap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/parsemap.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,77 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef PARSEMAP_H_ +#define PARSEMAP_H_ + +/* define PARSEMAP_LINKAGE to prepend extern "C" in front of symbols if using a C++ compiler */ +#ifdef __cplusplus +#define PARSEMAP_LINKAGE extern "C" +#else +#define PARSEMAP_LINKAGE +#endif + +/* the structure used in the parseMap_XXX tables */ +typedef struct +{ + int value; /* numeric value */ + const char* text; /* textual equivalent of value */ + int length; /* length of text. avoids heavy use of strlen */ +} ParseMapEntry; + +/* function that searches untyped parseMap_XXX tables. also performs literal integer parsing. */ +PARSEMAP_LINKAGE int ParseMapSearch(const char* text, int* result, ParseMapEntry* entries, int numEntries); +PARSEMAP_LINKAGE const char* ParseMapSearchReverse(int value, char not_found_buf[11], ParseMapEntry* entries, int numEntries); + +/* macro to declare a parser function of type T */ +#define DECL_PARSETYPE(T) \ +PARSEMAP_LINKAGE int parse_##T(const char* text, T* result); \ +PARSEMAP_LINKAGE const char* format_##T(T value, char not_found_buf[11]) + +/* macro to begin a parseMap definition of type T */ +#define PARSE_MAP_START(T) \ +const ParseMapEntry parseMap_##T[] = { + +/* macro to add a ParseMapEntry struct to a parseMap table. preprocessor is used to generate text and length values. */ +#define PARSE_MAP_ENTRY(x) \ +{ x, #x, sizeof(#x)-1 } + +/* macro to create a ParseMapEntry where the text is not identical to the C identifier. */ +#define PARSE_MAP_ALIAS(val, alias) \ +{ val, alias, sizeof(alias)-1 } + +#define PARSE_MAP_PREFIXENTRY(prefix, tail) \ +PARSE_MAP_ENTRY(prefix##tail), \ +PARSE_MAP_ALIAS(prefix##tail, #tail) + +/* macro to end a parseMap definition. also defines the typed parser function */ +#define PARSE_MAP_END(T) \ +}; \ +\ +PARSEMAP_LINKAGE int parse_##T(const char* text, T* result) \ + { \ + return ParseMapSearch(text, (int*) result, (ParseMapEntry*) parseMap_##T, sizeof(parseMap_##T) / sizeof(ParseMapEntry)); \ + } \ +\ +PARSEMAP_LINKAGE const char* format_##T(T value, char not_found_buf[11]) \ + { \ + return ParseMapSearchReverse((int) value, not_found_buf, (ParseMapEntry*) parseMap_##T, sizeof(parseMap_##T) / sizeof(ParseMapEntry)); \ + } \ + + +#endif /* PARSEMAP_H_ */ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/portbufferhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/portbufferhandler.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,616 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +#include "portbufferhandler.h" +#include "log.h" // currently needed for INFO_PRINTF etc macros + +/** + * Overflow handler to generate a warning message if a log line will not fit + * in the descriptor. + */ +class TOverflowHandler : public TDes16Overflow + { +public: + void Overflow(TDes& aDes) + { + _LIT(KWarning, "[truncated]"); + if(aDes.Length() + KWarning().Length() > aDes.MaxLength()) + { + aDes.SetLength(aDes.Length() - KWarning().Length()); + } + aDes.Append(KWarning); + } + }; + +CPortBufferHandler::CPortBufferHandler() + { + } + +CPortBufferHandler::~CPortBufferHandler() + { + } + +void CPortBufferHandler::AddPortL(OMX_COMPONENTTYPE* aComp, + TInt aPortNum, + const TDesC& aFileName, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_DIRTYPE aPortDir, + MOmxScriptTestLogger& aLogger, + TInt aHeaderLength) + { + + CComponentInfo* compInfo = NULL; + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + compInfo = iComponents[pos]; + } + else + { + compInfo = new (ELeave) CComponentInfo(aComp); + CleanupStack::PushL(compInfo); + iComponents.AppendL(compInfo); + CleanupStack::Pop(compInfo); + } + + + CPortInfo* portInfo = compInfo->AddPortL(aPortNum,aFileName,aSupplier,aPortDir,aLogger,aHeaderLength); + } + +void CPortBufferHandler::AllocateBuffersL(OMX_COMPONENTTYPE* aComp) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->AllocateBuffersL(); + } + } + +void CPortBufferHandler::Start(OMX_COMPONENTTYPE* aComp, TInt aPortNum) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->Start(aPortNum); + } + } + +void CPortBufferHandler::Resume(OMX_COMPONENTTYPE* aComp, TInt aPortNum) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->Resume(aPortNum); + } + } + +void CPortBufferHandler::BufferDone(OMX_COMPONENTTYPE* aComp, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->BufferDone(aBufHdr, aSource); + } + } + +void CPortBufferHandler::Stop(OMX_COMPONENTTYPE* aComp, TInt aPortNum) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->Stop(aPortNum); + } + } + + +void CPortBufferHandler::Pause(OMX_COMPONENTTYPE* aComp, TInt aPortNum) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->Pause(aPortNum); + } + } + +void CPortBufferHandler::FreeBuffers(OMX_COMPONENTTYPE* aComp) + { + TInt pos = iComponents.Find(*aComp, CComponentInfo::CompareComp); + if (pos >= 0) + { + iComponents[pos]->FreeBuffers(); + } + } + +CPortBufferHandler::CComponentInfo::CComponentInfo(OMX_COMPONENTTYPE* aComp) : + iComp(aComp),iState(OMX_StateLoaded) + { + } + +CPortBufferHandler::CComponentInfo::~CComponentInfo() + { + iPorts.ResetAndDestroy(); + } + +CPortBufferHandler::CPortInfo* CPortBufferHandler::CComponentInfo::AddPortL(TInt aPortNum, const TDesC& aFileName,OMX_BUFFERSUPPLIERTYPE aSupplier, OMX_DIRTYPE aPortDir, MOmxScriptTestLogger& aLogger, TInt aHeaderLength) + { + __ASSERT_ALWAYS(iPorts.Find(aPortNum, CPortInfo::ComparePortNum) == KErrNotFound, User::Invariant()); + + CPortInfo* portInfo = CPortInfo::NewL(iComp, aPortNum, aFileName, aSupplier, aPortDir, aLogger, aHeaderLength); + CleanupStack::PushL(portInfo); + iPorts.AppendL(portInfo); + CleanupStack::Pop(portInfo); + + return portInfo; + } + +void CPortBufferHandler::CComponentInfo::AllocateBuffersL() + { + TInt numPorts = iPorts.Count(); + + for (TInt port = 0; port < numPorts; ++port) + { + iPorts[port]->AllocateBuffersL(); + } + iState = OMX_StateIdle; + } + +void CPortBufferHandler::CComponentInfo::Start(TInt aPortNum) + { + TInt numPorts = iPorts.Count(); + + if(aPortNum == -1) + { + for (TInt port = 0; port < numPorts; ++port) + { + iPorts[port]->Start(); + } + } + else + { + TInt pos = iPorts.Find(aPortNum, CPortInfo::ComparePortNum); + iPorts[pos]->Start(); + } + iState = OMX_StateExecuting; + } + +void CPortBufferHandler::CComponentInfo::Resume(TInt aPortNum) + { + if(aPortNum == -1) + { + TInt numPorts = iPorts.Count(); + + for (TInt port = 0; port < numPorts; ++port) + { + iPorts[port]->Resume(); + } + } + else + { + TInt pos = iPorts.Find(aPortNum, CPortInfo::ComparePortNum); + iPorts[pos]->Resume(); + } + iState = OMX_StateExecuting; + } + +void CPortBufferHandler::CComponentInfo::BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource) + { + TInt pos = KErrNotFound; + + if (aSource) + { + pos = iPorts.Find(static_cast(aBufHdr->nOutputPortIndex), CPortInfo::ComparePortNum); + } + else + { + pos = iPorts.Find(static_cast(aBufHdr->nInputPortIndex), CPortInfo::ComparePortNum); + } + + __ASSERT_ALWAYS(pos != KErrNotFound, User::Invariant()); + + iPorts[pos]->BufferDone(aBufHdr); + } + +void CPortBufferHandler::CComponentInfo::Stop(TInt aPortNum) + { + if(aPortNum == -1) + { + for (TInt port = 0; port < iPorts.Count(); ++port) + { + iPorts[port]->Stop(); + } + } + else + { + TInt pos = iPorts.Find(aPortNum, CPortInfo::ComparePortNum); + iPorts[pos]->Stop(); + } + iState = OMX_StateIdle; + } + +void CPortBufferHandler::CComponentInfo::Pause(TInt aPortNum) + { + if(aPortNum == -1) + { + for (TInt port = 0; port < iPorts.Count(); ++port) + { + iPorts[port]->Pause(); + } + } + else + { + TInt pos = iPorts.Find(aPortNum, CPortInfo::ComparePortNum); + iPorts[pos]->Pause(); + } + iState = OMX_StatePause; + } + +void CPortBufferHandler::CComponentInfo::FreeBuffers() + { + for (TInt port = 0; port < iPorts.Count(); ++port) + { + iPorts[port]->FreeBuffers(); + } + iState = OMX_StateLoaded; + } + +TBool CPortBufferHandler::CComponentInfo::CompareComp(const OMX_COMPONENTTYPE* aComp, const CComponentInfo& aComponentInfo) + { + return (aComp == aComponentInfo.iComp); + } + + +CPortBufferHandler::CPortInfo::CPortInfo( OMX_COMPONENTTYPE* aComp, + TInt aPortNum, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_DIRTYPE aPortDir, + MOmxScriptTestLogger& aLogger, + TInt aHeaderLength): + iComp(aComp), + iPortNum(aPortNum), + iSupplier(aSupplier), + iPortDir(aPortDir), + iPosInputData(0), + iFileHeaderLength(0), + iFileFillingLength(0), + iLogger(aLogger), + iEOSReached(FALSE), + iTimeStamp(0) + { + if(aHeaderLength > -1) + { + iFileHeaderLength = aHeaderLength; + } + } + +CPortBufferHandler::CPortInfo* CPortBufferHandler::CPortInfo::NewL( OMX_COMPONENTTYPE* aComp, + TInt aPortNum, + const TDesC& aFileName, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_DIRTYPE aPortDir, + MOmxScriptTestLogger& aLogger, + TInt aHeaderLength) + { + CPortInfo* self = new (ELeave) CPortInfo(aComp,aPortNum,aSupplier,aPortDir,aLogger,aHeaderLength); + CleanupStack::PushL(self); + + self->iFileName.Copy(KPortDirectoryPath); + self->iFileName.Append(aFileName); + + User::LeaveIfError(self->iFs.Connect()); + if(self->iPortDir == OMX_DirInput) + { + User::LeaveIfError(self->iFileObject.Open(self->iFs, self->iFileName, EFileShareExclusive|EFileRead)); + } + else if(self->iPortDir == OMX_DirOutput) + { + User::LeaveIfError(self->iFileObject.Replace(self->iFs, self->iFileName, EFileWrite)); + } + else + { + User::LeaveIfError(KErrNotFound); + } + + CleanupStack::Pop(self); + return self; + } + +CPortBufferHandler::CPortInfo::~CPortInfo() + { + DeleteAllBuffers(); + iFileObject.Close(); + iFs.Close(); + } + +void CPortBufferHandler::CPortInfo::AllocateBuffersL() + { + OMX_BUFFERHEADERTYPE* bufHdr = NULL; + + if (iComp) + { + + OMX_PARAM_PORTDEFINITIONTYPE portDef; + portDef.nSize = sizeof(portDef); + portDef.nVersion = KOmxLILVersion; + portDef.nPortIndex = iPortNum; + OMX_ERRORTYPE error = iComp->GetParameter(iComp, OMX_IndexParamPortDefinition, &portDef); + if(error != OMX_ErrorNone) + { + User::Leave(error); + } + + iNumBufs = portDef.nBufferCountActual; + TInt bufSize = portDef.nBufferSize; + + if(iFileHeaderLength <=0) + { + iFileHeaderLength = bufSize; + } + + //fix for video partial tunnelling + //mpeg4decoder needs timestamp info in each frame. + //Buffer size approximately adjusted to framesize and timestamps added for each buffer + //this change is done for all video components(needed only for mpeg4decoder) + + if(portDef.eDomain == OMX_PortDomainVideo) + { + iFileFillingLength = 1600; //bufSize; + } + else + { + iFileFillingLength = bufSize; + } + + if (iSupplier == OMX_BufferSupplyInput) + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + iComp->AllocateBuffer(iComp, &bufHdr, iPortNum, NULL, bufSize); + bufHdr->pAppPrivate = (OMX_PTR)EBufferFree; + iBufferHeaders.AppendL(bufHdr); + } + } + else + { + OMX_U8* newBuffer = NULL; + + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + newBuffer = new (ELeave) OMX_U8[bufSize]; + CleanupStack::PushL(newBuffer); + iBuffers.AppendL(newBuffer); + CleanupStack::Pop(newBuffer); + + OMX_ERRORTYPE err = iComp->UseBuffer(iComp, &bufHdr, iPortNum, NULL, bufSize, newBuffer); + if(err != OMX_ErrorNone) + { + //error encountered in allocating. + } + bufHdr->pAppPrivate = (OMX_PTR)EBufferFree; + iBufferHeaders.AppendL(bufHdr); + } + } + } + } + +void CPortBufferHandler::CPortInfo::BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr) + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + if (iBufferHeaders[buf] == aBufHdr) + { + aBufHdr->pAppPrivate = (OMX_PTR)EBufferFree; + if(iPortDir == OMX_DirInput) + { + TPtr8 data(aBufHdr->pBuffer,aBufHdr->nAllocLen); + Mem::FillZ(aBufHdr->pBuffer,aBufHdr->nAllocLen); + // Read data to this buffer. + TInt err = iFileObject.Read(iPosInputData,data,iFileFillingLength); + iPosInputData += iFileFillingLength; + if(err != KErrNone) + { + return; //error return. + } + + aBufHdr->nTimeStamp = iTimeStamp* 1000; + iTimeStamp += 100; + if(!iEOSReached) + { + aBufHdr->nFilledLen = data.Size(); + aBufHdr->nOffset = 0; + aBufHdr->nInputPortIndex = iPortNum; + aBufHdr->nOutputPortIndex = OMX_ErrorMax; + + //Send buffer to port and mark that it is under use. + aBufHdr->pAppPrivate = (OMX_PTR)EBufferUnderUse; + if((data.Size() < aBufHdr->nAllocLen)&&(data.Size() < iFileFillingLength)) + { + //INFO_PRINTF1(_L("EOS detected on Input Port")); + aBufHdr->nFlags |= OMX_BUFFERFLAG_EOS; + iEOSReached = ETrue; + } + iComp->EmptyThisBuffer(iComp, aBufHdr); + } + } + else + { + //create a pointer into buffer + // using ptr , write buffer data to File. + TPtr8 data( aBufHdr->pBuffer+aBufHdr->nOffset, aBufHdr->nFilledLen, aBufHdr->nAllocLen ); + TInt err = iFileObject.Write(data); + if(err != KErrNone) + { + return; //error return. + } + err = iFileObject.Flush(); + if(err != KErrNone) + { + return; //error return. + } + aBufHdr->pAppPrivate = (OMX_PTR)EBufferFree; + aBufHdr->nFilledLen = 0; + aBufHdr->nOffset = 0; + aBufHdr->nOutputPortIndex = iPortNum; + aBufHdr->nInputPortIndex = OMX_ErrorMax; + if(aBufHdr->nFlags & OMX_BUFFERFLAG_EOS) + { + // TODO Logic for EOS + return; + } + else + { + iComp->FillThisBuffer(iComp, aBufHdr); + } + + } + } + } + } +void CPortBufferHandler::CPortInfo::Start() + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + OMX_BUFFERHEADERTYPE *bufferHdr = iBufferHeaders[buf]; + + if (bufferHdr->pAppPrivate == (OMX_PTR)EBufferFree) + { + if(iPortDir == OMX_DirInput) + { + TPtr8 data(bufferHdr->pBuffer,bufferHdr->nAllocLen); + // Read data to this buffer. + TInt err =0; + if(buf == 0) + { + err = iFileObject.Read(iPosInputData,data,iFileHeaderLength); + iPosInputData += iFileHeaderLength; + bufferHdr->nFlags |= OMX_BUFFERFLAG_STARTTIME; + } + else + { + err = iFileObject.Read(iPosInputData,data,iFileFillingLength); + iPosInputData += iFileFillingLength; + } + if(err != KErrNone) + { + return; //error return. + } + + bufferHdr->nTimeStamp = iTimeStamp * 1000; + iTimeStamp += 100; + if(data.Size()) + { + bufferHdr->nFilledLen = data.Size(); + bufferHdr->nOffset = 0; + + //Send buffer to port and mark that it is under use. + bufferHdr->pAppPrivate = (OMX_PTR)EBufferUnderUse; + //CHeck for EOF + if(buf > 0) + { + if(data.Size() < iFileFillingLength) + { + bufferHdr->nFlags |= OMX_BUFFERFLAG_EOS; + } + } + + if(buf == 0) + { + if(data.Size() < iFileHeaderLength) + { + ASSERT(0); + return; + } + } + + iComp->EmptyThisBuffer(iComp, bufferHdr); + } + } + else + { + bufferHdr->pAppPrivate = (OMX_PTR)EBufferUnderUse; + bufferHdr->nFilledLen = 0; + bufferHdr->nOffset = 0; + iComp->FillThisBuffer(iComp, bufferHdr); + } + } + + } + } + +void CPortBufferHandler::CPortInfo::Stop() + { +//Todo: implement any stop functionality required. + } + +void CPortBufferHandler::CPortInfo::Resume() + { +//Todo: implement any resume functionality required. + } + + +void CPortBufferHandler::CPortInfo::Pause() + { +//Todo: implement any resume functionality required. + } + +void CPortBufferHandler::CPortInfo::FreeBuffers() + { + for (TInt buf = 0; buf < iNumBufs; ++buf) + { + iComp->FreeBuffer(iComp, iPortNum, iBufferHeaders[buf]); + } + + DeleteAllBuffers(); + } + +void CPortBufferHandler::CPortInfo::DeleteAllBuffers() + { + iBufferHeaders.Reset(); + + if (iComp && iSupplier != OMX_BufferSupplyInput) + { + iBuffers.ResetAndDestroy(); + } + else + { + iBuffers.Reset(); + } + } + +TBool CPortBufferHandler::CPortInfo::ComparePortNum(const TInt* aPortNum, const CPortInfo& aPortInfo) + { + //return (aComp == aPortInfo.iComp); + return (*aPortNum == aPortInfo.iPortNum); + } + +OMX_DIRTYPE& CPortBufferHandler::CPortInfo::PortDir() + { + return iPortDir; + } + +void CPortBufferHandler::CPortInfo::LogExtra(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, + TRefByValue aFmt,...) + { + VA_LIST aList; + VA_START(aList, aFmt); + + TOverflowHandler overflow; + TBuf<255> msg; + msg.AppendFormatList(aFmt, aList, &overflow); + + iLogger.Log(aFile, aLine, aSeverity, msg); + + VA_END(aList); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/portbufferhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/portbufferhandler.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,143 @@ +// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + + +#ifndef PORTBUFFERHANDLER_H +#define PORTBUFFERHANDLER_H + +#include +#include +#include +#include +#include + +#include "omx_xml_script.h" + +#if defined(__WINSCW__) +_LIT(KPortDirectoryPath, "c:\\mm\\omxlogicalil\\"); +#else +_LIT(KPortDirectoryPath, "e:\\unittest\\mm\\omxlogicalil\\"); +#endif + +const OMX_VERSIONTYPE KOmxLILVersion = { 1, 1, 1, 0 }; + +NONSHARABLE_CLASS(CPortBufferHandler) : public CBase + { +public: + void AddPortL( OMX_COMPONENTTYPE* aComp, + TInt aPortNum, + const TDesC& aFileName, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_DIRTYPE aPortDir, + MOmxScriptTestLogger& aLogger, + TInt aHeaderLength); + + void AllocateBuffersL(OMX_COMPONENTTYPE* aComp); + void BufferDone(OMX_COMPONENTTYPE* aComp, OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource); + void FreeBuffers(OMX_COMPONENTTYPE* aComp); + void Start(OMX_COMPONENTTYPE* aComp, TInt aPortNum); + void Resume(OMX_COMPONENTTYPE* aComp, TInt aPortNum); + void Pause(OMX_COMPONENTTYPE* aComp, TInt aPortNum); + void Stop(OMX_COMPONENTTYPE* aComp, TInt aPortNum); + + CPortBufferHandler(); + ~CPortBufferHandler(); + +private: + NONSHARABLE_CLASS(CPortInfo) : public CBase + { + public: + static CPortInfo* NewL( OMX_COMPONENTTYPE* aComp, + TInt aPortNum, + const TDesC& aFileName, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_DIRTYPE aPortDir, + MOmxScriptTestLogger& aLogger, + TInt aHeaderLength); + + CPortInfo( OMX_COMPONENTTYPE* aComp, + TInt aPortNum, + OMX_BUFFERSUPPLIERTYPE aSupplier, + OMX_DIRTYPE aPortDir, + MOmxScriptTestLogger& aLogger, + TInt aHeaderLength); + ~CPortInfo(); + void AllocateBuffersL(); + void BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr); + void FreeBuffers(); + void DeleteAllBuffers(); + static TBool ComparePortNum(const TInt* aPortNum, const CPortInfo& aPortInfo); + void Start(); + void Stop(); + void Resume(); + void Pause(); + OMX_DIRTYPE& PortDir(); + void LogExtra(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, + TRefByValue aFmt,...); + + enum + { + EBufferFree, + EBufferUnderUse + }; + + private: + TBuf iFileName; + RFs iFs; + RFile iFileObject; + OMX_COMPONENTTYPE* iComp; + TInt iPortNum; + TInt iNumBufs; + OMX_BUFFERSUPPLIERTYPE iSupplier; + RPointerArray iBuffers; + RPointerArray iBufferHeaders; + OMX_DIRTYPE iPortDir; + TInt iPosInputData; + TInt iFileHeaderLength; + TInt iFileFillingLength; + MOmxScriptTestLogger& iLogger; + TBool iEOSReached; + TUint32 iTimeStamp; + }; + + NONSHARABLE_CLASS(CComponentInfo) : public CBase + { + public: + CComponentInfo(OMX_COMPONENTTYPE* aComp); + ~CComponentInfo(); + CPortInfo* AddPortL(TInt aPortNum, const TDesC& aFileName,OMX_BUFFERSUPPLIERTYPE aSupplier, OMX_DIRTYPE aPortDir, MOmxScriptTestLogger& aLogger, TInt aHeaderLength); + void AllocateBuffersL(); + void FillBuffers(); + void BufferDone(OMX_BUFFERHEADERTYPE* aBufHdr, TBool aSource); + void HoldBuffers(); + void FreeBuffers(); + static TBool CompareComp(const OMX_COMPONENTTYPE* aSource, const CComponentInfo& aComponentInfo); + + void Start(TInt aPortNum); + void Stop(TInt aPortNum); + void Resume(TInt aPortNum); + void Pause(TInt aPortNum); + + private: + OMX_COMPONENTTYPE* iComp; + RPointerArray iPorts; + OMX_STATETYPE iState; + }; + + + RPointerArray iComponents; + }; + +#endif // PORTBUFFERHANDLER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/statedes.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/statedes.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#include "statedes.h" + +_LIT(KStateLoaded, "LOADED"); +_LIT(KStateIdle, "IDLE"); +_LIT(KStateExecuting, "EXECUTING"); +_LIT(KStatePause, "PAUSE"); +_LIT(KStateWaitForResources, "WAIT_FOR_RESOURCES"); +_LIT(KStateStateInvalid, "STATEINVALID"); +_LIT(KBadState, "?"); + +_LIT(KClockStateRunning, "CLOCKSTATE_RUNNING"); +_LIT(KClockStateWaitingForStartTime, "CLOCKSTATE_WAITINGFORSTARTTIME"); +_LIT(KClockStateStopped, "CLOCKSTATE_STOPPED"); +_LIT(KClockStateUnknown, "CLOCKSTATE_UNKNOWN"); + +const TDesC* StateDes(OMX_STATETYPE aState) + { + switch(aState) + { + case OMX_StateLoaded: + return &KStateLoaded; + case OMX_StateIdle: + return &KStateIdle; + case OMX_StateExecuting: + return &KStateExecuting; + case OMX_StatePause: + return &KStatePause; + case OMX_StateWaitForResources: + return &KStateWaitForResources; + case OMX_StateInvalid: + return &KStateStateInvalid; + default: + return &KBadState; + } + } + +const TDesC* ClockStateDes(OMX_TIME_CLOCKSTATE aClockState) + { + switch(aClockState) + { + case OMX_TIME_ClockStateRunning: + return &KClockStateRunning; + case OMX_TIME_ClockStateWaitingForStartTime: + return &KClockStateWaitingForStartTime; + case OMX_TIME_ClockStateStopped: + return &KClockStateStopped; + default: + return &KClockStateUnknown; + } + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/statedes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/statedes.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#ifndef STATEDES_H_ +#define STATEDES_H_ + +#include +#include +#include + +const TDesC* StateDes(OMX_STATETYPE aState); +const TDesC* ClockStateDes(OMX_TIME_CLOCKSTATE aClockState); + +#endif /*STATEDES_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/threadedlogger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/threadedlogger.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,104 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "threadedlogger.h" + +CThreadedLogger* CThreadedLogger::NewLC(MOmxScriptTestLogger& aRealLogger) + { + CThreadedLogger* self = new(ELeave) CThreadedLogger(aRealLogger); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CThreadedLogger::CThreadedLogger(MOmxScriptTestLogger& aRealLogger): +CActive(EPriorityHigh), +iRealLogger(aRealLogger) + { + iCreatorThreadId = iCreatorThread.Id(); + } + +void CThreadedLogger::ConstructL() + { + User::LeaveIfError(iCreatorThread.Open(iCreatorThreadId)); + User::LeaveIfError(iMutex.CreateLocal()); + User::LeaveIfError(iSemaphore.CreateLocal(0)); + CActiveScheduler::Add(this); + iStatus = KRequestPending; + SetActive(); + } + +CThreadedLogger::~CThreadedLogger() + { + Cancel(); + iSemaphore.Close(); + iMutex.Close(); + iCreatorThread.Close(); + } + +void CThreadedLogger::Log(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, const TDes& aMessage) + { + if(RThread().Id() == iCreatorThreadId) + { + iRealLogger.Log(aFile, aLine, aSeverity, aMessage); + } + else + { + // proxy the log to creator thread + + // mutex prevents multiple threads to proxy at the same time + iMutex.Wait(); + + // const_cast is regrettable but all we do is pass the params onto a another MOmxScriptTestLogger which will + // also treat the args as const + iFile = const_cast(aFile); + iLine = aLine; + iSeverity = aSeverity; + iMessage = &const_cast(aMessage); + + // signal the creator thread (waking the Active Object) + TRequestStatus* statusPtr = &iStatus; + iCreatorThread.RequestComplete(statusPtr, KErrNone); + + // wait for creator thread to signal back + + iSemaphore.Wait(); + iMutex.Signal(); + } + } + +void CThreadedLogger::RunL() + { + if(iStatus.Int() == KErrCancel) + { + return; + } + iRealLogger.Log(iFile, iLine, iSeverity, *iMessage); + iFile = NULL; + iLine = 0; + iSeverity = (TOmxScriptSeverity) 0; + iMessage = NULL; + iStatus = KRequestPending; + SetActive(); + iSemaphore.Signal(); // signal the requestor thread + } + +void CThreadedLogger::DoCancel() + { + TRequestStatus* statusPtr = &iStatus; + User::RequestComplete(statusPtr, KErrCancel); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/threadedlogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/threadedlogger.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef THREADEDLOGGER_H_ +#define THREADEDLOGGER_H_ + +#include "omx_xml_script.h" + +/** + * Adapter class that serializes all Log() calls on the underlying logger into the same thread. + * That is, a call to Log() from a thread that did not create this AO will block until the AO has + * completed the log in the AS thread. + * + * This class is provided to allow the use of loggers that would otherwise KERN-EXEC 0 panic if + * used by multiple threads. + */ +class CThreadedLogger : public CActive, public MOmxScriptTestLogger + { +public: + static CThreadedLogger* NewLC(MOmxScriptTestLogger& aRealLogger); + ~CThreadedLogger(); + + void Log(const TText8* aFile, TInt aLine, TOmxScriptSeverity aSeverity, const TDes& aMessage); + +private: + CThreadedLogger(MOmxScriptTestLogger& aRealLogger); + void ConstructL(); + + void RunL(); + void DoCancel(); + +private: + MOmxScriptTestLogger& iRealLogger; + RThread iCreatorThread; + RMutex iMutex; + RSemaphore iSemaphore; + TThreadId iCreatorThreadId; + + TText8* iFile; + TInt iLine; + TOmxScriptSeverity iSeverity; + TDes* iMessage; + }; + +#endif /* THREADEDLOGGER_H_ */ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/transition.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/transition.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "transition.h" +#include + +void CloseSupplierRelations(TAny* aPtr) + { + RSupplierRelations& links = *reinterpret_cast(aPtr); + for(TInt i = 0, count = links.Count(); i < count; i++) + { + links[i].Close(); + } + links.Close(); + } + +/** + * Finds a transition order in which no component is transitioned until all components it suppliers to have been transitioned. + * If no such order exists (this happens if and only if a cyclic buffer supply chain exists in the graph), this method leaves + * with KErrNotFound. + * + * The result of this algorithm is appropriate for transitioning components from the Loaded state to the Idle state without incurring + * errors calling OMX_UseBuffer. For transitions Executing->Idle and Executing->Paused, the reverse order can be used. + * + * @leave KErrNoMemory + * @leave KErrNotFound iff a transition order for the graph does not exist + * @leave KErrArgument if aOrder passed in is not empty + */ +void FindTransitionOrderL(const RSupplierRelations& aSupplierRelations, RArray& aOrder) + { + if(aOrder.Count() > 0) + { + User::Leave(KErrArgument); + } + + TInt numComponents = aSupplierRelations.Count(); + TInt numPendingComponents = numComponents; + RArray pendingComponents; + CleanupClosePushL(pendingComponents); + for(TInt i = 0; i < numComponents; i++) + { + pendingComponents.AppendL(ETrue); + } + + while(numPendingComponents > 0) + { + TInt nextComponent = KErrNotFound; + for(TInt i = 0; i < numComponents && nextComponent == KErrNotFound; i++) + { + // try each component not yet transitioned + if(pendingComponents[i]) + { + // have all this component's non-supplier peers been transitioned? + nextComponent = i; + for(TInt j = 0, numSupplied = aSupplierRelations[i].Count(); j < numSupplied && nextComponent != KErrNotFound; j++) + { + if(pendingComponents[aSupplierRelations[i][j]]) + { + // no, this component can't transition yet + nextComponent = KErrNotFound; + } + } + } + } + // couldn't find a component to transition? so no solution + if(nextComponent == KErrNotFound) + { + aOrder.Reset(); + User::Leave(KErrNotFound); + } + + // this component can transition + aOrder.AppendL(nextComponent); + pendingComponents[nextComponent] = EFalse; + numPendingComponents--; + } + + CleanupStack::PopAndDestroy(&pendingComponents); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/transition.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/transition.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#ifndef TRANSITION_H_ +#define TRANSITION_H_ + +#include + +/** RSupplierRelations represents the buffer supplier links in a graph */ +typedef RArray > RSupplierRelations; + +void CloseSupplierRelations(TAny* aPtr); + +/* + +For example, consider the following graph: (<-- indicates direction of buffer supply) + + | 0 | <-- 1 <-- 2 + | 0 | --> 3 <-- 4 --> 5 + + The supplier relations table is: + + 0: 3 + 1: 0 + 2: 1 + 3: + 4: 3, 5 + 5: + + A valid transition order for this graph is { 3, 0, 1, 2, 5, 4 } + +*/ + +void FindTransitionOrderL(const RSupplierRelations& aSupplierRelations, RArray& aOrder); + +#endif /*TRANSITION_H_*/ diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videobufferhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videobufferhandler.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,156 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include "videobufferhandler.h" +#include + +const TInt KDefaultTimeInterval = 100000; + +CVideoBufferHandler* CVideoBufferHandler::NewL( + TDesC& aFilename, + OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, + const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, + OMX_PARAM_PORTDEFINITIONTYPE& portDef) + { + CVideoBufferHandler* handler = new (ELeave) CVideoBufferHandler(aFilename); + CleanupStack::PushL(handler); + handler->ConstructL(aChunkDataMsg, aBufferSize, portDef); + CleanupStack::Pop(handler); + + return handler; + } + +CVideoBufferHandler::~CVideoBufferHandler() + { + iReceiveBuffer.Close(); + iSendBuffer.Close(); + iBufferChunk.Close(); + iFileSource.Close(); + iFs.Close(); + } + +void CVideoBufferHandler::DoCancel() + { + iReceiveBuffer.CancelDataAvailable(); + } + +CVideoBufferHandler::CVideoBufferHandler(TDesC& aFilename): + CActive(EPriorityStandard), + iReadDes(NULL, 0, 0), + iFirstBuffer(ETrue) + { + CActiveScheduler::Add(this); + iFileName.Append(aFilename); + } + +void CVideoBufferHandler::ChangeFilledBufferLength(TInt aLength) + { + if (!iChangeFileBufferLength) + { + iChangeFileBufferLength = ETrue; + } + iFileBufferLengthTestValue = aLength; + } + + +void CVideoBufferHandler::SetSendInvalidBufferId(TInt aSendInvalidBufferId) + { + iSendInvalidBufferId = aSendInvalidBufferId; + } + +void CVideoBufferHandler::RunL() + { + // Timer has expired check for new messages... + TFilledBufferHeaderV2 header; + User::LeaveIfError(iReceiveBuffer.Receive(header)); + TUint8* chunkBase = iBufferChunk.Base(); + + TUint8* bufBase = chunkBase + header.iOffset; + + iReadDes.Set(bufBase, 0, iBufConfig.iBufferSizeInBytes); + iFileSource.Read(iReadDes); + + if (iChangeFileBufferLength) + { + // this is negative test case. COmxILCallbackManager::BufferDoneNotification() will panic + header.iFilledLength = iFileBufferLengthTestValue; + } + else + { + header.iFilledLength = iReadDes.Length(); + } + + iTimeStamp += KDefaultTimeInterval; + header.iTimeStamp = iTimeStamp; + + if (iReadDes.Length() != 0) + { + // there is more to read from file source, request for more buffer + header.iFlags = iFirstBuffer ? OMX_BUFFERFLAG_STARTTIME : 0; + iReceiveBuffer.NotifyDataAvailable(iStatus); + SetActive(); + } + else + { + header.iFlags = OMX_BUFFERFLAG_EOS; + } + + if (iSendInvalidBufferId) + { + header.iOffset=KMaxTUint32; + User::LeaveIfError(iSendBuffer.Send(header)); + iSendInvalidBufferId = 0; + } + else + User::LeaveIfError(iSendBuffer.Send(header)); + } + +void CVideoBufferHandler::ConstructL(OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef) + + { + iBufferChunk.SetHandle(aChunkDataMsg.nChunk); + User::LeaveIfError(iBufferChunk.Duplicate(RThread())); + + iReceiveBuffer.SetHandle(aChunkDataMsg.nAvailableBufferQueue ); + User::LeaveIfError(iReceiveBuffer.Duplicate(RThread())); + + iSendBuffer.SetHandle(aChunkDataMsg.nFilledBufferQueue); + User::LeaveIfError(iSendBuffer.Duplicate(RThread())); + + if (portDef.nBufferCountActual <= 0 || portDef.nBufferSize <= 0) + { + User::Leave(KErrArgument); + } + + iBufConfig.iNumBuffers = portDef.nBufferCountActual; + iBufConfig.iBufferSizeInBytes = aBufferSize.nBufferSize; + + // Open datafile + User::LeaveIfError(iFs.Connect()); + User::LeaveIfError(iFileSource.Open(iFs, iFileName, EFileShareExclusive|EFileRead)); + } + +void CVideoBufferHandler::Start() + { + // Start streaming + iFirstBuffer = ETrue; + iReceiveBuffer.NotifyDataAvailable(iStatus); + iTimeStamp = KDefaultTimeInterval; + SetActive(); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videobufferhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videobufferhandler.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +#ifndef VIDEOBUFFERHANDLER_H +#define VIDEOBUFFERHANDLER_H + +#include +#include +#include +#include +#include +#include + +NONSHARABLE_CLASS(CVideoBufferHandler) : public CActive + { +public: + virtual ~CVideoBufferHandler(); + static CVideoBufferHandler* NewL(TDesC& aFilename, OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef); + +public: + void Start(); + void ChangeFilledBufferLength(TInt aLength); + void SetSendInvalidBufferId(TInt aSendInvalidBufferId); + +protected: + CVideoBufferHandler(TDesC& aFilename); + +private: + void ConstructL(OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef); + + // From CActive + void RunL(); + void DoCancel(); + +protected: + RMsgQueue iReceiveBuffer; + RMsgQueue iSendBuffer; + TMMSharedChunkBufConfig iBufConfig; + TPtr8 iReadDes; + + RChunk iBufferChunk; + TBuf iFileName; + RFile iFileSource; + RFs iFs; + TBool iFirstBuffer; + TBool iChangeFileBufferLength; + TInt iFileBufferLengthTestValue; + TInt iSendInvalidBufferId; + TInt iTimeStamp; + }; + +#endif // VIDEOBUFFERHANDLER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videobufferhandler_mpeg4.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videobufferhandler_mpeg4.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,151 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include "videobufferhandler_mpeg4.h" +#include +#include + + +CVideoBufferHandlerMPEG4* CVideoBufferHandlerMPEG4::NewL( + TDesC& aFilename, + OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, + const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, + OMX_PARAM_PORTDEFINITIONTYPE& portDef) + { + CVideoBufferHandlerMPEG4* handler = new (ELeave) CVideoBufferHandlerMPEG4(aFilename); + CleanupStack::PushL(handler); + handler->ConstructL(aChunkDataMsg, aBufferSize, portDef); + CleanupStack::Pop(handler); + + return handler; + } + +CVideoBufferHandlerMPEG4::~CVideoBufferHandlerMPEG4() + { + delete iFrameSupplier; + } + +CVideoBufferHandlerMPEG4::CVideoBufferHandlerMPEG4(TDesC& aFilename): + CVideoBufferHandler(aFilename) + { + } + +void CVideoBufferHandlerMPEG4::RunL() + { + // Timer has expired check for new messages... + TFilledBufferHeaderV2 header; + + User::LeaveIfError(iReceiveBuffer.Receive(header)); + TUint8* chunkBase = iBufferChunk.Base(); + //__ASSERT_ALWAYS(message < iBufConfig.iNumBuffers, User::Invariant()); + + TUint8* bufBase = chunkBase + header.iOffset; + + TInt frameLength = 0; + TInt err = iFrameSupplier->NextFrameData(bufBase, frameLength); + if (err != KErrNone) + { + User::Leave(err); + } + + if (iChangeFileBufferLength) + { + // this is negative test case. COmxILCallbackManager::BufferDoneNotification() will panic + header.iFilledLength = iFileBufferLengthTestValue; + } + else + { + header.iFilledLength = frameLength; + } + + if (!iFrameSupplier->IsLastFrame()) + { + // there is more to read from file source, request for more buffer + header.iTimeStamp = 0; + header.iFlags = (iFrameSupplier->CurrentFrame() == 0 ? OMX_BUFFERFLAG_STARTTIME : 0); + iReceiveBuffer.NotifyDataAvailable(iStatus); + SetActive(); + } + else + { + header.iFlags = OMX_BUFFERFLAG_EOS; + } + + if (iSendInvalidBufferId) + { + User::LeaveIfError(iSendBuffer.Send(header)); + iSendInvalidBufferId = 0; + } + else + { + User::LeaveIfError(iSendBuffer.Send(header)); + } + } + + +void CVideoBufferHandlerMPEG4::ConstructL(OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef) + { + RThread chunkOwnerThread; + + TInt error = chunkOwnerThread.Open(TThreadId(aChunkDataMsg.nThreadId)); + iBufferChunk.SetHandle(aChunkDataMsg.nChunk); + User::LeaveIfError(iBufferChunk.Duplicate(chunkOwnerThread)); + + iReceiveBuffer.SetHandle(aChunkDataMsg.nAvailableBufferQueue); + User::LeaveIfError(iReceiveBuffer.Duplicate(RThread())); + + iSendBuffer.SetHandle(aChunkDataMsg.nFilledBufferQueue); + User::LeaveIfError(iSendBuffer.Duplicate(RThread())); + + if ((portDef.nBufferCountActual <= 0) || (portDef.nBufferSize <= 0)) + { + User::Leave(KErrArgument); + } + + iFrameSupplier = CVideoFrameSupplier::NewL(iFileName, CVideoFrameSupplier::EVideoFileTypeMPEG4); + + iBufConfig.iNumBuffers = portDef.nBufferCountActual; + iBufConfig.iBufferSizeInBytes = aBufferSize.nBufferSize; + } + + +void CVideoBufferHandlerMPEG4::SetChunkDetailAndOpenL(TInt aChunkHandleId, TUint64 aThreadId) + { + RThread chunkOwnerThread; + + TInt err = chunkOwnerThread.Open(TThreadId(aThreadId)); + if (err != KErrNone) + { + User::LeaveIfError(err); + } + + CleanupClosePushL(chunkOwnerThread); + + iBufferChunk.SetHandle(aChunkHandleId); + err = iBufferChunk.Duplicate(chunkOwnerThread); + if (err != KErrNone) + { + User::LeaveIfError(err); + } + + CleanupStack::PopAndDestroy(&chunkOwnerThread); + } + + + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videobufferhandler_mpeg4.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videobufferhandler_mpeg4.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +#ifndef VIDEOBUFFERHANDLERMPEG4_H +#define VIDEOBUFFERHANDLERMPEG4_H + +#include +#include +#include +#include +#include +#include +#include +#include "videobufferhandler.h" + +const TInt KVideoBufferLength=102400; + +typedef struct + { + // Maybe these should be 64-bit variables for large video files. + TInt iPosition; + TInt iLength; + } +TFrameLocation; + +NONSHARABLE_CLASS(CVideoBufferHandlerMPEG4) : public CVideoBufferHandler + { +public: + + ~CVideoBufferHandlerMPEG4(); + static CVideoBufferHandlerMPEG4* NewL(TDesC& aFilename, OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef); + +private: + CVideoBufferHandlerMPEG4(TDesC& aFilename); + void ConstructL(OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef); + + void SetChunkDetailAndOpenL(TInt aChunkHandleId, TUint64 aThreadId); + + // From CActive + void RunL(); + +private: + CVideoFrameSupplier* iFrameSupplier; + + + }; + +#endif // VIDEOBUFFERHANDLERMPEG4_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videobuffersinkhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videobuffersinkhandler.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,116 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include "videobuffersinkhandler.h" +#include + +CVideoBufferSinkHandler* CVideoBufferSinkHandler::NewL( + TDesC& aFilename, + OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, + const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, + OMX_PARAM_PORTDEFINITIONTYPE& portDef) + { + CVideoBufferSinkHandler* handler = new (ELeave) CVideoBufferSinkHandler(aFilename); + CleanupStack::PushL(handler); + handler->ConstructL(aChunkDataMsg, aBufferSize, portDef); + CleanupStack::Pop(handler); + + return handler; + } + +CVideoBufferSinkHandler::~CVideoBufferSinkHandler() + { + iReceiveBuffer.Close(); + iSendBuffer.Close(); + iBufferChunk.Close(); + iFileSink.Close(); + iFs.Close(); + } + +CVideoBufferSinkHandler::CVideoBufferSinkHandler(TDesC& aFilename): + CActive(EPriorityStandard), + iWriteDes(NULL, 0, 0) + { + CActiveScheduler::Add(this); + iFileName.Append(aFilename); + } + +void CVideoBufferSinkHandler::ConstructL(OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef) + { + iBufferChunk.SetHandle(aChunkDataMsg.nChunk); + User::LeaveIfError(iBufferChunk.Duplicate(RThread())); + + iReceiveBuffer.SetHandle(aChunkDataMsg.nFilledBufferQueue ); + User::LeaveIfError(iReceiveBuffer.Duplicate(RThread())); + + iSendBuffer.SetHandle(aChunkDataMsg.nAvailableBufferQueue); + User::LeaveIfError(iSendBuffer.Duplicate(RThread())); + + if (portDef.nBufferCountActual <= 0 || portDef.nBufferSize <= 0) + { + User::Leave(KErrArgument); + } + + iBufConfig.iNumBuffers = portDef.nBufferCountActual; + iBufConfig.iBufferSizeInBytes = aBufferSize.nBufferSize; + + // Open datafile + User::LeaveIfError(iFs.Connect()); + User::LeaveIfError(iFileSink.Replace(iFs, iFileName, EFileShareExclusive|EFileWrite)); + } + +void CVideoBufferSinkHandler::Start() + { + // Start streaming + iReceiveBuffer.NotifyDataAvailable(iStatus); + SetActive(); + } + +void CVideoBufferSinkHandler::RunL() + { + TFilledBufferHeaderV2 header; + User::LeaveIfError(iReceiveBuffer.Receive(header)); + + TUint8* chunkBase = iBufferChunk.Base(); + + TUint8* bufBase = chunkBase + header.iOffset; + + iWriteDes.Set(bufBase, header.iFilledLength, iBufConfig.iBufferSizeInBytes); + + __ASSERT_ALWAYS(header.iFilledLength <= iWriteDes.Length(), User::Invariant()); + + iFileSink.Write(iWriteDes); + + if (header.iFlags != OMX_BUFFERFLAG_EOS) + { + // there is no more to read from file source, request for more buffer + iReceiveBuffer.NotifyDataAvailable(iStatus); + SetActive(); + } + + User::LeaveIfError(iSendBuffer.Send(header)); + } + +void CVideoBufferSinkHandler::DoCancel() + { + iReceiveBuffer.CancelDataAvailable(); + } + + + diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videobuffersinkhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videobuffersinkhandler.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +#ifndef VIDEOBUFFERSINKHANDLER_H +#define VIDEOBUFFERSINKHANDLER_H + +#include +#include +#include +#include +#include +#include + +NONSHARABLE_CLASS(CVideoBufferSinkHandler) : public CActive + { +public: + ~CVideoBufferSinkHandler(); + static CVideoBufferSinkHandler* NewL(TDesC& aFilename, OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef); + + +public: + void Start(); + +private: + CVideoBufferSinkHandler(TDesC& aFilename); + void ConstructL(OMX_SYMBIAN_PARAM_3PLANE_CHUNK_DATA& aChunkDataMsg, const OMX_SYMBIAN_PARAM_BUFFER_SIZE& aBufferSize, OMX_PARAM_PORTDEFINITIONTYPE& portDef); + + // From CActive + void RunL(); + void DoCancel(); + +private: + RMsgQueue iReceiveBuffer; + RMsgQueue iSendBuffer; + TMMSharedChunkBufConfig iBufConfig; + TPtr8 iWriteDes; + + + RChunk iBufferChunk; + TBuf iFileName; + RFile iFileSink; + RFs iFs; + }; + +#endif // VIDEOBUFFERSINKHANDLER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videotesttimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videotesttimer.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +#include "videotesttimer.h" + + +CVideoTestTimer::CVideoTestTimer(MTimerObserver& aTimerObserver) +: CTimer(EPriorityHigh), iTimerObserver(aTimerObserver) + { + CActiveScheduler::Add(this); + } + +CVideoTestTimer* CVideoTestTimer::NewL(MTimerObserver& aTimerObserver) + { + CVideoTestTimer* self = new (ELeave) CVideoTestTimer(aTimerObserver); + CleanupStack::PushL(self); + self->ConstructL(); // this call CTimer::ConstructL + CleanupStack::Pop(self); + return self; + } + +CVideoTestTimer::~CVideoTestTimer() + { + // cancel is called by CTimer destructor + } + +/** Start the timer */ +void CVideoTestTimer::Start(TTimeIntervalMicroSeconds32 aDelay) + { + HighRes(aDelay); + } + +/** Handle completion */ +void CVideoTestTimer::RunL() + { + if (iStatus == KErrNone) + { + iTimerObserver.TimerExpired(); + } + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/videotesttimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/videotesttimer.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + + +#ifndef VIDEOTESTTIMER_H +#define VIDEOTESTTIMER_H + +#include + + + + +class MTimerObserver + { +public: + virtual void TimerExpired() = 0; + }; + +NONSHARABLE_CLASS(CVideoTestTimer) : public CTimer + { +public: + ~CVideoTestTimer(); + static CVideoTestTimer* NewL(MTimerObserver& aTimerObserver); + void Start(TTimeIntervalMicroSeconds32 aDelay); + +private: + CVideoTestTimer(MTimerObserver& aTimerObserver); + void RunL(); + +private: + MTimerObserver& iTimerObserver; + }; + +#endif // VIDEOTESTTIMER_H diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/windowmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/windowmanager.cpp Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#include "windowmanager.h" + +CWindowManager* CWindowManager::NewL() + { + CWindowManager* self = new(ELeave) CWindowManager(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CWindowManager::CWindowManager(): +CActive(EPriorityStandard) + { + CActiveScheduler::Add(this); + } + +void CWindowManager::ConstructL() + { + User::LeaveIfError(iMsgQueue.CreateLocal(1)); + User::LeaveIfError(iSemaphore.CreateLocal(0)); + + User::LeaveIfError(iWsSession.Connect()); + // Create the Screen device for the WServ session. + iWsSd = new (ELeave) CWsScreenDevice(iWsSession); + User::LeaveIfError(iWsSd->Construct()); + // Create a Window Group. + iWindowGroup = RWindowGroup(iWsSession); + User::LeaveIfError(iWindowGroup.Construct((TUint32)this, ETrue)); + iWindow = new (ELeave) RWindow(iWsSession); + User::LeaveIfError(iWindow->Construct(iWindowGroup, ((TUint32)(this)) + 1)); + + // Reset the screen mode. + if(iWsSd->CurrentScreenMode() != 0) + { + iWsSd->SetAppScreenMode(0); + iWsSd->SetScreenMode(0); + } + + iScreenSize = iWsSd->SizeInPixels(); + iWindow->SetExtent(TPoint(0,0), iScreenSize); + iWindow->SetVisible(ETrue); + iWindow->Activate(); + + User::LeaveIfError(iWindow->SetRequiredDisplayMode(EColor16MA)); + + // TODO - this forcing of transparency may not be needed, as there is + // a defect in the graphics component right now + // force the transparency change to take place + iWindow->SetBackgroundColor(TRgb(0x000000, 0)); + iWindow->BeginRedraw(); + iWindow->EndRedraw(); + iWsSession.Flush(); + + iCreatorThreadId = RThread().Id(); + + SetActive(); + iMsgQueue.NotifyDataAvailable(iStatus); + } + +CWindowManager::~CWindowManager() + { + Cancel(); + if(iWindow) + { + iWindow->Close(); + delete iWindow; + } + iWindowGroup.Close(); + delete iWsSd; + iWsSession.Close(); + + iSemaphore.Close(); + iMsgQueue.Close(); + } + +void CWindowManager::RunL() + { + TMessage msg; + TInt err = iMsgQueue.Receive(msg); + if(err != KErrNone && err != KErrUnderflow) + { + iReturnCode = err; + } + else + { + iReturnCode = DoCommand(msg.iCommand, msg.iParam1, msg.iParam2); + } + SetActive(); + iMsgQueue.NotifyDataAvailable(iStatus); + iSemaphore.Signal(); + } + +void CWindowManager::DoCancel() + { + iMsgQueue.CancelDataAvailable(); + } + +TInt CWindowManager::RegisterSurface(TSurfaceId& aSurfaceId) + { + return RunCommand(ERegisterSurface, &aSurfaceId); + } + +TInt CWindowManager::SetBackgroundSurface(TSurfaceConfiguration& aSurfaceConfig, TBool aTriggerRedraw) + { + return RunCommand(ESetBackgroundSurface, &aSurfaceConfig, aTriggerRedraw); + } + +TInt CWindowManager::RunCommand(TCommand aCommand, TAny* aParam1, TInt aParam2) + { + if(RThread().Id() == iCreatorThreadId) + { + return DoCommand(aCommand, aParam1, aParam2); + } + else + { + TMessage msg; + msg.iCommand = aCommand; + msg.iParam1 = aParam1; + msg.iParam2 = aParam2; + iMsgQueue.SendBlocking(msg); + iSemaphore.Wait(); + return iReturnCode; + } + } + +TInt CWindowManager::DoCommand(TCommand aCommand, TAny* aParam1, TInt aParam2) + { + switch(aCommand) + { + case ERegisterSurface: + { + TSurfaceId& surfaceId = *reinterpret_cast(aParam1); + return iWsSession.RegisterSurface(iWsSd->GetScreenNumber(), surfaceId); + } + case ESetBackgroundSurface: + { + TSurfaceConfiguration& surfaceConfig = *reinterpret_cast(aParam1); + TBool triggerRedraw = aParam2; + return iWindow->SetBackgroundSurface(surfaceConfig, triggerRedraw); + } + default: + { + User::Invariant(); + return KErrNone; + } + } + } + +TSize CWindowManager::ScreenSize() const + { + return iScreenSize; + } + +void CWindowManager::Flush() + { + iWsSession.Flush(); + } diff -r 000000000000 -r 0e4a32b9112d tsrc/xmltestharness/xmlclient/src/windowmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/xmltestharness/xmlclient/src/windowmanager.h Wed Aug 25 12:40:50 2010 +0300 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** +@file +@internalComponent +*/ + +#ifndef WINDOWMANAGER_H_ +#define WINDOWMANAGER_H_ + +#include +#include + +/** + * Encapsulates the resources used to provide a window to render to via Graphic Surfaces. + * Proxies certain methods so that they can be used by arbitary threads. + */ +class CWindowManager : public CActive + { +private: + enum TCommand + { + ERegisterSurface, + ESetBackgroundSurface + }; + + struct TMessage + { + TCommand iCommand; + TAny* iParam1; + TInt iParam2; + }; + +public: + static CWindowManager* NewL(); + ~CWindowManager(); + + TSize ScreenSize() const; + + TInt RegisterSurface(TSurfaceId& aSurfaceId); + TInt SetBackgroundSurface(TSurfaceConfiguration& aSurfaceConfig, TBool aTriggerRedraw); + void Flush(); + +private: + CWindowManager(); + void ConstructL(); + + void RunL(); + void DoCancel(); + + TInt RunCommand(TCommand aCommand, TAny* aParam1, TInt aParam2 = 0); + TInt DoCommand(TCommand aCommand, TAny* aParam1, TInt aParam2); + +private: + RMsgQueue iMsgQueue; + RSemaphore iSemaphore; + TInt iReturnCode; + TThreadId iCreatorThreadId; + + RWsSession iWsSession; + CWsScreenDevice* iWsSd; // Screen Device for this WServ session. + RWindowGroup iWindowGroup; // Window group of the AO windows. + RWindow* iWindow; + TSize iScreenSize; + }; + +#endif /* WINDOWMANAGER_H_ */