mmdevicefw/mdfunittest/codecapi/video/src/videoplayfile.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmdevicefw/mdfunittest/codecapi/video/src/videoplayfile.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,408 @@
+// Copyright (c) 2005-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 <mmf/devvideo/videoplayhwdevice.h>
+#include <mmf/server/mmfdatabuffer.h>
+#include "videoplayfile.h"
+
+#include "../../PU/video/src/Plugin/VideoTestDecoderPU/videotestdecoderpu.hrh"
+#include "../../PU/video/src/Plugin/VideoTestEncoderPU/videotestencoderpu.hrh"
+
+const TInt KInputBufferSize = 8192;
+const TInt KFilePositionZero = 0;
+const TInt KTBufSize = 256;
+const TInt KTRegionFixSize = 1;
+
+// **************************************************
+// instructs the Hw Device Adapter to play a file	
+// **************************************************
+CPlayVideoFile::CPlayVideoFile(RTestStepVideoCodecs* aParent) : 
+	CActive(EPriorityNormal),
+	iState(EHwDeviceInit),
+	iParent(aParent)
+	{
+	}
+
+void  CPlayVideoFile::ConstructL()
+	{
+	CActiveScheduler::Add(this);
+	User::LeaveIfError(RFbsSession::Connect());
+
+	TInt err = KErrNone;
+	TRAP(err, iScreenDevice = CFbsScreenDevice::NewL(_L(""),EColor16MA));
+	if (err == KErrNotSupported)
+		{
+		TRAP(err, iScreenDevice = CFbsScreenDevice::NewL(_L(""),EColor16M));
+		}
+	if (err == KErrNotSupported)
+		{
+		TRAP(err, iScreenDevice = CFbsScreenDevice::NewL(_L(""),EColor64K));
+		}
+	if (err == KErrNotSupported)
+		{
+		TRAP(err, iScreenDevice = CFbsScreenDevice::NewL(_L(""),EColor4K));
+		}
+	if (err == KErrNotSupported)
+		{
+		TRAP(err, iScreenDevice = CFbsScreenDevice::NewL(_L(""),EColor256));
+		}
+	if (err == KErrNotSupported)
+		{
+		iScreenDevice = CFbsScreenDevice::NewL(_L(""),EColor16MAP);
+		}		
+	else
+		{
+		User::LeaveIfError(err);		
+		}
+	}
+
+CPlayVideoFile* CPlayVideoFile::NewL(RTestStepVideoCodecs* aParent)
+	{
+	CPlayVideoFile* self = new (ELeave) CPlayVideoFile(aParent);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+	
+void CPlayVideoFile::DoCancel()
+	{
+	}
+
+CPlayVideoFile::~CPlayVideoFile()
+	{
+	iFile.Close();
+	iFs.Close();
+	
+	delete iVideoHwDevice;
+	delete iScreenDevice;
+	RFbsSession::Disconnect();
+	}
+	
+	
+void CPlayVideoFile::LoadCodecL()	
+	{
+	iParent->InfoMessage(_L("Loading Hw Device Adapter and PU Codec"));
+
+	RImplInfoPtrArray array;
+	REComSession::ListImplementationsL(TUid::Uid(KUidMdfProcessingUnit), array);
+	TBool found = EFalse;
+	CImplementationInformation* info = NULL;
+	for (TInt i=0;i<array.Count() && !found;i++)
+		{
+		info = array[i];
+		if (info->ImplementationUid() == TUid::Uid(KUidVideoTestDecoderPu))
+			{
+			found = ETrue;
+			}
+		}
+	TInt err = KErrNotFound;
+	if (found)
+		{
+		TRAP(err, iVideoHwDevice = CMMFVideoDecodeHwDevice::NewPuAdapterL(*info,*this));
+		}
+	else
+		{
+		err = KErrNotFound;
+		}
+	array.ResetAndDestroy();
+	User::LeaveIfError(err);
+
+	}
+	
+void CPlayVideoFile::SetDSA(TBool aUseDSA)	
+	{
+	// Need new version of this to load from a PU based uid
+	iUseDSA = aUseDSA;
+	}
+	
+void CPlayVideoFile::StartPlaybackL()	
+	{
+	OpenTestFileL();
+	SetState(EHwDeviceInit);
+	CActiveScheduler::Start();
+	}
+
+void CPlayVideoFile::SetState(TPlayVideoFileState aState)
+	{
+	iState = aState;
+	SetActive();	
+	TRequestStatus* status = &iStatus;
+	User::RequestComplete(status, KErrNone);	
+	}
+
+void CPlayVideoFile::OpenTestFileL()
+	{
+	TBuf<KTBufSize> buf;
+	buf.Format(_L("Opening test input file %S"), &KTestPlaybackFile);
+	iParent->InfoMessage(buf);
+	User::LeaveIfError(iFs.Connect());
+	User::LeaveIfError(iFile.Open(iFs, KTestPlaybackFile, EFileRead));
+	}
+
+void CPlayVideoFile::RunL()
+	{
+	switch (iState)
+		{
+		case EHwDeviceInit:
+			{
+			iParent->InfoMessage(_L("State: EHwDeviceInit"));
+			TRAPD(err, InitializeL());
+			if (err != KErrNone)
+				{
+				CleanupAndSetDeviceError(_L("Cannot intialize HwDevice"));
+				break;
+				}
+			break;
+			}
+		case EHwDeviceStartDecode:
+			{
+			// if we are playing a file, first we have to open the file
+			iParent->InfoMessage(_L("State: EHwDeviceStartDecode"));
+			TRAPD(err, StartDecodeL());
+			if (err != KErrNone)
+				{
+				CleanupAndSetDeviceError(_L("Cannot start decoding"));
+				break;
+				}
+			break;
+			}
+		case EHwDeviceAllowToComplete:
+			iParent->InfoMessage(_L("State: EHwDeviceAllowToComplete"));
+			break;
+		case EHwDeviceDone:
+			{
+			iParent->InfoMessage(_L("State: EHwDeviceDeviceDone"));
+			Cancel();
+			CActiveScheduler::Stop();
+			break;
+			}				
+		case EHwDeviceError:
+			{
+			TBuf<KTBufSize> buf;
+			buf.Format(_L("State: EHwDeviceDeviceError %d"), iError);
+			iParent->SetVerdict(buf, EFail);
+			
+			CActiveScheduler::Stop();
+			break;
+			}
+		default:
+			{
+			CleanupAndSetDeviceError(_L("Unknown CPlayVideoFile iState"));
+			break;
+			}
+		}
+	}
+	
+	
+void CPlayVideoFile::InitializeL()
+	{
+	iParent->InfoMessage(_L("InitializeL()"));
+
+	TUncompressedVideoFormat reqFormat;
+	reqFormat.iDataFormat = ERgbFbsBitmap;
+	reqFormat.iRgbFormat = EFbsBitmapColor16M;
+	RArray<TUncompressedVideoFormat> decodeFormats;
+	iVideoHwDevice->GetOutputFormatListL(decodeFormats);
+	CleanupClosePushL(decodeFormats);
+	User::LeaveIfError(decodeFormats.Find(reqFormat));
+
+	iParent->InfoMessage(_L("Call VideoHwDevice->SetOutputFormat()"));
+	iVideoHwDevice->SetOutputFormatL(reqFormat);
+	CleanupStack::PopAndDestroy(&decodeFormats);	
+	
+	CMMFDescriptorBuffer* buffer = CMMFDescriptorBuffer::NewL(KInputBufferSize);
+	CleanupStack::PushL(buffer);
+	TVideoInputBuffer inputBuffer;
+	
+	TDes8& des = buffer->Data();
+	// read header data from file
+	User::LeaveIfError(iFile.Read(des));
+	TInt pos = KFilePositionZero;
+	// seek back to start
+	User::LeaveIfError(iFile.Seek(ESeekStart, pos));
+
+	TBuf<KTBufSize> buf;
+	buf.Format(_L("Read header of size %d"),inputBuffer.iData.Length());
+	iParent->InfoMessage(buf);
+	
+	if (des.Length()>0)
+		{
+		// Set the pointer
+		inputBuffer.iData.Set(&des[0],des.Length(),des.MaxLength());
+		
+		iParent->InfoMessage(_L("Call VideoHwDevice GetHeaderInformationL()"));
+		TVideoPictureHeader* header = iVideoHwDevice->GetHeaderInformationL(EDuArbitraryStreamSection, 
+												EDuElementaryStream,
+												&inputBuffer);
+												
+		iFrameSize = header->iSizeInMemory;
+		iVideoHwDevice->ReturnHeader(header);
+		}
+	else
+		{
+		// Cannot read any data from file, so no point in continuing
+		User::Leave(KErrCorrupt);
+		}
+		
+	CleanupStack::PopAndDestroy(buffer);	
+	
+	iParent->InfoMessage(_L("Call VideoHwDevice SetVideoDestScreenL()"));
+	iVideoHwDevice->SetVideoDestScreenL(iUseDSA);
+	
+	iParent->InfoMessage(_L("Call VideoHwDevice->Initialize()"));
+	iVideoHwDevice->Initialize();
+	}
+	
+	
+void CPlayVideoFile::StartDecodeL()
+	{
+	iParent->InfoMessage(_L("StartDecodeL()"));
+
+	if (iUseDSA)
+		{
+		StartDirectScreenAccessL();
+		}
+	// tell the HwDeviceAdapter to play the file
+	iParent->InfoMessage(_L("Call VideoHwDevice->Start()"));
+	iVideoHwDevice->Start();
+	}
+	
+	
+void CPlayVideoFile::ReadNextBufferL()
+	{
+	// check that we aren't waiting for the input buffer to be returned
+	iParent->InfoMessage(_L("ReadNextBufferL()"));
+	TVideoInputBuffer* inputBuffer = iVideoHwDevice->GetBufferL(KInputBufferSize);	
+	if (inputBuffer)
+		{
+		TBuf<KTBufSize> buf;
+		buf.Format(_L("inputBuffer size %d"),inputBuffer->iData.Length());
+		iParent->InfoMessage(buf);
+		User::LeaveIfError(iFile.Read(inputBuffer->iData));
+		buf.Format(_L("Read from file %d bytes"),inputBuffer->iData.Length());
+		iParent->InfoMessage(buf);
+		if (inputBuffer->iData.Length()>0)
+			{
+			iParent->InfoMessage(_L("Call HwDevice->WriteCodedData()"));
+			iVideoHwDevice->WriteCodedDataL(inputBuffer);
+			}
+		else
+			{
+			iParent->InfoMessage(_L("End of input stream"));
+			iParent->InfoMessage(_L("Call HwDevice->InputEnd()"));
+			iVideoHwDevice->InputEnd();
+			}
+		}
+	}
+		
+void CPlayVideoFile::CleanupAndSetDeviceError(TPtrC16 aText)
+	{
+	iParent->SetVerdict(aText, EFail);
+	delete iVideoHwDevice;
+	SetState(EHwDeviceError);
+	}
+	
+void CPlayVideoFile::MdvppNewPicture(TVideoPicture* aPicture)
+	{
+	iParent->InfoMessage(_L("MdvppNewPicture - Received Frame"));
+	iVideoHwDevice->ReturnPicture(aPicture);
+	iParent->InfoMessage(_L("MdvppNewPicture - finished returning Frame"));
+	}
+
+void CPlayVideoFile::MdvppNewBuffers()
+	{
+	iParent->InfoMessage(_L("MdvppNewBuffers()"));
+	TRAP(iError, ReadNextBufferL());
+	if (iError != KErrNone)
+		{
+		iParent->SetVerdict(_L("Error reading next buffer"),EFail);		
+		iVideoHwDevice->Stop();
+		SetState(EHwDeviceError);
+		}
+	}
+
+void CPlayVideoFile::MdvppReturnPicture(TVideoPicture* /*aPicture*/)
+	{
+	iParent->InfoMessage(_L("MdvppReturnPicture()"));
+	}
+	
+void CPlayVideoFile::MdvppSupplementalInformation(const TDesC8& /*aData*/, 
+	const TTimeIntervalMicroSeconds& /*aTimestamp*/, const TPictureId& /*aPictureId*/)
+	{
+	}
+	
+void CPlayVideoFile::MdvppPictureLoss()
+	{
+	iParent->InfoMessage(_L("MdvppPictureLoss()"));
+	}
+	
+void CPlayVideoFile::MdvppPictureLoss(const TArray<TPictureId>& /*aPictures*/)
+	{
+	iParent->InfoMessage(_L("MdvppPictureLoss()"));
+	}
+	
+void CPlayVideoFile::MdvppSliceLoss(TUint /*aFirstMacroblock*/, TUint /*aNumMacroblocks*/, const TPictureId& /*aPicture*/)
+	{
+	iParent->InfoMessage(_L("MdvppSliceLoss()"));
+	}
+	
+void CPlayVideoFile::MdvppReferencePictureSelection(const TDesC8& /*aSelectionData*/)
+	{
+	}
+	
+void CPlayVideoFile::MdvppTimedSnapshotComplete(TInt /*aError*/, TPictureData* /*aPictureData*/, 
+	const TTimeIntervalMicroSeconds& /*aPresentationTimestamp*/, const TPictureId& /*aPictureId*/)
+	{
+	}
+	
+void CPlayVideoFile::MdvppFatalError(CMMFVideoHwDevice* /*aDevice*/, TInt aError)
+	{
+	iError = aError;
+	iParent->InfoMessage(_L("MdvppFatalError()"));
+	SetState(EHwDeviceError);
+	}
+	
+void CPlayVideoFile::MdvppInitializeComplete(CMMFVideoHwDevice* /*aDevice*/, TInt aError)
+	{
+	iParent->InfoMessage(_L("MdvppInitializeComplete()"));
+	iError = aError;
+	if (iError == KErrNone)
+		{
+		iParent->InfoMessage(_L("The Hw Device Adapter initialised correctly"));
+		SetState(EHwDeviceStartDecode);
+		}
+	else
+		{
+		iParent->InfoMessage(_L("Failure intialising the hw device adapter"));
+		SetState(EHwDeviceError);
+		}
+	}
+	
+void CPlayVideoFile::MdvppStreamEnd()
+	{
+	iParent->InfoMessage(_L("MdvppStreamEnd()"));
+	SetState(EHwDeviceDone);
+	}
+
+void CPlayVideoFile::StartDirectScreenAccessL()
+	{
+	TRegionFix<KTRegionFixSize> reg;
+	TRect pos(iFrameSize);
+	reg.AddRect(pos);
+	
+	iVideoHwDevice->StartDirectScreenAccessL(pos, *iScreenDevice, reg);
+	}