mmapitest/devvideohaitest/src/T_CMMFDevVideoPlayData.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 09 Jun 2010 11:20:54 +0300
branchRCL_3
changeset 23 545d349d14da
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/*
* 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 <datawrapper.h>
#include <devvideoplay.h>
#include <devvideobase.h> 
#include <hal.h>
#include <devvideoconstants.h>
#include "t_cmmfdevvideoplaydata.h"
#include "t_devvideoconstants.h"

/*@{*/
//LIT's to get params from ini files
_LIT(KPostPro,								"postprocessor");
_LIT(KCodec,								"codec");
_LIT(KCombination,							"combination");
_LIT(KScreenout,							"screen");
_LIT(KFramerate,							"framerate");
_LIT(KInputfile,							"inputfile");
_LIT(KOutputfile,							"outputfile");
_LIT(KSynch,								"synch");
_LIT(KDecoder, 								"dec");
_LIT(KRotation, 							"rotation");
_LIT(KWidth, 								"width");
_LIT(KHeight, 								"height");
_LIT(Kx, 									"x");
_LIT(Ky, 									"y");
_LIT(KPos, 									"pos");
_LIT(KAntiAliasFiltering,					"antiAliasFiltering");
_LIT(KMimeType,								"mimeType");
_LIT(KUseDecoder,							"useDecoder");
_LIT(KInputPath,							"inputPath");
_LIT(KOutputPath,							"outputPath");
_LIT(KDisplayMode,							"displayMode");
_LIT(KBuf,									"buffer");
_LIT(KDataInOrder, 							"dataInOrder");
_LIT(KTVideoDataUnitType, 					"TVideoDataUnitType");
_LIT(KTVideoDataUnitEncapsulation, 			"TVideoDataUnitEncapsulation");
//H264
_LIT(KUid,									"uidInt");
_LIT(KBuffMgmt,								"buffMgmt");
_LIT(KOutput,								"output");
_LIT(KHwdev,								"hwdev");
_LIT(KDataUnitTypeInt,						"dataUnitTypeInt");
_LIT(KEncapsulation,						"encapsulation");
_LIT(KFormat,								"format");
_LIT(KDataFormat,                           "dataFormat");
_LIT(KDataLayout,                           "dataLayout");
_LIT(KPattern,                              "pattern");
_LIT(KAspectRatioNum,                       "aspectRatioNum");
_LIT(KAspectRatioDenom,                     "aspectRatioDenom");
_LIT(KCoefficients,                         "coefficients");
_LIT(KPreDecodeBufferSize,                  "preDecodeBufferSize");
_LIT(KMaxPostDecodeBufferSize,              "maxPostDecodeBufferSize");
_LIT(KPreDecoderBufferPeriodInt,			"preDecoderBufferPeriodInt");
_LIT(KPostDecoderBufferPeriodInt,           "postDecoderBufferPeriodInt");
_LIT(KMaxInputBufferSize,                   "maxInputBufferSize");
_LIT(KMinNumInputBuffers,                   "minNumInputBuffers");
_LIT(KInputEnd,								"inputEnd");
_LIT(KDest,                                 "dest");
_LIT(KX,                                    "x");
_LIT(KY,                                    "y");
_LIT(KSync,                                 "sync");
/*@}*/

/*@{*/
//LIT's to identify commands
_LIT(KCmdNewL,								"NewL");
_LIT(KCmdDestructor,						"~");
_LIT(KCmdInitialize,						"Initialize");
_LIT(KCmdStart,								"Start");
_LIT(KCmdStop,								"Stop");
_LIT(KCmdPause,								"Pause");
_LIT(KCmdResume,							"Resume");
_LIT(KCmdSetRotateOptionsL,					"SetRotateOptionsL");
_LIT(KCmdSetScaleOptionsL,					"SetScaleOptionsL");
_LIT(KCmdSetPosition,						"SetPosition");
_LIT(KCmdSetClockSource,					"SetClockSource");
_LIT(KCmdSelectDecoderL,					"SelectDecoderL");
_LIT(KCmdSetInputFormat,					"SetInputFormat");
_LIT(KCmdSelectPostProcessorL,				"SelectPostProcessorL");
_LIT(KCmdPostProcessorInfoLC,				"PostProcessorInfoLC");
_LIT(KCmdFindCommonFormat,					"FindCommonFormat");
_LIT(KCmdSetOutputFormatL,					"SetOutputFormatL");
_LIT(KCmdGetHeaderInformationL,				"GetHeaderInformationL");
_LIT(KCmdReturnHeader,						"ReturnHeader");
_LIT(KCmdSetVideoDestScreenL,				"SetVideoDestScreenL");
_LIT(KCmdGetBufferOptions,					"GetBufferOptions");
_LIT(KCmdSetBufferOptionsL,					"SetBufferOptionsL");
_LIT(KCmdSetPostProcessTypesL,				"SetPostProcessTypesL");
_LIT(KCmdGetOutputFormatListL,				"GetOutputFormatListL");
_LIT(KCmdAbortDirectScreenAccess,			"AbortDirectScreenAccess");
_LIT(KCmdStartDirectScreenAccess,			"StartDirectScreenAccess");
_LIT(KCmdUtilityGetEnvironment,  			"UtilityGetEnvironment");
/*@}*/
_LIT(KCmdH264CreateDecTest,  				"H264CreateDecTest");
_LIT(KCmdH264SelectPostProcessor,           "H264SelectPostProcessor");
_LIT(KCmdH264SetPostProcessTypes,           "H264SetPostProcessTypes");
_LIT(KCmdH264SetInputFormatCompr,			"H264SetInputFormatCompr");	
_LIT(KCmdH264SetOutputFormat,				"H264SetOutputFormat");
_LIT(KCmdH264SetBufferOptions,				"H264SetBufferOptions");
_LIT(KCmdH264ListFrameSize,                 "H264ListFrameSize");
_LIT(KCmdH264SetVideoDestScreen,            "H264SetVideoDestScreen"); 
_LIT(KCmdH264SetWindowRect,                 "H264SetWindowRect");    
_LIT(KCmdH264Initialize,					"H264Initialize");
_LIT(KCmdH264Start,							"H264Start");
_LIT(KCmdH264Stop,							"H264Stop");
_LIT(KCmdH264Pause,                         "H264Pause");
_LIT(KCmdH264Resume,                        "H264Resume");
_LIT(KCmdH264IOFrameMatch,					"H264IOFrameMatch");
_LIT(KCmdH264FindCommonFormats,             "H264FindCommonFormats");    
_LIT(KCmdH264GetHeaderInformation,          "H264GetHeaderInformation");
_LIT(KCmdH264EnableSynchronization,         "H264EnableSynchronization");
_LIT(KCmdH264SetScaleOptions,               "H264SetScaleOptions");
_LIT(KCmdH264SetRotateOptions,              "H264SetRotateOptions");
_LIT(KCmdH264SynchronizeDecoding,           "H264SynchronizeDecoding");
_LIT(KCmdH264Delete,                        "H264Delete");
_LIT(KCmdH264SetPosition,                   "H264SetPosition");
_LIT(KCmdH264AbortDirectScreenAccess,       "H264AbortDirectScreenAccess");

/*@{*/
_LIT(KNoCodec,								"ENoCodec");
_LIT(KH263,									"EH263");
_LIT(KMPEG4,								"EMPEG4");
_LIT(KH264,									"EH264");
_LIT(KRV9,									"ERV9");
/*@}*/

const CDataWrapperBase::TEnumEntryTable	CT_CMMFDevVideoPlay::iCodecs[] =
	{
	KNoCodec,	ENoCodec,
	KH263,		EH263,
	KMPEG4,		EMPEG4,
	KH264,		EH264,
	KRV9,		ERV9
	};

/*@{*/
//LIT's for display mode
_LIT(KNone,									"ENone");
_LIT(KGray2,								"EGray2");
_LIT(KGray4,								"EGray4");
_LIT(KGray16,								"EGray16");
_LIT(KGray256,								"EGray256");
_LIT(KColor16,								"EColor16");
_LIT(KColor256,								"EColor256");
_LIT(KColor64K,								"EColor64K");
_LIT(KColor16M,								"EColor16M");
_LIT(KRgb,									"ERgb");
_LIT(KColor4K,								"EColor4K");
_LIT(KColor16MU,							"EColor16MU");
_LIT(KColor16MA,							"EColor16MA");
_LIT(KColorLast,							"EColorLast");
/*@}*/

const CDataWrapperBase::TEnumEntryTable	CT_CMMFDevVideoPlay::iDisplayModes[] =
	{
	KNone,		ENone,
	KGray2,		EGray2,
	KGray4,		EGray4,
	KGray16,	EGray16,
	KGray256,	EGray256,
	KColor16,	EColor16,
	KColor256,	EColor256,
	KColor64K,	EColor64K,
	KColor16M,	EColor16M,
	KRgb,		ERgb,
	KColor4K,	EColor4K,
	KColor16MU,	EColor16MU,
	KColor16MA,	EColor16MA,
	KColorLast,	EColorLast,
	KColor64K,	EColor64K,
	};

/*@{*/
//LIT's for rotation
_LIT(KRotateNone,							"ERotateNone");
_LIT(KRotate90Clockwise,					"ERotate90Clockwise");
_LIT(KRotate90Anticlockwise,				"ERotate90Anticlockwise");
_LIT(KRotate180,							"ERotate180");
/*@}*/
const CDataWrapperBase::TEnumEntryTable	CT_CMMFDevVideoPlay::iRotations[] =
	{
	KRotateNone,			ERotateNone,
	KRotate90Clockwise,		ERotate90Clockwise,
	KRotate90Anticlockwise,	ERotate90Anticlockwise,
	KRotate180,				ERotate180
	};

/*@{*/
//LIT's for Video Data Unit Type
_LIT(KEDuCodedPicture,						"EDuCodedPicture");
_LIT(KEDuVideoSegment,						"EDuVideoSegment");
_LIT(KEDuSeveralSegments,					"EDuSeveralSegments");
_LIT(KEDuArbitraryStreamSection,			"EDuArbitraryStreamSection");
/*@}*/

const CDataWrapperBase::TEnumEntryTable	CT_CMMFDevVideoPlay::iTVideoDataUnitType[] =
	{
	KEDuCodedPicture,				EDuCodedPicture,
	KEDuVideoSegment,				EDuVideoSegment,
	KEDuSeveralSegments,			EDuSeveralSegments,
	KEDuArbitraryStreamSection,		EDuArbitraryStreamSection 
	};

/*@{*/
//LIT's for video data unit encapsulation
_LIT(KEDuElementaryStream,					"EDuElementaryStream");
_LIT(KEDuGenericPayload,					"EDuGenericPayload");
_LIT(KEDuRtpPayload,						"EDuRtpPayload");
/*@}*/
const CDataWrapperBase::TEnumEntryTable	CT_CMMFDevVideoPlay::iTVideoDataUnitEncapsulation[] =
	{
	KEDuElementaryStream,	EDuElementaryStream,
	KEDuGenericPayload,		EDuGenericPayload,
	KEDuRtpPayload,			EDuRtpPayload
	};

//H264
// -----------------------------------------------------------------------------
// class CEngineObserver
// -----------------------------------------------------------------------------
//
CEngineObserver::CEngineObserver(CT_CMMFDevVideoPlay& aTestClass) :
  iTestClass(aTestClass)
    {
    
    }
void CEngineObserver::MvdeStreamEndReached()
    {
    iTestClass.DecOutstanding();
    }
void CEngineObserver::MvdeSetError(TInt aError)
    {
    iTestClass.SetError(aError);
    }

/**
 * Public destructor
 */
CT_CMMFDevVideoPlay::~CT_CMMFDevVideoPlay()
	{
	INFO_PRINTF1(_L("CT_CMMFDevVideoPlay Destructor In"));
	if(!iUse264)
	    {
	    if(iDsaStarted)
	        {
	        iDevvp->AbortDirectScreenAccess();      
	        iDsaStarted = EFalse;
	        }
	    DestroyData();
	    }

    iUse264 = EFalse;
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay Destructor Out"));
	}

/**
 * Return a pointer to the object that the data wraps
 * @return	pointer to the object that the data wraps
 */
TAny* CT_CMMFDevVideoPlay::GetObject()
	{
	return iDevvp;
	}

/**
 * Command that destroy the wrapped object and helper objects
 */ 
void CT_CMMFDevVideoPlay::DoCmdDestructor()
	{
	DestroyData();	
	if ( iFileOpen )
		{
		CloseFile();
		iFileOpen = EFalse;
		}
	if ( iDsaStarted )
		{
		iDevvp->AbortDirectScreenAccess();      
		iDsaStarted = EFalse;
		}      		
	//Postproc input buffer
	if ( !iCIBuffMgmtOn && iRawInBuffer)
		{ 
		delete (TUint8*)iRawInBuffer->iData.iRawData->Ptr();
		delete iRawInBuffer->iData.iRawData;
		delete iRawInBuffer;
		iRawInBuffer = NULL;
		}    	
	if(iScreenDevice)
		{
		delete iScreenDevice;
		iScreenDevice = NULL;
		RFbsSession::Disconnect();
		}		
	if(iClock)
		{
		delete iClock;
		iClock = NULL;
		}		
	iFrameSizeList.Close();
	iFs.Close();
	REComSession::FinalClose(); 	
	if(iInfo)
		{
		delete iInfo;
		iInfo=NULL;
		}	
	while(Outstanding())
		{
		INFO_PRINTF1(_L("DoCmdDestructor DecOutstanding()"));
		DecOutstanding();
		}
	}

/**
 * Helper method tha destroy the wrapped object
 */
void CT_CMMFDevVideoPlay::DestroyData()
{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DestroyData")); 
	// Delete Devvideo play 
	delete iDevvp;
	iDevvp = NULL;
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DestroyData"));
}

/**
 * Two phase constructor
 *
 * @leave	system wide error
 */
CT_CMMFDevVideoPlay* CT_CMMFDevVideoPlay::NewL()
	{	
	CT_CMMFDevVideoPlay*	ret=new (ELeave) CT_CMMFDevVideoPlay();
	CleanupStack::PushL(ret);
	ret->ConstructL();
	CleanupStack::Pop(ret);
	return ret;		
	}

/**
 * Protected constructor. First phase construction
 */
CT_CMMFDevVideoPlay::CT_CMMFDevVideoPlay()
	:
	iDevvp(NULL),
	iDecHWDevId(0),
	iPostProcId(0),
	iInBuffSize(0),
	iInputEnd(EFalse),
	iDsaStarted(EFalse),
	iSynchronized(EFalse),
	iFrameListed(EFalse),
	iPictureSize(0,0),
	iAsyncErrorIndex(0),
	iFileOpen(EFalse),
	iCodedInBuffer(NULL),
	iOutBuffer(NULL),
	iRawInBuffer(NULL),
	iTimeStamp(0),
	iFrameTimeInterval(0),
	iSentBuffCount(0),
	iReturnedBuffCount(0),
	iPictureLoss(0),
	iStreamEnd(EFalse),
	iCodecType(EH263),
	iClock(NULL),
	iDirectScreenAccess(EFalse),
	iCIBuffMgmtOn(EFalse),
	iFrameMeasurement(EFalse),
	iCommonFormatFound(EFalse),
	iErrorInputBuffer(EFalse),
	iEngine(NULL),
	iObserver(NULL),
	iUse264(EFalse),
	iFrameRate(15)
	{
	}

/**
 * Second phase construction
 * @internalComponent
 * @return	N/A
 * @pre		None
 * @post	None * @leave	system wide error
 */
void CT_CMMFDevVideoPlay::ConstructL()
	{		
    iClock = CSystemClockSource::NewL();
	}

/**
 * Process a command read from the ini file
 * @param aCommand			The command to process
 * @param aSection			The section in the ini containing data for the command
 * @param aAsyncErrorIndex	Command index for async calls to return errors to 
 * @return					ETrue if the command is processed *
 * @leave					System wide error
 */
TBool CT_CMMFDevVideoPlay::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection,
											 const TInt aAsyncErrorIndex)
	{	
	TBool	ret=ETrue;

	if ( aCommand==KCmdDestructor )
		{
		DoCmdDestructor();
		}
	else if ( aCommand==KCmdNewL )
		{
		DoCmdNewL(aSection);
		}
	else if ( aCommand==KCmdInitialize )
		{
		DoCmdInitialize(aAsyncErrorIndex);
		}
	else if ( aCommand==KCmdStart )
		{
		DoCmdStart(aAsyncErrorIndex);
		}
	else if ( aCommand==KCmdStop )
		{
		DoCmdStop();
		}
	else if ( aCommand==KCmdSetPosition )
		{
		DoCmdSetPosition(aSection);
		}
	else if ( aCommand==KCmdPause )
		{
		DoCmdPause();
		}
	else if ( aCommand==KCmdResume )
		{
		DoCmdResume();
		}
	else if ( aCommand==KCmdSetRotateOptionsL )
		{
		DoCmdSetRotateOptionsL(aSection);
		}
	else if ( aCommand==KCmdSetScaleOptionsL )
		{
		DoCmdSetScaleOptionsL(aSection);
		}
	else if ( aCommand==KCmdSetClockSource )
		{
		DoCmdSetClockSource(aSection);
		}
	else if ( aCommand==KCmdSelectDecoderL )
		{
		DoCmdSelectDecoderL(aSection);
		}
	else if ( aCommand==KCmdSelectPostProcessorL )
		{
		DoCmdSelectPostProcessorL(aSection);
		}
	else if ( aCommand==KCmdPostProcessorInfoLC )
		{
		DoCmdPostProcessorInfoLC();
		}
	else if ( aCommand==KCmdGetOutputFormatListL )
		{
		DoCmdGetOutputFormatListL(aSection);
		}	
	else if ( aCommand==KCmdFindCommonFormat )
		{
		DoCmdFindCommonFormat();
		}
	else if ( aCommand==KCmdSetOutputFormatL )
		{
		DoCmdSetOutputFormatL(aSection);
		}
	else if ( aCommand==KCmdGetHeaderInformationL )
		{
		DoCmdGetHeaderInformationL(aSection);
		}	
	else if ( aCommand==KCmdReturnHeader )
		{
		DoCmdReturnHeader();
		}	
	else if ( aCommand==KCmdSetVideoDestScreenL )
		{
		DoCmdSetVideoDestScreenL();
		}
	else if ( aCommand==KCmdGetBufferOptions )
		{
		DoCmdGetBufferOptions();
		}
	else if ( aCommand==KCmdSetBufferOptionsL )
		{
		DoCmdSetBufferOptionsL();
		}	
	else if ( aCommand==KCmdSetPostProcessTypesL )
		{
		DoCmdSetPostProcessTypesL(aSection);
		}
	else if ( aCommand==KCmdSetInputFormat )
		{
		DoCmdSetInputFormatL(aSection);
		}
	else if ( aCommand==KCmdStartDirectScreenAccess )
		{
		DoCmdStartDirectScreenAccessL(aSection);
		}
	else if ( aCommand==KCmdAbortDirectScreenAccess )
		{
		DoCmdAbortDirectScreenAccess();
		}
	else if ( aCommand==KCmdUtilityGetEnvironment )
		{
		DoCmdUtilityGetEnvironmentL();
		}
	else if ( aCommand==KCmdH264CreateDecTest)
		{
		DoCmdH264CreateDecTest(aSection);
		}
	else if (aCommand==KCmdH264SelectPostProcessor)
	    {
	    DoCmdH264SelectPostProcessor(aSection);
	    }
	else if (aCommand==KCmdH264SetPostProcessTypes)
	    {
	    DoCmdH264SetPostProcessTypes(aSection);
	    }
	else if (aCommand==KCmdH264SetInputFormatCompr)
		{
		DoCmdH264SetInputFormatCompr(aSection);
		}
	else if (aCommand==KCmdH264SetOutputFormat)
		{
		DoCmdH264SetOutputFormat(aSection);
		}
	else if (aCommand==KCmdH264SetBufferOptions)
		{
		DoCmdH264SetBufferOptions(aSection);
		}
	else if (aCommand==KCmdH264ListFrameSize)
	    {
	    DoCmdH264ListFrameSize();
	    }
	else if (aCommand==KCmdH264SetVideoDestScreen)
	    {
	    DoCmdH264SetVideoDestScreen(aSection);
	    }
	else if (aCommand==KCmdH264SetWindowRect)
	    {
	    DoCmdH264SetWindowRect(aSection);
	    }
	else if (aCommand==KCmdH264Initialize)
		{
		DoCmdH264Initialize();
		}
	else if (aCommand==KCmdH264Start)
		{
		DoCmdH264Start(aSection);
		}
	else if (aCommand==KCmdH264IOFrameMatch)
		{
		DoCmdH264IOFrameNumMatch();
		}
	else if (aCommand==KCmdH264Stop)
		{
		DoCmdH264Stop();
		}
	else if (aCommand==KCmdH264GetHeaderInformation)
	    {
	    DoCmdH264GetHeaderInformation(aSection);
	    }
	else if (aCommand==KCmdH264FindCommonFormats)
	    {
	    DoCmdH264FindCommonFormats();
	    }
	else if (aCommand==KCmdH264EnableSynchronization)
	    {
	    DoCmdH264EnableSynchronization(aSection);
	    }
	else if (aCommand==KCmdH264SetScaleOptions)
	    {
	    DoCmdH264SetScaleOptions(aSection);
	    }
	else if (aCommand==KCmdH264SetRotateOptions)
	    {
	    DoCmdH264SetRotateOptions(aSection);
	    }
	else if (aCommand==KCmdH264SynchronizeDecoding)
	    {
	    DoCmdH264SynchronizeDecoding(aSection);
	    }
	else if (aCommand==KCmdH264Delete)
	    {
	    DoCmdH264Delete();
	    }
    else if (aCommand==KCmdH264Pause)
        {
        DoCmdH264Pause();
        }
    else if (aCommand==KCmdH264Resume)
        {
        DoCmdH264Resume();
        }
    else if (aCommand==KCmdH264SetPosition)
        {
        DoCmdH264SetPosition(aSection);
        }
	else if (aCommand==KCmdH264AbortDirectScreenAccess)
		{
		DoCmdH264AbortDirectScreenAccess();
		}
	else
		{
		ERR_PRINTF1(_L("Unknown command"));
		ret = EFalse;
		}
	return ret;
	}

/**
 * Constructs CMMFDevVideoPlay instance and initialize params.
 * @param	aSection	- The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdNewL(const TTEFSectionName& aSection)
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdNewL"));
	TBool dataOk = ETrue;
	DestroyData();	
	TRAPD(err, iDevvp = CMMFDevVideoPlay::NewL(*this));
	if ( err!=KErrNone)
		{
		ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdNewL failed with error %d"), err);
		SetError (err);
		dataOk = EFalse;
		}	
	if(dataOk)
		{
		TRAP(err, InitializeParamsL(aSection));	
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdNewL failed in InitializeParamsL. Error: %d"), err);
			SetError (err);
			}
		CreateFiles(aSection);	
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdNewL"));
	}  

/**
 * Open File session
 */ 
void CT_CMMFDevVideoPlay::CreateFiles(const TTEFSectionName& aSection)
	{     
	TPtrC inputPath;
	TPtrC outputPath;
	TPtrC inputfile;
	TPtrC outputfile;
	TBool screenout = EFalse;
	TInt error = KErrNone;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::CreateFiles"));
	
	if ( !(GetBoolFromConfig(aSection, KScreenout(), screenout)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KScreenout());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	if ( !(GetStringFromConfig(aSection, KInputfile(),inputfile)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KInputfile());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	if ( !screenout)
		{
		if ( !(GetStringFromConfig(aSection, KOutputfile(),outputfile)))
			{
			ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOutputfile());
			SetBlockResult(EFail);
			dataOk = EFalse;
			}
		} 
	if ( !(GetStringFromConfig(aSection, KInputPath(),inputPath)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KInputPath());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}			
	if(dataOk)
		{		
		error = iFs.Connect ();
		if ( error!=KErrNone)
			{
			ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdNewL failed with error %d"), error);
			SetError (error);
			}
		else
			{
			TFileName inFileName(inputPath);
			inFileName.Append (inputfile);
			//Open File
			if ( screenout)
				{
				TRAPD(err, OpenFileL(inFileName));
				if ( err != KErrNone)
					{
					ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdNewL failed with error %d"), err);
					SetError (err);
					}
				iFileOpen = ETrue;
				INFO_PRINTF1(_L("File Opened!"));
				}
			else
				{
				if ( ! (GetStringFromConfig(aSection, KOutputPath(),outputPath)))
					{
					ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOutputPath());
					SetBlockResult(EFail);
					}
				TFileName outFileName(outputPath);
				outFileName.Append (outputfile);
				TRAPD(err, OpenFileL(outFileName, inFileName));
				if ( err != KErrNone)
					{
					ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::OpenFileL failed with error %d"), err);
					SetError (err);
					}
				iFileOpen = ETrue;
				}
			}												
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::CreateFiles"));
	}

/**
 * Initilize Engine parameters 
 * @param	aSection	-	The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::InitializeParamsL(const TTEFSectionName& aSection)
	{
	TInt codec = 0;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::InitializeParamsL"));
	if ( !(GetEnumFromConfig(aSection, KCodec(), iCodecs, codec)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KCodec());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}	
	if ( !(GetBoolFromConfig(aSection, KScreenout(), iDirectScreenAccess)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KScreenout());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	
	if(dataOk)
		{
		iCodecType=(TVideoCodec)codec;
		if (iDirectScreenAccess)
			{
			User::LeaveIfError(FbsStartup());
			}
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::InitializeParamsL"));
	}

/**
 * Sets the clock source in case the sync parameter is true
 * @param	aSection	- The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdSetClockSource(const TTEFSectionName& aSection)
	{
	TInt framerate = 0;
	TInt synch = 0;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetClockSource"));	
	if ( !( GetIntFromConfig(aSection, KFramerate(), framerate)) )
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFramerate());
        SetBlockResult(EFail);
        dataOk = EFalse;
        }
	if ( !( GetIntFromConfig(aSection,KSynch(), synch)) )
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KSynch());
        SetBlockResult(EFail);
        dataOk = EFalse;
        }
	if(dataOk)
		{
		if (synch) //Set Clock and frame rate for syncronization    
	       	{    
	       	TRAPD(err, ListFrameSizeL(iCodecType));
	    	if ( err != KErrNone)
	    		{
	    		ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::ListFrameSizeL failed with error %d"), err);
	    		SetError (err);
	    		}
	    	else
	    		{
	    		INFO_PRINTF1(_L("List Frame done!"));    	
		       	iDevvp->SetClockSource(iClock);  
		        iSynchronized = ETrue;
		        iFrameTimeInterval = (TInt64)(1000000/framerate);
		        iFramerate = framerate;
	    		}	    	
	       	}
		}		
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetClockSource"));
	}

/**
 * Gets the decoders list and Select a Decoder
 * @param	aSection	-	Section to read from the ini file
 * @return none
 */
void CT_CMMFDevVideoPlay::DoCmdSelectDecoderL(const TTEFSectionName& aSection)
	{
	TInt decoder;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSelectDecoder"));
	if ( !(GetHexFromConfig(aSection, KDecoder(), decoder)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDecoder());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	if(dataOk)
		{
		iSelectDecoder=TUid::Uid(decoder);
		TRAPD(err, iDecHWDevId = iDevvp->SelectDecoderL(iSelectDecoder));
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("SelectDecoderL left with error: %d"), err);
			SetError(err);
			}
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSelectDecoder"));
	}

/**
 * Gets the postprocessores list and Select a PostProcessor
 * @param	aSection	-	Section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdSelectPostProcessorL(const TTEFSectionName& aSection)
	{
	TInt postPro;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSelectPostProcessor"));
	if ( !(GetHexFromConfig(aSection, KPostPro(), postPro)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDecoder());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	if(dataOk)
		{
		iSelectPostProcessor=TUid::Uid(postPro);
		TRAPD(err, iPostProcId = iDevvp->SelectPostProcessorL(iSelectPostProcessor));
		if (err != KErrNone)
			{
			ERR_PRINTF2(_L("SelectPostProcessorL left with error %d"), err);
	        SetError(err);
			}
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSelectPostProcessor"));
	}

/**
 * Sets the input format for the decoder and the postprocessor
 * @param	aSection	-	Section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdSetInputFormatL(const TTEFSectionName& aSection)
	{
	TBuf8<50> mimetype;
	TBool useDecoder = ETrue;
	TInt tVideoDataUnitType = EDuCodedPicture;
	TInt tVideoDataUnitEncapsulation = EDuElementaryStream;
	TBool dataInOrder=ETrue;	
	TPtrC mimeType;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetInputFormat"));
	if(!GetStringFromConfig(aSection, KMimeType(), mimeType))
		{
		ERR_PRINTF1(_L("Mime type not retrieved, command will not be executed"));
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	if ( !(GetBoolFromConfig(aSection, KUseDecoder(), useDecoder)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KUseDecoder());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
		
	if( !(GetBoolFromConfig(aSection, KDataInOrder(), dataInOrder)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file, using default value"),&KDataInOrder());
		}			
	if(! (GetEnumFromConfig(aSection, KTVideoDataUnitType(), iTVideoDataUnitType,tVideoDataUnitType)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file, using default value"),&KTVideoDataUnitType());
		}
	if( !(GetEnumFromConfig(aSection, KTVideoDataUnitEncapsulation(), iTVideoDataUnitEncapsulation,tVideoDataUnitEncapsulation)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file, using default value"),&KTVideoDataUnitEncapsulation());
		}	
	if(dataOk)
		{
		mimetype.Append(mimeType);
		if ( useDecoder) //Decoder
			{
			CCompressedVideoFormat* compressedFormat=NULL;
			TRAPD(error, compressedFormat = CCompressedVideoFormat::NewL (mimetype));
			if (error != KErrNone)
				{
				ERR_PRINTF2(_L("Error in CCompressedVideoFormat::NewL: %d"), error);
				SetError (error);
				}
			else
				{
				CleanupStack::PushL (compressedFormat);
				TRAP(error,
						iDevvp->SetInputFormatL(iDecHWDevId, *compressedFormat, 
									(TVideoDataUnitType)tVideoDataUnitType, 
									(TVideoDataUnitEncapsulation)tVideoDataUnitEncapsulation,
									dataInOrder));
				CleanupStack::PopAndDestroy (compressedFormat);
				if ( error != KErrNone)
					{
					ERR_PRINTF2(_L("Error in SetInputFormatL for decoder: %d"), error);
					SetError (error);
					}
				else
					{
					INFO_PRINTF1(_L("SetInputFormatL done!"));			
					}
				}
			
			}
		else // PostProcessor
			{
			TRAPD(err, iDevvp->SetInputFormatL(iPostProcId, iCommonFormat));
			if ( err != KErrNone)
				{
				ERR_PRINTF2(_L("Error in SetInputFormatL for PostProcessor: %d"), err);
				SetError (err);
				}
			}
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetInputFormat"));
	}

/**
 * Gets the output format list from the decoder and the postprocessor
 * @param	aSection	-	The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdGetOutputFormatListL(const TTEFSectionName& aSection)
	{
	TBool useDecoder = ETrue; //ETrue - Decoder , EFalse - PostProcessor
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdGetOutputFormatListL"));
	if ( !(GetBoolFromConfig(aSection, KUseDecoder(), useDecoder)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KUseDecoder());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	if(dataOk)
		{
		if ( useDecoder) //Decoder
			{
			TRAPD(err, iDevvp->GetOutputFormatListL(iDecHWDevId, iDecFormats));
			if ( err != KErrNone)
				{
				ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdGetOutputFormatListL failed with error %d"), err);
				SetError (err);
				}
			}
		else //PostProcessor
			{
			TRAPD(err1, iDevvp->GetOutputFormatListL(iPostProcId, iPPFormats));
			if ( err1 != KErrNone)
				{
				ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdGetOutputFormatListL left with error %d"), err1);
				SetError (err1);
				}
			}
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdGetOutputFormatListL"));
	}

/**
 * Gets the postprocessor info.
 */
void CT_CMMFDevVideoPlay::DoCmdPostProcessorInfoLC()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdPostProcessorInfo"));
	delete iInfo;
	iInfo=NULL;
	TRAPD(err, {iInfo = iDevvp->PostProcessorInfoLC(iSelectPostProcessor); CleanupStack::Pop(iInfo);} );
	if ( err!=KErrNone )
		{
		ERR_PRINTF2(_L("PostProcessorInfoLC failed with error %i"),err);
		}
	else
		{
		iPPFormats = iInfo->SupportedFormats();
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdPostProcessorInfo"));
	}

/**
 * Find common format for dec output and postproc input. 
 * Precondition: The command GetOutputList has to be called before, for the Decoder and the postprocessor,
 * because in this method we use both list to find the common format.
 */
void CT_CMMFDevVideoPlay::DoCmdFindCommonFormat()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdFindCommonFormat"));
	if ( iDevvp->FindCommonFormat (iDecFormats.Array (), iPPFormats.Array (), iCommonFormat) )
		{
		INFO_PRINTF1(_L("DoCmdFindCommonFormat found common Format!"));
		}
	else
		{
		iCommonFormat = iDecFormats[0];
		ERR_PRINTF1(_L("Error in CT_CMMFDevVideoPlay::DoCmdFindCommonFormat: Common Format not found."));
		SetBlockResult(EFail);
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdFindCommonFormat"));
	}

/**
 * Sets the output format for both the decoder and the postprocessor.
 * @param	aSection	-	The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdSetOutputFormatL(const TTEFSectionName& aSection)
	{
	TBool useDecoder = ETrue;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetOutputFormat"));
	if ( !(GetBoolFromConfig(aSection, KUseDecoder(), useDecoder)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KUseDecoder());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}
	if(dataOk)
		{
		if ( useDecoder)
			{ //Decoder			
			TRAPD(error, iDevvp->SetOutputFormatL (iDecHWDevId, iCommonFormat));
			if(error != KErrNone)
				{
				ERR_PRINTF2(_L("SetOutputFormatL left with error %d"), error);
				SetError(error);
				}
			}
		else
			{ //PostProcessor
			if ( iDirectScreenAccess)
				{
				//Set Output Fomat
				TUncompressedVideoFormat outFormat;
				outFormat.iDataFormat = ERgbRawData;
				outFormat.iRgbFormat = ERgb32bit888; //RGB format for display         
				TRAPD(error, iDevvp->SetOutputFormatL (iPostProcId, outFormat));
				if(error != KErrNone)
					{
					ERR_PRINTF2(_L("SetOutputFormatL left with error %d"), error);
					SetError(error);
					}

				}
			else // Memory buffer output
				{
				TRAPD(error, iDevvp->SetOutputFormatL (iPostProcId, iCommonFormat));
				if(error != KErrNone)
					{
					ERR_PRINTF2(_L("SetOutputFormatL left with error %d"), error);
					SetError(error);
					}
				}
			}
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetOutputFormat"));
	}


/**
 * Gets the header information.
 * @param	aSection	-	The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdGetHeaderInformationL(const TTEFSectionName& aSection)
	{
	TInt bufSize = 0;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdGetHeaderInformationL"));
	if ( !(GetIntFromConfig(aSection, KBuf(), bufSize)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KBuf());
		SetBlockResult(EFail);
		dataOk = EFalse;
		}		
	if(dataOk)
		{
		INFO_PRINTF1(_L("GetHeaderInformationL init..!"));
		TInt err = KErrNone;
		iHeaderInfo = NULL;
		HBufC8* tempBuff=  NULL;
		//Read Picture header : Size is not known
		TVideoInputBuffer* codedBuffer = new(ELeave) TVideoInputBuffer;
		CleanupStack::PushL ( codedBuffer);
		if ( iFrameListed) //frame size known 
			{
			tempBuff = HBufC8::NewLC(iInBuffSize);
			codedBuffer->iData.Set (tempBuff->Des ());
			if(iFrameSizeList.Count() > 0)
				{
				err = ReadOneCodedPicture (codedBuffer, iFrameSizeList[0]);
				}
			else
				{
				err = KErrGeneral;
				}
			
			TInt pos =0;
			if ( iInFile.Seek (ESeekStart, pos))
				{
				err = KErrGeneral;
				}
			if ( err < 0)
				{
				CleanupStack::PopAndDestroy (tempBuff);
				}
			}
		else //frame size not known 
			{
			iInBuffSize = KH263MaxCodedSizeQCIF;
			err = KErrOverflow;
			while ( (err == KErrOverflow) && (iInBuffSize <= KMP4MaxCodedSizeVGA))
				{
				tempBuff = HBufC8::NewLC(iInBuffSize);
				codedBuffer->iData.Set (tempBuff->Des ());
				err = ReadOneCodedPicture (codedBuffer);
				TInt pos =0;
				if ( iInFile.Seek (ESeekStart, pos))
					{
					err = KErrGeneral;
					}
				if ( iInputEnd)
					{
					err = KErrNotFound;
					}
				if ( err < 0)
					{
					CleanupStack::PopAndDestroy (tempBuff);
					iInBuffSize = 4*iInBuffSize;
					}
				}
			}
		// Reitrieve header information from bitstream 
		if ( err < 0)
			{
			CleanupStack::PopAndDestroy (codedBuffer);
			}
		else
			{
			TRAPD(error, iHeaderInfo = iDevvp->GetHeaderInformationL(EDuCodedPicture, EDuElementaryStream,codedBuffer));
			CleanupStack::PopAndDestroy (tempBuff);
			CleanupStack::PopAndDestroy (codedBuffer);		
			if ( error != KErrNone)
				{
				ERR_PRINTF2(_L("Error in DoCmdGetHeaderInformationL: %d"), error);
				SetError(error);				
				}
			else
				{
				//Check Header info 
				if ( iHeaderInfo)
					{
					//Size in Memory
					iPictureSize = iHeaderInfo->iDisplayedRect.Size ();
					// Display rect  
					TSize dispsize = iHeaderInfo->iDisplayedRect.Size ();
					iDispRect.SetSize (dispsize);
					INFO_PRINTF3(_L("Size from Header, Height: %d Width: %d"),dispsize.iHeight,
							dispsize.iWidth);
					INFO_PRINTF3(_L("Size from iPictureSize, Height: %d Width: %d"),iPictureSize.iHeight,
							iPictureSize.iWidth);
					}
				// Set size of decoder input buffer
				if ( !iFrameListed)
					{
					iInBuffSize = bufSize;
					}
				}				
			}
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdGetHeaderInformationL"));
	}

/**
 * Returns  the HeaderInformation of the video
 */
void CT_CMMFDevVideoPlay::DoCmdReturnHeader()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdReturnHeader"));
	if (iHeaderInfo)
		{
		iDevvp->ReturnHeader(iHeaderInfo);
		}
	else
		{
		ERR_PRINTF1(_L("Error in DoCmdReturnHeader!"));
  		SetBlockResult(EFail);
		}
		INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdReturnHeader"));
	}

/**
 * Sets output on screen or memory buffer
 */
void CT_CMMFDevVideoPlay::DoCmdSetVideoDestScreenL()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetVideoDestScreenL"));
	TRAPD(err, iDevvp->SetVideoDestScreenL(iDirectScreenAccess));
	if (err != KErrNone)
  		{
  		ERR_PRINTF2(_L("Error in DoCmdSetVideoDestScreenL: %d"), err);
  		SetError(err);
  		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetVideoDestScreenL"));
	}
    
/**
 * Gets the buffer options.
 */
void CT_CMMFDevVideoPlay::DoCmdGetBufferOptions()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdGetBufferOptions"));
	iDevvp->GetBufferOptions(iBufferOptions);	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdGetBufferOptions"));
	}

/**
 * Sets the buffer options for the DevVideoPlay
 */
void CT_CMMFDevVideoPlay::DoCmdSetBufferOptionsL()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetBufferOptionsL"));
	iBufferOptions.iMaxInputBufferSize = iInBuffSize;
	//iBufferOptions.iMaxPostDecodeBufferSize = 0;	
	iBufferOptions.iPreDecodeBufferSize = 0;
	iBufferOptions.iMinNumInputBuffers = KNumOfInputBuffers;
	TRAPD(err, iDevvp->SetBufferOptionsL(iBufferOptions));
	if ( err != KErrNone)
		{
		ERR_PRINTF2(_L("Error in DoCmdSetBufferOptionsL: %d"), err);
		SetError (err);
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetBufferOptionsL"));
	}

/**
 * Sets the options for the postprocessor
 */
void CT_CMMFDevVideoPlay::DoCmdSetPostProcessTypesL(const TTEFSectionName& aSection)
	{
	TInt combination = 0;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetPostProcessTypesL"));
	if ( ! (GetHexFromConfig(aSection, KCombination(), combination)) )
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KCombination());
        SetBlockResult(EFail);
        dataOk = EFalse;
        }
	if(dataOk)
		{
		TRAPD(err,iDevvp->SetPostProcessTypesL(iPostProcId, combination));
		if( err!=KErrNone )
			{
			ERR_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdSetPostProcessTypesL left with error %d"), err);
			SetError(err);		
			} 
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetPostProcessTypesL"));
	}

/**
 * Initialize the decoder with the specified parameters.
 * @return - KErrNone if no error
 */ 
void CT_CMMFDevVideoPlay::DoCmdInitialize(const TInt aAsyncErrorIndex)
    {  
    INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdInitialize"));
    iAsyncErrorIndex = aAsyncErrorIndex;    
    iDevvp->Initialize();
    IncOutstanding();	
    INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdInitialize"));
    }

/**
 * Starts video decoding directly to the display frame buffer using Direct Screen Access. Playback to the display can start immediately.
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::DoCmdStart(const TInt aAsyncErrorIndex)
    {
    INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdStart"));
    iAsyncErrorIndex = aAsyncErrorIndex;
    // Start DevVideoPlay
    INFO_PRINTF1(_L("Start Decoding Engine.."));
   	iDevvp->Start();    	
   	//Reset Clock at Stream Start
   	if ( iSynchronized ) 
   	    { 	
   	    TTimeIntervalMicroSeconds offset(KStartOffset);
   	    iClock->Reset(offset);  
   	    }
   	INFO_PRINTF1(_L("Start Data transfer."));
   	TRAPD(err, HandleNewBufferL()); 
   	if (err != KErrNone)
   	    {
   	    ERR_PRINTF2(_L("HandleNewBufferL()left with error %d"),err);
   	    SetError(err);
   	    }
   	else
   	   {
   	    if(!iErrorInputBuffer)
   	    	{
   	    	IncOutstanding();
   		    INFO_PRINTF1(_L("Start..done!"));     
   		    INFO_PRINTF2(_L("iFrameSizeList.Count %d"),iFrameSizeList.Count());  
   	    	} 	       
   	   }         	   
    INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdStart"));
    }

/**
 * Stops the playback
 * @param	aSection	-	The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdStartDirectScreenAccessL(const TTEFSectionName& aSection)
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdStartDirectScreenAccessL"));	
	if ( !iScreenDevice)
		{
		delete iScreenDevice;
		iScreenDevice = NULL;
		RFbsSession::Disconnect();
		TDisplayMode displayMode; //0 - Decoder , 1 - PostProcessor
		TInt value = 0;
		if ( !(GetEnumFromConfig(aSection, KDisplayMode(), iDisplayModes, value)))
			{
			ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDisplayMode());
			SetBlockResult(EFail);
			}
		displayMode = (TDisplayMode)value;
		User::LeaveIfError (RFbsSession::Connect());
		
		TRAPD(error, iScreenDevice = CFbsScreenDevice::NewL (KScreenNumber, displayMode));
		if(error != KErrNone)
			{
			ERR_PRINTF2(_L("Error creating screen device"),error);
			SetError(error);
			}
		}
	
	if ( iDispRect.iBr.iY > KQVGAHeight)
		{
		iDispRect.iTl.iY = 0;
		iDispRect.SetHeight (KQVGAHeight);
		}
	if ( iDispRect.iBr.iX > KQVGAWidth)
		{
		iDispRect.iTl.iX = 0;
		iDispRect.SetWidth (KQVGAWidth);
		}
	
	TRegionFix<1> region(iDispRect);
	//Start DSA

	INFO_PRINTF2(_L("Size window Y: %d"),iDispRect.Height());
	INFO_PRINTF2(_L("Size window X: %d"),iDispRect.Width());

	TRAPD(error,iDevvp->StartDirectScreenAccessL(iDispRect, *iScreenDevice, region));
	if ( error != KErrNone)
		{
		ERR_PRINTF2(_L("StartDirectScreenAccessL error: %d"),error);
		SetError(error);
		}
	else
		{
		iDsaStarted = ETrue;
		}
	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdStartDirectScreenAccessL"));
	}

/** 
 * Stop Devvideoplay 
 */
void CT_CMMFDevVideoPlay::DoCmdStop()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdStop"));
	iDevvp->Stop ();
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdStop"));
	}

/**
 * Aborts Direct Screen Access completely
 * @return None
 */
void CT_CMMFDevVideoPlay::DoCmdAbortDirectScreenAccess()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdAbortDirectScreenAccess"));
	if ( iDirectScreenAccess && iDsaStarted)
		{
		iDevvp->AbortDirectScreenAccess ();
		INFO_PRINTF1(_L("Abort Direct Screen Access Done"));
		iDsaStarted = EFalse;
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdAbortDirectScreenAccess"));
	}

/**
 * Pause the decoding process
 */
void CT_CMMFDevVideoPlay::DoCmdPause()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdPause"));
	if ( iSynchronized)
		{
		iClock->Suspend (); //Stop Clock source
		}
	iDevvp->Pause();
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdPause"));
	}

/**
 * Resume the decodind process
 */
void CT_CMMFDevVideoPlay::DoCmdResume()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdResume"));
	if ( iSynchronized)
		{
		iClock->Resume (); //Restart Clock source
		}
	iDevvp->Resume ();	
	if ( iDecHWDevId)
		{		
		if ( iDevvp->NumFreeBuffers () > 0 )
			{
			INFO_PRINTF1(_L("Restart data transfer."));
	    	TRAPD(err1, HandleNewBufferL()); 
	        if (err1 != KErrNone)
	        	{
	        	ERR_PRINTF2(_L("HandleNewBufferL()left with error %d"),err1);
	        	SetError(err1);
	        	return;
	        	}
			}
		}

	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdResume"));
	}

/**
 * Rotating the display
 * @param	aSection	-	The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdSetRotateOptionsL(const TTEFSectionName& aSection)
	{
	TRotationType rotation;
	TInt rotItem;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetRotateOptionsL"));
	if ( !( GetEnumFromConfig(aSection, KRotation(), iRotations, rotItem)))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRotation());
        SetBlockResult(EFail);
        dataOk = EFalse;
		}
	if(dataOk)
		{
		rotation = (TRotationType)rotItem;		
		TRAPD(error,iDevvp->SetRotateOptionsL(iPostProcId, rotation));
		if ( error != KErrNone)
			{
			ERR_PRINTF2(_L("DoCmdSetRotateOptionsL! Error = %d"),error);
			SetError (error);
			}
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetRotateOptionsL"));
	}

/**
 * Setting the screen options
 * @param	aSection	-	The section to read from the ini file
 * @return	none
 */
void CT_CMMFDevVideoPlay::DoCmdSetScaleOptionsL(const TTEFSectionName& aSection)
    {
	TInt width;
	TInt height;
  	TInt x,y;
  	TBool antiAliasFiltering = ETrue;
  	TBool dataOk = ETrue;
  	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetScaleOptionsL"));
	if ( !(GetIntFromConfig(aSection, Kx(), x)) )
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &Kx());
        SetBlockResult(EFail);
        dataOk = EFalse;
        }
	if ( !(GetIntFromConfig(aSection, Ky(), y)) )
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &Ky());
        SetBlockResult(EFail);
        dataOk = EFalse;
        } 
	if ( !(GetIntFromConfig(aSection, KWidth(), width)) )
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KWidth());
        SetBlockResult(EFail);
        dataOk = EFalse;
        }
	if ( !(GetIntFromConfig(aSection, KHeight(), height)) )
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHeight());
        SetBlockResult(EFail);
        dataOk = EFalse;
        }	
	GetBoolFromConfig(aSection, KAntiAliasFiltering(),antiAliasFiltering);
 	if(dataOk)
 		{
 		TSize size(width, height);	  
 		TRAPD(error, SetWindowRect(x, y,size));
 		if ( error != KErrNone)
 			{
 			ERR_PRINTF2(_L("SetWindowRect! left with Error = %d"),error);
 			SetBlockResult (EFail);
 			}

 		TRAP(error, iDevvp->SetScaleOptionsL(iPostProcId, size, antiAliasFiltering));
 		if ( error != KErrNone)
 			{
 			ERR_PRINTF2(_L("SetScaleOptionsL! left with Error = %d"),error);
 			SetError (error);
 			}
 		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetScaleOptionsL"));
    }

/**
 * Sets the new position for playback and decoding. It is use for forward and backward
 */
void CT_CMMFDevVideoPlay::DoCmdSetPosition(const TTEFSectionName& aSection)
	{
	TInt pos;
	Int64 time = 0;
	TBool dataOk = ETrue;
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdSetPosition"));
	if ( !(GetIntFromConfig(aSection, KPos(), pos)) ) //This parameter indicates seconds to move forward/backward from the current position
		{
	    ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPos());
	    SetBlockResult(EFail);
	    dataOk = EFalse;
		}
	if(dataOk)
		{
		pos = pos*iFramerate;	
		INFO_PRINTF2(_L("pos %i"),pos);
		if((pos > iFrameSizeList.Count()) || ((pos+iSentBuffCount) < 0))
			{
			ERR_PRINTF2(_L("Invalid value, check %S from INI file"), &KPos());
			//SetBlockResult(EFail);
			}
		else
			{
			iSentBuffCount +=pos;
			TTimeIntervalMicroSeconds timeStamp;	
			if ( iSynchronized )
				{
				timeStamp = (TTimeIntervalMicroSeconds)(iSentBuffCount*iFrameTimeInterval);
				time = timeStamp.Int64();
				iClock->Reset(timeStamp);  
				iTimeStamp = time; 		 
				}
			else
				{
				timeStamp = (TTimeIntervalMicroSeconds)(iSentBuffCount);    
				}
			 
			iDevvp->SetPosition(timeStamp);
			 
			TInt temp=0;
			for(TInt i=0; i < iSentBuffCount; i++)
				{
				temp += iFrameSizeList[i];
				}			 
			TInt error = KErrNone;
			error = iInFile.Seek(ESeekStart,temp);
			if (error != KErrNone)
				{
				ERR_PRINTF2(_L("Error Seeking in file, check ini for parameter POS: %d"),error);
				SetBlockResult(EFail);
				}
			}		
		}	
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdSetPosition"));
	}

/**
 * Utility command to get the initial parameters
 */
void CT_CMMFDevVideoPlay::DoCmdUtilityGetEnvironmentL()
	{	
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::DoCmdUtilityGetEnvironmentL"));
			
	CPostProcessorInfo *infoPost = NULL;
	RArray< TUid > postProcessors;
	iDevvp->GetPostProcessorListL(postProcessors);
	for(TInt i = 0; i< postProcessors.Count(); i++)
		{
		INFO_PRINTF3(_L("PostProcessors %d = 0x%x"),i,postProcessors[i]);
		TRAPD(err,infoPost = iDevvp->PostProcessorInfoLC(postProcessors[i]);CleanupStack::Pop(infoPost));
		if(err != KErrNone)
			{
			ERR_PRINTF1(_L("Error in getting Devvp->PostProcessorInfoLC(postProcessors[i])"));
			}
		else
			{
			TBool supported = infoPost->SupportsDirectDisplay();
			if (supported)
				{
				INFO_PRINTF1(_L("Direct Display Supported"));
				}
			else
				{
				INFO_PRINTF1(_L("Direct Display Not Supported"));
				}	
			const RArray<TUint32> combinations = infoPost->SupportedCombinations();	  
			for (i = 0; i < combinations.Count(); i++)
				{
				INFO_PRINTF2(_L("Supported Combination : %d"),combinations[i]);
				}
			TUint32 test = 0x3040;	
			if (infoPost->SupportsCombination(test))
				{
				INFO_PRINTF2(_L("Combination %x is Supported"),test);
				}
			else
				{
				INFO_PRINTF2(_L("Combination %x is NOT Supported"),test);
				}
			test = 0x40;//play	
			if (infoPost->SupportsCombination(test))
				{
				INFO_PRINTF2(_L("Combination %x is Supported"),test);
				}
			else
				{
				INFO_PRINTF2(_L("Combination %x is NOT Supported"),test);
				}
			test = 0x44;//rotation
			if (infoPost->SupportsCombination(test))
				{
				INFO_PRINTF2(_L("Combination %x is Supported"),test);
				}
			else
				{
				INFO_PRINTF2(_L("Combination %x is NOT Supported"),test);
				}
			test = 0x48;//scale
			if (infoPost->SupportsCombination(test))
				{
				INFO_PRINTF2(_L("Combination %x is Supported"),test);
				}
			else
				{
				INFO_PRINTF2(_L("Combination %x is NOT Supported"),test);
				}
			TUint32 rotations = infoPost->SupportedRotations();
			if (rotations == 0)
				{
				INFO_PRINTF1(_L("Rotation is Not Supported"));
				}
			else
				{
				INFO_PRINTF2(_L("Supported rotation : %d"),rotations);
				}
			supported = infoPost->SupportsArbitraryScaling();
			if (supported)
				{
				INFO_PRINTF1(_L("Arbitrary Scaling is Supported"));
				}
			else
				{
				RArray<TScaleFactor> scaleFactors = infoPost->SupportedScaleFactors();
				TScaleFactor factor;
				for (i = 0; i < scaleFactors.Count(); i++)
					{
					factor = scaleFactors[i];
					INFO_PRINTF3(_L("Scale factor: scale num - %d scale denom - %d"),factor.iScaleNum,factor.iScaleDenom);
					}		
				}
			}
		
		}
	
  			
	RArray<TUid> decoders;
	iDevvp->GetDecoderListL(decoders);
	CVideoDecoderInfo *infDec =NULL;
	INFO_PRINTF1(_L("INFORMATION ABOUT DECODERS:"));
	for(TInt i = 0; i< decoders.Count(); i++)
		{		
		TRAPD(err, infDec = iDevvp->VideoDecoderInfoLC(decoders[i]);CleanupStack::Pop(infDec));		
		if(err != KErrNone )
			{
			 ERR_PRINTF1(_L("Error in iDevvp->VideoDecoderInfoLC(decoders[i])"));
			}
		else
			{
			INFO_PRINTF6(_L("\nDecoder =0x%x\n Identifier = %S\n Accelerated = %i\n Supports Direct Display: %i\n Manufacturer%S"), 
					decoders[i].iUid,
					&infDec->Identifier(),
					infDec->Accelerated(),
					infDec->SupportsDirectDisplay(),
					&infDec->Manufacturer());				
			INFO_PRINTF1(_L("SUPPORTED FORMATS:"));
			TBuf<255> mime;
			const RPointerArray<CCompressedVideoFormat>& outputFormats =infDec->SupportedFormats();
			for (TInt j = 0; j < outputFormats.Count(); j++)
				{
				mime.Copy(outputFormats[j]->MimeType());		
				INFO_PRINTF3(_L("Supported type %d MIMETYPE: %S"),j,&mime);					
				}	
			INFO_PRINTF1(_L("\n\n"));	
			}						
		}
		    
	TInt colors = 0;
	HAL::Get(HALData::EDisplayColors, colors);
	INFO_PRINTF2(_L("Display colors : %d"),colors);
	INFO_PRINTF1(_L("Display mode!"));
	switch(colors)
		{
		case 0:
	 		INFO_PRINTF1(_L("None"));
	 	break;		
		case 16777216:
			INFO_PRINTF1(_L("EColor16MU"));
		break;
		case 65536:
			INFO_PRINTF1(_L("EColor64K"));
		break;
		case 4096:
			INFO_PRINTF1(_L("EColor4K"));
		break;
		default:
			INFO_PRINTF1(_L("Default mode EColor4K"));
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::DoCmdUtilityGetEnvironmentL"));
	}

/**
 * Sets the original window for display
 */
void CT_CMMFDevVideoPlay::SetWindowRect(TInt aX, TInt aY, TSize aSize)
    {
    INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::SetWindowRect"));
    iDispRect.SetRect(TPoint(aX,aY),aSize);
    INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::SetWindowRect"));
    }

/**
 * Read one coded picture into decoder input buffer
 * 
 * @param aCodedInBuffer
 * 
 * @return err
 */
TInt CT_CMMFDevVideoPlay::ReadOneCodedPicture(TVideoInputBuffer* aCodedInBuffer)
	{
	TInt buffLength = iInBuffSize;
	TBool found = EFalse;
	TInt pos =0;
	TUint8* testData= NULL;
	TInt err = KErrNone;	
	if ( aCodedInBuffer->iData.MaxLength ()< buffLength)
		{
		err = KErrOverflow;
		return err;
		}
	aCodedInBuffer->iData.SetLength (0);
	//Read data from Input File  
	err = iInFile.Read (aCodedInBuffer->iData, buffLength);
	if ( err != KErrNone)
		{
		return err;
		}
	//Buffer is not full,  reset size of buffer   
	if ( aCodedInBuffer->iData.Length ()< buffLength)
		{
		buffLength = aCodedInBuffer->iData.Length ();
		}
	testData = const_cast<TUint8*>(aCodedInBuffer->iData.Ptr());
	//Check the length of one coded picture
	if ( (iCodecType == EH263) || ((testData[0] == 0x00) && (testData[1] == 0x00) & ((testData[2] & 0xFC) == 0x80)))
		{
		if ( (aCodedInBuffer->iData.Length() > 0))
			{
			pos = KScLength; //skip first 3 byte (PSC)   
			// Find next PSC
			while ( pos < (buffLength - KScLength) && !found)
				{
				if ( (testData[pos+1] == 0x00) && (testData[pos+2] == 0x00) & ((testData[pos+3] & 0xFC) == 0x80))
					{
					found = ETrue;
					}
				pos++;
				}
			}
		else
			{
			iInputEnd = ETrue;
			return err;
			}
		}
	else
		if ( iCodecType == EMPEG4)
			{
			if ( (aCodedInBuffer->iData.Length() > 0))
				{
				// Check if start code of Visual Object Sequence              
				pos = 0;
				while ( pos < (buffLength - KScLength) && !found)
					{ // Find 1st VOP start code in the buffer              
					if ( (testData[pos] == 0x00) && (testData[pos+1] == 0x00)&& (testData[pos+2] == 0x01) && (testData[pos+3] == 0xB6))
						{
						while (pos < (buffLength - KScLength-1) && !found)
							{
							pos++;
							// Find 2nd start code in the buffer >> End of a Picture
							if ( (testData[pos+1] == 0x00) && (testData[pos+2] == 0x00)&& (testData[pos+3] == 0x01) && (testData[pos+4] != 0xB1))
								{
								found = ETrue;
								}
							}
						}
					pos++;
					}
				}
			else
				{
				iInputEnd = ETrue;
				return err;
				}
			}
		else
			{
			err = KErrNotSupported;
			}
	// Start and End of a picure are found 
	if ( found)
		{
		//Set Size to length of the header + one picure, and reset position to be read next time
		aCodedInBuffer->iData.SetLength (pos);
		TInt tempLength = pos - buffLength;
		err = iInFile.Seek (ESeekCurrent, tempLength);
		}
	// All data in Buffer are checked and end of data not found 
	else
		{
		if ( pos >= (iInBuffSize-3))
			{
			err = KErrOverflow;
			}
		}
	if ( err == KErrNone)
		{
		err = pos;
		}	
	return err;	
	}          
    
/**
 * Read one coded picture into decoder input buffer, frame size is known 
 * 
 * @param aCodedInBuffer
 * @param aSize				- frame size
 * @return err				- The error
 */
TInt CT_CMMFDevVideoPlay::ReadOneCodedPicture(TVideoInputBuffer* aCodedInBuffer, TInt aSize)
    {
    TInt err = KErrNone;        
    if(aCodedInBuffer !=NULL)
    	{
    	err = iInFile.Read(aCodedInBuffer->iData, aSize);                
    	}
    else
    	{
    	INFO_PRINTF1(_L("aCodedInBuffer is NULL"));
    	err = KErrNotFound;
    	}
    if (aSize == 0)
    	{
    	iInputEnd = ETrue;
    	}
    return err;
    }


/**
 * Notifies the client that one or more new empty input buffers are available
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoNewBuffers()
    {
	TRAPD(err, HandleNewBufferL()); 
	if (err != KErrNone)
		{
		ERR_PRINTF2(_L("HandleNewBufferL()left with error %d"),err);
		SetBlockResult(EFail);    	
		}
    }

/**
 * Returns a used input video picture back to the caller. The picture memory can be re-used or freed. 
 * 
 * @param aPicture	the picture to return
 */
void CT_CMMFDevVideoPlay::MdvpoReturnPicture(TVideoPicture* aPicture)
    {   
    if ( iRawInBuffer == aPicture )
        {        
    	TRAPD(err1, HandleNewBufferL()); 
        if (err1 != KErrNone)
        	{
        	ERR_PRINTF2(_L("HandleNewBufferL()left with error %d"),err1);
        	SetBlockResult(EFail);
        	}
        }    
    }

/**
 * Delivers supplemental information from a coded data unit.
 * 
 * @param aData			The supplemental data. The reference is only valid until the method returns, and thus the data must be processed or copied immediately
 * @param aTimestamp	The presentation timestamp for the picture that the supplemental data is part of
 * @param aPictureId	Picture identifier for the picture. If a picture ID is not available, aPictureId.iIdType is set to ENone
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoSupplementalInformation(const TDesC8& /*aData*/, const TTimeIntervalMicroSeconds& /*aTimestamp*/, const TPictureId& /*aPictureId*/)
    {	  
    }

/**
 * Back channel information from the decoder, indicating a picture loss without specifying the lost picture.
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoPictureLoss()
    {
    iPictureLoss++;      
    }

/**
 * Back channel information from the decoder, indicating a picture loss without specifying the lost picture.
 * 
 * @param aPictures	Picture identifiers for the lost pictures.
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoPictureLoss(const TArray<TPictureId>& aPictures)
    {         
    iPictureLoss += aPictures.Count();     
    }

/**
 * Back channel information from the decoder, indicating the loss of consecutive macroblocks in raster scan order.
 * 
 * @param aFirstMacroblock	The first lost macroblock
 * @param aNumMacroblocks	The number of lost macroblocks that are consecutive in raster-scan order
 * @param aPicture			The picture identifier for the picture where the macroblocks were lost
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoSliceLoss(TUint /*aFirstMacroblock*/, TUint /*aNumMacroblocks*/, const TPictureId& /*aPicture*/)
    {  
    }

/**
 * Back channel information from the decoder, indicating a reference picture selection request. 
 * 
 * @param aSelectionData	The	reference picture selection request message. 
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoReferencePictureSelection(const TDesC8& /*aSelectionData*/)
    {
    }

/**
 * Called when a timed snapshot request has been completed. When this method is called, the snapshot has been taken, and the memory reserved for the picture can be re-used or freed. 
 * 
 * @param aError					An error code, KErrNone if no errors occurred.
 * @param aPictureData				The snapshot picture data
 * @param aPresentationTimestamp	The presentation timestamp for the snapshot picture
 * @param aPictureId				Picture identifier for the picture. If a picture ID is not available, aPictureId.iIdType is set to ENone
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoTimedSnapshotComplete(TInt aError, TPictureData* /*aPictureData*/, 
														const TTimeIntervalMicroSeconds& /*aPresentationTimestamp*/,
														const TPictureId& /*aPictureId*/)
    {
    if(aError!= KErrNone)
    	{
    	INFO_PRINTF2(_L("An error has ocurred: %i in CT_CMMFDevVideoPlay::MdvpoTimedSnapshotComplete"),aError);
    	}    
    }    

/**
 * Notifies the client that one or more new output pictures are available. 
 * 
 * @return None
 */    
void CT_CMMFDevVideoPlay::MdvpoNewPictures()
    {    
    GetReturnedPicture();
    }

/**
 * Reports a fatal decoding or playback error to the client.
 * 
 * @param aError	The error code
 * 
 * @return None
 */       
void CT_CMMFDevVideoPlay::MdvpoFatalError(TInt aError)
    {
    INFO_PRINTF1(_L("MdvpoFatalError DecOutstanding"));
    DecOutstanding();
    ERR_PRINTF2(_L("A Fatal error has ocurred: %i"),aError);
    HandleRuntimeError(aError);  
    }

/**
 * Reports that DevVideoPlay initialization has completed. The interface can now be used for video playback. 
 * 
 * @param aError	Initialization error code, KErrNone if no error occurred
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoInitComplete(TInt aError)
	{

	if ( aError == KErrNone)
		{
		INFO_PRINTF1(_L("MdvpoInitComplete OK"));
		//Initilize parameters for Decoding/Playback
		iCodedInBuffer = NULL;
		iOutBuffer =NULL;
		iSentBuffCount = 0;
		iReturnedBuffCount = 0;
		iPictureLoss =0;
		iInputEnd = EFalse;
		iStreamEnd = EFalse;
		iTimeStamp = 0;
		}
	else
		{		
		ERR_PRINTF2(_L("MdvpoInitComplete Error %d"), aError);
		SetAsyncError (iAsyncErrorIndex, aError);
		}
	INFO_PRINTF1(_L("MdvpoInitComplete DecOutstanding"));	
	DecOutstanding ();
	}

/**
 * Reports that the input video stream end has been reached and all pictures have been processed.
 * This method is only called after the client has called InputEnd(). No more output pictures will be available.
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::MdvpoStreamEnd()
    {
	iStreamEnd = ETrue;     
    INFO_PRINTF1(_L("Stream End!"));
    INFO_PRINTF2(_L("iSentBuffCount: %d"),iSentBuffCount);
    INFO_PRINTF2(_L("iReturnedBuffCount: %d"),iReturnedBuffCount);
    INFO_PRINTF2(_L("iPictureLoss: %d"),iPictureLoss);
    INFO_PRINTF1(_L("MdvpoStreamEnd DecOutStanding"));
   	DecOutstanding();
    }


/**
 * Get Next input data 
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::HandleNewBufferL()
    {
	if ( !iInputEnd )
		{
		if ( iDecHWDevId || iCIBuffMgmtOn ) //Retrieve buffer from Hwdevice
			{
			GetInputBuffer();     
			}
		else
			{
			FillAndSendBufferL();   // Postproc input
			}
		}	
    }

/**
 * Retrieve decoder input buffer
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::GetInputBuffer()
    {
    //TBool buffer = EFalse; 	 	 
    if ( iDecHWDevId )
    	{	
    	TRAPD(error, iCodedInBuffer = iDevvp->GetBufferL(iInBuffSize));
    	if (error != KErrNone)
    		{	
    		ERR_PRINTF2(_L("Error GetInputBufferL!. Error %d"),error);
    		iErrorInputBuffer = ETrue;
    		SetError(error);    		
    		}
    	else
    		{
    		if ( iCodedInBuffer )
    	    	{    	    	    	       	    	
    	        TRAPD(error, FillAndSendBufferL());
    	        if (error != KErrNone)
    	     	   {
    	     	   ERR_PRINTF2(_L("Error GetInputBufferL->FillAndSendBufferL!. Error %d"),error);
    	     	   SetBlockResult(EFail);        	   
    	     	   }
    	    	}
    		}    
    	} 
    }
    
    
    
/**
 * Fill data into input buffer and send to devvideoplay 
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::FillAndSendBufferL()
	{
	TInt err = KErrNone;	
	if ( iDecHWDevId)
		{
		if ( iSynchronized)
			{
			TInt size = 0;
			if((iSentBuffCount>=0) && (iSentBuffCount < iFrameSizeList.Count()))
				{
				size = iFrameSizeList[iSentBuffCount];
				}
			else
				{
				ERR_PRINTF2(_L("error %i"),iSentBuffCount);
				}
			
			err = ReadOneCodedPicture (iCodedInBuffer, size); // Read compressed data of one picture from file 
			}
		else
			{
			err = ReadOneCodedPicture (iCodedInBuffer); // Read compressed data of one picture from file 
			}
		}
	else // Postproc input case
		{
		err = ReadRawPicture (); // Read raw data for one picture      
		}
	if ( iInputEnd)
		{
		iDevvp->InputEnd (); // All input Data sent        
		return;
		}
	if ( err >= 0)
		{
		if ( iDecHWDevId)
			{
			iCodedInBuffer->iOptions = TVideoInputBuffer::EDecodingTimestamp;
			if ( iPostProcId)
				{
				iCodedInBuffer->iOptions |= TVideoInputBuffer::EPresentationTimestamp;
				}
			if ( iSynchronized)
				{
				iCodedInBuffer->iDecodingTimestamp = iTimeStamp;
				if ( iPostProcId)
					{
					iCodedInBuffer->iPresentationTimestamp = iTimeStamp;
					}
				iTimeStamp += iFrameTimeInterval;
				}
			else // Clock source is not set
				{
				iCodedInBuffer->iDecodingTimestamp = iSentBuffCount;
				if ( iPostProcId)
					{
					iCodedInBuffer->iPresentationTimestamp = iSentBuffCount;
					}
				}
			if ( iFrameMeasurement)
				{
				iClock->Reset (); // Reset Timer 
				}
			TRAPD(error,iDevvp->WriteCodedDataL(iCodedInBuffer)); // Input Data Sent to Decoder 
			if ( error != KErrNone)
				{
				ERR_PRINTF2(_L("Error Writing data!. Error %d"),error);
				SetError(error);
				return;
				}
			}
		else
			{
			iRawInBuffer->iData.iDataSize.SetSize (iPictureSize.iWidth,
					iPictureSize.iHeight);
			iRawInBuffer->iOptions |= (TVideoPicture::ETimestamp);
			if ( iSynchronized)
				{
				iRawInBuffer->iTimestamp = iTimeStamp;
				iTimeStamp += iFrameTimeInterval;
				}
			else
				{
				iRawInBuffer->iTimestamp = iSentBuffCount;
				}
			TRAPD(error, iDevvp->WritePictureL (iRawInBuffer)); // Input Data Sent to PostProcessor 
			if (error != KErrNone)
				{
				ERR_PRINTF2(_L("Error Writing Picture!. Error %d"),error);
				SetError(error);
				return;
				}
			}
		iSentBuffCount++;
		}
	else
		{
		iInputEnd = ETrue;
		iDevvp->InputEnd ();
		return;
		}	
	} 
   

/**
 * Retrieve output picture
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::GetReturnedPicture()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::GetReturnedPicture"));
	TRAPD(err, iOutBuffer = iDevvp->NextPictureL());
	if ( err != KErrNone)
		{
        HandleRuntimeError(err);
        ERR_PRINTF1(_L("Error en GetReturnedPicture!!"));
        }        
    if ( iOutBuffer )
        {       
        iReturnedBuffCount++;
        SaveAndReturnPicture();
        }
    INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::GetReturnedPicture"));
    }

/**
 * This function finishes the async call depending on the error occured while handling the picture
 * 
 * @param aError Error Value passed
 * @return none
 */
void CT_CMMFDevVideoPlay::HandleRuntimeError(TInt aError)
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::HandleRuntimeError"));
	ERR_PRINTF2(_L("HandleRuntimeError! Error = %d"),aError);
	SetError (aError);
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::HandleRuntimeError"));
	}    

/**
 * Store output data into a file
 * 
 * @return None
 */
void CT_CMMFDevVideoPlay::SaveAndReturnPicture()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::SaveAndReturnPicture"));
	TInt err = iOutFile.Write (*(iOutBuffer->iData.iRawData), iOutBuffer->iData.iRawData->Size ());
	iDevvp->ReturnPicture (iOutBuffer);
	iOutBuffer = NULL;
	if ( err != KErrNone)
		{
		HandleRuntimeError (err);
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::SaveAndReturnPicture"));
	}

/**
 * List size of each frame of coded bitstream 
 * 
 * @param  aCodec picture 
 * @return none
 */
void CT_CMMFDevVideoPlay::ListFrameSizeL(TVideoCodec aCodec)
	{
	TInt framesize = 0;
	TInt readpos = 0;
	TInt buffsize = KH263MaxCodedSizeQCIF; //buffer size for listing frame size
	iCodecType = aCodec; // this is for ReadOneCodedPicture
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::ListFrameSizeL"));
	//Initial buffer size
	// Allocate buffer 
	TVideoInputBuffer* videoBuffer = new(ELeave) TVideoInputBuffer;
	CleanupStack::PushL (videoBuffer);
	HBufC8* tempBuff = HBufC8::NewLC( buffsize);
	videoBuffer->iData.Set (tempBuff->Des ());
	while (!iInputEnd)
		{
		iInBuffSize = buffsize;
		videoBuffer->iData.SetLength (0);
		framesize = ReadOneCodedPicture (videoBuffer);//        
		if ( framesize >= 0) // Frame size is added to list
			{
			iFrameSizeList.AppendL (framesize);
			readpos += framesize;
			}
		else // resize buffer to bigger one
			{
			if ( buffsize < KMP4MaxCodedSizeVGA)
				{
				CleanupStack::PopAndDestroy(tempBuff);
				buffsize = buffsize + KH263MaxCodedSizeQCIF;
				tempBuff = HBufC8::NewLC( buffsize);
				videoBuffer->iData.Set (tempBuff->Des ());
				iInFile.Seek (ESeekStart, readpos);
				}
			else
				{
				framesize = KErrNotFound;
				break;
				}
			}
		}
	//Reset file postion to start
	TInt pos =0;
	iInFile.Seek (ESeekStart, pos);
	iInputEnd = EFalse;
	// cleanup    
	CleanupStack::PopAndDestroy(2, videoBuffer);
	//Error case
	if ( framesize < 0)
		{
		User::Leave (framesize);
		}
	//Set frame size listed   
	iFrameListed = ETrue;
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::ListFrameSizeL"));
	}

/**
 * Closes the opened files
 */
void CT_CMMFDevVideoPlay::CloseFile()
	{	
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::CloseFile"));
	iInFile.Close ();
	if ( !iDirectScreenAccess)
		{
		iOutFile.Close ();
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::CloseFile"));
	}

/**
 * Opens the input and output file
 * @param	aInFileName		-	The name of input file
 * @param	aOutFileName	-	The name of output file
 * @return	none
 */
void CT_CMMFDevVideoPlay::OpenFileL(TFileName& aOutFileName, TFileName& aInFileName)
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::OpenFileL"));
	TInt err = iInFile.Open (iFs, aInFileName, EFileRead | EFileShareReadersOnly);
	User::LeaveIfError (err);
	err = iOutFile.Replace (iFs, aOutFileName,
			EFileShareExclusive|EFileWrite);
	if ( err!= KErrNone)
		{
		iInFile.Close ();
		User::Leave(err);
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::OpenFileL"));
	}

/**
 * Opens the input File
 * @param	aInFileName	-The name of input file
 * @return	none 
 */
void CT_CMMFDevVideoPlay::OpenFileL(TFileName& aInFileName)
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::OpenFileL"));
	User::LeaveIfError(iInFile.Open (iFs, aInFileName, EFileRead | EFileShareReadersOnly));
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::OpenFileL"));
	}

/**
 * Read one raw picture into postprocessor input buffer
 */
TInt CT_CMMFDevVideoPlay::ReadRawPicture()
	{
	INFO_PRINTF1(_L("*START*CT_CMMFDevVideoPlay::ReadRawPicture"));
	iRawInBuffer->iData.iRawData->Set ((TUint8*)iRawInBuffer->iData.iRawData->Ptr(), 0, iInBuffSize);
	TInt err = iInFile.Read (*(iRawInBuffer->iData.iRawData), iInBuffSize);
	if ( !err)
		{
		if ( (iRawInBuffer->iData.iRawData->Length()) == 0)
			{
			iInputEnd = ETrue;
			}
		}
	INFO_PRINTF1(_L("*END*CT_CMMFDevVideoPlay::ReadRawPicture"));
	return err;
	}

void CT_CMMFDevVideoPlay::DoCmdH264CreateDecTest(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::CreateDecTest, In"));
    iUse264 = ETrue;
    TInt uidInt = 0;
    TInt output = 0;
    TInt width = 0;
    TInt height = 0;
    TInt buffMgmt = 0;
    TInt codec = 0;
    TPtrC inputfile;
    TPtrC inputDirectory;
    
    iObserver = new (ELeave) CEngineObserver(*this);
    //Create Decoder test engine     
    iEngine = CVDecTestEngine::NewL(*iObserver);    

    //Read from test case file 
	if(!GetHexFromConfig(aSection, KUid(), uidInt))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KUid());
		SetBlockResult(EFail);
		}
	if(!GetIntFromConfig(aSection, KBuffMgmt(), buffMgmt))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KBuffMgmt());
		SetBlockResult(EFail);
		}
	if(!GetIntFromConfig(aSection, KOutput(), output))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOutput());
		SetBlockResult(EFail);
		}
	if(!GetIntFromConfig(aSection, KWidth(), width))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KWidth());
		SetBlockResult(EFail);
		}
	if(!GetIntFromConfig(aSection, KHeight(), height))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHeight());
		SetBlockResult(EFail);
		}
	if(!GetIntFromConfig(aSection, KCodec(), codec))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KCodec());
		SetBlockResult(EFail);
		}
	if(!GetStringFromConfig(aSection, KInputPath(), inputDirectory))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KInputPath());
		SetBlockResult(EFail);
		}
	if(!GetStringFromConfig(aSection, KInputfile(), inputfile))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KInputfile());
		SetBlockResult(EFail);
		}
  
	//Open File
    TFileName inFileName(inputDirectory);
    inFileName.Append(inputfile);

	TUid decoderUid;
    decoderUid.iUid = uidInt;
    INFO_PRINTF2(_L("Decoder uid is [%x]"), decoderUid.iUid);

	TSize size;
	size.SetSize(width, height);
        
    if (output == EDecodedFile) 
    	{
    	TPtrC outputfile;
    	TPtrC outputDirectory;
		if ( ! (GetStringFromConfig(aSection, KOutputPath(),outputDirectory)))
			{
			ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOutputPath());
			SetBlockResult(EFail);
			}
		if ( !(GetStringFromConfig(aSection, KOutputfile(),outputfile)))
			{
			ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOutputfile());
			SetBlockResult(EFail);
			}
    		
    	//Start sequence    
    	iEngine->SetUpL(size, EFalse, buffMgmt);
    	TFileName outFileName(outputDirectory);
    	outFileName.Append(outputfile);   
    	iEngine->OpenFileL(outFileName, inFileName);
    	}
    else if (output == EScreenOutput) 
    	{
   		iEngine->SetUpL(size, ETrue, buffMgmt);    	   
    	iEngine->OpenFileL(inFileName);    	
    	}               
    
    TRAPD(result, iEngine->SelectDecoderL(decoderUid));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SelectDecoderL left with error %d"), result);
        SetError(result);
        }
    
    TVideoCodec videoCodec;
    if (codec == 1) 
    	{
    	videoCodec = EH263;	
    	}
    else if (codec == 2) 
    	{
    	videoCodec = EMPEG4;	
    	}
    else if (codec == 3) 
    	{
    	videoCodec = EAVC;	
    	}
    else if (codec == 4) 
    	{
    	videoCodec = EVC1;	
    	}	
    else if (codec == 5) 
    	{
    	videoCodec = EFLV;	
    	}	
		else if (codec == 6) 
    	{
    	videoCodec = EVP6;	
    	}
    else 
    	{
    	videoCodec = EMPEG4;	
    	}
    iEngine->SetCodecType(videoCodec);
    
    iFileOpen = ETrue;
   
	INFO_PRINTF1(_L("CT_MMFDevVideoPlayData::CreateDecTest, Out"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264SetInputFormatCompr(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_MMFDevVideoPlayData::SetInputFormatCompr, In"));
  
    TInt hwdev = 0;
    TInt dataUnitTypeInt = 0;
    TInt encapsulation = 0;
    TInt dataInOrder = 0;
    TPtrC format;
	if(!GetIntFromConfig(aSection, KHwdev(), hwdev))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHwdev());
		SetBlockResult(EFail);
		}
	if(!GetIntFromConfig(aSection, KDataUnitTypeInt(), dataUnitTypeInt))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDataUnitTypeInt());
		SetBlockResult(EFail);
		}
	if(!GetIntFromConfig(aSection, KEncapsulation(), encapsulation))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KEncapsulation());
		SetBlockResult(EFail);
		}
	if(!GetBoolFromConfig(aSection, KDataInOrder(), dataInOrder))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDataInOrder());
		SetBlockResult(EFail);
		}
	if(!GetStringFromConfig(aSection, KFormat(), format))
		{
		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFormat());
		SetBlockResult(EFail);
		}
	
	TVideoDataUnitType dataUnitType;
	switch (dataUnitTypeInt)
		{
		case 1: dataUnitType = EDuCodedPicture;
				break;
		case 2: dataUnitType = EDuVideoSegment;
				break;
		case 3: dataUnitType = EDuSeveralSegments;
				break;			
		case 4: dataUnitType = EDuArbitraryStreamSection;
				break;				
		default:dataUnitType = EDuCodedPicture;			
		}
			
	TVideoDataUnitEncapsulation dataEncapsulation;
	
	switch (encapsulation) 
		{
		case 1: dataEncapsulation = EDuElementaryStream;
				break;
		case 2: dataEncapsulation = EDuGenericPayload;
				break;
		case 3: dataEncapsulation = EDuRtpPayload;
				break;
		default:dataEncapsulation = EDuElementaryStream;				
		}
	
	TBuf8<128> buf;
	buf.Copy(format);
	CCompressedVideoFormat* compressedFormat = CCompressedVideoFormat::NewL(buf);    
			     	
	TRAPD(result, iEngine->SetInputFormatL(hwdev,*compressedFormat, dataUnitType, dataEncapsulation, dataInOrder));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SetInputFormatL left with error %d"), result);
        SetError(result);
        }    
    delete compressedFormat;
    
    INFO_PRINTF1(_L("CT_MMFDevVideoPlayData::SetInputFormatCompr, Out"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264SetOutputFormat(const TTEFSectionName& aSection)
	{
	TInt hwdev = 0;
	TInt dataFormat = 0;
    TInt dataLayout = 0;
    TInt pattern = 0;
    TInt aspectRatioNum = 1;
    TInt aspectRatioDenom = 1;
    TInt coefficients = 0;
        
    //Read from test case file 
    if ( !(GetIntFromConfig(aSection, KHwdev(), hwdev)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHwdev());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KDataFormat(), dataFormat)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDataFormat());
        SetBlockResult(EFail);
        }
    
    if ( !(GetIntFromConfig(aSection, KDataLayout(), dataLayout)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDataLayout());
        SetBlockResult(EFail);
        }   
    
    TUncompressedVideoFormat unCompressedFormat;
    
    switch (dataFormat)
    	{
    	case 1: 
    	    unCompressedFormat.iDataFormat = ERgbRawData;    				
    		unCompressedFormat.iRgbFormat = ERgb32bit888;
    		break;    				
    	case 2: unCompressedFormat.iDataFormat = ERgbFbsBitmap;
    			switch (dataLayout) 
    				{
    				case 1: unCompressedFormat.iRgbFormat = ERgb16bit444;
    						break;
    				case 2: unCompressedFormat.iRgbFormat = ERgb16bit565;
    						break;
					case 3: unCompressedFormat.iRgbFormat = ERgb32bit888;
    						break;
    				case 4: unCompressedFormat.iRgbFormat = EFbsBitmapColor4K;
    						break;
    				case 5: unCompressedFormat.iRgbFormat = EFbsBitmapColor16M;
    						break;				    							
    				case 6: unCompressedFormat.iRgbFormat = EFbsBitmapColor16MU;
    						break;		
    				default: unCompressedFormat.iRgbFormat = ERgb16bit444;
    				}
    			break;
    	case 3: unCompressedFormat.iDataFormat = EYuvRawData;
                if ( !(GetIntFromConfig(aSection, KPattern(), pattern)))
                    {
                    ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPattern());
                    SetBlockResult(EFail);
                    }
                if ( !(GetIntFromConfig(aSection, KAspectRatioNum(), aspectRatioNum)))
                    {
                    ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KAspectRatioNum());
                    SetBlockResult(EFail);
                    }
                if ( !(GetIntFromConfig(aSection, KAspectRatioDenom(), aspectRatioDenom)))
                    {
                    ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KAspectRatioDenom());
                    SetBlockResult(EFail);
                    }
                if(!GetHexFromConfig(aSection, KCoefficients(), coefficients))
                    {
                    ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KCoefficients());
                    SetBlockResult(EFail);
                    }
    			switch (dataLayout) 
    				{
    				case 1: unCompressedFormat.iYuvFormat.iDataLayout = EYuvDataPlanar;
    						break;
    				case 2: unCompressedFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedLE;
    						break;
					case 3: unCompressedFormat.iYuvFormat.iDataLayout = EYuvDataInterleavedBE;
    						break;
    				case 4: unCompressedFormat.iYuvFormat.iDataLayout = EYuvDataSemiPlanar;
    						break;
    				default:unCompressedFormat.iYuvFormat.iDataLayout = EYuvDataPlanar;    							    					 
    				}
    			switch (pattern) 
    				{
    				case 1: unCompressedFormat.iYuvFormat.iPattern = EYuv420Chroma1;
    						break;
    				case 2: unCompressedFormat.iYuvFormat.iPattern = EYuv420Chroma2;
    						break;
					case 3: unCompressedFormat.iYuvFormat.iPattern = EYuv420Chroma3;
    						break;
    				case 4: unCompressedFormat.iYuvFormat.iPattern = EYuv422Chroma1;
    						break;
    				case 5: unCompressedFormat.iYuvFormat.iPattern = EYuv422Chroma2;
    						break;    							
    				default:unCompressedFormat.iYuvFormat.iPattern = EYuv420Chroma2; 
    				}
    			switch (coefficients) 
    				{
    				case 1: unCompressedFormat.iYuvFormat.iCoefficients = EYuvRange0;
    						break;
    				case 2: unCompressedFormat.iYuvFormat.iCoefficients = EYuvRange1;
    						break;
					case 3: unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt709;
    						break;
    				case 4: unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt709Range0;
    						break;
    				case 5: unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt709Range1;
    						break;    							
    				case 6: unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt601;
    						break;    							
    				case 7: unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt601Range0;
    						break;    							
    				case 8: unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt601Range1;
    						break;    									
    				case 9: unCompressedFormat.iYuvFormat.iCoefficients = ECustomYuvMatrix;
    						break;    							
    				default:unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt709Range0; 
    				}	
    			unCompressedFormat.iYuvFormat.iAspectRatioNum = aspectRatioNum;
    			unCompressedFormat.iYuvFormat.iAspectRatioDenom = aspectRatioDenom;
    			// We don't use conversion
				unCompressedFormat.iYuvFormat.iYuv2RgbMatrix = NULL;
				unCompressedFormat.iYuvFormat.iRgb2YuvMatrix = NULL;

    			break;
    		default:	    unCompressedFormat.iDataFormat = EYuvRawData;
						    unCompressedFormat.iYuvFormat.iDataLayout = EYuvDataPlanar; 
						    unCompressedFormat.iYuvFormat.iPattern = EYuv420Chroma1;
						    unCompressedFormat.iYuvFormat.iAspectRatioNum = 1;
						    unCompressedFormat.iYuvFormat.iAspectRatioDenom = 1;
						    unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt601Range1;
						    
						    // We don't use conversion
						    unCompressedFormat.iYuvFormat.iYuv2RgbMatrix = NULL;
						    unCompressedFormat.iYuvFormat.iRgb2YuvMatrix = NULL;
    	}            
    
    TRAPD(result, iEngine->SetOutputFormatL(hwdev, unCompressedFormat));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SetOutputFormatL left with error %d"), result);
        SetError(result);
        }
	}

void CT_CMMFDevVideoPlay::DoCmdH264SetBufferOptions(const TTEFSectionName& aSection)
	{
    TInt preDecodeBufferSize = 0;
	TInt maxPostDecodeBufferSize = 0;
	TInt preDecoderBufferPeriodInt = 0;
	TInt postDecoderBufferPeriodInt = 0;
	TInt maxInputBufferSize = 0;
	TInt minNumInputBuffers = 0;

    if ( !(GetIntFromConfig(aSection, KPreDecodeBufferSize(), preDecodeBufferSize)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPreDecodeBufferSize());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KMaxPostDecodeBufferSize(), maxPostDecodeBufferSize)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KMaxPostDecodeBufferSize());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KPreDecoderBufferPeriodInt(), preDecoderBufferPeriodInt)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPreDecoderBufferPeriodInt());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KPostDecoderBufferPeriodInt(), postDecoderBufferPeriodInt)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPostDecoderBufferPeriodInt());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KMaxInputBufferSize(), maxInputBufferSize)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KMaxInputBufferSize());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KMinNumInputBuffers(), minNumInputBuffers)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KMinNumInputBuffers());
        SetBlockResult(EFail);
        }    

    CMMFDevVideoPlay::TBufferOptions bufferOptions;
	bufferOptions.iPreDecodeBufferSize = preDecodeBufferSize;
	bufferOptions.iMaxPostDecodeBufferSize = maxPostDecodeBufferSize;
	bufferOptions.iPreDecoderBufferPeriod = preDecoderBufferPeriodInt;
	bufferOptions.iPostDecoderBufferPeriod = postDecoderBufferPeriodInt;
	bufferOptions.iMaxInputBufferSize = maxInputBufferSize;
	bufferOptions.iMinNumInputBuffers = minNumInputBuffers;

	TRAPD(result, iEngine->SetBufferOptionsL(bufferOptions));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SetBufferOptionsL left with error %d"), result);
        SetError(result);
        }
	}

void CT_CMMFDevVideoPlay::DoCmdH264Initialize()
	{
	INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Initialize, In"));
	iEngine->Initialize();
	IncOutstanding();
	INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Initialize, Out"));
	}

void  CT_CMMFDevVideoPlay::DoCmdH264Start(const TTEFSectionName& aSection)
	{
	INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Start, In"));
    TInt inputEnd = 0;
    if ( !(GetIntFromConfig(aSection, KInputEnd(), inputEnd)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KInputEnd());
        SetBlockResult(EFail);
        }
    if (inputEnd != 0)  
    	{
    	iEngine->Start(ETrue);
    	}
    else 
    	{
    	iEngine->Start(EFalse);
    	}
    IncOutstanding();
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Start, Out"));
	}

void CT_CMMFDevVideoPlay::DoCmdH264Stop()
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Stop, In"));
    TRAPD(result, iEngine->Stop());
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("Stop left with error %d"), result);
        SetError(result);
        }
    INFO_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdH264Stop, Out result=%d"),result);
    }

void CT_CMMFDevVideoPlay::DoCmdH264Pause()
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Pause, In"));
    TInt result = KErrNone;
    result = iEngine->Pause();
    INFO_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdH264Pause, Out result=%d"),result);    
    }

void CT_CMMFDevVideoPlay::DoCmdH264Resume()
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Resume, In"));
    TInt result = KErrNone;
    result = iEngine->Resume();
    INFO_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdH264Resume, Out result=%d"),result);    
    }

void CT_CMMFDevVideoPlay::DoCmdH264IOFrameNumMatch()
	{
    iEngine->SetFrameMatch( ETrue );
	}

void CT_CMMFDevVideoPlay::DoCmdH264ListFrameSize()
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264ListFrameSize, In"));
    RArray<TInt> framesizes;
    TRAPD(result, iEngine->ListFrameSizeL(framesizes));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("ListFrameSizeL left with error %d"), result);
        SetError(result);
        }
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264ListFrameSize, Out"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264SetVideoDestScreen(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::SetVideoDestScreen, In"));
   
    TBool dest = 0;
    if(!GetBoolFromConfig(aSection, KDest(), dest))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KDest());
        SetBlockResult(EFail);
        }

    TRAPD(result, iEngine->SetVideoDestScreenL(dest));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SetVideoDestScreenL left with error %d"), result);
        SetError(result);
        }    
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SetVideoDestScreen, Out"));
    } 

void CT_CMMFDevVideoPlay::DoCmdH264SetWindowRect(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SetWindowRect, In"));
    
    TInt x;
    TInt y;
    TInt width;
    TInt height;

    if ( !(GetIntFromConfig(aSection, KX(), x)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KX());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KY(), y)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KY());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KWidth(), width)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KWidth());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KHeight(), height)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHeight());
        SetBlockResult(EFail);
        }

    TSize size(width, height);
    
    iEngine->SetWindowRect(x, y, size);
    
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SetWindowRect, Out"));  
    }

void CT_CMMFDevVideoPlay::DoCmdH264SelectPostProcessor(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SelectPostProcessor, In"));
    
    TInt uidInt = 0;
    if(!GetHexFromConfig(aSection, KUid(), uidInt))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KUid());
        SetBlockResult(EFail);
        }
    
    TUid postproUid;
    postproUid.iUid = uidInt;
    INFO_PRINTF2(_L("PostProcessor uid is [%x]"), postproUid.iUid);
                
    TRAPD(result, iEngine->SelectPostProcessorL(postproUid));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SelectPostProcessorL left with error %d"), result);
        SetError(result);
        }     
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SelectPostProcessor, Out"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264SetPostProcessTypes(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SetPostProcessTypes, In"));
    
    TInt combination = 0;
    TInt hwdev = 0;

    if(!GetIntFromConfig(aSection, KHwdev(), hwdev))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHwdev());
        SetBlockResult(EFail);
        }
    if(!GetHexFromConfig(aSection, KCombination(), combination))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KCombination());
        SetBlockResult(EFail);
        }
    
    TRAPD(result, iEngine->SetPostProcessTypesL(hwdev, combination));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SetPostProcessTypesL left with error %d"), result);
        SetError(result);
        }    
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SetPostProcessTypes, In"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264FindCommonFormats()
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264FindCommonFormats, In") );
      
    TRAPD(result, iEngine->FindCommonFormatsL());
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("FindCommonFormatsL left with error %d"), result);
        SetError(result);
        }     
    INFO_PRINTF2(_L("CT_CMMFDevVideoPlay::DoCmdH264FindCommonFormats, Out [%d]"), result);
    }


void CT_CMMFDevVideoPlay::DoCmdH264GetHeaderInformation(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::GetHeaderInformation, In") );
    TInt result = KErrNone; 
    TInt dataUnitTypeInt = 0;
    TBool getDataUnitTypeInt = ETrue;
    if(!GetIntFromConfig(aSection, KDataUnitTypeInt(), dataUnitTypeInt))
        {
        getDataUnitTypeInt = EFalse;
        }
    TInt encapsulation = 0;
    TBool getEncapsulation = ETrue;
    if(!GetIntFromConfig(aSection, KEncapsulation(), encapsulation))
        {
        getEncapsulation = EFalse;
        }
    if(getDataUnitTypeInt && getEncapsulation)
        {
        TVideoDataUnitType dataUnitType;
        switch (dataUnitTypeInt)
            {
            case 1: dataUnitType = EDuCodedPicture;
                    break;
            case 2: dataUnitType = EDuVideoSegment;
                    break;
            case 3: dataUnitType = EDuSeveralSegments;
                    break;          
            case 4: dataUnitType = EDuArbitraryStreamSection;
                    break;              
            default:dataUnitType = EDuCodedPicture;         
            }
                
        TVideoDataUnitEncapsulation dataEncapsulation;      
        switch (encapsulation) 
            {
            case 1: dataEncapsulation = EDuElementaryStream;
                    break;
            case 2: dataEncapsulation = EDuGenericPayload;
                    break;
            case 3: dataEncapsulation = EDuRtpPayload;
                    break;
            default:dataEncapsulation = EDuElementaryStream;                
            }
        
        TRAP(result, iEngine->GetHeaderInformationL(dataUnitType, dataEncapsulation));
        }
    else 
        {
        TRAP(result, iEngine->GetHeaderInformationL());
        }           
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("GetHeaderInformationL left with error %d"), result);
        SetError(result);
        }     
    INFO_PRINTF2(_L("CT_CMMFDevVideoPlay::GetHeaderInformation, Out [%d]"), result);
    }

void CT_CMMFDevVideoPlay::DoCmdH264EnableSynchronization(const TTEFSectionName& aSection)
    {
    if(!GetIntFromConfig(aSection, KFramerate(), iFrameRate))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFramerate());
        SetBlockResult(EFail);
        }
    
    iEngine->EnableSynchronization(iFrameRate);
    }

void CT_CMMFDevVideoPlay::DoCmdH264SetScaleOptions(const TTEFSectionName& aSection)
    {
    TInt width = 0;
    TInt height = 0;
    TInt antiAliasing = 0;
    TInt hwdev = 0;

    if ( !(GetIntFromConfig(aSection, KHwdev(), hwdev)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHwdev());
        SetBlockResult(EFail);
        }   
    if ( !(GetIntFromConfig(aSection, KWidth(), width)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KWidth());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KHeight(), height)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHeight());
        SetBlockResult(EFail);
        }
    if ( !(GetIntFromConfig(aSection, KY(), antiAliasing)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KY());
        SetBlockResult(EFail);
        }
 
    TSize size(width, height);
      
    TRAPD(result, iEngine->SetScaleOptionsL(hwdev, size, antiAliasing));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("FindCommonFormatsL left with error %d"), result);
        SetError(result);
        } 
    }

void CT_CMMFDevVideoPlay::DoCmdH264SetRotateOptions(const TTEFSectionName& aSection)
{
    TInt rotItem = 0;       
    TInt hwdev = 0;
    if ( !(GetIntFromConfig(aSection, KHwdev(), hwdev)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHwdev());
        SetBlockResult(EFail);
        }   
    if ( !(GetIntFromConfig(aSection, KRotation(), rotItem)))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRotation());
        SetBlockResult(EFail);
        }
    TRotationType rotation;   
    switch(rotItem)
    {
        case 0:
            rotation = ERotateNone;
            break;
        case 90:
            rotation = ERotate90Clockwise;
            break;              
        case 180:        
            rotation = ERotate180;
            break;        
        case 270:
            rotation = ERotate90Anticlockwise;
            break;              
        default:               
            rotation = ERotateNone;                             
    }
    TRAPD(result, iEngine->SetRotateOptionsL(hwdev, rotation));
    if(result != KErrNone)
        {
        ERR_PRINTF2(_L("SetRotateOptionsL left with error %d"), result);
        SetError(result);
        } 
}

void CT_CMMFDevVideoPlay::DoCmdH264SynchronizeDecoding(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SynchronizeDecoding, In"));
    TBool sync = 0;
    if(!GetBoolFromConfig(aSection, KSync(), sync))
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KSync());
        SetBlockResult(EFail);
        }
    iEngine->SynchronizeDecoding(sync);
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SynchronizeDecoding, Out"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264Delete()
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Delete, In"));
    if (iFileOpen && iUse264)
        {
        iEngine->CloseFile();
        }
    iEngine->TearDown();
    if(iEngine)
        {
        delete iEngine;
        iEngine = NULL;
        }
    if(iObserver)
        {
        delete iObserver;
        iObserver = NULL;
        }
    if(iClock)
        {
        delete iClock;
        iClock = NULL;
        }
    while(Outstanding())
        {
        INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Delete DecOutstanding()"));
        DecOutstanding();
        }
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264Delete, Out"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264SetPosition(const TTEFSectionName& aSection)
    {
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SetPosition, In"));
    TInt pos;
    TBool dataOk = ETrue;
    if ( !(GetIntFromConfig(aSection, KPos(), pos)) ) //This parameter indicates seconds to move forward/backward from the current position
        {
        ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPos());
        SetBlockResult(EFail);
        dataOk = EFalse;
        }
    if(dataOk)
        {
        TInt frameTimeInterval = (TInt64)(1000000/iFrameRate);
        TInt newPosition = (iEngine->PlaybackPosition()).Int64()/frameTimeInterval + pos;
        INFO_PRINTF2(_L("set to position %d"),newPosition);
        TInt maxPosition = iEngine->GetFrameSizeCount();
        INFO_PRINTF2(_L("total framesize count %d"),maxPosition);
        if(newPosition >= maxPosition)
            {
            INFO_PRINTF3(_L("Invalid forward position %d, auto set to maximum framesize count %d"),newPosition,maxPosition-1);
            newPosition = maxPosition - 1;
            }
        if(newPosition <= 0)
            {
            INFO_PRINTF2(_L("Invalid backward position %d, auto set to starting position."),newPosition);
            newPosition = 1;
            }
        TTimeIntervalMicroSeconds timestamp = newPosition*frameTimeInterval;  
        iEngine->SetPosition(timestamp);
        }
    INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264SetPosition, Out"));
    }

void CT_CMMFDevVideoPlay::DoCmdH264AbortDirectScreenAccess()
	{
	INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264AbortDirectScreenAccess In"));
	iEngine->AbortDirectScreenAccess();
	INFO_PRINTF1(_L("CT_CMMFDevVideoPlay::DoCmdH264AbortDirectScreenAccess, Out"));
	}