imaging/imagingunittest/testcodec/src/fwexttestconvert.cpp
changeset 0 5752a19fdefe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imaging/imagingunittest/testcodec/src/fwexttestconvert.cpp	Wed Aug 25 12:29:52 2010 +0300
@@ -0,0 +1,610 @@
+// Copyright (c) 2007-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:
+//
+
+#include "fwexttestconvert.h"
+#include "fwexttestcodec.h"
+#include "imageframe.h"
+#include <icl/icl_uids.hrh>
+#include <e32property.h>
+#include "fwextconstants.h"
+
+// Concrete Decode Transform Extension class
+CDecodeOperationExtension* CDecodeOperationExtension::NewL(CFwExtTestDecoderPlugin* aParent)
+	{
+	return new (ELeave) CDecodeOperationExtension(aParent);
+	}
+
+CDecodeOperationExtension::CDecodeOperationExtension(CFwExtTestDecoderPlugin* aParent)
+:iParent(aParent), iReferenceCount(1), iOperationCaps(0x0F)
+	{	
+	}
+
+CDecodeOperationExtension::~CDecodeOperationExtension()
+	{
+	ASSERT(iReferenceCount == 0);
+	}	
+	
+TUid CDecodeOperationExtension::Uid() const
+	{
+	return iParent->iTestOperationExtPtr->Uid();
+	}
+	
+void CDecodeOperationExtension::IncrementRef()
+	{
+	iReferenceCount++;
+	iParent->iTestOperationExtPtr->IncrementRef();
+	}
+	
+void CDecodeOperationExtension::Release()
+	{
+	iReferenceCount--;
+	iParent->iTestOperationExtPtr->Release();
+	}
+	
+TUint CDecodeOperationExtension::Capabilities() const
+	{
+	return iOperationCaps;
+	}
+	
+void CDecodeOperationExtension::AddOperationL(TImageConvOperation::TOperation aOperation)
+	{
+	/*
+	This bitwise OR is purely for testing purposes only.  An actual
+	AddOperationL call would append the operation to a stack of operations.
+	*/
+	iOperations |= aOperation;
+	iParent->iTestOperationExtPtr->AddOperationL(aOperation);
+	}
+
+void CDecodeOperationExtension::ClearOperationStack()
+	{
+	iOperations = 0;
+	iParent->iTestOperationExtPtr->ClearOperationStack();
+	}
+
+// Concrete Scaler Extension class
+CScalerExtension* CScalerExtension::NewL(CFwExtTestDecoderPlugin* aParent)
+	{
+	return new (ELeave) CScalerExtension(aParent);
+	}
+
+CScalerExtension::CScalerExtension(CFwExtTestDecoderPlugin* aParent)
+:iParent(aParent), iReferenceCount(1)
+	{
+	}	
+
+CScalerExtension::~CScalerExtension()
+	{
+	ASSERT(iReferenceCount == 0);
+	}	
+	
+TUid CScalerExtension::Uid() const
+	{
+	return iParent->iTestScalerExtPtr->Uid();
+	}
+
+void CScalerExtension::IncrementRef()
+	{
+	iReferenceCount++;
+	iParent->iTestScalerExtPtr->IncrementRef();
+	}
+	
+void CScalerExtension::Release()
+	{
+	iReferenceCount--;
+	iParent->iTestScalerExtPtr->Release();
+	}
+
+void CScalerExtension::GetCapabilities(TScalerCaps& aCaps) const
+	{
+	aCaps = iScalerCaps;
+	iParent->iTestScalerExtPtr->GetCapabilities(aCaps);
+	}
+
+void CScalerExtension::SetScalingL(const TSize& aDesiredSize, TImageConvScaler::TScalerQuality aQuality, TBool aLockAspectRatio)
+	{
+	iParent->iTestScalerExtPtr->SetScalingL(aDesiredSize, aQuality, aLockAspectRatio);
+	}
+	
+void CScalerExtension::SetScalingL(TInt aScalingCoeff, TImageConvScaler::TScalerQuality aScalingQuality)
+	{
+	iParent->iTestScalerExtPtr->SetScalingL(aScalingCoeff, aScalingQuality);
+	}
+
+// Concrete Streamed Decode Extension class
+CStreamedDecodeExtension* CStreamedDecodeExtension::NewL(CFwExtTestDecoderPlugin* aParent)
+	{
+	return new (ELeave) CStreamedDecodeExtension(aParent);
+	}
+
+CStreamedDecodeExtension::CStreamedDecodeExtension(CFwExtTestDecoderPlugin* aParent)
+:iParent(aParent), iReferenceCount(1)
+	{
+	}
+	
+CStreamedDecodeExtension::~CStreamedDecodeExtension()
+	{
+	ASSERT(iReferenceCount == 0);
+	}	
+	
+TUid CStreamedDecodeExtension::Uid() const
+	{
+	return iParent->iTestStreamedDecodeExtPtr->Uid();
+	}
+
+void CStreamedDecodeExtension::IncrementRef()
+	{
+	iReferenceCount++;
+	iParent->iTestStreamedDecodeExtPtr->IncrementRef();
+	}
+
+void CStreamedDecodeExtension::Release()
+	{
+	iReferenceCount--;
+	iParent->iTestStreamedDecodeExtPtr->Release();
+	}
+
+void CStreamedDecodeExtension::GetSupportedFormatsL(RArray<TUid>& aFormats, TUid& aOptimalFormat) const
+	{
+	iParent->iTestStreamedDecodeExtPtr->GetSupportedFormatsL(aFormats, aOptimalFormat);
+	}
+	
+void CStreamedDecodeExtension::GetCapabilities(TUid aFormat, TInt aFrameNumber, TDecodeStreamCaps& aCaps) const
+	{
+	iParent->iTestStreamedDecodeExtPtr->GetCapabilities(aFormat, aFrameNumber, aCaps);
+	}
+	
+TInt CStreamedDecodeExtension::GetBufferSize(TUid aFormat, TSize& aBlockSizeInPixels, TInt aNumBlocks) const
+	{
+	return iParent->iTestStreamedDecodeExtPtr->GetBufferSize(aFormat, aBlockSizeInPixels, aNumBlocks);
+	}
+	
+void CStreamedDecodeExtension::InitFrameL(TUid aFormat, TInt aFrameNumber, TDecodeStreamCaps::TNavigation aNavigation)
+	{
+	iParent->iTestStreamedDecodeExtPtr->InitFrameL(aFormat, aFrameNumber, aNavigation);
+	}
+	
+void CStreamedDecodeExtension::GetBlocks(TRequestStatus* aStatus, CImageFrame* aFrame, TInt aSeqPosition, TInt aNumBlocksToGet, TInt* aNumBlocksRead)
+	{
+	iParent->iTestStreamedDecodeExtPtr->GetBlocks(aStatus, aFrame, aSeqPosition, aNumBlocksToGet, aNumBlocksRead);
+	}
+	
+void CStreamedDecodeExtension::GetNextBlocks(TRequestStatus* aStatus, CImageFrame* aFrame, TInt aNumBlocksToGet, TInt* aNumBlocksRead, TBool* aHaveMoreBlocks)
+	{
+	iParent->iTestStreamedDecodeExtPtr->GetNextBlocks(aStatus, aFrame, aNumBlocksToGet, aNumBlocksRead, aHaveMoreBlocks);
+	}
+	
+// Concrete Prepare Extension class
+CPrepareDecodeExtension* CPrepareDecodeExtension::NewL(CFwExtTestDecoderPlugin* aParent)
+	{
+	return new (ELeave) CPrepareDecodeExtension(aParent);
+	}
+
+CPrepareDecodeExtension::CPrepareDecodeExtension(CFwExtTestDecoderPlugin* aParent)
+:iParent(aParent), iReferenceCount(1)
+	{
+	}
+	
+CPrepareDecodeExtension::~CPrepareDecodeExtension()
+	{
+	ASSERT(iReferenceCount == 0);
+	}	
+	
+TUid CPrepareDecodeExtension::Uid() const
+	{
+	return iParent->iTestPrepareExtPtr->Uid();
+	}
+
+void CPrepareDecodeExtension::IncrementRef()
+	{
+	iReferenceCount++;
+	iParent->iTestPrepareExtPtr->IncrementRef();
+	}
+
+void CPrepareDecodeExtension::Release()
+	{
+	iReferenceCount--;
+	iParent->iTestPrepareExtPtr->Release();
+	}
+
+void CPrepareDecodeExtension::Prepare(TRequestStatus* aStatus)
+	{
+	iParent->iTestPrepareExtPtr->Prepare(aStatus);
+	iParent->iReadCodec->SetPrepareProcessing(); // indcate that doing Prepare processing
+	}
+	
+// Concrete Encode Transform Extension class
+CEncodeOperationExtension* CEncodeOperationExtension::NewL(CFwExtTestEncoderPlugin* aParent)
+	{
+	return new (ELeave) CEncodeOperationExtension(aParent);
+	}
+
+CEncodeOperationExtension::CEncodeOperationExtension(CFwExtTestEncoderPlugin* aParent)
+:iParent(aParent), iReferenceCount(1), iOperationCaps(0x0F)
+	{	
+	}
+
+CEncodeOperationExtension::~CEncodeOperationExtension()
+	{
+	ASSERT(iReferenceCount == 0);
+	}	
+	
+TUid CEncodeOperationExtension::Uid() const
+	{
+	return iParent->iTestOperationExtPtr->Uid();
+	}
+	
+void CEncodeOperationExtension::IncrementRef()
+	{
+	iReferenceCount++;
+	iParent->iTestOperationExtPtr->IncrementRef();
+	}
+	
+void CEncodeOperationExtension::Release()
+	{
+	iReferenceCount--;
+	iParent->iTestOperationExtPtr->Release();
+	}
+	
+TUint CEncodeOperationExtension::Capabilities() const
+	{
+	return iOperationCaps;
+	}
+	
+void CEncodeOperationExtension::AddOperationL(TImageConvOperation::TOperation aOperation)
+	{
+	/*
+	This bitwise OR is purely for testing purposes only.  An actual
+	AddOperationL call would append the operation to a stack of operations.
+	*/
+	iOperations |= aOperation;
+	iParent->iTestOperationExtPtr->AddOperationL(aOperation);
+	}
+
+void CEncodeOperationExtension::ClearOperationStack()
+	{
+	iOperations = 0;
+	iParent->iTestOperationExtPtr->ClearOperationStack();
+	}
+
+// Concrete Prepare Extension class for encoder
+CPrepareEncodeExtension* CPrepareEncodeExtension::NewL(CFwExtTestEncoderPlugin* aParent)
+	{
+	return new (ELeave) CPrepareEncodeExtension(aParent);
+	}
+
+CPrepareEncodeExtension::CPrepareEncodeExtension(CFwExtTestEncoderPlugin* aParent)
+:iParent(aParent), iReferenceCount(1)
+	{
+	}
+	
+CPrepareEncodeExtension::~CPrepareEncodeExtension()
+	{
+	ASSERT(iReferenceCount == 0);
+	}	
+	
+TUid CPrepareEncodeExtension::Uid() const
+	{
+	return iParent->iTestPrepareExtPtr->Uid();
+	}
+
+void CPrepareEncodeExtension::IncrementRef()
+	{
+	iReferenceCount++;
+	iParent->iTestPrepareExtPtr->IncrementRef();
+	}
+
+void CPrepareEncodeExtension::Release()
+	{
+	iReferenceCount--;
+	iParent->iTestPrepareExtPtr->Release();
+	}
+
+void CPrepareEncodeExtension::Prepare(TRequestStatus* aStatus)
+	{
+	// test code only - avoids processing framework msgs
+	CFwExtWriteCodec* codec = CFwExtWriteCodec::NewL(*iParent);
+	iParent->SetImageWriteCodec(codec); // Framework takes ownership
+	iParent->SetCodec(codec); // plugin pointer to codec
+
+	iParent->iTestPrepareExtPtr->Prepare(aStatus);
+	iParent->iWriteCodec->SetPrepareProcessing(); // indicate that doing Prepare processing
+	}
+
+// Concrete Streamed Encode Extension class
+CStreamedEncodeExtension* CStreamedEncodeExtension::NewL(CFwExtTestEncoderPlugin* aParent)
+	{
+	return new (ELeave) CStreamedEncodeExtension(aParent);
+	}
+
+CStreamedEncodeExtension::CStreamedEncodeExtension(CFwExtTestEncoderPlugin* aParent)
+:iParent(aParent), iReferenceCount(1)
+	{
+	}
+
+CStreamedEncodeExtension::~CStreamedEncodeExtension()
+	{
+	ASSERT(iReferenceCount == 0);
+	}
+
+TUid CStreamedEncodeExtension::Uid() const
+	{
+	return iParent->iTestStreamedEncodeExtPtr->Uid();
+	}
+
+void CStreamedEncodeExtension::IncrementRef()
+	{
+	iReferenceCount++;
+	iParent->iTestStreamedEncodeExtPtr->IncrementRef();
+	}
+
+void CStreamedEncodeExtension::Release()
+	{
+	iReferenceCount--;
+	iParent->iTestStreamedEncodeExtPtr->Release();
+	}
+
+void CStreamedEncodeExtension::GetSupportedFormatsL(RArray<TUid>& aFormats, TUid& aOptimalFormat) const
+	{
+	iParent->iTestStreamedEncodeExtPtr->GetSupportedFormatsL(aFormats, aOptimalFormat);
+	}
+
+void CStreamedEncodeExtension::GetCapabilities(TUid aFormat, TEncodeStreamCaps& aCaps) const
+	{
+	iParent->iTestStreamedEncodeExtPtr->GetCapabilities(aFormat, aCaps);
+	}
+
+void CStreamedEncodeExtension::InitFrameL(TUid aFormat, TInt aFrameNumber, const TSize& aFrameSizeInPixels, const TSize& aBlockSizeInPixels, TEncodeStreamCaps::TNavigation aNavigation, const CFrameImageData* aFrameImageData)
+	{
+	iParent->iTestStreamedEncodeExtPtr->InitFrameL(aFormat, aFrameNumber, aFrameSizeInPixels, aBlockSizeInPixels, aNavigation, aFrameImageData);
+	
+	// Have sufficient information to create the appropriate writecodec
+	CFwExtWriteCodec* codec = CFwExtWriteCodec::NewL(*iParent);
+	iParent->SetImageWriteCodec(codec); // Framework takes ownership
+	iParent->SetCodec(codec); // plugin pointer to codec
+	}
+
+void CStreamedEncodeExtension::AppendBlocks(TRequestStatus* aStatus, const CImageFrame& aBlocks, TInt aNumBlocksToAdd)
+	{
+	iParent->iTestStreamedEncodeExtPtr->AppendBlocks(aStatus, aBlocks, aNumBlocksToAdd);
+	}
+
+void CStreamedEncodeExtension::AddBlocks(TRequestStatus* aStatus, const CImageFrame& aBlocks, const TInt& aSeqPosition)
+	{
+	iParent->iTestStreamedEncodeExtPtr->AddBlocks(aStatus, aBlocks, aSeqPosition);
+	}
+
+void CStreamedEncodeExtension::Complete(TRequestStatus* aStatus)
+	{
+	iParent->iTestStreamedEncodeExtPtr->Complete(aStatus);
+//	iParent->iWriteCodec->Complete(); // indicate complete to the write codec
+	}
+
+// Decoder Plugin
+CFwExtTestDecoderPlugin* CFwExtTestDecoderPlugin::NewL()
+	{
+	return new (ELeave) CFwExtTestDecoderPlugin();
+	}
+	
+void CFwExtTestDecoderPlugin::ImageType(TInt /*aFrameNumber*/, TUid& /*aImageType*/, TUid& /*aImageSubType*/) const
+	{
+	
+	}
+	
+void CFwExtTestDecoderPlugin::ScanDataL()
+	{
+	// Just create codec and set in the Priv
+	CFwExtReadCodec* imageReadCodec = CFwExtReadCodec::NewL(*this);
+	SetImageReadCodec(imageReadCodec);
+	iReadCodec = imageReadCodec;
+	
+	SetDataLength(10);
+	
+	ReadFrameHeadersL();
+	}
+
+CFrameInfoStrings* CFwExtTestDecoderPlugin::FrameInfoStringsL(RFs& /*aFs*/, TInt /*aFrameNumber*/)
+	{
+	return NULL;
+	}
+
+CFwExtTestDecoderPlugin::CFwExtTestDecoderPlugin()
+:iDestSize(1234,1234)
+	{
+	}
+
+CFwExtTestDecoderPlugin::~CFwExtTestDecoderPlugin()
+	{
+	// test extension shared with test code
+	delete iTestOperationExtPtr;
+	delete iTestScalerExtPtr;
+	delete iTestStreamedDecodeExtPtr;
+	
+	// actual extensions that point to the above
+	delete iOperationExt;
+	delete iScalerExt;
+	delete iStreamedDecodeExt;
+	
+	// Call last
+	Cleanup();
+	}
+
+void CFwExtTestDecoderPlugin::GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr)
+	{
+	switch(aExtUid.iUid)
+		{
+		case KUidImageConvExtOperationValue:
+			{
+			iOperationExt = CDecodeOperationExtension::NewL(this);
+			aExtPtr = iOperationExt;
+			break;
+			}
+		case KUidImageConvExtScalerValue:
+			{
+			iScalerExt= CScalerExtension::NewL(this);
+			aExtPtr = iScalerExt;
+			break;
+			}
+		case KUidImageConvExtStreamedDecodeValue:
+			{
+			iStreamedDecodeExt = CStreamedDecodeExtension::NewL(this);
+			aExtPtr = iStreamedDecodeExt;
+			break;
+			}
+		case KUidImageConvExtPrepareValue:
+			{
+			iPrepareExt = CPrepareDecodeExtension::NewL(this);
+			aExtPtr = iPrepareExt;
+			break;
+			}
+		default:
+			{
+			User::Leave(KErrNotSupported);	
+			}
+		}
+	}
+
+TInt CFwExtTestDecoderPlugin::GetDestinationSize(TSize& aSize, TInt aFrameNumber)
+	{
+	aSize.iWidth = aSize.iWidth/2;
+	aSize.iHeight = aSize.iHeight/2;
+	return aFrameNumber;
+	}
+
+void CFwExtTestDecoderPlugin::SetClippingRectL(const TRect* aClipRect)
+	{
+	if(!aClipRect)
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	const TRect KClippingRectSize(2,4,6,8);
+
+	if(*aClipRect != KClippingRectSize)
+		{
+		User::Leave(KErrArgument);
+		}
+	}
+
+void CFwExtTestDecoderPlugin::HandleCustomSyncL(TInt aParam)
+	{
+	MImageConvExtension* tempExt = reinterpret_cast<MImageConvExtension*>(aParam);
+
+	if(tempExt->Uid() == KICLOperationUid)
+		{
+		iTestOperationExtPtr = static_cast<CDecodeOperationExtension*>(tempExt);
+		}
+	else if(tempExt->Uid() == KICLScalerUid)
+		{
+		iTestScalerExtPtr = static_cast<CScalerExtension*>(tempExt);
+		}
+	else if(tempExt->Uid() == KICLStreamedDecodeUid)
+		{
+		iTestStreamedDecodeExtPtr = static_cast<CStreamedDecodeExtension*>(tempExt);
+		}
+	else if(tempExt->Uid() == KICLPrepareUid)
+		{
+		iTestPrepareExtPtr = static_cast<CPrepareDecodeExtension*>(tempExt);
+		}
+	else
+		{
+		User::Leave(KErrNotSupported);
+		}
+	}
+
+void CFwExtTestDecoderPlugin::InitCustomAsyncL(TInt /*aParam*/)
+	{
+	}
+
+// Encoder Plugin	
+CFwExtTestEncoderPlugin* CFwExtTestEncoderPlugin::NewL()
+	{
+	return new (ELeave) CFwExtTestEncoderPlugin();
+	}
+
+CFwExtTestEncoderPlugin::CFwExtTestEncoderPlugin()
+	{
+	}
+
+CFwExtTestEncoderPlugin::~CFwExtTestEncoderPlugin()
+	{
+	// Call last
+	Cleanup();
+	}
+
+void CFwExtTestEncoderPlugin::SetCodec(CFwExtWriteCodec* aWriteCodec)
+	{
+	iWriteCodec = aWriteCodec;
+	}
+
+void CFwExtTestEncoderPlugin::PrepareEncoderL(const CFrameImageData* /*aFrameImageData*/)
+	{
+	}
+	
+void CFwExtTestEncoderPlugin::UpdateHeaderL()
+	{
+	}
+
+void CFwExtTestEncoderPlugin::HandleCustomSyncL(TInt aParam)
+	{
+	MImageConvExtension* tempExt = reinterpret_cast<MImageConvExtension*>(aParam);
+
+	if(tempExt->Uid() == KICLOperationUid)
+		{
+		iTestOperationExtPtr = static_cast<CEncodeOperationExtension*>(tempExt);
+		}
+	else if(tempExt->Uid() == KICLStreamedEncodeUid)
+		{
+		iTestStreamedEncodeExtPtr = static_cast<CStreamedEncodeExtension*>(tempExt);
+		}
+	else if(tempExt->Uid() == KICLPrepareUid)
+		{
+		iTestPrepareExtPtr = static_cast<CPrepareEncodeExtension*>(tempExt);
+		}
+	else
+		{
+		User::Leave(KErrNotSupported);
+		}
+	}	
+
+void CFwExtTestEncoderPlugin::GetExtensionL(TUid aExtUid, MImageConvExtension*& aExtPtr)
+	{
+	switch(aExtUid.iUid)
+		{
+		case KUidImageConvExtOperationValue:
+			{
+			iOperationExt = CEncodeOperationExtension::NewL(this);
+			aExtPtr = iOperationExt;
+			break;
+			}
+		case KUidImageConvExtStreamedEncodeValue:
+			{
+			iStreamedEncodeExt = CStreamedEncodeExtension::NewL(this);
+			aExtPtr = iStreamedEncodeExt;
+			break;
+			}
+		case KUidImageConvExtPrepareValue:
+			{
+			iPrepareExt = CPrepareEncodeExtension::NewL(this);
+			aExtPtr = iPrepareExt;
+			break;
+			}
+		default:
+			{
+			User::Leave(KErrNotSupported);	
+			}
+		}
+	}
+