imaging/imagingfws/MediaClientImage/Source/Test/TMdaFailVid/TMdaFailVid1.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingfws/MediaClientImage/Source/Test/TMdaFailVid/TMdaFailVid1.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,884 @@
+// Copyright (c) 1999-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:
+// TMDAVID6.CPP
+// 
+//
+
+#include "tmdatest.h"
+
+/*
+
+Tests:
+File -> Bitmap with alloc failure
+File -> Bitmap streaming with alloc failure
+Bitmap -> File with alloc failure
+
+*/
+
+//
+// CTestImageIO 
+// walking class that does image reads and writes. Exploits asynchronous behaviour
+// of own properties. Calls are essentially synchronous using AS recursion
+//
+
+const TInt KViaDesIncrement = 0x1000;
+const TInt KTempHeapSize = 0x100000; // 1M 0x20000; // 128K
+
+class CTestImageIO : public CBase, public MMdaImageUtilObserver
+	{
+// New data types
+protected:
+	enum TOperation {ERead, EReadViaDes, EReadViaFile, EWrite};
+	enum TState {EStateIdle, EStateOpening, EStateConverting};
+// Construction, Destruction
+public:
+	static CTestImageIO *NewL(RFs &aFs);
+	static CTestImageIO *NewLC(RFs &aFs);
+	~CTestImageIO();
+protected:
+	CTestImageIO(RFs &aFs);
+	void ConstructL();
+// New public functions
+public:
+	void ReadL(CFbsBitmap& aBitmap, const TDesC& aFileName, TInt aZoomFactor);
+	void ReadViaDesL(CFbsBitmap& aBitmap, const TDesC& aFileName, TInt aZoomFactor);
+	void ReadViaFileL(CFbsBitmap& aBitmap, const TDesC& aFileName, TInt aZoomFactor);
+	void WriteL(CFbsBitmap& aBitmap, const TDesC& aFileName, TMdaClipFormat* aFormat,TMdaPackage* aCodec);
+// Virtual functions from MMdaImageUtilObserver
+protected:
+	virtual void MiuoCreateComplete(TInt aError);
+	virtual void MiuoOpenComplete(TInt aError);
+	virtual void MiuoConvertComplete(TInt aError);
+// Helper functions
+protected:
+	void Leave(TInt aError);
+	void OpenOrigAndTempFilesL();
+	void CloseOrigAndTempFiles();
+	void CopyFileToTempL(TInt aSize);
+	void ResetStreamBufferedSize();
+	void IncrementStreamBufferedSize();
+	TInt StreamBufferedSize() const { return iBufferedSize; }
+// Data properties:
+protected:
+	CMdaImageUtility*	iUtility;
+	TOperation			iOperation;
+	TState				iState;
+	TInt				iReturnedError;
+	TPtr8				iBuffer;		// used in via des streaming
+	TPtr8				iCopyBuffer;
+	TInt				iBufferedSize;	// running required buffer size for streaming
+	TInt				iFileSize;
+	TInt				iZoomFactor;
+	RFile				iOrigFile;		// used in ReadViaFileL
+	RFile				iTempFile;
+	TInt				iTempFileSize;
+// Linked data
+	CFbsBitmap*			iBitmap;
+	TPtrC				iFileName;
+	RFs&				iFs;
+	};
+
+CTestImageIO* CTestImageIO::NewL(RFs &aFs)
+	{
+	CTestImageIO* result = NewLC(aFs);
+	CleanupStack::Pop(); 
+	return result;
+	}
+
+CTestImageIO* CTestImageIO::NewLC(RFs &aFs)
+	{
+	CTestImageIO* result = new (ELeave) CTestImageIO(aFs);
+	CleanupStack::PushL(result);
+	result->ConstructL();
+	return result;
+	}
+
+CTestImageIO::CTestImageIO(RFs &aFs):
+	iBuffer(NULL, 0, 0),
+	iCopyBuffer(NULL, 0, 0),
+	iFs(aFs)
+	{
+	}
+
+void CTestImageIO::ConstructL()
+	{
+	const TInt copySize=KViaDesIncrement;
+	iCopyBuffer.Set(STATIC_CAST(TUint8*, User::AllocL(copySize)), 0, copySize);
+	}
+
+CTestImageIO::~CTestImageIO()
+	{
+	delete iUtility;
+	User::Free(REINTERPRET_CAST(TAny*,CONST_CAST(TUint8*, iBuffer.Ptr())));
+	User::Free(REINTERPRET_CAST(TAny*,CONST_CAST(TUint8*, iCopyBuffer.Ptr())));
+	CloseOrigAndTempFiles();
+	}
+
+void CTestImageIO::Leave(TInt aError)
+	{
+	iReturnedError = aError;
+	CActiveScheduler::Stop();
+	}
+
+void CTestImageIO::OpenOrigAndTempFilesL()
+	{
+	User::LeaveIfError(iOrigFile.Open(iFs, iFileName, EFileShareReadersOnly|EFileStream|EFileRead));
+	User::LeaveIfError(iTempFile.Replace(iFs, KFailVideoTempTestFileName, EFileShareAny|EFileStream|EFileWrite));
+	iTempFileSize = 0;
+	}
+
+void CTestImageIO::CloseOrigAndTempFiles()
+	{
+	iOrigFile.Close();
+	iTempFile.Close();
+	}
+
+void CTestImageIO::CopyFileToTempL(TInt aSize)
+	{
+	TInt copySize = aSize - iTempFileSize;
+	ASSERT(copySize >= 0); // should not occur
+
+	if(copySize == 0)
+		return;
+
+	User::LeaveIfError(iOrigFile.Read(iCopyBuffer, copySize));
+
+	ASSERT(iCopyBuffer.Length() == copySize); // should not have any shortfall
+
+	User::LeaveIfError(iTempFile.Write(iCopyBuffer));
+
+	iTempFileSize += copySize;
+	}
+
+void CTestImageIO::ResetStreamBufferedSize()
+	{
+	ASSERT(iFileSize>0); // don't copy with real empty files
+	iBufferedSize = 1; // start stream at size 1
+	}
+
+void CTestImageIO::IncrementStreamBufferedSize()
+	{
+	TInt newSize;
+	if (iBufferedSize < 100)
+		newSize = iBufferedSize + 1;
+	else
+		newSize = iBufferedSize + KViaDesIncrement;
+	iBufferedSize = Min(iFileSize, newSize);
+#if defined(_DEBUG) && 0
+	RDebug::Print(_L("IncrementStreamBuffer->%d"), iBufferedSize); 
+#endif defined(_DEBUG)
+	}
+
+
+void CTestImageIO::ReadL(CFbsBitmap& aBitmap, const TDesC& aFileName, TInt aZoomFactor)
+	{
+	ASSERT(iState==EStateIdle); // ensure in idle state
+	delete iUtility; iUtility=NULL; // could be non-NULL if previous error
+
+	iFileName.Set(aFileName); // remember parameters
+	iBitmap = &aBitmap;
+	iZoomFactor = aZoomFactor;
+
+	iOperation = ERead;
+
+	iUtility = CMdaImageFileToBitmapUtility::NewL(*this, NULL);
+	CMdaImageFileToBitmapUtility* utility = STATIC_CAST(CMdaImageFileToBitmapUtility*, iUtility);
+	utility->OpenL(iFileName);
+	iState = EStateOpening;
+	CActiveScheduler::Start(); // recurse into AO
+
+	ASSERT(iState == EStateIdle); // we should have come back here
+	delete iUtility; iUtility = NULL;
+
+	User::LeaveIfError(iReturnedError);
+	}
+
+void CTestImageIO::ReadViaDesL(CFbsBitmap& aBitmap, const TDesC& aFileName, TInt aZoomFactor)
+	{
+	ASSERT(iState==EStateIdle); // ensure in idle state
+	delete iUtility; iUtility=NULL; // could be non-NULL if previous error
+
+	iFileName.Set(aFileName); // remember parameters
+	iBitmap = &aBitmap;
+	iZoomFactor = aZoomFactor;
+
+	iOperation = EReadViaDes;
+
+	// read the whole of the original file into a buffer of the correct size
+	RFile file;
+	User::LeaveIfError(file.Open(iFs, aFileName, EFileShareReadersOnly|EFileStream|EFileRead));
+	CleanupClosePushL(file);
+	User::LeaveIfError(file.Size(iFileSize));
+	iBuffer.Set(STATIC_CAST(TUint8 *, User::AllocL(iFileSize)), 0, iFileSize);
+	User::LeaveIfError(file.Read(iBuffer));
+	CleanupStack::PopAndDestroy(); // file
+
+	ResetStreamBufferedSize(); // initial bit we try to read
+	iBuffer.SetLength(StreamBufferedSize()); 
+
+	iUtility = CMdaImageDescToBitmapUtility::NewL(*this, NULL);
+	CMdaImageDescToBitmapUtility* utility = STATIC_CAST(CMdaImageDescToBitmapUtility*, iUtility);
+	utility->OpenL(iBuffer);
+	iState = EStateOpening;
+	CActiveScheduler::Start(); // recurse into AO
+
+	ASSERT(iState == EStateIdle); // we should have come back here
+	delete iUtility; iUtility = NULL;
+
+	User::LeaveIfError(iReturnedError);
+	}
+
+void CTestImageIO::ReadViaFileL(CFbsBitmap& aBitmap, const TDesC& aFileName, TInt aZoomFactor)
+	{
+	ASSERT(iState==EStateIdle); // ensure in idle state
+	delete iUtility; iUtility=NULL; // could be non-NULL if previous error
+
+	iFileName.Set(aFileName); // remember parameters
+	iBitmap = &aBitmap;
+	iZoomFactor = aZoomFactor;
+
+	iOperation = EReadViaFile;
+
+	TEntry entry;
+	User::LeaveIfError(iFs.Entry(iFileName, entry));
+	iFileSize = entry.iSize;
+
+	// copy bytes from the original file, as required
+	OpenOrigAndTempFilesL();
+	ResetStreamBufferedSize(); // initial bit we try to read
+	CopyFileToTempL(StreamBufferedSize()); 
+
+	iUtility = CMdaImageFileToBitmapUtility::NewL(*this, NULL);
+	CMdaImageFileToBitmapUtility* utility = STATIC_CAST(CMdaImageFileToBitmapUtility*, iUtility);
+	TPtrC tempFileName(KFailVideoTempTestFileName);
+	utility->OpenL(tempFileName);
+	iState = EStateOpening;
+	CActiveScheduler::Start(); // recurse into AO
+
+	ASSERT(iState == EStateIdle); // we should have come back here
+	delete iUtility; iUtility = NULL;
+
+	CloseOrigAndTempFiles();
+	(void) iFs.Delete(KFailVideoTempTestFileName); // delete temp file
+
+	User::LeaveIfError(iReturnedError);
+	}
+
+void CTestImageIO::WriteL(CFbsBitmap& aBitmap, const TDesC& aFileName, TMdaClipFormat* aFormat,TMdaPackage* aCodec)
+	{
+	ASSERT(iState==EStateIdle); // ensure in idle state
+	delete iUtility; iUtility=NULL; // could be non-NULL if previous error
+
+	iFileName.Set(aFileName); // remember parameters
+	iBitmap = &aBitmap;
+
+	iOperation = EWrite;
+
+	iUtility = CMdaImageBitmapToFileUtility::NewL(*this, NULL);
+	CMdaImageBitmapToFileUtility* utility = STATIC_CAST(CMdaImageBitmapToFileUtility*, iUtility);
+	utility->CreateL(iFileName, aFormat, aCodec, aCodec); 
+		// note some of the standard codec's look at the standard codec info and some the extra
+	iState = EStateOpening;
+	CActiveScheduler::Start(); // recurse into AO
+
+	ASSERT(iState == EStateIdle); // we should have come back here
+	delete iUtility; iUtility = NULL;
+
+	User::LeaveIfError(iReturnedError);
+	}
+
+void CTestImageIO::MiuoOpenComplete(TInt aError)
+	{
+	ASSERT(iOperation == ERead || iOperation == EReadViaDes || iOperation == EReadViaFile); // only these operations should get here
+
+	ASSERT(iState == EStateOpening); // to be expected
+
+	if (aError!=KErrNone)
+		{
+		if ((iOperation==EReadViaDes || iOperation==EReadViaFile) &&
+			aError == KErrUnderflow && StreamBufferedSize() < iFileSize)
+			{
+			// doing stream operation and not yet enough data to open the file
+			IncrementStreamBufferedSize();
+			TInt error = KErrNone;
+			if (iOperation == EReadViaDes)
+				{
+				iBuffer.SetLength(StreamBufferedSize());
+				CMdaImageDescToBitmapUtility* utility = STATIC_CAST(CMdaImageDescToBitmapUtility*, iUtility);
+				TRAP(error, utility->OpenL(iBuffer));
+				}
+			else
+				{
+				ASSERT(iOperation == EReadViaFile);
+				TRAP(error, CopyFileToTempL(StreamBufferedSize()));
+				CMdaImageFileToBitmapUtility* utility = STATIC_CAST(CMdaImageFileToBitmapUtility*, iUtility);
+				TPtrC tempFileName(KFailVideoTempTestFileName);
+				if (error==KErrNone)
+					TRAP(error,utility->OpenL(tempFileName));
+				}
+			if (error != KErrNone)
+				{
+				iState = EStateIdle;
+				Leave(error);
+				}
+			}
+		else
+			{
+			iState = EStateIdle;
+			Leave(aError);
+			}
+		}
+	else
+		{
+		// note for readviades and viafile we only have to resize once - not on subsequent tries
+		TFrameInfo frameInfo;
+		iUtility->FrameInfo(0, frameInfo);
+		TSize frameSize = frameInfo.iFrameCoordsInPixels.Size();
+		frameSize.iWidth = (frameSize.iWidth+iZoomFactor-1) / iZoomFactor;
+		frameSize.iHeight = (frameSize.iHeight+iZoomFactor-1) / iZoomFactor;
+		TInt error = iBitmap->Resize(TSize(0,0));
+		if (error==KErrNone)
+			error = iBitmap->Resize(frameSize);
+		if (error==KErrNone)
+			TRAP(error, iUtility->ConvertL(*iBitmap));
+		if (error!=KErrNone)
+			{
+			iState = EStateIdle;
+			Leave(error);
+			}
+		else
+			iState = EStateConverting;
+		}
+	}
+
+void CTestImageIO::MiuoCreateComplete(TInt aError)
+	{
+	ASSERT(iOperation == EWrite); // only called on write operation
+
+	ASSERT(iState == EStateOpening); // to be expected
+
+	if (aError!=KErrNone)
+		{
+		iState = EStateIdle;
+		Leave(aError);
+		}
+	else
+		{
+		TRAPD(error, iUtility->ConvertL(*iBitmap));
+		if (error!=KErrNone)
+			{
+			iState = EStateIdle;
+			Leave(error);
+			}
+		else
+			iState = EStateConverting;
+		}
+	}
+
+void CTestImageIO::MiuoConvertComplete(TInt aError)
+	{
+	ASSERT(iState == EStateConverting); // to be expected
+
+	if (iOperation == ERead || iOperation == EWrite)
+		{
+		iState = EStateIdle;
+		Leave(aError);
+		}
+	else
+		{
+		ASSERT(iOperation == EReadViaDes || iOperation == EReadViaFile);
+
+		if (aError == KErrUnderflow && StreamBufferedSize() < iFileSize)
+			// partial decode event - try to decode a bit more
+			{
+			IncrementStreamBufferedSize();
+			TInt error = KErrNone;
+			if (iOperation == EReadViaDes)
+				iBuffer.SetLength(StreamBufferedSize());
+			else
+				{
+				ASSERT(iOperation == EReadViaFile);
+				TRAP(error, CopyFileToTempL(StreamBufferedSize()));
+				}
+			if (error==KErrNone)
+				TRAP(error, iUtility->ConvertL(*iBitmap));
+			if (error != KErrNone)
+				{
+				iState = EStateIdle;
+				Leave(error);
+				}
+			}
+		else
+			{
+			iState = EStateIdle;
+			Leave(aError);
+			}
+		}
+	}
+
+//
+// CMdaFailVid1
+//
+
+void CMdaFailVidTest1::DoTestL()
+	{
+	User::LeaveIfError(iFs.Connect());
+	CleanupClosePushL(iFs);
+
+	CDir* dir = NULL;
+	iFs.GetDir(KNullDesC,0,0,dir);
+	CleanupStack::PushL(dir);
+
+	TInt error=KErrNone;
+
+	__UHEAP_MARK;
+	TRAP(error,Test1L(*dir)); 
+	iEngine->Print(_L("After Test1"));
+	__UHEAP_MARKEND; 
+
+	User::LeaveIfError(error);
+
+	__UHEAP_MARK;
+	TRAP(error,Test2L(*dir));
+	iEngine->Print(_L("After Test2"));
+	__UHEAP_MARKEND; 
+
+	User::LeaveIfError(error);
+
+	// preload and destroy CFbsBitmap to avoid "memory leak" - really side effect of
+	// CFbsBitmap::Load() that is cleaned up properly later
+		{
+		TFileName fileName;
+		User::LeaveIfError(iFs.DefaultPath(fileName));
+		fileName.Append(KVideoTestSourceFileName);
+
+		CFbsBitmap* srcBmp = new(ELeave) CFbsBitmap;
+		CleanupStack::PushL(srcBmp);
+		User::LeaveIfError(srcBmp->Load(fileName));
+		CleanupStack::PopAndDestroy(); // srcBmp
+		}
+
+	__UHEAP_MARK;
+	TRAP(error,Test3L());
+	iEngine->Print(_L("After Test3"));
+	__UHEAP_MARKEND; 
+
+	User::LeaveIfError(error);
+
+	CleanupStack::PopAndDestroy(2); // dir, iFs
+	}
+
+void CMdaFailVidTest1::Test1L(CDir& aDir)
+	{
+	CFbsBitmap *bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	User::LeaveIfError(bmp->Create(TSize(0,0),EColor16M));
+	CFbsBitmap *src = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(src);
+	User::LeaveIfError(src->Create(TSize(0,0),EColor16M));
+
+	TInt entries = aDir.Count();
+
+	for (TInt count = 0; count < entries; count++)
+		{
+		__UHEAP_MARK;
+		const TEntry& entry = aDir[count];
+
+		TFileName fileName;
+		User::LeaveIfError(iFs.DefaultPath(fileName));
+		fileName.Append(entry.iName);
+
+		TBuf<80> text;
+		text.Zero();
+		text.Append(_L("Load with alloc fail - "));
+		text.Append(entry.iName);
+		iEngine->Print(text);
+
+		LoadImageL(*src,fileName,1);
+		LoadImageWithAllocFailureL(*bmp,fileName,1);
+		CheckBitmaps(*src,*bmp);
+
+		LoadImageL(*src,fileName,8);
+		LoadImageWithAllocFailureL(*bmp,fileName,8);
+		CheckBitmaps(*src,*bmp);
+		__UHEAP_MARKEND;
+		}
+
+	CleanupStack::PopAndDestroy(2); // src and bmp
+	}
+
+void CMdaFailVidTest1::Test2L(CDir& aDir)
+	{
+	CFbsBitmap *bmp = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp);
+	User::LeaveIfError(bmp->Create(TSize(0,0),EColor16M));
+	CFbsBitmap *bmp2 = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(bmp2);
+	User::LeaveIfError(bmp2->Create(TSize(0,0),EColor16M));
+	CFbsBitmap *src = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(src);
+	User::LeaveIfError(src->Create(TSize(0,0),EColor16M));
+
+	TInt entries = aDir.Count();
+
+	for (TInt count = 0; count < entries; count++)
+		{
+		__UHEAP_MARK;
+		const TEntry& entry = aDir[count];
+
+		TBuf<64> text;
+		text.Zero();
+		text.Append(_L("Stream with alloc fail - "));
+		text.Append(entry.iName);
+		iEngine->Print(text);
+
+		TFileName fileName;
+		User::LeaveIfError(iFs.DefaultPath(fileName));
+		fileName.Append(entry.iName);
+
+		StreamImageWithAllocFailureL(*bmp,fileName,1,EStreamViaDes);
+		LoadImageL(*src,fileName,1);
+		CheckBitmaps(*src,*bmp);
+		StreamImageWithAllocFailureL(*bmp2,fileName,1,EStreamViaFile);
+		CheckBitmaps(*bmp, *bmp2);
+
+		StreamImageWithAllocFailureL(*bmp,fileName,8,EStreamViaDes);
+		LoadImageL(*src,fileName,8);
+		CheckBitmaps(*src,*bmp);
+		StreamImageWithAllocFailureL(*bmp2,fileName,8,EStreamViaFile);
+		CheckBitmaps(*bmp, *bmp2);
+		__UHEAP_MARKEND;
+		}
+
+	CleanupStack::PopAndDestroy(3); // src, bmp2 and bmp
+	}
+
+void CMdaFailVidTest1::Test3L()
+	{
+	TFileName fileName;
+	User::LeaveIfError(iFs.DefaultPath(fileName));
+	fileName.Append(KVideoTestSourceFileName);
+
+	CFbsBitmap* srcBmp = new(ELeave) CFbsBitmap;
+	CleanupStack::PushL(srcBmp);
+	User::LeaveIfError(srcBmp->Load(fileName));
+
+	for (TInt formatIndex = 0; ; formatIndex++)
+		{
+		TMdaClipFormat* format = NULL;
+		TMdaPackage* codec = NULL;
+		ConfigDestPortL(format,codec,formatIndex);
+
+		if (format == NULL && codec == NULL)
+			break;
+
+		TBuf<64> text(_L("Save with alloc fail - "));
+		text.Append(SaveFileName(formatIndex));
+		iEngine->Print(text);
+
+		SaveImageWithAllocFailureL(*srcBmp,format,codec); 
+
+		iFs.Delete(KFailVideoTempTestFileName);
+		}
+
+	CleanupStack::PopAndDestroy(); // srcBmp
+	}
+
+void CMdaFailVidTest1::LoadImageWithAllocFailureL(CFbsBitmap& aBitmap,const TDesC& aFileName,TInt aZoomFactor)
+	{
+	TInt failCount = 1;
+	TInt err;
+
+	__UHEAP_MARK;
+	TRAP(err,LoadImageL(aBitmap,aFileName,aZoomFactor));
+	if (err != KErrNone)
+		iEngine->TestFailed(err);
+	__UHEAP_MARKEND; 
+
+	for(;;)	{
+#if defined(_DEBUG) && 0 
+		RDebug::Print(_L("CMdaFailVidTest1::LoadImageWithAllocFailureL(%S,%d) failCount=%d"), &aFileName, aZoomFactor, failCount);
+#endif defined(_DEBUG)
+		__UHEAP_SETFAIL(RHeap::EDeterministic, failCount);
+		__UHEAP_MARK;
+
+		TRAP(err,LoadImageL(aBitmap,aFileName,aZoomFactor));
+		if (err != KErrNoMemory && err != KErrNone)
+			iEngine->TestFailed(err);
+
+		__UHEAP_MARKEND; 
+		__UHEAP_SETFAIL(RHeap::ENone, 0);
+
+		if (err!=KErrNoMemory)
+			break;
+		failCount++;
+		}
+	failCount -= 1; // we are one over
+
+	TBuf<80> format;
+	format.Zero();
+	format.AppendFormat(_L("  Completed OK at zoom factor %d with %d memory allocations tested"),aZoomFactor,failCount);
+	iEngine->Print(format);
+	}
+
+void CMdaFailVidTest1::StreamImageWithAllocFailureL(CFbsBitmap& aBitmap,const TDesC& aFileName,TInt aZoomFactor,TStreamMethod aStreamMethod)
+	{
+	TInt failCount = 1;
+	TInt err;
+
+#if defined(_DEBUG) && 0 
+		RDebug::Print(_L("CMdaFailVidTest1::StreamImageWithAllocFailureL(%S,%d,%d)"), &aFileName, aZoomFactor, aStreamMethod);
+#endif defined(_DEBUG)
+
+	__UHEAP_MARK;
+	TRAP(err,StreamImageL(aBitmap,aFileName,aZoomFactor,aStreamMethod));
+  	if (err != KErrNone)
+  		iEngine->TestFailed(err);
+	__UHEAP_MARKEND; 
+  
+	for(;;)	{
+#if defined(_DEBUG) && 0 
+		RDebug::Print(_L("CMdaFailVidTest1::StreamImageWithAllocFailureL(%S,%d,%d) failCount=%d"), &aFileName, aZoomFactor, aStreamMethod, failCount);
+#endif defined(_DEBUG)
+		__UHEAP_SETFAIL(RHeap::EDeterministic, failCount);
+		__UHEAP_MARK;
+
+		TRAP(err,StreamImageL(aBitmap,aFileName,aZoomFactor,aStreamMethod));
+		if (err != KErrNoMemory && err != KErrNone)
+			iEngine->TestFailed(err);
+
+		__UHEAP_MARKEND; 
+		__UHEAP_SETFAIL(RHeap::ENone, 0);
+
+		if (err!=KErrNoMemory)
+			break;
+		failCount++;
+		}
+	failCount -= 1; // we are one over
+
+	TBuf<80> format;
+	format.Zero();
+	TPtrC method;
+	if (aStreamMethod==EStreamViaDes)
+		method.Set(_L("Desc"));
+	else
+		method.Set(_L("File"));
+	format.AppendFormat(_L("  Completed OK (%S) at zoom factor %d with %d memory allocations tested"),&method,aZoomFactor,failCount);
+	iEngine->Print(format);
+	}
+
+void CMdaFailVidTest1::LoadImageL(CFbsBitmap& aBitmap,const TDesC& aFileName,TInt aZoomFactor)
+	{
+	CTestImageIO* testIO = CTestImageIO::NewLC(iFs);
+	testIO->ReadL(aBitmap, aFileName, aZoomFactor);
+	CleanupStack::PopAndDestroy(); // testIO
+	}
+
+void CMdaFailVidTest1::StreamImageL(CFbsBitmap& aBitmap,const TDesC& aFileName,TInt aZoomFactor, TStreamMethod aStreamMethod)
+	{
+	CTestImageIO* testIO = CTestImageIO::NewLC(iFs);
+	if (aStreamMethod == EStreamViaDes)	
+		testIO->ReadViaDesL(aBitmap, aFileName, aZoomFactor);
+	else
+		{
+		ASSERT(aStreamMethod==EStreamViaFile);
+		testIO->ReadViaFileL(aBitmap, aFileName, aZoomFactor);
+		}
+	CleanupStack::PopAndDestroy(); // testIO
+	}
+
+void CMdaFailVidTest1::SaveImageWithAllocFailureL(CFbsBitmap& aBitmap,TMdaClipFormat* aFormat,TMdaPackage* aCodec)
+	{
+	TInt failCount = 1;
+	TInt err;
+
+	__UHEAP_MARK;
+	TRAP(err,SaveImageL(aBitmap,aFormat,aCodec));
+	if (err != KErrNone)
+		iEngine->TestFailed(err);
+	__UHEAP_MARKEND; 
+
+	for(;;)	{
+		__UHEAP_SETFAIL(RHeap::EDeterministic, failCount);
+		__UHEAP_MARK;
+
+		TRAP(err,SaveImageL(aBitmap,aFormat,aCodec));
+		if (err != KErrNoMemory && err != KErrNone)
+			iEngine->TestFailed(err);
+
+		__UHEAP_MARKEND; 
+		__UHEAP_SETFAIL(RHeap::ENone, 0);
+
+		if (err != KErrNoMemory)
+			break;
+
+		failCount++;
+		}
+	failCount -= 1; // we are one over
+
+	TBuf<80> format;
+	format.Zero();
+	format.AppendFormat(_L("  Completed OK with %d memory allocations tested"),failCount);
+	iEngine->Print(format);
+	}
+
+
+void CMdaFailVidTest1::SaveImageL(CFbsBitmap& aBitmap,TMdaClipFormat* aFormat,TMdaPackage* aCodec)
+	{
+	ASSERT(aFormat);
+
+	iFs.Delete(KFailVideoTempTestFileName);
+
+#if 0
+	RMdaSourceStreamPort srcPort;
+	srcPort.OpenLC(iSession);
+	TMdaFbsBitmapDevice bmpDev;
+	srcPort.ResourceConfigL(bmpDev);
+	TMdaFbsBitmapHandle bmpHandle;
+	bmpHandle.iBitmapHandle = aBitmap.Handle();
+	srcPort.PortConfigL(bmpHandle);
+
+	RMdaDestinationClipPort dstPort;
+	dstPort.OpenLC(iSession);
+	TMdaFileClipLocation location;
+	location.iName = KFailVideoTempTestFileName;
+	dstPort.ResourceConfigL(location);
+	dstPort.ResourceConfigL(*aFormat);
+	if (aCodec)
+		dstPort.ResourceConfigL(*aCodec);
+
+	RMdaController controller;
+	controller.OpenLC(iSession);
+	TMdaConnection connection(srcPort,dstPort,KUidMdaMediaTypeVideo);
+	controller.ConnectL(connection);
+	controller.PrepareL();
+	controller.PrimeL();
+
+	CleanupStack::PopAndDestroy(3); // controller, dstPort, srcPort
+#else 0
+	CTestImageIO* testIO = CTestImageIO::NewLC(iFs);
+	testIO->WriteL(aBitmap, KFailVideoTempTestFileName, aFormat, aCodec);
+	CleanupStack::PopAndDestroy(); // testIO
+#endif 0
+	}
+
+const TDesC& CMdaFailVidTest1::SaveFileName(TInt aFormatIndex)
+	{
+	switch (aFormatIndex)
+		{
+	case 0:		return KVideoTest1BppMonoMbm;
+	case 1:		return KVideoTest2BppMonoMbm;
+	case 2:		return KVideoTest4BppMonoMbm;
+	case 3:		return KVideoTest8BppMonoMbm;
+	case 4:		return KVideoTest4BppColorMbm;
+	case 5:		return KVideoTest8BppColorMbm;
+	case 6:		return KVideoTest12BppColorMbm;
+	case 7:		return KVideoTest16BppColorMbm;
+	case 8:		return KVideoTest24BppColorMbm;
+	case 9:		return KVideoTestMono10Jfif;
+	case 10:	return KVideoTestMono30Jfif;
+	case 11:	return KVideoTestMono60Jfif;
+	case 12:	return KVideoTestMono100Jfif;
+	case 13:	return KVideoTest420C10Jfif;
+	case 14:	return KVideoTest420C30Jfif;
+	case 15:	return KVideoTest420C60Jfif;
+	case 16:	return KVideoTest420C100Jfif;
+	case 17:	return KVideoTest422C10Jfif;
+	case 18:	return KVideoTest422C30Jfif;
+	case 19:	return KVideoTest422C60Jfif;
+	case 20:	return KVideoTest422C100Jfif;
+	case 21:	return KVideoTest444C10Jfif;
+	case 22:	return KVideoTest444C30Jfif;
+	case 23:	return KVideoTest444C60Jfif;
+	case 24:	return KVideoTest444C100Jfif;
+	case 25:	return KVideoTest1BppBmp;
+	case 26:	return KVideoTest4BppBmp;
+	case 27:	return KVideoTest8BppBmp;
+	case 28:	return KVideoTest24BppBmp;
+	default:	return KNullDesC;
+		}
+	}
+
+void CMdaFailVidTest1::ConfigDestPortL(TMdaClipFormat*& aFormat,TMdaPackage*& aCodec,TInt aFormatIndex)
+	{
+	aFormat = NULL;
+	aCodec = NULL;
+
+	if (aFormatIndex >= 0 && aFormatIndex <= 8)
+		{
+		switch (aFormatIndex)
+			{
+		case 0:		iMbmFormat.iDisplayMode = EGray2;		break;
+		case 1:		iMbmFormat.iDisplayMode = EGray4;		break;
+		case 2:		iMbmFormat.iDisplayMode = EGray16;		break;
+		case 3:		iMbmFormat.iDisplayMode = EGray256;		break;
+		case 4:		iMbmFormat.iDisplayMode = EColor16;		break;
+		case 5:		iMbmFormat.iDisplayMode = EColor256;	break;
+		case 6:		iMbmFormat.iDisplayMode = EColor4K;		break;
+		case 7:		iMbmFormat.iDisplayMode = EColor64K;	break;
+		case 8:		iMbmFormat.iDisplayMode = EColor16M;	break;
+		default:	User::Invariant();
+			}
+		aFormat = &iMbmFormat;
+		}
+	else if (aFormatIndex >= 9 && aFormatIndex <= 24)
+		{
+		switch (aFormatIndex)
+			{
+		case 9:		case 10:	case 11:	case 12:
+			iJfifFormat.iSettings.iSampleScheme = TMdaJpgSettings::EMonochrome;
+			break;
+		case 13:	case 14:	case 15:	case 16:
+			iJfifFormat.iSettings.iSampleScheme = TMdaJpgSettings::EColor420;
+			break;
+		case 17:	case 18:	case 19:	case 20:
+			iJfifFormat.iSettings.iSampleScheme = TMdaJpgSettings::EColor422;
+			break;
+		case 21:	case 22:	case 23:	case 24:
+			iJfifFormat.iSettings.iSampleScheme = TMdaJpgSettings::EColor444;
+			break;
+		default:	User::Invariant();
+			}
+		switch (aFormatIndex)
+			{
+		case 9:		case 13:	case 17:	case 21:
+			iJfifFormat.iSettings.iQualityFactor = 10;
+			break;
+		case 10:	case 14:	case 18:	case 22:
+			iJfifFormat.iSettings.iQualityFactor = 30;
+			break;
+		case 11:	case 15:	case 19:	case 23:
+			iJfifFormat.iSettings.iQualityFactor = 60;
+			break;
+		case 12:	case 16:	case 20:	case 24:
+			iJfifFormat.iSettings.iQualityFactor = 100;
+			break;
+		default:	User::Invariant();
+			}
+		aFormat = &iJfifFormat;
+		}
+	else if (aFormatIndex >= 25 && aFormatIndex <= 28)
+		{
+		switch (aFormatIndex)
+			{
+		case 25:	aCodec = &iBmp1BppCodec;	break;
+		case 26:	aCodec = &iBmp4BppCodec;	break;
+		case 27:	aCodec = &iBmp8BppCodec;	break;
+		case 28:	aCodec = &iBmp24BppCodec;	break;
+		default:	User::Invariant();
+			}
+		aFormat = &iBmpFormat;
+		}
+	}
+