mmlibs/mmfw/tsrc/mmfunittest/DevVideo/src/TestDevVideoPlayFour.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/tsrc/mmfunittest/DevVideo/src/TestDevVideoPlayFour.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,1397 @@
+
+// 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>
+
+void CTestDevVideoPlayGetNewPictureInfo::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayGetNewPictureInfo::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+CTestDevVideoPlayGetNewPictureInfo::CTestDevVideoPlayGetNewPictureInfo(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetNewPictureInfo* CTestDevVideoPlayGetNewPictureInfo::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetNewPictureInfo* self = new(ELeave) CTestDevVideoPlayGetNewPictureInfo(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayGetNewPictureInfo::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetNewPictureInfo"));
+	
+	// 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));
+	TRAP(err, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	//Tell plugin to start creating pictures.
+	TRAP(iError, aDevVideoPlay.SetVideoDestScreenL(EFalse));
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't SetVideoDestScreen"));
+			return EInconclusive;
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	aDevVideoPlay.Start();
+
+	TUint numPictures = 0;
+	TTimeIntervalMicroSeconds earliestTimeStamp(0);
+	TTimeIntervalMicroSeconds latestTimeStamp(0);
+
+
+	aDevVideoPlay.GetNewPictureInfo(numPictures, earliestTimeStamp, latestTimeStamp);
+
+	if ((numPictures == 1)
+		&& (earliestTimeStamp == TTimeIntervalMicroSeconds(0))
+		&& (latestTimeStamp == TTimeIntervalMicroSeconds(0)))
+		{
+		ret = EPass;
+		}
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayNextPicture::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayNextPicture::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+CTestDevVideoPlayNextPicture::CTestDevVideoPlayNextPicture(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayNextPicture* CTestDevVideoPlayNextPicture::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayNextPicture* self = new(ELeave) CTestDevVideoPlayNextPicture(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayNextPicture::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  NextPicture"));
+	
+	// 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));
+	TRAP(err, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	//Tell plugin to start creating pictures.
+	TRAP(iError, aDevVideoPlay.SetVideoDestScreenL(EFalse));
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't SetVideoDestScreen"));
+			return EInconclusive;
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	iDevVideoPlay = &aDevVideoPlay;
+	aDevVideoPlay.Start();//Tell plugin to start creating pictures.
+	// We should now get a series of NewPicture() callbacks.
+
+	if (iError == KErrNone)
+		{
+		ret = EPass;
+		}
+	else
+		{
+		ERR_PRINTF2(_L("Error - picture processing failed with error %d"), iError);
+		}
+	
+	return ret;
+	}
+
+void CTestDevVideoPlayNextPicture::MdvpoNewPictures()
+	{
+	TRAP(iError, DoNewPicturesL());
+	}
+
+void CTestDevVideoPlayNextPicture::CheckNewPictureInfoL(TUint aNumPictures, const TTimeIntervalMicroSeconds& aFirst, const TTimeIntervalMicroSeconds& aLast)
+	{
+	TUint numPictures = 0;
+	TTimeIntervalMicroSeconds first(0);
+	TTimeIntervalMicroSeconds last(0);
+	iDevVideoPlay->GetNewPictureInfo(numPictures, first, last);
+
+	if ((numPictures!=aNumPictures) || (first!=aFirst) || (last!=aLast))
+		{
+		User::Leave(KErrGeneral);
+		}
+	}
+
+void CTestDevVideoPlayNextPicture::DoNewPicturesL()
+	{
+	User::LeaveIfError(iError);//Don't go any further if we have an error
+	switch (iCurrentPictureNumber)
+		{
+		case 0:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 1:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(1), TTimeIntervalMicroSeconds(1));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 2:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(2), TTimeIntervalMicroSeconds(2));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 3:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(3), TTimeIntervalMicroSeconds(3));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 4:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(4), TTimeIntervalMicroSeconds(4));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 5:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(5), TTimeIntervalMicroSeconds(5));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			break;
+			}
+		case 6:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(6));
+			break;
+			}
+		case 7:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(2, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(7));
+			break;
+			}
+		case 8:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(3, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(8));
+			break;
+			}
+		case 9:
+			{
+			iCurrentPictureNumber++;
+			CheckNewPictureInfoL(4, TTimeIntervalMicroSeconds(6), TTimeIntervalMicroSeconds(9));
+			TVideoPicture* picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(3, TTimeIntervalMicroSeconds(7), TTimeIntervalMicroSeconds(9));
+			picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(2, TTimeIntervalMicroSeconds(8), TTimeIntervalMicroSeconds(9));
+			picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(1, TTimeIntervalMicroSeconds(9), TTimeIntervalMicroSeconds(9));
+			picture = iDevVideoPlay->NextPictureL();
+			iDevVideoPlay->ReturnPicture(picture);
+			CheckNewPictureInfoL(0, TTimeIntervalMicroSeconds(0), TTimeIntervalMicroSeconds(0));
+			break;
+			}
+		default:
+			User::Leave(KErrGeneral);
+			break;
+		};
+	}
+
+
+
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayGetSnapshot::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayGetSnapshot::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+CTestDevVideoPlayGetSnapshot::CTestDevVideoPlayGetSnapshot(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetSnapshot* CTestDevVideoPlayGetSnapshot::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetSnapshot* self = new(ELeave) CTestDevVideoPlayGetSnapshot(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayGetSnapshot::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetSnapshot"));
+	
+	// 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));
+	TRAP(err, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	TBool result = EFalse;
+	TPictureData pictureData;
+
+	TUncompressedVideoFormat format;
+	format.iDataFormat = EYuvRawData;
+	format.iYuvFormat = KTestYuvFormat1;
+
+	TRAP(err, result = aDevVideoPlay.GetSnapshotL(pictureData, format));
+
+	if (err == KErrNone)
+		{
+		if (result)
+			{
+			if ((pictureData.iDataFormat == EYuvRawData) &&
+				(pictureData.iDataSize == TSize(KTestPictureDataSizeX, KTestPictureDataSizeY)) && 
+				(pictureData.iRawData == NULL))
+				{
+				ret = EPass;
+				}
+			}
+		}
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayGetTimedSnapshotTimestamp::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayGetTimedSnapshotTimestamp::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+void CTestDevVideoPlayGetTimedSnapshotTimestamp::MdvpoTimedSnapshotComplete(TInt aError, 
+											TPictureData* aPictureData, 
+											const TTimeIntervalMicroSeconds& aPresentationTimestamp, 
+											const TPictureId& /*aPictureId*/)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayGetTimedSnapshotTimestamp::MdvpoTimedSnapshotComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	iTimestamp = aPresentationTimestamp;
+	iPictureData = aPictureData;
+	}
+
+CTestDevVideoPlayGetTimedSnapshotTimestamp::CTestDevVideoPlayGetTimedSnapshotTimestamp(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetTimedSnapshotTimestamp* CTestDevVideoPlayGetTimedSnapshotTimestamp::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetTimedSnapshotTimestamp* self = new(ELeave) CTestDevVideoPlayGetTimedSnapshotTimestamp(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayGetTimedSnapshotTimestamp::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetTimedSnapshotTimestamp"));
+	
+	// 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));
+	TRAP(err, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	TPictureData pictureData;
+
+	TUncompressedVideoFormat format;
+	format.iDataFormat = EYuvRawData;
+	format.iYuvFormat = KTestYuvFormat1;
+	TTimeIntervalMicroSeconds snapTime(KTestSnapshotTimestamp);
+
+	// get a timed snapshot from the post processor
+	TRAP(err, aDevVideoPlay.GetTimedSnapshotL(&pictureData, format, snapTime));
+
+	// check picture and timestamp from callback
+	if ((err == KErrNone) && (iError == KErrNone))
+		{
+		if ((iPictureData) && (iTimestamp == TTimeIntervalMicroSeconds(KTestSnapshotTimestamp)))
+			{
+			if ((iPictureData->iDataFormat == EYuvRawData) &&
+				(iPictureData->iDataSize == TSize(KTestPictureDataSizeX, KTestPictureDataSizeY)) && 
+				(iPictureData->iRawData == NULL))
+				{
+				ret = EPass;
+				}
+			else
+				{
+				ERR_PRINTF1(_L("Error - PictureData is corrupt!"));
+				}
+			}
+		}
+	else
+		{
+		ERR_PRINTF3(_L("GetTimedSnapshotL() gave error %d (expected %d)"),err, expErr);
+		}
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayGetTimedSnapshotID::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayGetTimedSnapshotID::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+void CTestDevVideoPlayGetTimedSnapshotID::MdvpoTimedSnapshotComplete(TInt aError, 
+											TPictureData* aPictureData, 
+											const TTimeIntervalMicroSeconds& /*aPresentationTimestamp*/, 
+											const TPictureId& aPictureId)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayGetTimedSnapshotID::MdvpoTimedSnapshotComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	iPictureId = aPictureId;
+	iPictureData = aPictureData;
+	}
+
+CTestDevVideoPlayGetTimedSnapshotID::CTestDevVideoPlayGetTimedSnapshotID(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetTimedSnapshotID* CTestDevVideoPlayGetTimedSnapshotID::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetTimedSnapshotID* self = new(ELeave) CTestDevVideoPlayGetTimedSnapshotID(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayGetTimedSnapshotID::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetTimedSnapshotID"));
+	
+	// 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));
+	TRAP(err, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	TPictureData pictureData;
+
+	TUncompressedVideoFormat format;
+	format.iDataFormat = EYuvRawData;
+	format.iYuvFormat = KTestYuvFormat1;
+	TPictureId snapId = KTestSnapshotId;
+
+	// get a timed snapshot from the post processor
+	TRAP(err, aDevVideoPlay.GetTimedSnapshotL(&pictureData, format, snapId));
+
+	// check picture and timestamp from callback
+	if ((err == KErrNone) && (iError == KErrNone))
+		{
+		if ( (iPictureData) && (iPictureId.iIdType == KTestSnapshotId.iIdType) && 
+			 (iPictureId.iId == KTestSnapshotId.iId) )
+			{
+			if ((iPictureData->iDataFormat == EYuvRawData) &&
+				(iPictureData->iDataSize == TSize(KTestPictureDataSizeX, KTestPictureDataSizeY)) && 
+				(iPictureData->iRawData == NULL))
+				{
+				ret = EPass;
+				}
+			else
+				{
+				ERR_PRINTF1(_L("Error - PictureData is corrupt!"));
+				}
+			}
+		}
+	else
+		{
+		ERR_PRINTF3(_L("GetTimedSnapshotL() gave error %d (expected %d)"),err, expErr);
+		}
+	
+	return ret;
+	}
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayCancelTimedSnapshot::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayCancelTimedSnapshot::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+void CTestDevVideoPlayCancelTimedSnapshot::MdvpoTimedSnapshotComplete(TInt aError, 
+											TPictureData* /*aPictureData*/, 
+											const TTimeIntervalMicroSeconds& /*aPresentationTimestamp*/, 
+											const TPictureId& /*aPictureId*/)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayCancelTimedSnapshot::MdvpoTimedSnapshotComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+CTestDevVideoPlayCancelTimedSnapshot::CTestDevVideoPlayCancelTimedSnapshot(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayCancelTimedSnapshot* CTestDevVideoPlayCancelTimedSnapshot::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayCancelTimedSnapshot* self = new(ELeave) CTestDevVideoPlayCancelTimedSnapshot(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayCancelTimedSnapshot::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  CancelTimedSnapshot"));
+	
+	// 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));
+	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));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	
+	TPictureData pictureData;
+
+	TUncompressedVideoFormat format;
+	format.iDataFormat = EYuvRawData;
+	format.iYuvFormat = KTestYuvFormat1;
+	TPictureId snapId = KTestSnapshotId;
+
+	// get a timed snapshot from the post processor
+	TRAP(err, aDevVideoPlay.GetTimedSnapshotL(&pictureData, format, snapId));
+
+	// cancel the snapshot
+	aDevVideoPlay.CancelTimedSnapshot();
+
+	// check picture has been cancelled
+	if (err == KErrNone) 
+		{
+		if (iError == KErrAbort)
+			{
+			INFO_PRINTF1(_L("Timed snapshot cancelled successfully"));
+			ret = EPass;
+			}
+		else
+			{
+			ERR_PRINTF3(_L("MdvpoTimedSnapshotComplete() gave error %d (expected %d)"),iError, KErrAbort);			
+			}
+		}
+	else
+		{
+		ERR_PRINTF3(_L("CancelTimedSnapshotL() gave error %d (expected %d)"),err, expErr);
+		}
+
+	return ret;
+	}
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayGetSupportedSnapshotFormats::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayGetSupportedSnapshotFormats::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+CTestDevVideoPlayGetSupportedSnapshotFormats::CTestDevVideoPlayGetSupportedSnapshotFormats(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayGetSupportedSnapshotFormats* CTestDevVideoPlayGetSupportedSnapshotFormats::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayGetSupportedSnapshotFormats* self = new(ELeave) CTestDevVideoPlayGetSupportedSnapshotFormats(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayGetSupportedSnapshotFormats::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EFail;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  GetSupportedSnapshotFormats"));
+	
+	// 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));
+	TRAP(err, aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));	// EABI warning removal
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	RArray<TUncompressedVideoFormat> vidFormats;
+
+	// get a list of supported formats from the plugin
+	TRAP(err, aDevVideoPlay.GetSupportedSnapshotFormatsL(vidFormats) )
+
+	// check picture and timestamp from callback
+	if (err == KErrNone)
+		{
+		if ( vidFormats.Count() == 3)
+			{
+			if ((vidFormats[0] == KTestVidFormat1) &&
+				(vidFormats[1] == KTestVidFormat2) &&
+				(vidFormats[2] == KTestVidFormat3) )
+				{
+				INFO_PRINTF1(_L("Snapshot format list checks ok"));
+				ret = EPass;
+				}
+			else
+				{
+				ERR_PRINTF1(_L("Error - Snapshot format list is corrupt!"));
+				}
+			}
+		}
+	else
+		{
+		ERR_PRINTF3(_L("GetSupportedSnapshotFormatsL() gave error %d (expected %d)"),err, expErr);
+		}
+
+	vidFormats.Reset();
+	vidFormats.Close();
+
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayClock::CTestDevVideoPlayClock(const TDesC& aTestName)
+	{
+	iTestStepName = aTestName;
+	}
+
+void CTestDevVideoPlayClock::ConstructL()
+	{
+	}
+
+CTestDevVideoPlayClock::~CTestDevVideoPlayClock()
+	{
+	}
+
+CTestDevVideoPlayClock* CTestDevVideoPlayClock::NewL(const TDesC& aTestName)
+	{
+	CTestDevVideoPlayClock* self = new(ELeave) CTestDevVideoPlayClock(aTestName);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+TInt CTestDevVideoPlayClock::StartThread(TAny* aAny)
+	{
+	CTestDevVideoPlayClock* me = static_cast<CTestDevVideoPlayClock*>(aAny);
+	me->RunThread();
+
+	return KErrNone;
+	}
+
+void CTestDevVideoPlayClock::RunThread()
+	{
+	TTimeIntervalMicroSeconds currentTime(0);
+
+	while(!iShutdownSubthread)
+		{
+		currentTime = iClockSource->Time();
+		TUint timeUint = I64LOW(currentTime.Int64());
+		}
+	}
+
+void CTestDevVideoPlayClock::MmcspuoTick(const TTimeIntervalMicroSeconds& aTime)
+	{
+	iPeriodicUtilityIteration++;
+
+	TUint currentTime = I64LOW(aTime.Int64());
+	TUint predictedTime = iPeriodicUtilityIteration * KTestClock2Seconds;
+
+	if (!TimeComparison(currentTime, predictedTime, KTestClockBigDeviationMS))
+		{
+		ERR_PRINTF3(_L("Error - Periodic Utility time comparison failed:  Got %u;  Expected %u"), currentTime, predictedTime);
+		iPeriodicUtilityTestVerdict = EFail;
+		iPeriodicUtility->Stop();
+		CActiveScheduler::Stop();
+		}
+	else
+		{
+		INFO_PRINTF3(_L("Periodic Utility time comparison passed:  Got %u;  Expected %u"), currentTime, predictedTime);
+		}
+
+	if (iPeriodicUtilityIteration >= 5)
+		{
+		iPeriodicUtility->Stop();
+		CActiveScheduler::Stop();
+		}
+	}
+
+TVerdict CTestDevVideoPlayClock::DoTestStepL()
+	{
+	TVerdict ret = EPass;
+	TTimeIntervalMicroSeconds testTime(0);
+	TUint timeUint = 0;
+
+	iClockSource = CSystemClockSource::NewL();
+
+	// Construct a new thread to constantly probe the clock - to test that it'll work from multiple threads
+	RThread thread;
+	
+	TInt error = thread.Create(_L("ClockSourceTestThread"), 
+								&CTestDevVideoPlayClock::StartThread,
+								KDefaultStackSize, 
+								&User::Heap(),
+								static_cast<TAny*>(this), 
+								EOwnerThread);
+
+	if (error)
+		{
+		ERR_PRINTF1(_L("Error - Couldn't create periodic utility object"));
+		delete iClockSource;
+		return EInconclusive;
+		}
+
+	TRequestStatus stat;
+	thread.Logon(stat);
+	if (stat!=KRequestPending)
+		{
+		delete iClockSource;
+		ERR_PRINTF2(_L("Error - Couldn't logon to the thread err=%d"), stat.Int());
+		thread.LogonCancel(stat);
+		User::WaitForRequest(stat);
+		return EInconclusive;
+		}
+	thread.SetPriority(EPriorityLess);
+
+	// wait for system to calm down
+	User::After(KTestClock2Seconds);
+
+	// reset the clock
+	iClockSource->Reset();
+
+	thread.Resume();
+
+	// wait for 2 seconds and then check the time == 2 seconds
+	User::After(KTestClock2Seconds);
+	testTime = iClockSource->Time();
+	timeUint = I64LOW(testTime.Int64());
+
+	if (!TimeComparison(timeUint, KTestClock2Seconds, KTestClockDeviationMS))
+		{
+		ERR_PRINTF3(_L("Error - time comparison failed:  Got %u;  Expected %u"), timeUint, KTestClock2Seconds);
+		ret = EFail;
+		}
+	else 
+		{
+		INFO_PRINTF3(_L("Time comparison passed:  Got %u;  Expected %u"), timeUint, KTestClock2Seconds);
+		}
+
+	// reset the clock back to 2 seconds
+	//testTime = KTestClock2Seconds;
+	//iClockSource->Reset(testTime);
+
+	// suspend timer for 2 seconds then resume for 2 seconds
+	iClockSource->Suspend();
+	User::After(KTestClock2Seconds);
+	iClockSource->Resume();
+	User::After(KTestClock2Seconds);
+	testTime = iClockSource->Time();
+	timeUint = I64LOW(testTime.Int64());
+
+	if (!TimeComparison(timeUint, KTestClock4Seconds, KTestClockDeviationMS))
+		{
+		ERR_PRINTF3(_L("Error - Suspend() + Resume() time comparison failed:  Got %u;  Expected %u"), timeUint, KTestClock4Seconds);
+		ret = EFail;
+		}
+	else
+		{
+		INFO_PRINTF3(_L("Suspend() + Resume() time comparison passed:  Got %u;  Expected %u"), timeUint, KTestClock4Seconds);
+		}
+
+	// reset clock to 18 seconds
+	testTime = KTestClock18Seconds;
+	iClockSource->Reset(testTime);
+
+	// wait for 2 seconds and then check the time == 20 seconds
+	User::After(KTestClock2Seconds);
+	testTime = iClockSource->Time();
+	timeUint = I64LOW(testTime.Int64());
+
+	if (!TimeComparison(timeUint, KTestClock20Seconds, KTestClockDeviationMS))
+		{
+		ERR_PRINTF3(_L("Error - Reset() time comparison failed:  Got %u;  Expected %u"), timeUint, KTestClock20Seconds);
+		ret = EFail;
+		}
+	else
+		{
+		INFO_PRINTF3(_L("Reset() time comparison passed:  Got %u;  Expected %u"), timeUint, KTestClock20Seconds);
+		}
+
+	// suspend for 2 seconds then resume for 2 seconds
+	iClockSource->Suspend();
+	User::After(KTestClock2Seconds);
+	iClockSource->Resume();
+	User::After(KTestClock2Seconds);
+	
+	testTime = iClockSource->Time();
+	timeUint = I64LOW(testTime.Int64());
+
+	if (!TimeComparison(timeUint, KTestClock22Seconds, KTestClockDeviationMS))
+		{
+		ERR_PRINTF3(_L("Error - Suspend() + Resume() time comparison failed:  Got %u;  Expected %u"), timeUint, KTestClock22Seconds);
+		ret = EFail;
+		}
+	else
+		{
+		INFO_PRINTF3(_L("Suspend() + Resume() time comparison passed:  Got %u;  Expected %u"), timeUint, KTestClock22Seconds);
+		}
+
+	// Now test the periodic utility
+	TRAPD(perError, iPeriodicUtility = CMMFClockSourcePeriodicUtility::NewL(*iClockSource, *this));
+	if (perError)
+		{
+		ERR_PRINTF1(_L("Error - Couldn't create periodic utility object"));
+		ret = EInconclusive;
+		}
+	else
+		{
+		iPeriodicUtilityTestVerdict = EPass;
+		TTimeIntervalMicroSeconds32 period = KTestClock2Seconds;
+		iClockSource->Reset();
+		iPeriodicUtility->Start(period);
+		CActiveScheduler::Start();
+		ret = iPeriodicUtilityTestVerdict;
+		}
+	delete iPeriodicUtility;
+	iPeriodicUtility = NULL;
+
+	// Clean up the thread
+	iShutdownSubthread = ETrue;
+	User::WaitForRequest(stat);
+	thread.Close();
+
+	delete iClockSource;
+
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayCommit::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayCommit::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+CTestDevVideoPlayCommit::CTestDevVideoPlayCommit(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayCommit* CTestDevVideoPlayCommit::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayCommit* self = new(ELeave) CTestDevVideoPlayCommit(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayCommit::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	TBool selDec = ETrue;
+	TBool selPost = ETrue;
+
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  Commit"));
+	
+	// expected results
+	switch(iTestType)
+		{
+		case ETestValid:
+			expErr = KErrNone;
+			break;
+		case ETestDecoderOnly:
+			selPost = EFalse;
+			break;
+		case ETestPostProcOnly:
+			selDec = EFalse;
+			break;
+		default:
+			ERR_PRINTF1(_L("Error - invalid test step type"));
+			return EInconclusive;
+		}
+
+	TInt err = KErrNone;
+
+//	THwDeviceId hwDecoder = 0;
+//	THwDeviceId hwPostProc = 0;
+
+	// select decoder
+	if (selDec)
+		{
+//		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
+	if (selPost)
+		{
+//		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;
+			}
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	// call CommitL on DevVideoPlay 
+	TRAP(iError, aDevVideoPlay.CommitL());
+
+	if (iError != expErr)
+		{
+		ERR_PRINTF3(_L("Commit left with error %d; Expected %d!"), iError, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF1(_L("CommitL() called successfully"));
+	
+	return ret;
+	}
+
+//------------------------------------------------------------------
+
+void CTestDevVideoPlayRevert::MdvpoInitComplete(TInt aError)
+	{
+	INFO_PRINTF2(_L("CTestDevVideoPlayRevert::MdvpoInitComplete():  Error = %d"), aError);
+	
+	iError = aError;
+	}
+
+CTestDevVideoPlayRevert::CTestDevVideoPlayRevert(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayRevert* CTestDevVideoPlayRevert::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayRevert* self = new(ELeave) CTestDevVideoPlayRevert(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayRevert::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+//	TInt expErr = KErrNone;
+	TBool selDec = ETrue;
+	TBool selPost = ETrue;
+
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  Revert"));
+	
+	// expected results
+	switch(iTestType)
+		{
+		case ETestValid:
+//			expErr = KErrNone;
+			break;
+		case ETestDecoderOnly:
+			selPost = EFalse;
+			break;
+		case ETestPostProcOnly:
+			selDec = EFalse;
+			break;
+		default:
+			ERR_PRINTF1(_L("Error - invalid test step type"));
+			return EInconclusive;
+		}
+
+	TInt err = KErrNone;
+
+//	THwDeviceId hwDecoder = 0;
+//	THwDeviceId hwPostProc = 0;
+
+	// select decoder
+	if (selDec)
+		{
+//		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
+	if (selPost)
+		{
+//		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;
+			}
+		}
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+			return EInconclusive;
+		}
+
+	// call Revert on DevVideoPlay
+	aDevVideoPlay.Revert();
+
+	// if no PANIC then test has passed...
+
+	INFO_PRINTF1(_L("Revert() called successfully"));
+	
+	return ret;
+	}
+
+
+//------------------------------------------------------------------
+
+CTestDevVideoPlayCustomInterface::CTestDevVideoPlayCustomInterface(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayCustomInterface* CTestDevVideoPlayCustomInterface::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayCustomInterface* self = new(ELeave) CTestDevVideoPlayCustomInterface(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayCustomInterface::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  CustomInterface"));
+
+	THwDeviceId hwDecoder = 0;
+	THwDeviceId hwPostProc = 0;
+	TInt err = KErrNone;
+
+	TRAP(err, hwDecoder = aDevVideoPlay.SelectDecoderL(KUidDevVideoTestDecodeHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize decoder"));
+			return EInconclusive;
+		}
+	
+	TRAP(err, hwPostProc = aDevVideoPlay.SelectPostProcessorL(KUidDevVideoTestPostProcHwDevice));
+	if (err != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize post processor"));
+			return EInconclusive;
+		}
+
+	// First try test uninitialized
+
+	TAny* ciOne = NULL;
+	TAny* ciTwo = NULL;
+	TAny* ciThree = NULL;
+	TAny* ciFour = NULL;
+	
+	ciOne = aDevVideoPlay.CustomInterface(hwDecoder, KUidCustomInterfaceOne);
+	ciTwo = aDevVideoPlay.CustomInterface(hwDecoder, KUidCustomInterfaceTwo);
+	ciThree = aDevVideoPlay.CustomInterface(hwPostProc, KUidCustomInterfaceTwo);
+	ciFour = aDevVideoPlay.CustomInterface(hwPostProc, KUidCustomInterfaceOne);
+
+	if (ciOne==NULL || ciTwo!=NULL || ciThree==NULL || ciFour!=NULL)
+		{
+		ERR_PRINTF1(_L("Test Failed - wrong interfaces returned"));
+		return EFail;
+		}
+
+	// Next, re-perform test initialized.
+
+	// initialize CDevVideoPlay and wait for response
+	// iError is set by the MdvpoInitComplete callback
+	aDevVideoPlay.Initialize();
+	
+	if (iError != KErrNone)
+		{
+		ERR_PRINTF1(_L("Error - couldn't initialize DevVideoPlay"));
+		return EInconclusive;
+		}
+
+	ciOne = NULL;
+	ciTwo = NULL;
+	ciThree = NULL;
+	ciFour = NULL;
+	
+	ciOne = aDevVideoPlay.CustomInterface(hwDecoder, KUidCustomInterfaceOne);
+	ciTwo = aDevVideoPlay.CustomInterface(hwDecoder, KUidCustomInterfaceTwo);
+	ciThree = aDevVideoPlay.CustomInterface(hwPostProc, KUidCustomInterfaceTwo);
+	ciFour = aDevVideoPlay.CustomInterface(hwPostProc, KUidCustomInterfaceOne);
+
+	if (ciOne==NULL || ciTwo!=NULL || ciThree==NULL || ciFour!=NULL)
+		{
+		ERR_PRINTF1(_L("Test Failed - wrong interfaces returned"));
+		return EFail;
+		}
+
+
+	return EPass;
+	}
+
+
+
+/*
+//------------------------------------------------------------------
+
+CTestDevVideoPlayXXX::CTestDevVideoPlayXXX(const TDesC& aTestName, TTestType aTestType)
+	:CTestDevVideoPlayStep(aTestName, aTestType)
+	{
+	}
+
+CTestDevVideoPlayXXX* CTestDevVideoPlayXXX::NewL(const TDesC& aTestName, TTestType aTestType)
+	{
+	CTestDevVideoPlayXXX* self = new(ELeave) CTestDevVideoPlayXXX(aTestName, aTestType);
+	return self;
+	}
+
+TVerdict CTestDevVideoPlayXXX::DoTestL(CMMFDevVideoPlay& aDevVideoPlay)
+	{
+	TVerdict ret = EPass;
+	TInt expErr = KErrNone;
+	
+	INFO_PRINTF1(_L("CMMFDevVideoPlay:  XXX"));
+	
+	// expected results
+	if (iTestType != ETestValid)
+		{
+		ERR_PRINTF1(_L("Error - invalid test step type"));
+		return EInconclusive;
+		}
+	
+	// XXXX
+
+	TInt err = KErrNone;
+	// TRAP(err, aDevVideoPlay.API_FUNCTION_HERE() )
+
+	if (err != expErr)
+		{
+		ERR_PRINTF3(_L("XXX() gave error %d (expected %d)"),iError, expErr);
+		ret = EFail;
+		}
+	else
+		INFO_PRINTF3(_L("XXX(), %d = %d"), iError, expErr);
+	
+	return ret;
+	}
+
+*/
+