/*
* 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 "omxscriptparser.h"
#include <xml/parser.h>
#include <utf.h>
#include "parsemap.h"
//#include <openmax/il/khronos/v1_x/OMX_CoreExt_Nokia.h>
#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;i<filename8Bit.Length();i++)
filepath[i]=filename8Bit.Ptr()[i];
filepath[i]='\0';
CheckForAbortL(iCallback.MosSetFilename_bellagio(comp, filepath));
//CleanupStack::PopAndDestroy(filename8Bit);
}
else if(elemName == _L8("SetDroppedFrameEvent"))
{
const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp"));
const TDesC8& action = FindAttributeL(aAttributes, _L8("action"));
CheckForAbortL(iCallback.MosSetDroppedFrameEvent(comp, action));
}
else if(elemName == _L8("SetBadFilename"))
{
const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp"));
CheckForAbortL(iCallback.MosSetBadFilename(comp));
}
else if(elemName == _L8("GetFilename"))
{
const TDesC8& comp = FindAttributeL(aAttributes, _L8("comp"));
const TDesC8& filename8Bit = FindAttributeL(aAttributes, _L8("filename"));
HBufC* filename = HBufC::NewLC(filename8Bit.Length());
filename->Des().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") || elemName == _L8("SetVideoPortFormat"))
{
const TDesC8& compPort = FindAttributeL(aAttributes, _L8("port"));
TPtrC8 comp;
TInt port;
ParseCompPortL(compPort, comp, port);
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;
}
const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr"));
OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone;
if (expectedError)
{
expectedErrorInt = ParseOmxErrorCode(*expectedError);
}
if (elemName == _L8("SetVideoPortFormat"))
{
TInt rate = ParseOptionalIntL(aAttributes, _L8("framerate"), -1);
CheckForAbortL(iCallback.MosSetVideoPortFormatsL(comp, port, colorFormatPtr, codingTypePtr, rate, expectedErrorInt));
return;
}
// The rest apply to SetVideoPortDef only
TInt width = ParseOptionalIntL(aAttributes, _L8("width"), -1);
TInt height = ParseOptionalIntL(aAttributes, _L8("height"), -1);
TInt stride = ParseOptionalIntL(aAttributes, _L8("stride"), -1);
#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<TUint32>(ParseOmxErrorL(nData1Des));
break;
case OMX_EventCmdComplete:
nData1 = static_cast<TUint32>(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") || elemName == _L8("EnablePort"))
{
const TDesC8& port = FindAttributeL(aAttributes, _L8("port"));
TPtrC8 comp;
TInt portIndex;
ParseCompPortL(port, comp, portIndex);
const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr"));
OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone;
if (expectedError)
{
expectedErrorInt = ParseOmxErrorCode(*expectedError);
}
if (elemName == _L8("EnablePort"))
{
CheckForAbortL(iCallback.MosEnablePort(comp, portIndex, expectedErrorInt));
}
else
{
CheckForAbortL(iCallback.MosDisablePort(comp, portIndex, expectedErrorInt));
}
}
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<TUint32>(ParseOmxErrorL(nData1Des));
break;
case OMX_EventCmdComplete:
nData1 = static_cast<TUint32>(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<OMX_NUMERICALDATATYPE>(-1);
}
OMX_ENDIANTYPE endian = OMX_EndianMax;
des = FindAttribute(aAttributes, _L8("endian"));
if(des != NULL)
{
endian = ParseEndianL(*des);
}
else
{
endian = static_cast<OMX_ENDIANTYPE>(-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("CheckCommonScale") || elemName == _L8("SetCommonScale"))
{
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);
const TDesC8* expectedError = FindAttribute(aAttributes, _L8("expectedomxerr"));
OMX_ERRORTYPE expectedErrorInt = OMX_ErrorNone;
if (expectedError)
{
expectedErrorInt = ParseOmxErrorCode(*expectedError);
}
if (elemName == _L8("CheckCommonScale"))
{
CheckForAbortL(iCallback.MosCheckConfigCommonScaleL(comp, port, width, height, expectedErrorInt));
}
else
{
CheckForAbortL(iCallback.MosSetConfigCommonScaleL(comp, port, width, height, expectedErrorInt));
}
}
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 <OMX_AUDIO_AACPROFILETYPE>(-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<KMaxFileName> 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<KMaxFileName> 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<RAttribute>& 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<RAttribute>& 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<TInt>(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<typename T> 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<RAttribute>& 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<RAttribute>& 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<RAttribute>& 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;
}
}