os/mm/mmapitest/devvideohaitest/src/T_CMMFDevVideoRecordData.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /*
     2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 *
    16 */
    17 
    18 
    19 #include "t_cmmfdevvideorecorddata.h"
    20 
    21 /*@{*/
    22 //LIT's to identify commands
    23 _LIT(KCmdNewL,						"NewL");
    24 _LIT(KCmdDestructor,				"~");
    25 _LIT(KCmdSelectEncoderL,			"SelectEncoderL");
    26 _LIT(KCmdSetInputFormatL,			"SetInputFormatL");
    27 _LIT(KCmdSetOutputFormatL,			"SetOutputFormatL");
    28 _LIT(KCmdSetBufferOptionsL,			"SetBufferOptionsL");
    29 _LIT(KCmdSetSourceMemoryL,			"SetSourceMemoryL");
    30 _LIT(KCmdSetMinRandomAccessRate,	"SetMinRandomAccessRate");
    31 _LIT(KCmdInitialize,				"Initialize");
    32 _LIT(KCmdSetComplexityLevel,		"SetComplexityLevel");
    33 _LIT(KCmdStart,						"Start");
    34 _LIT(KCmdPause,						"Pause");
    35 _LIT(KCmdResume,					"Resume");
    36 _LIT(KCmdStop,						"Stop");
    37 _LIT(KCmdUtilityGetEnvironment,  	"UtilityGetEnvironment");
    38 _LIT(KCmdSetRateControlOptions,  	"SetRateControlOptions");
    39 
    40 
    41 /*@}*/
    42 
    43 /*@{*/
    44 //LIT's to get params from ini files
    45 _LIT(KInputFile,			"inputfile");
    46 _LIT(KOutputFile,			"outputfile");
    47 _LIT(KInputPath,			"inputPath");
    48 _LIT(KOutputPath,			"outputPath");
    49 _LIT(KFrameRate,			"framerate");
    50 _LIT(KUid,					"uid");
    51 _LIT(KMimeType,				"mimeType");
    52 _LIT(KDataUnitType,			"DataUnitType");
    53 _LIT(KDataEncapsulation,	"DataEncapsulation");
    54 _LIT(KHrdVbvSpecification,	"HrdVbvSpecification");
    55 _LIT(KMaxPictureSize,		"maxPictureSize");
    56 _LIT(KRandomAccessRate, 	"randomAccessRate");
    57 _LIT(KComplexityLevel,		"complexityLevel");
    58 _LIT(KRawPicLength , 		"rawPicLength");
    59 _LIT(KPicWidth,				"picWidth");
    60 _LIT(KPicHeight,			"picHeight");
    61 _LIT(KHrdVbvNone, 			"EHrdVbvNone");
    62 _LIT(KHrdVbvCodingStandard, "EHrdVbvCodingStandard");
    63 _LIT(KHrdVbv3GPP, 			"EHrdVbv3GPP");
    64 _LIT(KLayer, 			    "layer");
    65 _LIT(KBitrateControlType, 	"bitrateControlType");
    66 _LIT(KBitrate, 			    "bitrate");
    67 _LIT(KPictureQuality, 		"pictureQuality");
    68 _LIT(KPicRate, 			    "picRate");
    69 _LIT(KQualityTempTradeOff, 	"qualityTempTradeOff");
    70 _LIT(KLatencyQuality, 		"latencyQuality");
    71 /*@{*/
    72 
    73 const CDataWrapperBase::TEnumEntryTable	CT_MMFDevVideoRecordData::iHrdVbvSpecification[] =
    74 	{
    75 	KHrdVbvNone, 			EHrdVbvNone,
    76 	KHrdVbvCodingStandard, 	EHrdVbvCodingStandard,
    77 	KHrdVbv3GPP, 			EHrdVbv3GPP
    78 	};
    79 
    80 /**
    81  * Two phase constructor
    82  *
    83  * @leave	system wide error
    84  */
    85 CT_MMFDevVideoRecordData* CT_MMFDevVideoRecordData::NewL()
    86 	{
    87 	CT_MMFDevVideoRecordData* self = new(ELeave)CT_MMFDevVideoRecordData();
    88 	CleanupStack::PushL (self);
    89 	self->ConstructL ();
    90 	CleanupStack::Pop (self);
    91 	return self;
    92 	}
    93 
    94 /**
    95  * Public destructor
    96  */
    97 CT_MMFDevVideoRecordData::~CT_MMFDevVideoRecordData()
    98 	{
    99 	INFO_PRINTF1(_L("Destroying data..."));
   100 	DestroyData();
   101 	INFO_PRINTF1(_L("Data destroyed"));
   102 	}
   103 
   104 /**
   105  * Protected constructor. First phase construction
   106  */
   107 CT_MMFDevVideoRecordData::CT_MMFDevVideoRecordData()
   108 	:	
   109 	iBufferCount(0),	
   110 	iTimeStamp(0), 	
   111 	iWrittenPictures(0), 	
   112 	iReturnedPictures(0), 	
   113 	iCompressedBuffers(0), 	
   114 	iBufferedPictures(0),	
   115 	iStopAfterAllFramesReturned(EFalse), 	
   116 	iInputEnd(EFalse),	
   117 	iDatabuf(),	
   118 	iRequests(0),	
   119 	iOutputRequests(0)
   120 	{
   121 	}
   122 
   123 
   124 void CT_MMFDevVideoRecordData::ConstructL()
   125 	{
   126 	iFs.Connect();
   127 	}
   128 
   129 /**
   130  * Returns a pointer to the object that the data wraps
   131  * @return wrapped object
   132  */
   133 TAny* CT_MMFDevVideoRecordData::GetObject()
   134 	{
   135 	return iDevvr;
   136 	}
   137 
   138 
   139 /*
   140  * COMMANDS
   141  */
   142 
   143 /**
   144  * Process a command read from the ini file
   145  *
   146  * @param aCommand			The command to process
   147  * @param aSection			The section in the ini containing data for the command
   148  * @param aAsyncErrorIndex	Command index for async calls to return errors to 
   149  * @return					ETrue if the command is processed *
   150  * @leave					System wide error
   151  */
   152 TBool CT_MMFDevVideoRecordData::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
   153 	{
   154 	TBool cmdProcessed = ETrue;
   155 	if(aCommand == KCmdNewL())
   156 		{
   157 		DoCmdNewL(aSection);
   158 		}
   159 	else if(aCommand == KCmdDestructor())
   160 		{
   161 		DoCmdDestructor();
   162 		}
   163 	else if(aCommand == KCmdSelectEncoderL())
   164 		{
   165 		DoCmdSelectEncoderL(aSection);
   166 		}
   167 	else if(aCommand == KCmdSetInputFormatL())
   168 		{
   169 		DoCmdSetInputFormatL();
   170 		}
   171 	else if(aCommand == KCmdSetOutputFormatL())
   172 		{
   173 		DoCmdSetOutputFormatL(aSection);
   174 		}
   175 	else if(aCommand == KCmdSetBufferOptionsL())
   176 		{
   177 		DoCmdSetBufferOptionsL(aSection);
   178 		}
   179 	else if(aCommand == KCmdSetSourceMemoryL())
   180 		{
   181 		DoCmdSetSourceMemoryL();
   182 		}
   183 	else if(aCommand == KCmdSetMinRandomAccessRate())
   184 		{
   185 		DoCmdSetMinRandomAccessRate(aSection);
   186 		}
   187 	else if(aCommand == KCmdInitialize())
   188 		{
   189 		DoCmdInitialize(aAsyncErrorIndex);
   190 		}
   191 	else if(aCommand == KCmdSetComplexityLevel())
   192 		{
   193 		DoCmdSetComplexityLevel(aSection);
   194 		}
   195 	else if(aCommand == KCmdStart())
   196 		{
   197 		DoCmdStart(aAsyncErrorIndex);
   198 		}
   199 	else if(aCommand == KCmdPause())
   200 		{
   201 		DoCmdPause();
   202 		}
   203 	else if(aCommand == KCmdResume())
   204 		{
   205 		DoCmdResume();
   206 		}
   207 	else if(aCommand == KCmdStop())
   208 		{
   209 		DoCmdStop();
   210 		}
   211 	else if ( aCommand==KCmdUtilityGetEnvironment )
   212 		{
   213 		DoCmdUtilityGetEnvironmentL();
   214 		}
   215 	else if ( aCommand==KCmdSetRateControlOptions )
   216 		{
   217 		DoCmdSetRateControlOptions(aSection);
   218 		}
   219 	else
   220 		{
   221 		cmdProcessed = EFalse;
   222 		}
   223 
   224 	return cmdProcessed;
   225 	}
   226 
   227 /**
   228  * DoCmdNewL
   229  * @param aSection			The section in the ini containing data for the command
   230  */
   231 void CT_MMFDevVideoRecordData::DoCmdNewL(const TTEFSectionName& aSection)
   232 	{
   233 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdNewL"));
   234 	DestroyData();
   235 	TRAPD(error,iDevvr = CMMFDevVideoRecord::NewL( *this ));
   236 	if(error!=KErrNone)
   237 		{
   238 		ERR_PRINTF2(_L("Error creating CMMFDevVideoRecord %i"), error);
   239 		SetError(error);
   240 		}
   241 	else
   242 		{
   243 		CreateBuffers();
   244 	
   245 		if(CreateFiles(aSection)!= KErrNone)
   246 			{
   247 			ERR_PRINTF1(_L("Error creating input/output files"));
   248 			SetBlockResult(EFail);
   249 			}
   250 		}
   251 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdNewL"));
   252 	}
   253 
   254 /**
   255  * DoCmdDestructor
   256  */
   257 void CT_MMFDevVideoRecordData::DoCmdDestructor()
   258 	{
   259 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdDestructor"));
   260 	iInFile.Close();   
   261 	iOutFile.Close();
   262 	iFs.Close();
   263 	REComSession::FinalClose();	
   264 	DestroyData();
   265 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdDestructor"));
   266 	}
   267 
   268 /**
   269  *	DoCmdSelectEncoderL
   270  *  Selects the video encoder to be used. This method must be called before any other video encoder related 
   271  *  methods are used. The encoder can be changed by calling this method again before the system has been 
   272  *  initialized with Initialize().
   273  *  All video encoder settings are reset to their default values. By default no pre-processing is performed.
   274  *  @param aSection			The section in the ini containing data for the command
   275  */
   276 void CT_MMFDevVideoRecordData::DoCmdSelectEncoderL(const TTEFSectionName& aSection)
   277 	{
   278 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdSelectEncoderL"));
   279 	TInt hUid = 0;
   280 
   281 	if(!GetHexFromConfig(aSection, KUid(), hUid))
   282 		{
   283 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KUid());
   284 		SetBlockResult(EFail);
   285 		}
   286 	else
   287 		{
   288 		TUid Uid = TUid::Uid(hUid);
   289 		SetPictureTypeL(aSection);
   290 		TRAPD(error,iEncHWDevId = iDevvr->SelectEncoderL(Uid));
   291 		if(error!=KErrNone)
   292 			{
   293 			iEncHWDevId = NULL;		
   294 			ERR_PRINTF2(_L("Error Selecting encoder: %i"), error);
   295 			SetError(error);
   296 			}
   297 		}
   298 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdSelectEncoderL"));
   299 	}
   300 
   301 /*
   302  *	Sets the input format for a hardware device. If both a pre-processor and an encoder are used, the 
   303  *	pre-processor output format and the encoder input format must be the same. The input format for the 
   304  *	first device in the system is the input format for video input data.
   305 */
   306 void CT_MMFDevVideoRecordData::DoCmdSetInputFormatL()
   307 	{
   308 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdSetInputFormatL"));
   309 	TUncompressedVideoFormat unCompressedFormat;	
   310 
   311 	unCompressedFormat.iDataFormat = EYuvRawData; 
   312 	unCompressedFormat.iYuvFormat.iDataLayout = EYuvDataPlanar;
   313 	unCompressedFormat.iYuvFormat.iPattern = EYuv420Chroma1;
   314 	unCompressedFormat.iYuvFormat.iYuv2RgbMatrix = NULL;
   315 	unCompressedFormat.iYuvFormat.iRgb2YuvMatrix = NULL;
   316 	unCompressedFormat.iYuvFormat.iAspectRatioNum = 1;
   317 	unCompressedFormat.iYuvFormat.iAspectRatioDenom = 1;
   318 	unCompressedFormat.iYuvFormat.iCoefficients = EYuvBt601Range0;
   319 
   320 	TRAPD(error,iDevvr->SetInputFormatL( iEncHWDevId, unCompressedFormat, iPictSize ));
   321 	if(error!=KErrNone)
   322 		{
   323 		ERR_PRINTF2(_L("Error Setting input format: %i"), error);
   324 		SetError(error);
   325 		}
   326 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdSetInputFormatL"));
   327 	}
   328 
   329 /*
   330  *	Sets the output format for a hardware device to a compressed video format. Only applicable for encoder 
   331  *	devices. The picture size depends on the input data format and possible scaling performed.
   332  *  	@param aSection			The section in the ini containing data for the command
   333  */
   334 void CT_MMFDevVideoRecordData::DoCmdSetOutputFormatL(const TTEFSectionName& aSection)
   335 	{
   336 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdSetOutputFormatL"));
   337 	TBuf8<50> mimetype;		
   338 	TVideoDataUnitType dataUnitType;
   339 	TVideoDataUnitEncapsulation dataEncapsulation;
   340 	TBool dataOk = ETrue;
   341 	TInt iDataUnitType = 0;
   342 	TInt iDataEncapsulation = 0;
   343 		
   344 	TPtrC mimeType;
   345 	if(!GetStringFromConfig(aSection, KMimeType(), mimeType))
   346 		{
   347 		ERR_PRINTF1(_L("Mime type not retrieved, command will not be executed"));
   348 		SetBlockResult(EFail);
   349 		dataOk = EFalse;
   350 		}
   351 	if(!GetHexFromConfig(aSection, KDataUnitType(), iDataUnitType))
   352 		{
   353 		ERR_PRINTF2(_L("check parameter: %S"), &KDataUnitType());
   354 		SetBlockResult(EFail);
   355 		dataOk = EFalse;
   356 		}
   357 	if(!GetHexFromConfig(aSection, KDataEncapsulation(), iDataEncapsulation))
   358 		{
   359 		ERR_PRINTF2(_L("check parameter: %S"), &KDataEncapsulation());
   360 		SetBlockResult(EFail);
   361 		dataOk = EFalse;
   362 		}
   363 	if(dataOk)
   364 		{
   365 		mimetype.Append(mimeType);
   366 		CCompressedVideoFormat* compressedFormat=NULL;
   367 		TRAPD(cfError, compressedFormat = CCompressedVideoFormat::NewL(mimetype));
   368 		CleanupStack::PushL(compressedFormat);
   369 		if(cfError != KErrNone)
   370 			{
   371 			ERR_PRINTF2(_L("Error selecting compressed video format, check selected mimeType: %i"), cfError);
   372 			SetError(cfError);
   373 			}
   374 		else
   375 			{
   376 			dataUnitType = static_cast<TVideoDataUnitType>(iDataUnitType);
   377 			dataEncapsulation = static_cast<TVideoDataUnitEncapsulation>(iDataEncapsulation);
   378 			
   379 			TRAPD(error,iDevvr->SetOutputFormatL(iEncHWDevId, *compressedFormat, dataUnitType, dataEncapsulation, EFalse));  	
   380 			if(error != KErrNone)
   381 				{
   382 				ERR_PRINTF2(_L("Couldn't set OutputFormat %i"), error);	
   383 				delete iDevvr;
   384 				iDevvr = NULL;
   385 				SetError(error);
   386 				}
   387 			}
   388 		CleanupStack::PopAndDestroy(compressedFormat);
   389 		}
   390 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdSetOutputFormatL"));
   391 	}
   392 
   393 /*
   394  *	Sets encoder buffering options.
   395  *	@param aSection			The section in the ini containing data for the command
   396 */
   397 void CT_MMFDevVideoRecordData::DoCmdSetBufferOptionsL(const TTEFSectionName& aSection)
   398 	{
   399 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdSetBufferOptionsL"));
   400 	TEncoderBufferOptions bufferOptions;
   401 	TInt HrdVbvSpecification = 0;
   402 	TInt maxPictureSize = 0;
   403 	TBool dataOk = ETrue;
   404 	if(!GetEnumFromConfig(aSection, KHrdVbvSpecification(), iHrdVbvSpecification, HrdVbvSpecification))
   405 		{
   406 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KHrdVbvSpecification());
   407 		SetBlockResult(EFail);
   408 		dataOk = EFalse;
   409 		}
   410 	if(!GetIntFromConfig(aSection, KMaxPictureSize(), maxPictureSize))
   411 		{
   412 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KMaxPictureSize());
   413 		SetBlockResult(EFail);
   414 		dataOk = EFalse;
   415 		}	
   416 	if(dataOk)
   417 		{
   418 		bufferOptions.iHrdVbvParams.Set(NULL, 0);
   419 		bufferOptions.iHrdVbvSpec = (THrdVbvSpecification)HrdVbvSpecification;
   420 		bufferOptions.iMaxPreEncoderBufferPictures = KNumPictures;
   421 		bufferOptions.iMaxCodedPictureSize = maxPictureSize;
   422 		bufferOptions.iMaxOutputBufferSize = maxPictureSize;      
   423 		bufferOptions.iMaxCodedSegmentSize = maxPictureSize;
   424 	
   425 		//Not needed more that 4 input buffers for normal fileRead test cases
   426 		bufferOptions.iMinNumOutputBuffers = KNumPictures - 2;
   427 		TRAPD(error, iDevvr->SetBufferOptionsL( bufferOptions ));
   428 		if(error!=KErrNone)
   429 			{
   430 			ERR_PRINTF2(_L("Error Setting buffer options: %i"), error);
   431 			SetError(error);
   432 			}	
   433 		}
   434 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdSetBufferOptionsL"));
   435 	}
   436 /*
   437  *	Sets the data source to be memory buffers.
   438  */
   439 void CT_MMFDevVideoRecordData::DoCmdSetSourceMemoryL()
   440 	{
   441 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdSetSourceMemoryL"));
   442 	
   443 	TRAPD(error, iDevvr->SetSourceMemoryL(iFrameRate, EFalse, EFalse));	
   444 	if(error != KErrNone)
   445 		{
   446 		ERR_PRINTF2(_L("Error Setting Source Memory: %i"), error);
   447 		SetError(error);
   448 		}
   449 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdSetSourceMemoryL"));
   450 	}
   451 
   452 /*
   453  *	Sets the minimum frequency (in time) for instantaneous random access points in the bitstream. 
   454  *	An instantaneous random access point is such where the encoder can achieve a full output picture 
   455  *	immediately by encoding data starting from the random access point. The random access point frequency
   456  *	may be higher than signalled, if the sequence contains scene cuts which typically cause a coding of 
   457  *	a random access point.
   458  *	@param aSection			The section in the ini containing data for the command
   459 */
   460 void CT_MMFDevVideoRecordData::DoCmdSetMinRandomAccessRate(const TTEFSectionName& aSection)
   461 	{
   462 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdSetMinRandomAccessRate"));
   463 	TReal randomAccessRate = 0; 
   464 	
   465 	if(!GetRealFromConfig(aSection, KRandomAccessRate(), randomAccessRate))
   466 		{
   467 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRandomAccessRate());
   468 		SetBlockResult(EFail);
   469 		}
   470 	else
   471 		{
   472 		iDevvr->SetMinRandomAccessRate( randomAccessRate );
   473 		}
   474 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdSetMinRandomAccessRate"));
   475 	}
   476 
   477 /*
   478  * Initializes the video devices, and reserves hardware resources. This method is asynchronous, 
   479  *	DevVideoRecord will call MMMFDevVideoRecordObserver::MdvroInitializeComplete() after initialization has 
   480  *	completed. If direct capture is used, this method also prepares the camera API for capture by calling 
   481  *	PrepareVideoCaptureL(). No DevVideoRecord method may be called while initialization is in progress, the 
   482  *	initialization process can only be cancelled by destroying the DevVideoRecord object. 
   483  *	@param a AsyncErrorIndex 	Command index for async calls to return errors to
   484 */
   485 void CT_MMFDevVideoRecordData::DoCmdInitialize(const TInt aAsyncErrorIndex)
   486 	{
   487 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdInitialize"));
   488 	iAsyncErrorIndex = aAsyncErrorIndex;
   489 	IncOutstanding();
   490 	iDevvr->Initialize();	
   491 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdInitialize"));
   492 	}
   493 
   494 /*
   495  * Sets the complexity level to use for video processing in a hardware device. The level can be changed at 
   496  * any time. 
   497  * @param a AsyncErrorIndex 	Command index for async calls to return errors to
   498 */
   499 void CT_MMFDevVideoRecordData::DoCmdSetComplexityLevel(const TTEFSectionName& aSection)
   500 	{
   501 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdSetComplexityLevel"));
   502 	TInt complexityLevel = 0; 
   503 	
   504 	INFO_PRINTF1(_L("SET COMPLEXITY LEVEL begin"));
   505 	
   506 	if(!GetIntFromConfig(aSection, KComplexityLevel(), complexityLevel))
   507 		{
   508 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KComplexityLevel());
   509 		SetBlockResult(EFail);
   510 		}
   511 	else
   512 		{
   513 		iDevvr->SetComplexityLevel( iEncHWDevId, complexityLevel );
   514 		INFO_PRINTF1(_L("SET COMPLEXITY LEVEL stop"));	
   515 		}
   516 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdSetComplexityLevel"));
   517 	}
   518 
   519 /*
   520  *	Starts recording video. This includes capturing pictures from the camera (if direct capture is used), 
   521  *	pre-processing and encoding. Recording will proceed until it is stopped or paused. Initally recording 
   522  *	is stopped.
   523  * 	@param a AsyncErrorIndex 	Command index for async calls to return errors to
   524  */
   525 void CT_MMFDevVideoRecordData::DoCmdStart(const TInt aAsyncErrorIndex)
   526 	{
   527 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdStart"));
   528 	iAsyncErrorIndex = aAsyncErrorIndex;
   529 	
   530 	iDevvr->Start();
   531 	
   532 	iRequests++;
   533 	if ( FillAndSendBuffer() == 0 ) 
   534 		{
   535 		iStopAfterAllFramesReturned = ETrue;
   536 		}
   537 	IncOutstanding();
   538 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdStart"));
   539 	}
   540 
   541 /*
   542  * 	Pauses video recording. Recording can be resumed using Resume().
   543  */
   544 void CT_MMFDevVideoRecordData::DoCmdPause()
   545 	{
   546 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdPause"));
   547 	iDevvr->Pause();
   548 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdPause"));
   549 	}
   550 
   551 /*
   552  * 	Resumes video recording after a pause.
   553  */
   554 void CT_MMFDevVideoRecordData::DoCmdResume()
   555 	{
   556 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdResume"));
   557 	iDevvr->Resume();
   558 	HandleReturnedPicture();
   559 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdResume"));
   560 	}
   561 
   562 /**
   563  * Stops recording video. No new pictures will be captured, pre-processed, or encoded.
   564  */
   565 void CT_MMFDevVideoRecordData::DoCmdStop()
   566 	{
   567 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdStop"));
   568 	iDevvr->Stop();
   569 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdStop"));	
   570 	}
   571 
   572 /*
   573  * CALLBACKS
   574  */
   575 
   576 /**
   577  * Returns a used input video picture back to the caller. The picture memory can be re-used or freed. 
   578  * 
   579  * @param aPicture	the picture to return
   580  */
   581 void CT_MMFDevVideoRecordData::MdvroReturnPicture(TVideoPicture* aPicture)
   582 	{
   583 	TInt index = 0;
   584 
   585 	iReturnedPictures++;
   586 	iBufferedPictures--;
   587 
   588 	for ( index = 0; index < KBufferInputPictures; index++)
   589 		{
   590 		if ( &(iPicture[index]) == aPicture )
   591 			{//set it free
   592 			iPicture[index].iOptions = 0;
   593 			}
   594 		}	
   595 	HandleReturnedPicture();
   596 	}
   597 
   598 /**
   599  * Callback not used.
   600  * 
   601  * @return None
   602  */
   603 void CT_MMFDevVideoRecordData::MdvroSupplementalInfoSent()
   604 	{
   605 	}
   606 
   607 /**
   608  * Observer callback in Custom interface Buffer management. 
   609  * Client is notified a new buffer(s) is available 
   610  * 
   611  * @return None
   612  */
   613 void CT_MMFDevVideoRecordData::MdvroNewBuffers()
   614 	{
   615 	iCompressedBuffers ++;
   616 	HandleNewBuffer();
   617 	}
   618 
   619 /**
   620  * Reports a fatal decoding or playback error to the client.
   621  * 
   622  * @param aError	The error code
   623  * 
   624  * @return None
   625  */      
   626 void CT_MMFDevVideoRecordData::MdvroFatalError(TInt aError)
   627 	{
   628 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::MdvroFatalError"));
   629 
   630 	DecOutstanding();
   631 
   632 	ERR_PRINTF2(_L("A fatal error ocurred %i"), aError);
   633 	SetAsyncError (iAsyncErrorIndex, aError);
   634 	
   635 	if(iDevvr != NULL)
   636 		{
   637 		delete iDevvr;
   638 		iDevvr = NULL;
   639 		}
   640 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::MdvroFatalError"));
   641 	}
   642 
   643 /**
   644  * Reports that DevVideoRecord initialization has completed. The interface can now be used for video recording. 
   645  * 
   646  * @param aError	Initialization error code, KErrNone if no error occurred
   647  * 
   648  * @return None
   649  */
   650 void CT_MMFDevVideoRecordData::MdvroInitializeComplete(TInt aError)
   651 	{
   652 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::MdvroInitializeComplete"));
   653 	DecOutstanding();
   654 	if ( aError != KErrNone )
   655         {
   656         SetAsyncError (iAsyncErrorIndex, aError);
   657         ERR_PRINTF2(_L("Error at MdvroInitializeComplete %i"), aError);
   658         }
   659 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::MdvroInitializeComplete"));
   660 	}
   661 
   662 /**
   663  * Reports that the input video stream end has been reached and all pictures have been processed.
   664  * This method is only called after the client has called InputEnd(). No more output pictures will be available.
   665  * 
   666  * @return None
   667  */
   668 void CT_MMFDevVideoRecordData::MdvroStreamEnd()
   669 	{
   670 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::MdvroStreamEnd"));
   671 	DecOutstanding();
   672 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::MdvroStreamEnd"));
   673 	}
   674 
   675 /*
   676  * HELPERS
   677  */
   678 
   679 /**
   680  * Sets the Picture Type for the test
   681  * @param aSection			The section in the ini containing data for the command
   682  */
   683 void CT_MMFDevVideoRecordData::SetPictureTypeL(const TTEFSectionName& aSection)
   684 	{
   685 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::SetPictureTypeL"));
   686 	TInt rawPicLength=0;
   687 	TInt picWidth=0;
   688 	TInt picHeight=0;	
   689 	
   690 	if(!GetIntFromConfig(aSection, KFrameRate(), iFrameRate))
   691 		{
   692 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KFrameRate());
   693 		SetBlockResult(EFail);
   694 		}
   695 	
   696 	if(!GetIntFromConfig(aSection, KRawPicLength(), rawPicLength))
   697 		{
   698 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRawPicLength());
   699 		SetBlockResult(EFail);
   700 		}
   701 	
   702 	if(!GetIntFromConfig(aSection, KPicWidth(), picWidth))
   703 		{
   704 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRawPicLength());
   705 		SetBlockResult(EFail);
   706 		}	
   707 	
   708 	if(!GetIntFromConfig(aSection, KPicHeight(), picHeight))
   709 		{
   710 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KRawPicLength());
   711 		SetBlockResult(EFail);
   712 		}	
   713 		
   714 	iPictSize.SetSize(picHeight,picWidth);
   715 	
   716 	INFO_PRINTF1(_L("Creating Data buffers"));
   717 	TUint8* pointer = NULL; 
   718 	if (!iDatabuf)
   719         {
   720         //iDatabuf = new (ELeave) TUint8*[KBufferInputPictures];
   721         iDatabuf = new RPointerArray<TUint8>[KBufferInputPictures];
   722         
   723         for ( TInt i = 0; i < KBufferInputPictures; i ++ ) 
   724             {              
   725             pointer = new (ELeave) TUint8[rawPicLength];
   726             iDatabuf[i].Append(pointer);
   727             iPicture[i].iData.iRawData = new (ELeave) TPtr8(0, 0, 0);
   728             iPicture[i].iData.iRawData->Set(pointer, rawPicLength, rawPicLength );
   729             iPicture[i].iData.iDataSize.SetSize(iPictSize.iWidth, iPictSize.iHeight);
   730             }
   731         }
   732 	INFO_PRINTF1(_L("Data buffers created"));
   733 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::SetPictureTypeL"));
   734 	}
   735 
   736 /**
   737  * create buffers to read data
   738  */
   739 void CT_MMFDevVideoRecordData::CreateBuffers()
   740 	{
   741 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::CreateBuffers"));
   742 	for (TInt i = 0; i < KBufferInputPictures; i ++)
   743 		{
   744 		INFO_PRINTF1(_L("creating buffers"));
   745 		iPicture[i].iData.iRawData = NULL;
   746 		INFO_PRINTF1(_L("buffers created"));
   747 		}
   748 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::CreateBuffers"));
   749 	}
   750 	
   751 
   752 /**
   753  *checks for input file and creates output files
   754  * @param aSection			The section in the ini containing data for the command
   755  */
   756 int CT_MMFDevVideoRecordData::CreateFiles(const TTEFSectionName& aSection)
   757 	{
   758 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::CreateFiles"));
   759 	TInt err = KErrNone;
   760 	TPtrC inputFile;
   761 	TPtrC outputFile;
   762 	TPtrC inputPath;
   763 	TPtrC outputPath;
   764 	if(!GetStringFromConfig(aSection, KInputFile(), inputFile))
   765 		{
   766 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KInputFile());
   767 		SetBlockResult(EFail);
   768 		err = KErrNotFound;
   769 		}
   770 	if(!GetStringFromConfig(aSection, KOutputFile(), outputFile))
   771 		{
   772 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOutputFile());
   773 		SetBlockResult(EFail);
   774 		err = KErrNotFound;
   775 		}
   776 	if(!GetStringFromConfig(aSection, KInputPath(), inputPath))
   777 		{
   778 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KInputPath());
   779 		SetBlockResult(EFail);
   780 		err = KErrNotFound;
   781 		}
   782 	if(!GetStringFromConfig(aSection, KOutputPath(), outputPath))
   783 		{
   784 		ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KOutputFile());
   785 		SetBlockResult(EFail);
   786 		err = KErrNotFound;
   787 		}	
   788 	
   789     if(err == KErrNone)
   790     	{
   791 		TFileName inFileName(inputPath);
   792 	    inFileName.Append(inputFile);
   793 	    TFileName outFileName(outputPath);
   794 	    outFileName.Append(outputFile);
   795 	    
   796 	    err = OpenFile(outFileName, inFileName);
   797     	}
   798     INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::CreateFiles"));
   799     return err;
   800 	}
   801 
   802 /**
   803  * Opens input file.
   804  * Creates output file.
   805  * @param aOutFileName the output file
   806  * @param aInFileName  the input file
   807  */
   808 int CT_MMFDevVideoRecordData::OpenFile(TFileName& aOutFileName, TFileName& aInFileName)
   809 	{
   810 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::OpenFile"));
   811 	TInt err = KErrNone;
   812 	if ( (err=iInFile.Open(iFs, aInFileName, EFileRead | EFileShareReadersOnly)) != KErrNone)
   813 		{  
   814 		ERR_PRINTF2(_L("Couldn't open input file: %i"),err);
   815 		}        
   816 	else
   817 		{
   818 		if((err=iOutFile.Replace(iFs, aOutFileName, EFileShareExclusive|EFileWrite))!= KErrNone)
   819 			{
   820 			ERR_PRINTF2(_L("Couldn't open output file: %i"),err);
   821 			}
   822 		}
   823 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::OpenFile"));
   824 	return err;
   825 	}
   826 
   827 /**
   828  * gets new buffers from buffer array
   829  */
   830 void CT_MMFDevVideoRecordData::HandleNewBuffer()
   831 	{
   832 	TVideoOutputBuffer* tmp=NULL;
   833 	TRAPD(error, tmp = iDevvr->NextBufferL());           
   834 	if (error != KErrNone)
   835 		{
   836 		ERR_PRINTF2(_L("Error in getting NextBufferL, Error: %d"), error);
   837 		SetBlockResult(EFail);
   838 		}
   839 	else
   840 		{
   841 		SaveAndReturnBuffer( tmp );
   842 		}
   843 	}
   844 
   845 /**
   846  * handles the returned pictures 
   847  */
   848 void CT_MMFDevVideoRecordData::HandleReturnedPicture()
   849 	{
   850 	if ( iStopAfterAllFramesReturned )
   851 		{
   852 		}
   853 	else
   854 		{
   855 		//iOutputRequests++;
   856 		if ( FillAndSendBuffer() == 0 ) 
   857 			{
   858 			iStopAfterAllFramesReturned = ETrue;
   859 			}
   860 		}
   861 	}
   862 
   863 /**
   864  *handles out to file requests 
   865  *@param aNumberOfPictures number of pictures to write
   866  */
   867 TInt CT_MMFDevVideoRecordData::HandleOutputRequest()
   868 	{
   869 	TInt request = 1;
   870 	if ( FillAndSendBuffer() == 0 ) 
   871 		{
   872 		//all data read => stop
   873 		iStopAfterAllFramesReturned = ETrue;
   874 		request = 0;
   875 		}
   876 	return request;
   877 	}
   878 
   879 /**
   880  *writes buffer to file
   881  *@param tmp current buffer
   882  */
   883 void CT_MMFDevVideoRecordData::SaveAndReturnBuffer(TVideoOutputBuffer* tmp)
   884     {
   885     iOutFile.Write( tmp->iData );
   886     iDevvr->ReturnBuffer( tmp );
   887     }
   888 
   889 /**
   890  *fills buffer data buffer and process it
   891  */
   892 TInt CT_MMFDevVideoRecordData::FillAndSendBuffer()
   893 	{
   894 	TInt64 tsValue = 0;
   895 	TInt index = 0;
   896 	TInt status = KErrNone;
   897 	TInt error = 1;
   898 	if (iStopAfterAllFramesReturned)
   899 		{
   900 		error = 0;
   901 		}
   902 	else
   903 		{
   904 		for ( index = 0; index < KBufferInputPictures; index++ )
   905 			{// find a free buffer
   906 			if ( iPicture[index].iOptions == 0 )
   907 				{            
   908 				break;
   909 				}
   910 			} 
   911 	
   912 		if ( index == KBufferInputPictures )
   913 			{// all buffers in use, hold on for now        
   914 			error = -1;
   915 			}
   916 		else
   917 			{
   918 			// Reset buffer length
   919 			iPicture[index].iData.iRawData->SetMax();
   920 		
   921 			status = iInFile.Read( *(iPicture[index].iData.iRawData));
   922 			if ( status != KErrNone )
   923 				{    
   924 				iStopAfterAllFramesReturned = ETrue;
   925 				iDevvr->InputEnd();
   926 				error = 0;
   927 				}
   928 			else
   929 				{
   930 				// If the buffer is 0 or incomplete, stop test case
   931 				if ( iPicture[index].iData.iRawData->Length() == 0 || iPicture[index].iData.iRawData->Length() < iPicture[index].iData.iRawData->MaxLength() )
   932 					{        
   933 					iStopAfterAllFramesReturned = ETrue;
   934 					iDevvr->InputEnd();
   935 					error = 0;
   936 					}
   937 				else
   938 					{
   939 					// write data
   940 					tsValue = TReal(iTimeStamp) * TReal(1000000) / TReal(KVEDSPH263TimerResolution);
   941 					iPicture[index].iTimestamp = tsValue;
   942 					iPicture[index].iData.iDataFormat = EYuvRawData;
   943 					iWrittenPictures++;  
   944 					iBufferedPictures++;    
   945 					iPicture[index].iOptions = 1;//mark to be used
   946 					// send it as usually
   947 					TRAPD(error, iDevvr->WritePictureL( &(iPicture[index]) ));
   948 					if(error!=KErrNone)
   949 						{
   950 						ERR_PRINTF2(_L("Error int WritePictureL Error: %d"), error);
   951 						SetError(error);
   952 						}
   953 					iTimeStamp ++;
   954 					}
   955 				}
   956 			}
   957 		}
   958 	return error;
   959 	}
   960 
   961 void CT_MMFDevVideoRecordData::DoCmdUtilityGetEnvironmentL()
   962 	{
   963 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DoCmdUtilityGetEnvironmentL"));
   964 	RArray<TUid> decoders;	
   965 	RArray<TPictureRateAndSize> maxPictureRates;
   966 	TBuf<255> mime;
   967 	CleanupClosePushL (decoders);	
   968 	iDevvr->GetEncoderListL(decoders);
   969 	CVideoEncoderInfo* info = NULL;
   970 	for (TInt i = 0; i < decoders.Count ();i++)
   971 		{
   972 		info =iDevvr->VideoEncoderInfoLC(decoders[i]);		
   973 		TSize maxSize = info->MaxPictureSize();
   974 		INFO_PRINTF6(_L("\n%S\nManufacturer%S\nUid: 0x%x\nAccelerated: %i\nSupports Direct Capture: %i"), 
   975 				&info->Identifier(),
   976 				&info->Manufacturer(),
   977 				decoders[i].iUid,
   978 				info->Accelerated(),
   979 				info->SupportsDirectCapture());
   980 		
   981 		INFO_PRINTF3(_L("\nMax width %i, Max height %i"),maxSize.iWidth, maxSize.iHeight);
   982 		
   983 		maxPictureRates = info->MaxPictureRates(); 
   984 
   985 		INFO_PRINTF4(_L("\nData unit types supported:%d\nData unit encapsulations:%d\nMaximum number of bitrate layers supported:%d"),
   986 				info->SupportedDataUnitTypes(),
   987 				info->SupportedDataUnitEncapsulations(),
   988 				info->MaxBitrateLayers()
   989 				);
   990 		
   991 
   992 		INFO_PRINTF4(_L("\nPicture options supported:%d\nSupportsPictureLoss:%i\nSupportsSliceLoss:%i"),
   993 				info->SupportedPictureOptions(),
   994 				info->SupportsPictureLoss(),
   995 				info->SupportsSliceLoss()
   996 				);
   997 		
   998 		INFO_PRINTF4(_L("\nSupplemental enhancement info:%i\nMaximum unequal error protection level:%d\nMaxBitrate:%d"),
   999 				info->SupportsSupplementalEnhancementInfo(),
  1000 				info->MaxUnequalErrorProtectionLevels(),
  1001 				info->MaxBitrate()
  1002 				);
  1003 		
  1004 		INFO_PRINTF2(_L("Coding-standard specific information: %S"),&info->CodingStandardSpecificInfo());
  1005 		TInt j = 0;
  1006 		for (j = 0; j < maxPictureRates.Count(); j++)
  1007 			{
  1008 			TSize pictureSize=maxPictureRates[j].iPictureSize;			
  1009 			INFO_PRINTF4(_L("max width: %i, max height %i, max rate %f"),
  1010 					pictureSize.iWidth, pictureSize.iHeight, maxPictureRates[j].iPictureRate);
  1011 			}
  1012 		
  1013 		const RPointerArray<CCompressedVideoFormat>& outputFormats =info->SupportedOutputFormats();
  1014 		for (j = 0; j < outputFormats.Count(); j++)
  1015 			{
  1016 			mime.Copy(outputFormats[j]->MimeType());		
  1017 			INFO_PRINTF3(_L("Supported type %d MIMETYPE: %S"),j,&mime);					
  1018 			}
  1019 		CleanupStack::Pop (info);
  1020 		}
  1021 	CleanupStack::PopAndDestroy(&decoders);
  1022 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DoCmdUtilityGetEnvironmentL"));
  1023 	}
  1024 
  1025 void CT_MMFDevVideoRecordData::DoCmdSetRateControlOptions(const TTEFSectionName& aSection)
  1026     {
  1027 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::SetRateControlOptions"));
  1028 
  1029 
  1030 	TInt layer = 0;
  1031 	TInt bitrateControlInt = 0;
  1032 	TInt bitrate = 0;
  1033 	TInt pictureQuality = 0;
  1034 	TReal pictureRate;  
  1035 	TReal qualityTemporalTradeoff;  
  1036 	TReal latencyQualityTradeoff; 	
  1037 	
  1038     if(!GetIntFromConfig(aSection, KLayer(), layer))
  1039         {
  1040         ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLayer());
  1041         SetBlockResult(EFail);
  1042         }
  1043     if(!GetIntFromConfig(aSection, KBitrateControlType(), bitrateControlInt))
  1044         {
  1045         ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KBitrateControlType());
  1046         SetBlockResult(EFail);
  1047         }	
  1048     if(!GetIntFromConfig(aSection, KBitrate(), bitrate))
  1049         {
  1050         ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLayer());
  1051         SetBlockResult(EFail);
  1052         }		
  1053     if(!GetIntFromConfig(aSection, KPictureQuality(), pictureQuality))
  1054         {
  1055         ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPictureQuality());
  1056         SetBlockResult(EFail);
  1057         }	
  1058     if(!GetRealFromConfig(aSection, KPicRate(), pictureRate))
  1059         {
  1060         ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KPicRate());
  1061         SetBlockResult(EFail);
  1062         }	
  1063     if(!GetRealFromConfig(aSection, KQualityTempTradeOff(), qualityTemporalTradeoff))
  1064         {
  1065         ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KQualityTempTradeOff());
  1066         SetBlockResult(EFail);
  1067         }	
  1068     if(!GetRealFromConfig(aSection, KLatencyQuality(), latencyQualityTradeoff))
  1069         {
  1070         ERR_PRINTF2(_L("Error in getting parameter %S from INI file"), &KLatencyQuality());
  1071         SetBlockResult(EFail);
  1072         }	
  1073 
  1074 	TBitrateControlType bitrateControlType;
  1075 	switch (bitrateControlInt) 
  1076 		{
  1077 		case 1: bitrateControlType = EBrControlNone;
  1078 				break;
  1079 		case 2: bitrateControlType = EBrControlStream;
  1080 				break;		
  1081 		case 3: bitrateControlType = EBrControlPicture;
  1082 				break;		
  1083 		default:bitrateControlType = EBrControlStream; 
  1084 		}
  1085 
  1086 
  1087     TRateControlOptions rateControlOptions;
  1088 	rateControlOptions.iControl = bitrateControlType;
  1089 	rateControlOptions.iBitrate = bitrate;
  1090 	rateControlOptions.iPictureQuality = pictureQuality;
  1091 	rateControlOptions.iPictureRate = pictureRate;
  1092 	rateControlOptions.iQualityTemporalTradeoff = qualityTemporalTradeoff;
  1093 	rateControlOptions.iLatencyQualityTradeoff = latencyQualityTradeoff;
  1094 
  1095 	iDevvr->SetRateControlOptions(layer, rateControlOptions);  
  1096 
  1097 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::SetRateControlOptions"));
  1098 
  1099 	}
  1100 
  1101 
  1102 
  1103 
  1104 
  1105 void CT_MMFDevVideoRecordData::DestroyData()
  1106 	{
  1107 	INFO_PRINTF1(_L("*START*CT_MMFDevVideoRecordData::DestroyData"));
  1108 	delete iDevvr;
  1109 	iDevvr = NULL;
  1110 	INFO_PRINTF1(_L("*END*CT_MMFDevVideoRecordData::DestroyData"));
  1111 	}