diff -r 000000000000 -r 79dd3e2336a0 mmdevicefw/mdfunittest/codecapi/omxvorbis/src/tsu_mdf_omxvorbiscodecs_omx.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmdevicefw/mdfunittest/codecapi/omxvorbis/src/tsu_mdf_omxvorbiscodecs_omx.cpp Fri Oct 08 19:40:43 2010 +0100 @@ -0,0 +1,425 @@ +// Copyright (c) 2006-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 "tsu_mdf_omxvorbiscodecs_omx.h" +#include +#include +#include +#include "PU/decoder/vorbisdecoderprocessingunit.h" +#include "PU/vorbisprocessingunituids.hrh" +// for the bitrate custom interface +#include + +#include + +// +// RTestStepOmxVorbisCodecOmx +// general tests relating to OpenMax layer + +/** + * Constructor + */ +RTestStepOmxVorbisCodecOmx::RTestStepOmxVorbisCodecOmx() + { + iTestStepName = _L("MM-MDF-OMXVORBISCODECS-U-0020-HP"); + iHeapSize = KTestHeapSize; + } + +/** + * @see MMdfProcessingUnitObserver + */ +void RTestStepOmxVorbisCodecOmx::InitializeComplete(const CMdfProcessingUnit* /* aPu */, TInt /* aErrorCode */) + { + } + +/** + * @see MMdfProcessingUnitObserver + */ +void RTestStepOmxVorbisCodecOmx::ExecuteComplete(const CMdfProcessingUnit* /* aPu */, TInt /* aErrorCode */) + { + } + +/** + * Do the test step + */ +TVerdict RTestStepOmxVorbisCodecOmx::DoTestStepL() + { + // *** TO DO + // (Mip/Mop)Configure / GetConfig() are largely stubbed for both PU and + // input / output ports in the Vorbis PU. + // This ought to be fixed. + + iVerdict = EPass; + + CMdfProcessingUnit* theDecPu=NULL; + CMdfProcessingUnit* theEncPu=NULL; + + _LIT8(KTestGarbage, "I am Garbage"); + + const TDesC8& testGarbageDes = KTestGarbage; + const MMdfProcessingUnitObserver* garbageObs = NULL; + + // NB we *deliberately* use an unsafe cast + garbageObs = (const MMdfProcessingUnitObserver*)&testGarbageDes; + + TInt err = OMX_Init(); + if(err != KErrNone) + { + ERR_PRINTF1(_L("Error - couldn't initialise OpenMax")); + return EFail; + } + + TRAPD(err1, theDecPu = CMdfProcessingUnit::NewL(TUid::Uid(KUidVorbisDecoderPU) )); + if(err1 == KErrNone) + { + err1 = theDecPu->Create(*garbageObs); + } + + TRAPD(err2, theEncPu = CMdfProcessingUnit::NewL(TUid::Uid(KUidVorbisEncoderPU) )); + if(err2 == KErrNone) + { + err2 = theEncPu->Create(*garbageObs); + } + + if(err1 || err2) + { + ERR_PRINTF1(_L("Error - couldn't initialise PUs (1)")); + delete theDecPu; + delete theEncPu; + OMX_Deinit(); + REComSession::FinalClose(); + return EFail; + } + + // re-initialise using ourselves as observer + delete theDecPu; + delete theEncPu; + TRAP(err1, theDecPu = CMdfProcessingUnit::NewL(TUid::Uid(KUidVorbisDecoderPU) )); + if(err1 == KErrNone) + { + err1 = theDecPu->Create(*this); + } + + TRAP(err2, theEncPu = CMdfProcessingUnit::NewL(TUid::Uid(KUidVorbisEncoderPU) )); + if(err2 == KErrNone) + { + err2 = theEncPu->Create(*this); + } + + if(err1 || err2) + { + ERR_PRINTF1(_L("Error - couldn't initialise PUs (2)")); + delete theDecPu; + delete theEncPu; + OMX_Deinit(); + REComSession::FinalClose(); + return EFail; + } + + RPointerArray ipa; + RPointerArray opa; + + // decoder + if(theDecPu) + { + MMdfInputPort* inputPort = NULL; + MMdfOutputPort* outputPort = NULL; + + err1 = theDecPu->GetInputPorts(ipa); + if(err1 == KErrNone && ipa.Count()) + { + inputPort = ipa[0]; + } + err2 = theDecPu->GetOutputPorts(opa); + if(err2 == KErrNone && opa.Count()) + { + outputPort = opa[0]; + } + + if(!inputPort || !outputPort) + { + ERR_PRINTF1(_L("Error - couldn't get input/output ports")); + iVerdict = EFail; + } + else + { + // set port observers + inputPort->MipSetObserver(*this); + outputPort->MopSetObserver(*this); + + // configure + TTaskConfig config; + config.iRate = 0; + config.iStereoMode = 0; + TPuTaskConfig puConfig2(config); + err = theDecPu->Configure(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't configure PU")); + iVerdict = EFail; + } + err = theDecPu->GetConfig(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't get PU configuration")); + iVerdict = EFail; + } + + // create / free buffers + CMMFBuffer* inputBuffer = NULL; + CMMFBuffer* outputBuffer = NULL; + + // try and create oversized buffers + inputBuffer = inputPort->MipCreateBuffer(20480000); + if(inputBuffer) + { + ERR_PRINTF1(_L("Error - oversize buffer creation was non-null")); + iVerdict = EFail; + } + outputBuffer = outputPort->MopCreateBuffer(0); + if(outputBuffer) + { + ERR_PRINTF1(_L("Error - zero buffer creation was non-null")); + iVerdict = EFail; + } + + TUint32 inputBufSize = 2048; + inputBufSize = inputPort->MipBufferSize(); + inputBuffer = inputPort->MipCreateBuffer(inputBufSize); + outputBuffer = outputPort->MopCreateBuffer(inputBufSize); + if(!inputBuffer || !outputBuffer) + { + ERR_PRINTF1(_L("Error - failed to create input or output buffer")); + iVerdict = EFail; + } + + // direct port config + err = inputPort->MipConfigure(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't configure input port")); + iVerdict = EFail; + } + err = inputPort->MipGetConfig(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't get input port configuration")); + iVerdict = EFail; + } + err = outputPort->MopConfigure(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't configure output port")); + iVerdict = EFail; + } + err = outputPort->MopGetConfig(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't get output port configuration")); + iVerdict = EFail; + } + + // --- get state + theDecPu->State(); + + // try and initialize twice; try and execute twice + + theDecPu->Initialize(); + theDecPu->Initialize(); + + theDecPu->Execute(); + theDecPu->Execute(); + + // try and action the ports when we're not running + // NB we should give some delay here so we don't free them before + // they are actioned + theDecPu->Pause(); + inputPort->MipWriteData(*inputBuffer); + outputPort->MopReadData(*outputBuffer); + User::After(2000000L); + + theDecPu->Stop(); + inputPort->MipWriteData(*inputBuffer); + outputPort->MopReadData(*outputBuffer); + User::After(2000000L); + + err = inputPort->MipFreeBuffer(inputBuffer); + err += outputPort->MopFreeBuffer(outputBuffer); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't free input/output buffer")); + iVerdict = EFail; + } + + opa.Close(); + ipa.Close(); + } + } + + // encoder + if(theEncPu) + { + MMdfInputPort* inputPort = NULL; + MMdfOutputPort* outputPort = NULL; + + err1 = theEncPu->GetInputPorts(ipa); + if(err1 == KErrNone && ipa.Count()) + { + inputPort = ipa[0]; + } + err2 = theEncPu->GetOutputPorts(opa); + if(err2 == KErrNone && opa.Count()) + { + outputPort = opa[0]; + } + + if(!inputPort || !outputPort) + { + ERR_PRINTF1(_L("Error - couldn't get input/output ports")); + iVerdict = EFail; + } + else + { + + // configure + TTaskConfig config; + config.iRate = 0; + config.iStereoMode = 0; + TPuTaskConfig puConfig2(config); + err = theEncPu->Configure(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't configure PU")); + iVerdict = EFail; + } + err = theEncPu->GetConfig(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't get PU configuration")); + iVerdict = EFail; + } + + // create / free buffers + CMMFBuffer* inputBuffer = NULL; + CMMFBuffer* outputBuffer = NULL; + + // try and create oversized buffers + inputBuffer = inputPort->MipCreateBuffer(20480000); + if(inputBuffer) + { + ERR_PRINTF1(_L("Error - oversize buffer creation was non-null")); + iVerdict = EFail; + } + outputBuffer = outputPort->MopCreateBuffer(0); + if(outputBuffer) + { + ERR_PRINTF1(_L("Error - zero buffer creation was non-null")); + iVerdict = EFail; + } + + TUint32 inputBufSize = 2048; + inputBufSize = inputPort->MipBufferSize(); + inputBuffer = inputPort->MipCreateBuffer(inputBufSize); + outputBuffer = outputPort->MopCreateBuffer(inputBufSize); + if(!inputBuffer || !outputBuffer) + { + ERR_PRINTF1(_L("Error - failed to create input or output buffer")); + iVerdict = EFail; + } + + // direct port config + err = inputPort->MipConfigure(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't configure input port")); + iVerdict = EFail; + } + err = inputPort->MipGetConfig(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't get input port configuration")); + iVerdict = EFail; + } + err = outputPort->MopConfigure(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't configure output port")); + iVerdict = EFail; + } + err = outputPort->MopGetConfig(puConfig2); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't get output port configuration")); + iVerdict = EFail; + } + + // --- get state + theEncPu->State(); + + // try and initialize twice; try and execute twice + + theEncPu->Initialize(); + theEncPu->Initialize(); + + theEncPu->Execute(); + theEncPu->Execute(); + + // try and action the ports when we're not running + // NB we should give some delay here so we don't free them before + // they are actioned + + // *** there is a problem with this at the moment - + // VorbisEncoder will kern-exec:3 when passed garbage data + // directly. To be resolved before this test goes back in. + /* + CMMFDataBuffer* dataBuffer = static_cast(inputBuffer); + TUint8* data_pointer = const_cast(dataBuffer->Data().Ptr()); + memset(data_pointer, 0, dataBuffer->Data().MaxLength()); + dataBuffer = static_cast(outputBuffer); + data_pointer = const_cast(dataBuffer->Data().Ptr()); + memset(data_pointer, 0, dataBuffer->Data().MaxLength()); + + theEncPu->Pause(); + inputPort->MipWriteData(*inputBuffer); + outputPort->MopReadData(*outputBuffer); + User::After(2000000L); + */ + + err = inputPort->MipFreeBuffer(inputBuffer); + err += outputPort->MopFreeBuffer(outputBuffer); + if(err) + { + ERR_PRINTF1(_L("Error - couldn't free input/output buffer")); + iVerdict = EFail; + } + + opa.Close(); + ipa.Close(); + } + } + + delete theDecPu; + delete theEncPu; + OMX_Deinit(); + REComSession::FinalClose(); + return iVerdict; + } + +// end