mmlibs/mmfw/tsrc/mmfunittest/DevVideo/src/TestDevVideoPlayOne.cpp
changeset 0 b8ed18f6c07b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmfunittest/DevVideo/src/TestDevVideoPlayOne.cpp	Thu Oct 07 22:34:12 2010 +0100
@@ -0,0 +1,2133 @@
+
+// Copyright (c) 2003-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:
+// TestDevVideoPlay.cpp
+// 
+//
+
+#include "TestDevVideoPlay.h"
+#include "TestDevVideoPlayTestData.h"
+#include "TestDevVideoPlugins/decoder.h"
+#include "TestDevVideoPlugins/postproc.h"
+#include <e32math.h>
+
+const TInt KTestScreenCount = 2;
+// DevVideoPlay base class
+
+const TUid KUidMDFVideoDecoderHwDeviceAdapter = { 0x102737ED };
+
+CTestDevVideoPlayStep::CTestDevVideoPlayStep(const TDesC& aTestName, TTestType aTestType)
+	{
+	// store the name of this test case
+	// this is the name that is used by the script file
+	// Each test step initialises it's own name
+	iTestStepName = aTestName;		
+	iTestType = aTestType;		// included in case needed in future
+	}
+	
+CTestDevVideoPlayStep::~CTestDevVideoPlayStep() 
+	{
+	delete iDevVideoPlay;
+	}
+
+TVerdict CTestDevVideoPlayStep::DoTestStepL()
+	{
+	// construct DevVideoPlay object
+	__UHEAP_MARK;
+	TRAPD(err, iDevVideoPlay = CMMFDevVideoPlay::NewL(*this));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Could not create a CMMFDevVideoPlay class!"));
+		return EInconclusive;
+		}
+	
+	TVerdict ret = EFail;
+
+	// call the test step
+	ret = DoTestL(*iDevVideoPlay);
+		
+	INFO_PRINTF1(_L("CMMFDevVideoPlay: Destroying"));
+	delete iDevVideoPlay;
+	iDevVideoPlay = NULL;
+	__MM_HEAP_MARKEND;
+	if(iError != KErrNone)
+		ERR_PRINTF2( _L("CMMFDevVideoPlay failed with error %d"), iError );
+	
+	return ret;
+	}
+
+
+// MMMFDevVideoPlayObserver
+void CTestDevVideoPlayStep::MdvpoNewBuffers()
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoNewBuffers()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoReturnPicture(TVideoPicture* /*aPicture*/)
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoReturnPicture()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoSupplementalInformation(const TDesC8& /*aData*/, 
+								  const TTimeIntervalMicroSeconds& /*aTimestamp*/, 
+								  const TPictureId& /*aPictureId*/)
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoSupplementalInformation()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoPictureLoss()
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoPictureLoss()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoPictureLoss(const TArray<TPictureId>& /*aPictures*/)
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoPictureLoss(TArray)"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoSliceLoss(TUint /*aFirstMacroblock*/, TUint /*aNumMacroblocks*/, const TPictureId& /*aPicture*/)
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoSliceLoss()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoReferencePictureSelection(const TDesC8& /*aSelectionData*/)
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoReferencePictureSelection()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoTimedSnapshotComplete(TInt /*aError*/, 
+								TPictureData* /*aPictureData*/, 
+								const TTimeIntervalMicroSeconds& /*aPresentationTimestamp*/, 
+								const TPictureId& /*aPictureId*/)
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoTimedSnapshotComplete()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoNewPictures()
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoNewPictures()"));
+	}
+
+void CTestDevVideoPlayStep::MdvpoFatalError(TInt aError)
+	{
+	iError = aError;
+	INFO_PRINTF2(_L("CTestDevVideoPlayStep::MdvpoFatalError():  Error = %d"), aError);
+	}
+
+void CTestDevVideoPlayStep::MdvpoInitComplete(TInt aError)
+	{
+	iError = aError;
+	INFO_PRINTF2(_L("CTestDevVideoPlayStep::MdvpoInitComplete():  Error = %d"), aError);
+	}
+
+void CTestDevVideoPlayStep::MdvpoStreamEnd()
+	{
+	INFO_PRINTF1(_L("CTestDevVideoPlayStep::MdvpoStreamEnd()"));
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayCommonFormat::CTestDevVideoPlayCommonFormat(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayCommonFormat* CTestDevVideoPlayCommonFormat::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayCommonFormat* self = new(ELeave) CTestDevVideoPlayCommonFormat(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayCommonFormat::DoTestL(CMMFDevVideoPlay& /*aDevVideoPlay*/)
+	{
+	TVerdict ret = EPass;
+	TBool expErr = ETrue;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  Find common format"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	// make a fake list of formats
+	RArray<TUncompressedVideoFormat> vFormats1;
+	RArray<TUncompressedVideoFormat> vFormats2;
+
+	TUncompressedVideoFormat commonFormat;
+	TUncompressedVideoFormat otherFormat;
+
+	// push arrays to cleanup stack
+	CleanupClosePushL(vFormats1);
+	CleanupClosePushL(vFormats2);
+
+	// setup vFormats1 
+	User::LeaveIfError(vFormats1.Append(KTestVidFormat1));
+	User::LeaveIfError(vFormats1.Append(KTestVidFormat2));
+
+	// setup vFormats2
+	User::LeaveIfError(vFormats2.Append(KTestVidFormat2));
+	User::LeaveIfError(vFormats2.Append(KTestVidFormat3));
+
+	TArray<TUncompressedVideoFormat> t1 = vFormats1.Array();
+	TArray<TUncompressedVideoFormat> t2 = vFormats2.Array();
+	TBool formatFound = EFalse;
+		
+	// attempt to find a common format
+	formatFound = CMMFDevVideoPlay::FindCommonFormat(t1, t2, commonFormat);
+
+	// now attempt to find a common format that doesn't exist
+	vFormats1.Reset();
+	User::LeaveIfError(vFormats1.Append(KTestVidFormat1));
+	User::LeaveIfError(vFormats1.Append(KTestVidFormat1));
+	TBool otherFormatFound = ETrue;
+
+	// perform search for non-existent common format
+	t1 = vFormats1.Array();	// need to get Array class again
+	otherFormatFound = CMMFDevVideoPlay::FindCommonFormat(t1, t2, otherFormat);
+
+	// close the arrays
+	CleanupStack::PopAndDestroy(2, &vFormats1);
+
+	// check format
+	if ( (!formatFound) || !(commonFormat == KTestVidFormat2) )
+		{
+		ret = EFail;
+		ERR_PRINTF1(_L("Error:  No common format found..."));
+		}
+	else if (otherFormatFound )
+		{
+		ret = EFail;
+		ERR_PRINTF1(_L("Error:  Found a common format when there wasn't one!"));
+		}
+	else
+		{
+		INFO_PRINTF3(_L("FindCommonFormat(), %d = %d"), formatFound, expErr);
+		}
+	return ret;
+	}
+
+
+//------------------------------------------------------------------
+
+
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayFindDecoders::CTestDevVideoPlayFindDecoders(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayFindDecoders* CTestDevVideoPlayFindDecoders::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayFindDecoders* self = new(ELeave) CTestDevVideoPlayFindDecoders(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayFindDecoders::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  FindDecoders"));
+
+	RArray<TUid> foundDecoders;
+	CleanupClosePushL(foundDecoders);
+	RArray<TUid> expectedDecoders;
+	CleanupClosePushL(expectedDecoders);
+	RArray<TUid> unExpectedDecoders;
+	CleanupClosePushL(unExpectedDecoders);
+
+	TInt error = KErrNone;
+	TUint32 requestedPostProcType = 0;
+	
+	// Unsupported mime type
+	if (!error)
+		{
+		requestedPostProcType = 0;
+		_LIT8(KMimeType1, "VIDEO/mpeg21");
+		foundDecoders.Reset();
+		expectedDecoders.Reset();
+		unExpectedDecoders.Reset();
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindDecodersL(KMimeType1(), requestedPostProcType, foundDecoders, EFalse));
+
+		if (!error)
+			error = CheckDecoders(foundDecoders, expectedDecoders, unExpectedDecoders);
+		}
+
+	// Unsupported post proc type
+	if (!error)
+		{
+		requestedPostProcType = EPpOutputCrop|EPpInputCrop;
+		foundDecoders.Reset();
+		_LIT8(KMimeType2, "videO/duMMy");
+		expectedDecoders.Reset();
+		unExpectedDecoders.Reset();
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindDecodersL(KMimeType2(), requestedPostProcType, foundDecoders, EFalse));
+		if (error == KErrNotFound)//we actually expect KErrNotFound here
+			error = KErrNone;
+		else
+			error = KErrGeneral;
+
+		if (!error)
+			error = CheckDecoders(foundDecoders, expectedDecoders, unExpectedDecoders);
+		}
+
+	// Unsupported mime type (by exact match)
+	if (!error)
+		{
+		_LIT8(KMimeType3, "video/H263-2000; profile=45;level=40");
+		requestedPostProcType = 0;
+		foundDecoders.Reset();
+		expectedDecoders.Reset();
+		unExpectedDecoders.Reset();
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindDecodersL(KMimeType3(), requestedPostProcType, foundDecoders, ETrue));
+		if (error == KErrNotFound)//we actually expect KErrNotFound here
+			error = KErrNone;
+		else
+			error = KErrGeneral;
+
+		if (!error)
+			error = CheckDecoders(foundDecoders, expectedDecoders, unExpectedDecoders);
+		}
+	
+	// Supported mime type (by unexact match)
+	if (!error)
+		{
+		_LIT8(KMimeType4, "video/H263-2000; profile=1234;level=20");
+		requestedPostProcType = 0;
+		foundDecoders.Reset();
+		expectedDecoders.Reset();
+		unExpectedDecoders.Reset();
+		User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+		User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindDecodersL(KMimeType4(), requestedPostProcType, foundDecoders, EFalse));
+
+		if (!error)
+			error = CheckDecoders(foundDecoders, expectedDecoders, unExpectedDecoders);
+		}
+	
+	// Supported mime type and post proc type (by exact match)
+	if (!error)
+		{
+		_LIT8(KMimeType5, "video/zippyvideo");
+		requestedPostProcType = EPpMirror|EPpInputCrop;
+		foundDecoders.Reset();
+		expectedDecoders.Reset();
+		unExpectedDecoders.Reset();
+		User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindDecodersL(KMimeType5(), requestedPostProcType, foundDecoders, ETrue));
+
+		if (!error)
+			error = CheckDecoders(foundDecoders, expectedDecoders, unExpectedDecoders);
+		}
+	
+	//Added to check that the mimetype comparison is not case sensitive
+	if (!error)
+		{
+		_LIT8(KMimeType6, "VIDEO/ZIPPYvideo");
+		requestedPostProcType = EPpMirror|EPpInputCrop;
+		foundDecoders.Reset();
+		expectedDecoders.Reset();
+		unExpectedDecoders.Reset();
+		User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+		User::LeaveIfError(unExpectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+		INFO_PRINTF1(_L("To check that the mime type comparison is not case sensitive"));
+		TRAP(error, aDevVideoPlay.FindDecodersL(KMimeType6(), requestedPostProcType, foundDecoders, ETrue));
+		INFO_PRINTF2(_L("error = %d"),error);
+		if (!error)
+			error = CheckDecoders(foundDecoders, expectedDecoders, unExpectedDecoders);
+	
+		}
+
+	CleanupStack::PopAndDestroy(3); //foundDecoders, expectedDecoders, unExpectedDecoders
+
+	if (!error)
+		ret = EPass;
+		
+	return ret;
+	}
+
+TInt CTestDevVideoPlayFindDecoders::CheckDecoders(const RArray<TUid>& aFoundDecoders, 
+												  const RArray<TUid>& aExpectedDecoders, 
+												  const RArray<TUid>& aUnExpectedDecoders)
+	{
+	TInt ret = KErrGeneral;
+
+	TBool foundUnExpected = EFalse;
+	TInt numberToBeFoundInExpectedDecoders = aExpectedDecoders.Count();
+
+	for (TInt i=0; i<aFoundDecoders.Count(); i++)
+		{
+		TUid uidToLookFor = aFoundDecoders[i];
+		for (TInt j=0; j<aExpectedDecoders.Count(); j++)
+			{
+			if (aExpectedDecoders[j] == uidToLookFor)
+				{
+				numberToBeFoundInExpectedDecoders--;
+				break;//j
+				}
+			}
+		for (TInt k=0; k<aUnExpectedDecoders.Count(); k++)
+			{
+			if (aUnExpectedDecoders[k] == uidToLookFor)
+				{
+				foundUnExpected = ETrue;
+				break;//k
+				}
+			}
+		}
+
+	if ((!foundUnExpected) && (numberToBeFoundInExpectedDecoders==0))
+		ret = KErrNone;
+
+	return ret;
+	}
+
+
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayFindPostProc::CTestDevVideoPlayFindPostProc(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayFindPostProc* CTestDevVideoPlayFindPostProc::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayFindPostProc* self = new(ELeave) CTestDevVideoPlayFindPostProc(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayFindPostProc::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  FindPostProc"));
+
+	RArray<TUid> foundPostProx;
+	CleanupClosePushL(foundPostProx);
+	RArray<TUid> expectedPostProx;
+	CleanupClosePushL(expectedPostProx);
+	RArray<TUid> unExpectedPostProx;
+	CleanupClosePushL(unExpectedPostProx);
+
+	TInt error = KErrNone;
+	TUint32 requestedPostProcType = 0;	
+
+	// First ask for post processor isn't supported
+	if (!error)
+		{
+		requestedPostProcType = EPpInputCrop|EPpMirror|EPpScale|EPpOutputPad|EPpNoiseFilter;
+		foundPostProx.Reset();
+		expectedPostProx.Reset();
+		unExpectedPostProx.Reset();
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice1));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice2));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice3));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice4));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice5));
+		
+		TRAP(error, aDevVideoPlay.FindPostProcessorsL(requestedPostProcType, foundPostProx));
+		if (error == KErrNotFound)//we actually expect KErrNotFound here
+			error = KErrNone;
+		else
+			error = KErrGeneral;
+
+		if (!error)
+			error = CheckPostProx(foundPostProx, expectedPostProx, unExpectedPostProx);
+		}
+
+	// Next ask for all post processors
+	if (!error)
+		{
+		requestedPostProcType = 0;
+		foundPostProx.Reset();
+		expectedPostProx.Reset();
+		unExpectedPostProx.Reset();
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice1));
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice2));
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice3));
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice4));
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindPostProcessorsL(requestedPostProcType, foundPostProx));
+		if (!error)
+			error = CheckPostProx(foundPostProx, expectedPostProx, unExpectedPostProx);
+		}
+
+	// Next ask for a specific subset of post processors
+	if (!error)
+		{
+		requestedPostProcType = EPpMirror;
+		foundPostProx.Reset();
+		expectedPostProx.Reset();
+		unExpectedPostProx.Reset();
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice1));
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice2));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice3));
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice4));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindPostProcessorsL(requestedPostProcType, foundPostProx));
+		if (!error)
+			error = CheckPostProx(foundPostProx, expectedPostProx, unExpectedPostProx);
+		}
+	
+	// Next ask for another specific subset of post processors
+	if (!error)
+		{
+		requestedPostProcType = EPpMirror|EPpInputCrop;
+		foundPostProx.Reset();
+		expectedPostProx.Reset();
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice1));
+		User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice2));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice3));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice4));
+		User::LeaveIfError(unExpectedPostProx.Append(KUidDevVideoTestPostProcHwDevice5));
+
+		TRAP(error, aDevVideoPlay.FindPostProcessorsL(requestedPostProcType, foundPostProx));
+		if (!error)
+			error = CheckPostProx(foundPostProx, expectedPostProx, unExpectedPostProx);
+		}
+
+	CleanupStack::PopAndDestroy(3);//foundPostProx, expectedPostProx, unExpectedPostProx
+	
+	if (!error)
+		ret = EPass;
+		
+	return ret;
+	}
+
+
+TInt CTestDevVideoPlayFindPostProc::CheckPostProx(const RArray<TUid>& aFoundPostProx, 
+												  const RArray<TUid>& aExpectedPostProx, 
+												  const RArray<TUid>& aUnExpectedPostProx)
+	{
+	TInt ret = KErrGeneral;
+
+	TBool foundUnExpected = EFalse;
+	TInt numberToBeFoundInExpectedPostProx = aExpectedPostProx.Count();
+
+	for (TInt i=0; i<aFoundPostProx.Count(); i++)
+		{
+		TUid uidToLookFor = aFoundPostProx[i];
+		for (TInt j=0; j<aExpectedPostProx.Count(); j++)
+			{
+			if (aExpectedPostProx[j] == uidToLookFor)
+				{
+				numberToBeFoundInExpectedPostProx--;
+				break;//j
+				}
+			}
+		for (TInt k=0; k<aUnExpectedPostProx.Count(); k++)
+			{
+			if (aUnExpectedPostProx[k] == uidToLookFor)
+				{
+				foundUnExpected = ETrue;
+				break;//k
+				}
+			}
+		}
+
+	if ((!foundUnExpected) && (numberToBeFoundInExpectedPostProx==0))
+		ret = KErrNone;
+
+	return ret;
+	}
+
+
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayListDecoders::CTestDevVideoPlayListDecoders(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayListDecoders* CTestDevVideoPlayListDecoders::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayListDecoders* self = new(ELeave) CTestDevVideoPlayListDecoders(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayListDecoders::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  ListDecoders"));
+		
+	RArray<TUid> foundDecoders;
+	CleanupClosePushL(foundDecoders);
+	RArray<TUid> expectedDecoders;
+	CleanupClosePushL(expectedDecoders);
+
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice1));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice2));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice3));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice4));
+	User::LeaveIfError(expectedDecoders.Append(KUidDevVideoTestDecodeHwDevice5));
+
+	TRAPD(err, aDevVideoPlay.GetDecoderListL(foundDecoders));
+
+	if (!err)
+		{		
+		// Make sure that the video hardware device adapter is NOT in the array
+		TBool foundAdapter = EFalse;
+		for (TInt j = 0; j < foundDecoders.Count(); j++)
+			{
+			if (foundDecoders[j] == KUidMDFVideoDecoderHwDeviceAdapter)
+				{
+				foundAdapter = ETrue;
+				break;
+				}
+			}
+
+		// Make sure that all the UIDs of the test plugins are in the array..
+		TInt numberToBeFound = expectedDecoders.Count();
+		for (TInt i=0; i<expectedDecoders.Count(); i++)
+			{
+			TUid uidToFind = expectedDecoders[i];
+			for (TInt j=0; j<foundDecoders.Count(); j++)
+				{
+				if (foundDecoders[j] == uidToFind)
+					{
+					numberToBeFound--;
+					break;//j
+					}
+				}
+			}
+		if ((numberToBeFound == 0) && (!foundAdapter))
+			{
+			ret = EPass;
+			}
+		}
+
+	CleanupStack::PopAndDestroy(2);
+	
+	return ret;
+	}
+
+
+
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayListPostProc::CTestDevVideoPlayListPostProc(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayListPostProc* CTestDevVideoPlayListPostProc::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayListPostProc* self = new(ELeave) CTestDevVideoPlayListPostProc(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayListPostProc::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  ListPostProc"));
+		
+	RArray<TUid> foundPostProx;
+	CleanupClosePushL(foundPostProx);
+	RArray<TUid> expectedPostProx;
+	CleanupClosePushL(expectedPostProx);
+
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice1));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice2));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice3));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice4));
+	User::LeaveIfError(expectedPostProx.Append(KUidDevVideoTestPostProcHwDevice5));
+
+	TRAPD(err, aDevVideoPlay.GetPostProcessorListL(foundPostProx));
+
+	if (!err)
+		{
+		// Make sure that all the UIDs of the test plugins are in the array..
+		TInt numberToBeFound = expectedPostProx.Count();
+		for (TInt i=0; i<expectedPostProx.Count(); i++)
+			{
+			TUid uidToFind = expectedPostProx[i];
+			for (TInt j=0; j<foundPostProx.Count(); j++)
+				{
+				if (foundPostProx[j] == uidToFind)
+					{
+					numberToBeFound--;
+					break;//j
+					}
+				}
+			}
+		if (numberToBeFound == 0)
+			ret = EPass;
+		}
+
+	CleanupStack::PopAndDestroy(2);
+
+	return ret;
+	}
+
+
+
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayGetDecoderInfo::CTestDevVideoPlayGetDecoderInfo(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetDecoderInfo* CTestDevVideoPlayGetDecoderInfo::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetDecoderInfo* self = new(ELeave) CTestDevVideoPlayGetDecoderInfo(aTestName, aTestType);
+	return self;
+	}
+
+TBool CTestDevVideoPlayGetDecoderInfo::ValidDecoderInfo(CVideoDecoderInfo* aInfo)
+	{
+	// do null pointer check
+	if (!aInfo) 
+		{
+		ERR_PRINTF1(_L("Error - Decoder Info is NULL!"));
+		return EFalse;
+		}
+	
+	// check the decoder against test data
+	// need to check every call so as to keep code coverage
+	// and prevent a situation where if the first test fails
+	// then subsequent tests will not be called
+	TBool ret = ETrue;
+
+	// UID check
+	if (aInfo->Uid() != KUidDevVideoTestDecodeHwDevice)
+		{
+		ERR_PRINTF1(_L("Error - Decoder UID is incorrect!"));
+		ret = EFalse;
+		}
+	// Manufacturer check
+	if (!(aInfo->Manufacturer() == KTestDecoderInfoManufacturer))
+		{
+		ERR_PRINTF1(_L("Error - Manufacturer is incorrect!"));
+		ret = EFalse;
+		}
+	// Identifier check
+	if (!(aInfo->Identifier() == KTestDecoderInfoIdentifier))
+		{
+		ERR_PRINTF1(_L("Error - Identifier is incorrect!"));
+		ret = EFalse;
+		}
+	// Version check
+	TVersion decVer = aInfo->Version();
+	if ( (decVer.iMajor != KTestDecoderInfoVersionMaj) ||
+		 (decVer.iMinor != KTestDecoderInfoVersionMin) ||
+		 (decVer.iBuild != KTestDecoderInfoVersionBuild) )
+		{
+		ERR_PRINTF1(_L("Error - Version is incorrect!"));
+		ret = EFalse;
+		}
+	// Accelerated check
+	if (!aInfo->Accelerated())
+		{
+		ERR_PRINTF1(_L("Error - Accelerated = EFalse!"));
+		ret = EFalse;
+		}
+	// Direct display check
+	if (!aInfo->SupportsDirectDisplay())
+		{
+		ERR_PRINTF1(_L("Error - Supports Direct Display = EFalse!"));
+		ret = EFalse;
+		}
+
+	// Max picture size
+	TSize maxSize = aInfo->MaxPictureSize();
+	if (maxSize.iWidth != KTestDecoderInfoMaxSizeX || maxSize.iHeight != KTestDecoderInfoMaxSizeY)
+		{
+		ERR_PRINTF1(_L("Error - Max Picture Size is wrong!"));
+		ret = EFalse;
+		}
+
+	// Max Bitrate
+	if (aInfo->MaxBitrate() != KMaxTUint)
+		{
+		ERR_PRINTF1(_L("Error - Max Bitrate is wrong!"));
+		ret = EFalse;
+		}
+	
+	// Supports picture loss
+	if (!aInfo->SupportsPictureLoss())
+		{
+		ERR_PRINTF1(_L("Error - Supports Picture Loss = EFalse!"));
+		ret = EFalse;
+		}
+
+	// Supports slice loss
+	if (aInfo->SupportsSliceLoss())
+		{
+		ERR_PRINTF1(_L("Error - Supports Slice Loss = ETrue!"));
+		ret = EFalse;
+		}
+
+	// Coding standard info
+	if (!(aInfo->CodingStandardSpecificInfo() == KTestDecoderInfoCSInfo))
+		{
+		ERR_PRINTF1(_L("Error - Coding standard specific info is incorrect!"));
+		ret = EFalse;
+		}
+	// Implementation info
+	if (!(aInfo->ImplementationSpecificInfo() == KTestDecoderInfoISInfo))
+		{
+		ERR_PRINTF1(_L("Error - Implementation specific info is incorrect!"));
+		ret = EFalse;
+		}
+
+	if (!aInfo->SupportsContentProtected())//Check if flag is set indicating Content Protection is supported.
+		{
+		ERR_PRINTF1(_L("Error - Failed To get flag indicating support of Content Protection!"));
+		ret = EFalse;
+		}
+
+	// get some test compressed video formats
+	CCompressedVideoFormat* testFormat = NULL;
+	TInt err = KErrNone;
+
+	// get formats supported
+	const RPointerArray<CCompressedVideoFormat>& vidFormats = aInfo->SupportedFormats();
+
+	// get supported max picture rates
+	TPictureRateAndSize testRate;
+	const RArray<TPictureRateAndSize>& maxRates = aInfo->MaxPictureRates();
+
+	// test formats supported
+	for (TUint i = 0; i < KTestDecoderInfoCount; i++)
+		{
+		TPtrC8 mimeType = KTestDecoderInfoMimeArray[i];
+		TRAP(err, testFormat = GetTestCVFormatL(mimeType));
+		if (err != KErrNone)
+			{
+			ERR_PRINTF2(_L("Error - Failed to construct CCompressedVideoFormat: %d!"), i);
+			ret = EFalse;
+			if(testFormat != NULL)
+				{
+				delete testFormat;
+				testFormat=NULL;
+				}
+			break;
+			}
+
+		if (!(*testFormat == *(vidFormats[i])) || !(aInfo->SupportsFormat(*testFormat)))
+			{
+			ERR_PRINTF2(_L("Error - Video Format %d is corrupt!"), i);
+			ret = EFalse;
+			}
+
+		delete testFormat; 
+		testFormat = NULL;
+
+		// Test supported max picture rates
+		GetTestEncoderInfoRate(i, testRate);
+		if (!(testRate.iPictureSize == maxRates[i].iPictureSize) || 
+			!(testRate.iPictureRate == maxRates[i].iPictureRate) )
+			{
+			ERR_PRINTF2(_L("Error - picture rate %d is corrupt!"), i);
+			ret = EFalse;
+			}
+		}
+	//Screen information check
+#ifdef SYMBIAN_ENABLE_MMF_MULTISCREEN_SUPPORT
+	RArray<TInt> supportedScreens;
+	TRAP(err, aInfo->GetSupportedScreensL(supportedScreens));
+	if(err != KErrNone)
+		{
+		ERR_PRINTF2(_L("GetSupportedScreensL leaves with %d"), err);
+		ret = EFalse;
+		}
+	if(supportedScreens.Count() != KTestScreenCount)
+		{
+		ERR_PRINTF1(_L("Error - Unexpected screen count"));
+		ret = EFalse;
+		}
+	err = supportedScreens.Find(KDecoderDefaultScreenNumber);
+	if(err == KErrNotFound)
+		{
+		ERR_PRINTF1(_L("Error - No support for primary screen"));
+		ret = EFalse;
+		}
+	err = supportedScreens.Find(KDecoderSecondaryScreenNumber);
+	if(err == KErrNotFound)
+		{
+		ERR_PRINTF1(_L("Error - No support for secondary screen"));
+		ret = EFalse;
+		}
+	supportedScreens.Close();
+#endif
+	// finally check a format which isn't supposed to be supported
+	TRAP(err, testFormat = GetTestCVFormatL(_L8("Frederick Bloggs and his amazing coloured dog")));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - Failed to construct final CCompressedVideoFormat!"));
+		ret = EFalse;
+		}
+	else 
+		{
+		if (aInfo->SupportsFormat(*testFormat))
+			{
+			ERR_PRINTF1(_L("Error - Failed negative SupportsFormat() check!"));
+			ret = EFalse;
+			}
+		}
+
+	if(testFormat != NULL)
+		{
+		delete testFormat;
+		testFormat=NULL;
+		}
+	return ret;
+	}
+
+TVerdict CTestDevVideoPlayGetDecoderInfo::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetDecoderInfo"));
+
+	// expected results		
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	TInt err = KErrNone;
+	CVideoDecoderInfo *decInfo = NULL;
+	TBool valid = EFalse;
+	
+	// get decoder information from test decoder plugin
+	
+	TRAP(err, 
+		decInfo = aDevVideoPlay.VideoDecoderInfoLC(KUidDevVideoTestDecodeHwDevice); 
+		valid = ValidDecoderInfo(decInfo);
+		CleanupStack::PopAndDestroy(decInfo); );
+	if (err != expErr)
+		{
+		ERR_PRINTF3(_L("VideoDecoderInfoLC() gave error %d (expected %d)"),err, expErr);
+		ret = EFail;
+		}
+	// check the Video Decoder
+	else if (!valid)
+		{
+		ERR_PRINTF1(_L("CVideoDecoderInfo class is corrupt!"));
+		ret = EFail;
+		}
+	else
+		{
+		INFO_PRINTF1(_L("CVideoDecoderInfo passed check successfully"));
+		INFO_PRINTF3(_L("VideoDecoderInfoLC(), %d = %d"), err, expErr);
+		}
+		
+	return ret;
+	}
+
+
+
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayGetPostProcInfo::CTestDevVideoPlayGetPostProcInfo(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetPostProcInfo* CTestDevVideoPlayGetPostProcInfo::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetPostProcInfo* self = new(ELeave) CTestDevVideoPlayGetPostProcInfo(aTestName, aTestType);
+	return self;
+	}
+
+TBool CTestDevVideoPlayGetPostProcInfo::ValidPostProcInfo(CPostProcessorInfo* aInfo)
+	{
+	// do null pointer check
+	if (!aInfo) 
+		{
+		ERR_PRINTF1(_L("Error - Post Processor Info is NULL!"));
+		return EFalse;
+		}
+	
+	// check the post processor against test data
+	// need to check every call so as to keep code coverage
+	// and prevent a situation where if the first test fails
+	// then subsequent tests will not be called
+	TBool ret = ETrue;
+
+	// UID check
+	if (aInfo->Uid() != KUidDevVideoTestPostProcHwDevice)
+		{
+		ERR_PRINTF1(_L("Error - Post Processor UID is incorrect!"));
+		ret = EFalse;
+		}
+	// Manufacturer check
+	if (!(aInfo->Manufacturer() == KTestPostProcInfoManufacturer))
+		{
+		ERR_PRINTF1(_L("Error - Manufacturer is incorrect!"));
+		ret = EFalse;
+		}
+	// Identifier check
+	if (!(aInfo->Identifier() == KTestPostProcInfoIdentifier))
+		{
+		ERR_PRINTF1(_L("Error - Identifier is incorrect!"));
+		ret = EFalse;
+		}
+	// Version check
+	TVersion posVer = aInfo->Version();
+	if ( (posVer.iMajor != KTestPostProcInfoVersionMaj) ||
+		 (posVer.iMinor != KTestPostProcInfoVersionMin) ||
+		 (posVer.iBuild != KTestPostProcInfoVersionBuild) )
+		{
+		ERR_PRINTF1(_L("Error - Version is incorrect!"));
+		ret = EFalse;
+		}
+	// Accelerated check
+	if (!aInfo->Accelerated())
+		{
+		ERR_PRINTF1(_L("Error - Accelerated = EFalse!"));
+		ret = EFalse;
+		}
+	// Direct display check
+	if (!aInfo->SupportsDirectDisplay())
+		{
+		ERR_PRINTF1(_L("Error - Supports Direct Display = EFalse!"));
+		ret = EFalse;
+		}
+	// YUVToRGB Capabilities
+	if (!CompareYuvRgbCaps(aInfo->YuvToRgbCapabilities(), KTestPostProcInfoYuvToRgbCaps))
+		{
+		ERR_PRINTF1(_L("Error - YUV To RGB capabilities is incorrect!"));
+		ret = EFalse;
+		}
+
+	// Supported rotations
+	if (aInfo->SupportedRotations() != KTestPostProcInfoRotations)
+		{
+		ERR_PRINTF1(_L("Error - Supported Rotations is incorrect!"));
+		ret = EFalse;
+		}
+
+	// Supports arbitrary scaling check
+	if (!aInfo->AntiAliasedScaling())
+		{
+		ERR_PRINTF1(_L("Error - Anti-Aliased Scaling = EFalse!"));
+		ret = EFalse;
+		}
+	// Supports anti-aliased scaling check
+	if (!aInfo->SupportsArbitraryScaling())
+		{
+		ERR_PRINTF1(_L("Error - Supports Arbitrary Scaling = EFalse!"));
+		ret = EFalse;
+		}
+	// Implementation info
+	if (!(aInfo->ImplementationSpecificInfo() == KTestPostProcInfoISInfo))
+		{
+		ERR_PRINTF1(_L("Error - Implementation specific info is incorrect!"));
+		ret = EFalse;
+		}
+
+	// get some test compressed video formats
+	TUncompressedVideoFormat testFormat;
+	TUint32 testComb = 0;
+	TScaleFactor testFactor = {0, 0};
+
+	// get supported formats
+	const RArray<TUncompressedVideoFormat>& vidFormats = aInfo->SupportedFormats();
+	
+	// get supported combinations
+	const RArray<TUint32>& suppCombs = aInfo->SupportedCombinations();
+
+	// get supported scale factors
+	const RArray<TScaleFactor>& scaleFactors = aInfo->SupportedScaleFactors();
+
+	// test formats, combinations, and scale factors supported
+	for (TUint i = 0; i < KTestPostProcInfoCount; i++)
+		{
+		testFormat = KTestPostProcInfoFormatArray[i];
+		if (!(testFormat == (vidFormats[i])) || !(aInfo->SupportsFormat(testFormat)))
+			{
+			ERR_PRINTF2(_L("Error - Video Format %d is corrupt!"), i);
+			ret = EFalse;
+			}
+
+		testComb = KTestPostProcInfoCombsArray[i];
+		if (!(testComb == (suppCombs[i])) || !(aInfo->SupportsCombination(testComb)))
+			{
+			ERR_PRINTF2(_L("Error - Combination %d is corrupt!"), i);
+			ret = EFalse;
+			}
+
+		testFactor = KTestPostProcInfoScaleFactorsArray[i];
+		if (!CompareScaleFactors(testFactor, scaleFactors[i]))
+			{
+			ERR_PRINTF2(_L("Error - Scale factor %d is corrupt!"), i);
+			ret = EFalse;
+			}
+		}
+
+	//Screen information check
+#ifdef SYMBIAN_ENABLE_MMF_MULTISCREEN_SUPPORT
+	RArray<TInt> supportedScreens;
+	TRAPD(err, aInfo->GetSupportedScreensL(supportedScreens));
+	if(err != KErrNone)
+		{
+		ERR_PRINTF2(_L("GetSupportedScreensL leaves with %d"), err);
+		ret = EFalse;
+		}
+	if(supportedScreens.Count() != KTestScreenCount)
+		{
+		ERR_PRINTF1(_L("Error - Unexpected screen count"));
+		ret = EFalse;
+		}
+	err = supportedScreens.Find(KPostProcDefaultScreenNumber);
+	if(err == KErrNotFound)
+		{
+		ERR_PRINTF1(_L("Error - No support for primary screen"));
+		ret = EFalse;
+		}
+	err = supportedScreens.Find(KPostProcSecondaryScreenNumber);
+	if(err == KErrNotFound)
+		{
+		ERR_PRINTF1(_L("Error - No support for secondary screen"));
+		ret = EFalse;
+		}
+	supportedScreens.Close();
+#endif
+	// check a format that isn't supposed to be supported
+	testFormat = KTestPostProcInfoNegativeFormat;
+	testFormat.iYuvFormat = KTestYuvFormat1;
+	if (aInfo->SupportsFormat(testFormat))
+		{
+		ERR_PRINTF1(_L("Error - Failed negative SupportsFormat() check!"));
+		ret = EFalse;
+		}
+	
+	// finally check a combination that isn't supposed to be supported
+	testComb = KTestPostProcInfoNegativeComb;
+	if (aInfo->SupportsCombination(testComb))
+		{
+		ERR_PRINTF1(_L("Error - Failed negative SupportsCombination() check!"));
+		ret = EFalse;
+		}
+
+	if (!aInfo->SupportsContentProtected())//Check if flah is set indicating Content Protection is supported.
+		{
+		ERR_PRINTF1(_L("Error - Failed To get flag indicating support of Content Protection!"));
+		ret = EFalse;
+		}
+
+	return ret;
+	}
+
+TVerdict CTestDevVideoPlayGetPostProcInfo::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetPostProcInfo"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	TInt err = KErrNone;
+	CPostProcessorInfo *procInfo = NULL;
+	TBool valid = EFalse;
+	
+	// get decoder information from test decoder plugin
+	TRAP(err, 
+		procInfo = aDevVideoPlay.PostProcessorInfoLC(KUidDevVideoTestPostProcHwDevice);
+	        procInfo->SetSupportsContentProtected(ETrue);	
+		valid = ValidPostProcInfo(procInfo);
+		CleanupStack::PopAndDestroy(procInfo); );
+
+	if (err != expErr)
+		{
+		ERR_PRINTF3(_L("PostProcessorInfoLC() gave error %d (expected %d)"),err, expErr);
+		ret = EFail;
+		}
+	// check the Video Post Processor
+	else if (!valid)
+		{
+		ERR_PRINTF1(_L("CPostProcessorInfo class is corrupt!"));
+		ret = EFail;
+		}
+	else
+		{
+		INFO_PRINTF1(_L("CPostProcessorInfo passed check successfully"));
+		INFO_PRINTF3(_L("PostProcessorInfoLC(), %d = %d"), err, expErr);
+		}
+
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlaySelectDecoder::CTestDevVideoPlaySelectDecoder(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlaySelectDecoder* CTestDevVideoPlaySelectDecoder::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlaySelectDecoder* self = new(ELeave) CTestDevVideoPlaySelectDecoder(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlaySelectDecoder::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  SelectDecoder"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	iError = KErrNone;
+
+	// this will leave if an error occurs
+	TRAP( iError, aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice) );
+
+	if (iError != expErr)
+		{
+		ERR_PRINTF3(_L("SelectDecoderL() gave error %d (expected %d)"),iError, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF3(_L("SelectDecoderL(), %d = %d"), iError, expErr);
+	
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlaySelectPostProc::CTestDevVideoPlaySelectPostProc(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlaySelectPostProc* CTestDevVideoPlaySelectPostProc::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlaySelectPostProc* self = new(ELeave) CTestDevVideoPlaySelectPostProc(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlaySelectPostProc::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  SelectPostProc"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	iError = KErrNone;
+	
+	// this will leave if an error occurs
+	TRAP( iError, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice) );
+
+	if (iError != expErr)
+		{
+		ERR_PRINTF3(_L("SelectPostProcessorL() gave error %d (expected %d)"),iError, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF3(_L("SelectPostProcessorL(), %d = %d"), iError, expErr);
+	
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayGetHeaderInfo::CTestDevVideoPlayGetHeaderInfo(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetHeaderInfo* CTestDevVideoPlayGetHeaderInfo::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetHeaderInfo* self = new(ELeave) CTestDevVideoPlayGetHeaderInfo(aTestName, aTestType);
+	return self;
+	}
+
+TBool CTestDevVideoPlayGetHeaderInfo::ValidPictureHeader(const TVideoPictureHeader* aPictureHeader)
+	{
+	TBool ret = EFalse;
+
+	if (!aPictureHeader)
+		{
+		ERR_PRINTF1(_L("Error - Picture Header is NULL!"));
+		return EFalse;
+		}
+
+	TTimeIntervalMicroSeconds testTime(KTestInputBufferTimestamp);
+
+	// check the picture header
+	if (aPictureHeader->iOptions != KTestPictureHeaderOptions)
+		{
+		ERR_PRINTF1(_L("Error - Options are incorrect!"));
+		}
+
+	else if (!(aPictureHeader->iPresentationTimestamp == testTime))
+		{
+		ERR_PRINTF1(_L("Error - Timestamp is incorrect!"));
+		}
+	else if (!(*(aPictureHeader->iOptional) == KTestInputBufferData()))
+		{	
+		ERR_PRINTF1(_L("Error - Optional data is corrupt!"));
+		}
+	else 
+		{
+		INFO_PRINTF1(_L("Picture Header is valid"));
+		ret = ETrue;
+		}
+
+	return ret;
+	}
+
+TVerdict CTestDevVideoPlayGetHeaderInfo::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetHeaderInfo"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	TInt err = KErrNone;
+//	THwDeviceId hwDecoder = 0;
+
+	// select decoder
+//	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	TRAP(err, aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	// construct a test video input buffer with a valid timestamp
+	TPtrC8 testInputBufferDataLitCPtr(KTestInputBufferData);
+	HBufC8* testInputBufferData = testInputBufferDataLitCPtr.AllocLC();
+
+	TVideoInputBuffer testBuffer;
+	testBuffer.iOptions = KTestInputBufferOptions;
+	testBuffer.iPresentationTimestamp = KTestInputBufferTimestamp;
+	testBuffer.iData.Set(testInputBufferData->Des());
+
+	TVideoPictureHeader* picHeader = NULL;
+	// get header information from test data unit
+	TRAP(err, picHeader = aDevVideoPlay.GetHeaderInformationL(KTestDataUnitType, KTestDataUnitEncap, &testBuffer) );
+
+	if (err != expErr)
+		{
+		ERR_PRINTF3(_L("GetHeaderInformationL() gave error %d (expected %d)"),err, expErr);
+		ret = EFail;
+		}
+	else if (!ValidPictureHeader(picHeader))
+		{
+		ERR_PRINTF1(_L("Picture header corrupt!"));
+		ret = EFail;
+		}
+	else
+		{
+		INFO_PRINTF1(_L("Header information retrieved successfully"));
+		INFO_PRINTF3(_L("GetHeaderInformationL(), %d = %d"), err, expErr);	
+		}
+
+	CleanupStack::PopAndDestroy(testInputBufferData);
+	
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayReturnHeader::CTestDevVideoPlayReturnHeader(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayReturnHeader* CTestDevVideoPlayReturnHeader::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayReturnHeader* self = new(ELeave) CTestDevVideoPlayReturnHeader(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayReturnHeader::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  ReturnHeader"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	TInt err = KErrNone;
+//	THwDeviceId hwDecoder = 0;
+
+	// select decoder
+//	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	TRAP(err, aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	TVideoPictureHeader picHeader;
+	picHeader.iOptions = KTestPictureHeaderOptions;
+	TTimeIntervalMicroSeconds testTime(KTestPictureHeaderTimestamp);
+	picHeader.iPresentationTimestamp = testTime;
+
+	// return picture header [can use a local TVideoPictureHeader because we
+	// are testing a fake plugin - normally this would be a header supplied by
+	// the video plugin].
+	aDevVideoPlay.ReturnHeader(&picHeader);
+	
+	// if plugin didn't PANIC then test has passed
+	INFO_PRINTF1(_L("Header information returned successfully"));
+			
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayConfigureDecoder::CTestDevVideoPlayConfigureDecoder(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayConfigureDecoder* CTestDevVideoPlayConfigureDecoder::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayConfigureDecoder* self = new(ELeave) CTestDevVideoPlayConfigureDecoder(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayConfigureDecoder::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr;
+
+	expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  ConfigureDecoderL"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	TInt err = KErrNone;
+	TRAP(err, aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	//construct a test picture header
+	TVideoPictureHeader pictureHeader;
+	pictureHeader.iOptions = KTestPictureHeaderOptions;
+	pictureHeader.iPresentationTimestamp = KTestInputBufferTimestamp;
+
+	TPtrC8 testInputBufferDataLitCPtr(KTestInputBufferData);
+	pictureHeader.iOptional = &testInputBufferDataLitCPtr;
+
+	// get header information from test data unit
+	TRAP(err, aDevVideoPlay.ConfigureDecoderL(pictureHeader));
+
+	if (err != expErr)
+		{
+		ERR_PRINTF3(_L("ConfigureDecoderL() gave error %d (expected %d)"),err, expErr);
+		ret = EFail;
+		}
+	else
+		{
+		if (err == KErrNone)
+			{
+			INFO_PRINTF1(_L("Header information successfully configured in Decoder"));
+			}
+		INFO_PRINTF3(_L("ConfigureDecoderL(), error %d = expected %d"), err, expErr);	
+		}
+	
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlaySetInputFormatUC::CTestDevVideoPlaySetInputFormatUC(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlaySetInputFormatUC* CTestDevVideoPlaySetInputFormatUC::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlaySetInputFormatUC* self = new(ELeave) CTestDevVideoPlaySetInputFormatUC(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlaySetInputFormatUC::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  SetInputFormatUC"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+
+	TInt err = KErrNone;
+
+//	THwDeviceId hwDecoder = 0;
+	THwDeviceId hwPostProc = 0;
+
+	// select decoder
+//	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	TRAP(err, aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	// select post-processor
+	TRAP(err, hwPostProc = aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+		return EInconclusive;
+		}
+
+	// this will leave if an error occurs in either plugin
+	TRAP(err, aDevVideoPlay.SetInputFormatL(hwPostProc, KTestVidFormat2) );
+
+	if ( err != expErr )
+		{
+		ERR_PRINTF3(_L("SetInputFormatL() on Post-Processor gave error %d (expected %d)"),err, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF3(_L("SetInputFormat(), %d = %d"), err, expErr);
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+CTestDevVideoPlaySetInputFormat::CTestDevVideoPlaySetInputFormat(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlaySetInputFormat* CTestDevVideoPlaySetInputFormat::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlaySetInputFormat* self = new(ELeave) CTestDevVideoPlaySetInputFormat(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlaySetInputFormat::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  SetInputFormat"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+
+	TInt err = KErrNone;
+
+	THwDeviceId hwDecoder = 0;
+//	THwDeviceId hwPostProc = 0;
+
+	// select decoder
+	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	// select post-processor
+//	TRAP(err, hwPostProc = aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));
+	TRAP(err, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+		return EInconclusive;
+		}
+
+	// get a temporary compressed video class
+	CCompressedVideoFormat *tempCFormat = NULL;
+	TRAP(err, tempCFormat = GetTestCVFormatL(KTestMimeType1));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize compressed video class"));
+		return EInconclusive;
+		}
+
+	// this will leave if an error occurs
+	TRAP(err, aDevVideoPlay.SetInputFormatL(hwDecoder, *tempCFormat, KTestUnitType1, KTestEncapType1, ETrue) );
+
+	// delete compressed video class
+	delete tempCFormat;	
+	tempCFormat = NULL;
+
+	if ( err != expErr )
+		{
+		ERR_PRINTF3(_L("SetInputFormatL() on Decoder gave error %d (expected %d)"),err, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF3(_L("SetInputFormat(), %d = %d"), err, expErr);
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+CTestDevVideoPlayGetOutputFormatList::CTestDevVideoPlayGetOutputFormatList(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetOutputFormatList* CTestDevVideoPlayGetOutputFormatList::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetOutputFormatList* self = new(ELeave) CTestDevVideoPlayGetOutputFormatList(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayGetOutputFormatList::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetOutputFormatList"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+
+	TInt err = KErrNone;
+	TInt err2 = KErrNone;
+
+	THwDeviceId hwDecoder = 0;
+	THwDeviceId hwPostProc = 0;
+
+	// select decoder
+	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	// select post-processor
+	TRAP(err, hwPostProc = aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+		return EInconclusive;
+		}
+
+	RArray<TUncompressedVideoFormat> decodeList;
+	RArray<TUncompressedVideoFormat> postProcList;
+
+	// Get output format list for decoder
+	TRAP(err, aDevVideoPlay.GetOutputFormatListL(hwDecoder, decodeList));
+		
+	// Get output format list for post-processor
+	TRAP(err2, aDevVideoPlay.GetOutputFormatListL(hwPostProc, postProcList));
+	
+	if ((err != expErr) || (err2 != expErr))
+		{
+		ERR_PRINTF3(_L("GetOutputFormatListL() on Decoder gave error %d (expected %d)"),err, expErr);
+		ERR_PRINTF3(_L("GetOutputFormatListL() on Post-Processor gave error %d (expected %d)"),err2, expErr);
+		ret = EFail;
+		}
+	else
+		{
+		TBool decPass = EFalse;
+		TBool posPass = EFalse;
+
+		// expecting KTestVidFormat1,2,3 - check
+		TInt count = decodeList.Count();
+		if (count == 3) 
+			{
+			if ((decodeList[0] == KTestVidFormat1) &&
+				(decodeList[1] == KTestVidFormat2) &&
+				(decodeList[2] == KTestVidFormat3) )
+				{
+				INFO_PRINTF1(_L("Decoder output list checks ok"));
+				decPass = ETrue;
+				}
+			}
+
+		// expecting KTestVidFormat3,2,1 - check
+		count = postProcList.Count();
+		if (count == 3) 
+			{
+			if ((postProcList[0] == KTestVidFormat3) &&
+				(postProcList[1] == KTestVidFormat2) &&
+				(postProcList[2] == KTestVidFormat1) )
+				{
+				INFO_PRINTF1(_L("Post-Processor output list checks ok"));
+				posPass = ETrue;
+				}
+			}
+		
+		if (!decPass)
+			{
+			ERR_PRINTF1(_L("Decoder output list corrupt!"));
+			ret = EFail;
+			}
+		
+		if (!posPass)
+			{
+			ERR_PRINTF1(_L("Post-Processor output list corrupt!"));
+			ret = EFail;
+			}
+	
+		INFO_PRINTF4(_L("GetOutputFormatListL(), %d, %d = %d"), err, err2, expErr);
+		}	
+
+	// close the arrays
+	decodeList.Reset();		
+	decodeList.Close();
+	
+	postProcList.Reset();	
+	postProcList.Close();
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+CTestDevVideoPlaySetOutputFormat::CTestDevVideoPlaySetOutputFormat(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlaySetOutputFormat* CTestDevVideoPlaySetOutputFormat::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlaySetOutputFormat* self = new(ELeave) CTestDevVideoPlaySetOutputFormat(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlaySetOutputFormat::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  SetOutputFormat"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+
+	TInt err = KErrNone;
+	TInt err2 = KErrNone;
+
+	THwDeviceId hwDecoder = 0;
+	THwDeviceId hwPostProc = 0;
+
+	// select decoder
+	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	// select post-processor
+	TRAP(err, hwPostProc = aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+		return EInconclusive;
+		}
+
+	// set output format on decoder
+	TRAP(err, aDevVideoPlay.SetOutputFormatL(hwDecoder, KTestVidFormat1) )
+	
+	// set output format on post-processor
+	TRAP(err2, aDevVideoPlay.SetOutputFormatL(hwPostProc, KTestVidFormat2) )
+
+
+	if ((err != expErr) || (err2 != expErr))
+		{
+		ERR_PRINTF3(_L("SetOutputFormatL() on Decoder gave error %d (expected %d)"),err, expErr);
+		ERR_PRINTF3(_L("SetOutputFormatL() on Post-Processor gave error %d (expected %d)"),err2, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF4(_L("SetOutputFormat(), %d, %d= %d"), err, err2, expErr);
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+CTestDevVideoPlaySetPostProcTypes::CTestDevVideoPlaySetPostProcTypes(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlaySetPostProcTypes* CTestDevVideoPlaySetPostProcTypes::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlaySetPostProcTypes* self = new(ELeave) CTestDevVideoPlaySetPostProcTypes(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlaySetPostProcTypes::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  SetPostProcTypes"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+
+	TInt err = KErrNone;
+	TInt err2 = KErrNone;
+
+	THwDeviceId hwDecoder = 0;
+	THwDeviceId hwPostProc = 0;
+
+	// select decoder
+	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+		return EInconclusive;
+		}
+
+	// select post-processor
+	TRAP(err, hwPostProc = aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+		return EInconclusive;
+		}
+
+	// set post-process types on decoder
+	TRAP(err, aDevVideoPlay.SetPostProcessTypesL(hwDecoder, KTestProcessType1) )
+	
+	// set post-process types on post-processor
+	TRAP(err2, aDevVideoPlay.SetPostProcessTypesL(hwPostProc, KTestProcessType2) )
+
+
+	if ((err != expErr) || (err2 != expErr))
+		{
+		ERR_PRINTF3(_L("SetPostProcessTypesL() on Decoder gave error %d (expected %d)"),err, expErr);
+		ERR_PRINTF3(_L("SetPostProcessTypesL() on Post-Processor gave error %d (expected %d)"),err2, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF4(_L("SetPostProcessTypes(), %d, %d= %d"), err, err2, expErr);
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+CTestDevVideoPlayGetDecoderPostProcInfo::CTestDevVideoPlayGetDecoderPostProcInfo(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetDecoderPostProcInfo* CTestDevVideoPlayGetDecoderPostProcInfo::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetDecoderPostProcInfo* self = new(ELeave) CTestDevVideoPlayGetDecoderPostProcInfo(aTestName, aTestType);
+	return self;
+	}
+
+TBool CTestDevVideoPlayGetDecoderPostProcInfo::ValidPostProcInfo(CPostProcessorInfo* aInfo)
+	{
+	// do null pointer check
+	if (!aInfo) 
+		{
+		ERR_PRINTF1(_L("Error - Post Processor Info is NULL!"));
+		return EFalse;
+		}
+	
+	// check the post processor against test data
+	// need to check every call so as to keep code coverage
+	// and prevent a situation where if the first test fails
+	// then subsequent tests will not be called
+	TBool ret = ETrue;
+
+	// UID check
+	if (aInfo->Uid() != KUidDevVideoTestDecodeHwDevice)
+		{
+		ERR_PRINTF1(_L("Error - Decoder UID is incorrect!"));
+		ret = EFalse;
+		}
+	// Manufacturer check
+	if (!(aInfo->Manufacturer() == KTestPostProcInfoManufacturer))
+		{
+		ERR_PRINTF1(_L("Error - Manufacturer is incorrect!"));
+		ret = EFalse;
+		}
+	// Identifier check
+	if (!(aInfo->Identifier() == KTestPostProcInfoIdentifier))
+		{
+		ERR_PRINTF1(_L("Error - Identifier is incorrect!"));
+		ret = EFalse;
+		}
+	// Version check
+	TVersion posVer = aInfo->Version();
+	if ( (posVer.iMajor != KTestPostProcInfoVersionMaj) ||
+		 (posVer.iMinor != KTestPostProcInfoVersionMin) ||
+		 (posVer.iBuild != KTestPostProcInfoVersionBuild) )
+		{
+		ERR_PRINTF1(_L("Error - Version is incorrect!"));
+		ret = EFalse;
+		}
+	// Accelerated check
+	if (!aInfo->Accelerated())
+		{
+		ERR_PRINTF1(_L("Error - Accelerated = EFalse!"));
+		ret = EFalse;
+		}
+	// Direct display check
+	if (!aInfo->SupportsDirectDisplay())
+		{
+		ERR_PRINTF1(_L("Error - Supports Direct Display = EFalse!"));
+		ret = EFalse;
+		}
+	// YUVToRGB Capabilities
+	if (!CompareYuvRgbCaps(aInfo->YuvToRgbCapabilities(), KTestPostProcInfoYuvToRgbCaps))
+		{
+		ERR_PRINTF1(_L("Error - YUV To RGB capabilities is incorrect!"));
+		ret = EFalse;
+		}
+	//Content Protection	
+	if (!aInfo->SupportsContentProtected())//Check if flag is set indicating Content Protection is supported.
+		{
+		ERR_PRINTF1(_L("Error - Failed To get flag indicating support of Content Protection!"));
+		ret = EFalse;
+		}
+
+	// Supported rotations
+	if (aInfo->SupportedRotations() != KTestPostProcInfoRotations)
+		{
+		ERR_PRINTF1(_L("Error - Supported Rotations is incorrect!"));
+		ret = EFalse;
+		}
+
+	// Supports arbitrary scaling check
+	if (!aInfo->AntiAliasedScaling())
+		{
+		ERR_PRINTF1(_L("Error - Anti-Aliased Scaling = EFalse!"));
+		ret = EFalse;
+		}
+	// Supports anti-aliased scaling check
+	if (!aInfo->SupportsArbitraryScaling())
+		{
+		ERR_PRINTF1(_L("Error - Supports Arbitrary Scaling = EFalse!"));
+		ret = EFalse;
+		}
+	// Implementation info
+	if (!(aInfo->ImplementationSpecificInfo() == KTestDecoderInfoISInfo))
+		{
+		ERR_PRINTF1(_L("Error - Implementation specific info is incorrect!"));
+		ret = EFalse;
+		}
+
+	// get some test compressed video formats
+	TUncompressedVideoFormat testFormat;
+	TUint32 testComb = 0;
+	TScaleFactor testFactor = {0, 0};
+
+	// get supported formats
+	const RArray<TUncompressedVideoFormat>& vidFormats = aInfo->SupportedFormats();
+	
+	// get supported combinations
+	const RArray<TUint32>& suppCombs = aInfo->SupportedCombinations();
+
+	// get supported scale factors
+	const RArray<TScaleFactor>& scaleFactors = aInfo->SupportedScaleFactors();
+
+	// test formats, combinations, and scale factors supported
+	for (TUint i = 0; i < KTestPostProcInfoCount; i++)
+		{
+		testFormat = KTestPostProcInfoFormatArray[i];
+		if (!(testFormat == (vidFormats[i])) || !(aInfo->SupportsFormat(testFormat)))
+			{
+			ERR_PRINTF2(_L("Error - Video Format %d is corrupt!"), i);
+			ret = EFalse;
+			}
+
+		testComb = KTestPostProcInfoCombsArray[i];
+		if (!(testComb == (suppCombs[i])) || !(aInfo->SupportsCombination(testComb)))
+			{
+			ERR_PRINTF2(_L("Error - Combination %d is corrupt!"), i);
+			ret = EFalse;
+			}
+
+		testFactor = KTestPostProcInfoScaleFactorsArray[i];
+		if (!CompareScaleFactors(testFactor, scaleFactors[i]))
+			{
+			ERR_PRINTF2(_L("Error - Scale factor %d is corrupt!"), i);
+			ret = EFalse;
+			}
+		}
+
+	// check a format that isn't supposed to be supported
+	testFormat = KTestPostProcInfoNegativeFormat;
+	testFormat.iYuvFormat = KTestYuvFormat1;
+	if (aInfo->SupportsFormat(testFormat))
+		{
+		ERR_PRINTF1(_L("Error - Failed negative SupportsFormat() check!"));
+		ret = EFalse;
+		}
+	
+	// finally check a combination that isn't supposed to be supported
+	testComb = KTestPostProcInfoNegativeComb;
+	if (aInfo->SupportsCombination(testComb))
+		{
+		ERR_PRINTF1(_L("Error - Failed negative SupportsCombination() check!"));
+		ret = EFalse;
+		}
+
+	if (!aInfo->SupportsContentProtected())
+		{
+		ERR_PRINTF1(_L("Error - Failed to Set Content Protected Support!"));
+		ret = EFalse;
+		}
+
+	return ret;
+	}
+
+TVerdict CTestDevVideoPlayGetDecoderPostProcInfo::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetPostProcInfo"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	TInt err = KErrNone;
+	CPostProcessorInfo *procInfo = NULL;
+	TBool valid = EFalse;
+	
+	// get decoder information from test decoder plugin
+	TRAP(err, 
+		procInfo = aDevVideoPlay.PostProcessorInfoLC(KUidDevVideoTestDecodeHwDevice); 
+		procInfo->SetSupportsContentProtected(ETrue);
+		valid = ValidPostProcInfo(procInfo);
+		CleanupStack::PopAndDestroy(procInfo); );
+
+	if (err != expErr)
+		{
+		ERR_PRINTF3(_L("PostProcessorInfoLC() gave error %d (expected %d)"),err, expErr);
+		ret = EFail;
+		}
+	// check the Video Decoder
+	else if (!valid)
+		{
+		ERR_PRINTF1(_L("CPostProcessorInfo class is corrupt!"));
+		ret = EFail;
+		}
+	else
+		{
+		INFO_PRINTF1(_L("CPostProcessorInfo passed check successfully"));
+		INFO_PRINTF3(_L("PostProcessorInfoLC(), %d = %d"), err, expErr);
+		}
+
+	return ret;
+	}