os/mm/mmlibs/mmfw/tsrc/mmfunittest/videorenderer/src/testrenderer.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include "testrenderer.h"
sl@0
    17
#include "videoframebuffer.h"
sl@0
    18
#include "testgceharness.h"
sl@0
    19
sl@0
    20
RTestRendererStep* RTestRendererStep::NewL(const TDesC& aStepName, TBool aTimed)
sl@0
    21
	{
sl@0
    22
	RTestRendererStep* self = new (ELeave) RTestRendererStep(aStepName, aTimed);
sl@0
    23
	return self;
sl@0
    24
	}
sl@0
    25
sl@0
    26
RTestRendererStep::RTestRendererStep(const TDesC& aStepName, TBool aTimed) :
sl@0
    27
	iVideoRenderer(NULL),
sl@0
    28
	iTimed(aTimed)
sl@0
    29
	{
sl@0
    30
	iTestStepName = aStepName;
sl@0
    31
sl@0
    32
	// size for buffer created
sl@0
    33
	iSize.iWidth = 1024;
sl@0
    34
	iSize.iHeight = 768;
sl@0
    35
	iVideoFormat.iDataFormat = ERgbRawData;
sl@0
    36
	iVideoFormat.iRgbFormat = ERgb32bit888;
sl@0
    37
	}
sl@0
    38
sl@0
    39
void RTestRendererStep::MvroVideoBufferAvailable()
sl@0
    40
	{
sl@0
    41
	INFO_PRINTF1(_L("MvroVideoBufferAvailable() callback received"));
sl@0
    42
	TRAPD(err, FsmL(EBufferAvailable));
sl@0
    43
	if (err != KErrNone)
sl@0
    44
		{
sl@0
    45
		ERR_PRINTF2(_L("FsmL(EBufferAvailable) failed with %d"), err);
sl@0
    46
		EndTest(EFail);
sl@0
    47
		}
sl@0
    48
	}
sl@0
    49
sl@0
    50
void RTestRendererStep::MvroBufferDisplayed(TInt aBufferId, const TTime& aTime)
sl@0
    51
	{
sl@0
    52
	INFO_PRINTF2(_L("MvroBufferDisplayed() callback received aBufferId=%d"), aBufferId);
sl@0
    53
	iBufferId = aBufferId;
sl@0
    54
	iDisplayedTime = aTime;
sl@0
    55
	TRAPD(err, FsmL(EBufferDisplayed));
sl@0
    56
	if (err != KErrNone)
sl@0
    57
		{
sl@0
    58
		ERR_PRINTF2(_L("FsmL(EBufferDisplayed) failed with %d"), err);
sl@0
    59
		EndTest(EFail);
sl@0
    60
		}
sl@0
    61
	}
sl@0
    62
sl@0
    63
void RTestRendererStep::MvroBufferSkipped(TInt aBufferId)
sl@0
    64
	{
sl@0
    65
	INFO_PRINTF2(_L("MvroBufferSkipped() callback received aBufferId=%d"), aBufferId);
sl@0
    66
	iBufferId = aBufferId;
sl@0
    67
	TRAPD(err, FsmL(EBufferSkipped));
sl@0
    68
	if (err != KErrNone)
sl@0
    69
		{
sl@0
    70
		ERR_PRINTF2(_L("FsmL(EBufferSkipped) failed with %d"), err);
sl@0
    71
		EndTest(EFail);
sl@0
    72
		}
sl@0
    73
	}
sl@0
    74
sl@0
    75
TVerdict RTestRendererStep::DoTestStepPreambleL()
sl@0
    76
	{
sl@0
    77
    // Install the Active Scheduler
sl@0
    78
    iActiveScheduler = new(ELeave) CActiveScheduler;
sl@0
    79
    CActiveScheduler::Install(iActiveScheduler);
sl@0
    80
	iActiveSchedulerStarted = EFalse;
sl@0
    81
		
sl@0
    82
    iBuffAvailCallback = 0;
sl@0
    83
    iBuffDisplayCallback = 0;
sl@0
    84
    iBuffSkipCallback = 0;
sl@0
    85
sl@0
    86
    // The following is required because of the panic tests.
sl@0
    87
    // When a thread panics the global pointer is not reset to NULL
sl@0
    88
    // and the following test fails because the pointer is hanging.
sl@0
    89
    // When testframework creates a thread to run the test step it also
sl@0
    90
    // defines a heap and the default process heap is not used. Therefore
sl@0
    91
    // when the thread dies the heap is no longer available.
sl@0
    92
	CTestGCEHarness::ResetGlobalPointer();
sl@0
    93
    
sl@0
    94
    // Initialise Window server objects
sl@0
    95
    InitWservL();
sl@0
    96
sl@0
    97
    return EPass;
sl@0
    98
	}
sl@0
    99
sl@0
   100
TVerdict RTestRendererStep::DoTestStepPostambleL()
sl@0
   101
	{
sl@0
   102
	CActiveScheduler::Install(NULL);
sl@0
   103
	delete iActiveScheduler;
sl@0
   104
    iActiveScheduler = NULL;
sl@0
   105
sl@0
   106
    // Destroy Window server objects
sl@0
   107
    DeInitWserv();
sl@0
   108
sl@0
   109
    return EPass;
sl@0
   110
	}
sl@0
   111
sl@0
   112
void RTestRendererStep::InitWservL()
sl@0
   113
    {
sl@0
   114
    TInt err = iWs.Connect();
sl@0
   115
    if (err != KErrNone)
sl@0
   116
        {
sl@0
   117
        // Access violation if ws is null
sl@0
   118
        ERR_PRINTF1(_L("Cannot test, no window server available"));
sl@0
   119
        User::Leave(err);
sl@0
   120
        }
sl@0
   121
sl@0
   122
    iScreen = new (ELeave) CWsScreenDevice(iWs); // make device for this session
sl@0
   123
    User::LeaveIfError(iScreen->Construct()); // and complete its construction
sl@0
   124
sl@0
   125
    iRootWindow = RWindowGroup(iWs);
sl@0
   126
    User::LeaveIfError(iRootWindow.Construct((TUint32)this, ETrue));
sl@0
   127
sl@0
   128
    iWindow = new(ELeave) RWindow(iWs);
sl@0
   129
    User::LeaveIfError(((RWindow*)iWindow)->Construct(iRootWindow,((TUint32)(this)) + 1));
sl@0
   130
    iWindow->SetExtent(TPoint(0,0), TSize(100,100));
sl@0
   131
    iWindow->SetVisible(ETrue);
sl@0
   132
    iWindow->SetRequiredDisplayMode(EColor16MA);
sl@0
   133
    iWindow->Activate();
sl@0
   134
    }
sl@0
   135
sl@0
   136
void RTestRendererStep::DeInitWserv()
sl@0
   137
    {
sl@0
   138
    if (iWindow)
sl@0
   139
        {
sl@0
   140
        iWindow->Close();
sl@0
   141
        delete iWindow;
sl@0
   142
        iWindow = NULL;
sl@0
   143
        }
sl@0
   144
    iRootWindow.Close();
sl@0
   145
    delete iScreen;
sl@0
   146
    iScreen = NULL;
sl@0
   147
    iWs.Flush();
sl@0
   148
    iWs.Close();
sl@0
   149
    }
sl@0
   150
sl@0
   151
TInt RTestRendererStep::SetBackgroundSurface(TSurfaceId& id)
sl@0
   152
	{
sl@0
   153
	TInt err = iWindow->SetBackgroundSurface(id);
sl@0
   154
	iWs.Finish();
sl@0
   155
	return err;
sl@0
   156
	}
sl@0
   157
sl@0
   158
void RTestRendererStep::RemoveBackgroundSurface()
sl@0
   159
	{
sl@0
   160
	iWindow->RemoveBackgroundSurface(ETrue);
sl@0
   161
	}
sl@0
   162
sl@0
   163
TVerdict RTestRendererStep::DoTestStepL()
sl@0
   164
	{
sl@0
   165
	__UHEAP_MARK;
sl@0
   166
	
sl@0
   167
    // Call the state handler from IDLE state
sl@0
   168
    TRAPD(err, FsmL(EStartTest));
sl@0
   169
    if (err == KErrNone && iTestStepResult == EPass)
sl@0
   170
        {
sl@0
   171
        // Start the scheduler - Done only once !
sl@0
   172
    	iActiveSchedulerStarted = ETrue;
sl@0
   173
        CActiveScheduler::Start();    
sl@0
   174
        }
sl@0
   175
    else if (err != KErrNone)
sl@0
   176
    	{
sl@0
   177
        ERR_PRINTF2(_L("FsmL(EStartTest) leave with %d"), err);
sl@0
   178
    	iTestStepResult = EFail;
sl@0
   179
    	}
sl@0
   180
sl@0
   181
	delete iVideoRenderer;
sl@0
   182
	iVideoRenderer = NULL;
sl@0
   183
sl@0
   184
    // cleanup test harness
sl@0
   185
    CTestGCEHarness::Remove();
sl@0
   186
	
sl@0
   187
	__UHEAP_MARKEND;
sl@0
   188
sl@0
   189
    return iTestStepResult;
sl@0
   190
	}
sl@0
   191
sl@0
   192
void RTestRendererStep::FsmL(TTestRendererEvents aEventCode)
sl@0
   193
	{
sl@0
   194
    switch (aEventCode)
sl@0
   195
        {
sl@0
   196
        case EStartTest:
sl@0
   197
        	{
sl@0
   198
        	iFsmState = EStateCreate;
sl@0
   199
        	TInt numBuffers = 1;
sl@0
   200
        	
sl@0
   201
        	INFO_PRINTF2(_L("CVideoRenderer::NewL() Timed=%d"), iTimed);
sl@0
   202
        	CTestGCEHarness::NewL(numBuffers);
sl@0
   203
            iVideoRenderer = CVideoRenderer::NewL(*this, iTimed);
sl@0
   204
            
sl@0
   205
            INFO_PRINTF1(_L("iVideoRenderer->GetSupportedFormatsL()"));
sl@0
   206
            RArray<TUncompressedVideoFormat> expectedArray;
sl@0
   207
            CleanupClosePushL(expectedArray);
sl@0
   208
            TUncompressedVideoFormat format;
sl@0
   209
            format.iDataFormat = ERgbRawData;
sl@0
   210
    		format.iRgbFormat = ERgb16bit444;
sl@0
   211
    		expectedArray.AppendL(format); // append EVideoRendererPixelFormatXRGB_4444
sl@0
   212
    		format.iDataFormat = ERgbRawData;
sl@0
   213
    		format.iRgbFormat = ERgb16bit565;
sl@0
   214
    		expectedArray.AppendL(format); // append EVideoRendererPixelFormatRGB_565
sl@0
   215
    		format.iDataFormat = ERgbRawData;
sl@0
   216
    		format.iRgbFormat = ERgb32bit888;
sl@0
   217
    		expectedArray.AppendL(format); // append EVideoRendererPixelFormatXRGB_8888:
sl@0
   218
sl@0
   219
    		RArray<TUncompressedVideoFormat> array;
sl@0
   220
            CleanupClosePushL(array);
sl@0
   221
        	iVideoRenderer->GetSupportedFormatsL(array);
sl@0
   222
        	TInt expectedCount = expectedArray.Count();
sl@0
   223
        	TESTL(array.Count() == expectedCount);
sl@0
   224
        	for (TInt i = 0; i < expectedCount; i++)
sl@0
   225
        		{
sl@0
   226
        		TESTL(expectedArray[i] == array[i]);
sl@0
   227
        		}
sl@0
   228
sl@0
   229
        	CleanupStack::PopAndDestroy(2, &expectedArray);
sl@0
   230
        	CreateSurfaceL(numBuffers);
sl@0
   231
        	
sl@0
   232
            break;
sl@0
   233
        	}
sl@0
   234
        case EBufferAvailable:
sl@0
   235
        	iBuffAvailCallback++;
sl@0
   236
        	if (iFsmState == EStateCreate && iBuffAvailCallback == 1)
sl@0
   237
        		{
sl@0
   238
	            iFsmState = EStateUpdate;
sl@0
   239
sl@0
   240
	        	// map surface to display
sl@0
   241
	            TInt err = SetBackgroundSurface(iSurfaceId);
sl@0
   242
	            if (err != KErrNone)
sl@0
   243
	            	{
sl@0
   244
		        	ERR_PRINTF2(_L("RWindow::SetBackgroundSurface() returned %d"), err);
sl@0
   245
                    EndTest(EFail);
sl@0
   246
                    break;
sl@0
   247
	            	}
sl@0
   248
sl@0
   249
	        	TTime presentationTime;
sl@0
   250
	        	presentationTime.UniversalTime();
sl@0
   251
	        	TTimeIntervalMicroSeconds microsec(500000); // use half a second delay
sl@0
   252
	        	presentationTime += microsec;
sl@0
   253
	        	GetNextBufferAndSubmitUpdateL(0, KRgbGreen, presentationTime);
sl@0
   254
        		}
sl@0
   255
        	else if (iFsmState == EStateUpdate && iBuffAvailCallback == 2)
sl@0
   256
        		{
sl@0
   257
	        	iFsmState = EStateReleaseBuffer;
sl@0
   258
sl@0
   259
	        	// buffer is available again after update;
sl@0
   260
        	    // try to get next buffer
sl@0
   261
        	    TVideoFrameBuffer* buffer;
sl@0
   262
	            INFO_PRINTF1(_L("iVideoRenderer->NextBuffer() after update"));
sl@0
   263
	        	buffer = iVideoRenderer->NextBuffer();
sl@0
   264
	        	TESTL(buffer != NULL);
sl@0
   265
	            INFO_PRINTF1(_L("iVideoRenderer->ReleaseBuffer()"));
sl@0
   266
	        	iVideoRenderer->ReleaseBuffer(buffer);
sl@0
   267
        		}
sl@0
   268
        	else if (iFsmState == EStateReleaseBuffer)
sl@0
   269
        		{
sl@0
   270
        		if (iBuffDisplayCallback == 1)
sl@0
   271
        			{
sl@0
   272
            		// both release buffer callback and display callback are received, test complete with pass
sl@0
   273
                	EndTest(EPass);
sl@0
   274
        			}
sl@0
   275
        		// else continue waiting for more callback
sl@0
   276
        		}
sl@0
   277
        	else
sl@0
   278
        		{
sl@0
   279
        		ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState);
sl@0
   280
            	EndTest(EFail);
sl@0
   281
        		}
sl@0
   282
sl@0
   283
        	break;
sl@0
   284
        case EBufferDisplayed:
sl@0
   285
        	iBuffDisplayCallback++;
sl@0
   286
        	if ((iFsmState != EStateUpdate && iFsmState != EStateReleaseBuffer) ||
sl@0
   287
        		iBufferId != 0)
sl@0
   288
        		{
sl@0
   289
        		// not in a valid state
sl@0
   290
        		ERR_PRINTF2(_L("State %d was not expected when handing buffer displayed event."), iFsmState);
sl@0
   291
            	EndTest(EFail);
sl@0
   292
        		}
sl@0
   293
        	if (iFsmState == EStateReleaseBuffer && iBuffAvailCallback == 3)
sl@0
   294
        		{
sl@0
   295
        		// both release buffer callback and display callback are received, test complete with pass
sl@0
   296
        		EndTest(EPass);
sl@0
   297
        		}
sl@0
   298
        	// otherwise, haven't received release callback yet, continue waiting
sl@0
   299
        	break;
sl@0
   300
        default:
sl@0
   301
			// unexpected event
sl@0
   302
			ERR_PRINTF2(_L("Unexpected event code %d in RTestRendererStep::FsmL"), aEventCode);
sl@0
   303
        	EndTest(EFail);
sl@0
   304
        	break;
sl@0
   305
        }
sl@0
   306
	}
sl@0
   307
sl@0
   308
void RTestRendererStep::EndTest(TVerdict aVerdict)
sl@0
   309
	{
sl@0
   310
    iTestStepResult = aVerdict;
sl@0
   311
    if (iActiveSchedulerStarted)
sl@0
   312
    	{
sl@0
   313
    	CActiveScheduler::Stop();
sl@0
   314
    	}
sl@0
   315
	}
sl@0
   316
sl@0
   317
void RTestRendererStep::CreateRendererAndSurfaceL(TInt aNumBuffers)
sl@0
   318
	{
sl@0
   319
	INFO_PRINTF2(_L("CVideoRenderer::NewL() Timed=%d"), iTimed);
sl@0
   320
	CTestGCEHarness::NewL(aNumBuffers);
sl@0
   321
	iVideoRenderer = CVideoRenderer::NewL(*this, iTimed);
sl@0
   322
	CreateSurfaceL(aNumBuffers);
sl@0
   323
	}
sl@0
   324
sl@0
   325
void RTestRendererStep::CreateSurfaceL(TInt aNumBuffers)
sl@0
   326
	{
sl@0
   327
	INFO_PRINTF1(_L("iVideoRenderer->CreateSurfaceL()"));
sl@0
   328
	iVideoRenderer->CreateSurfaceL(iSize, aNumBuffers, iVideoFormat, iSurfaceId);
sl@0
   329
	}
sl@0
   330
sl@0
   331
void RTestRendererStep::GetNextBufferAndSubmitUpdateL(TInt aExpectedBufId, TRgb aColor, const TTime& aPresentationTime)
sl@0
   332
	{
sl@0
   333
    TVideoFrameBuffer* buffer = GetNextBufferL(aExpectedBufId, aColor);
sl@0
   334
    INFO_PRINTF1(_L("iVideoRenderer->UpdateBuffer()"));
sl@0
   335
	iVideoRenderer->UpdateBuffer(buffer, aPresentationTime);
sl@0
   336
	}
sl@0
   337
sl@0
   338
TVideoFrameBuffer* RTestRendererStep::GetNextBufferL(TInt aExpectedBufId, TRgb aColor)
sl@0
   339
	{
sl@0
   340
	INFO_PRINTF1(_L("iVideoRenderer->NextBuffer()"));
sl@0
   341
	TVideoFrameBuffer* buffer;
sl@0
   342
	buffer = iVideoRenderer->NextBuffer();
sl@0
   343
	TESTL(buffer != NULL);
sl@0
   344
	TESTL(buffer->Format() == iVideoFormat);
sl@0
   345
	TESTL(buffer->Stride() == iSize.iWidth *  4); // 4 bite per pixel for ERgb32bit888
sl@0
   346
	TESTL(buffer->BufferId() == aExpectedBufId);
sl@0
   347
	TESTL(buffer->Buffer() != NULL);
sl@0
   348
	
sl@0
   349
	TInt bufSize = buffer->Stride() * iSize.iHeight;
sl@0
   350
	Mem::Fill(buffer->Buffer(), bufSize, aColor.Internal());
sl@0
   351
	return buffer;
sl@0
   352
	}
sl@0
   353
sl@0
   354
RTestRendererReplaceStep* RTestRendererReplaceStep::NewL(const TDesC& aStepName, TBool aTimed)
sl@0
   355
	{
sl@0
   356
	RTestRendererReplaceStep* self = new (ELeave) RTestRendererReplaceStep(aStepName, aTimed);
sl@0
   357
	return self;
sl@0
   358
	}
sl@0
   359
sl@0
   360
RTestRendererReplaceStep::RTestRendererReplaceStep(const TDesC& aStepName, TBool aTimed) :
sl@0
   361
	RTestRendererStep(aStepName, aTimed)
sl@0
   362
	{
sl@0
   363
	}
sl@0
   364
sl@0
   365
void RTestRendererReplaceStep::FsmL(TTestRendererEvents aEventCode)
sl@0
   366
	{
sl@0
   367
	switch (aEventCode)
sl@0
   368
	    {
sl@0
   369
	    case EStartTest:
sl@0
   370
	    	iFsmState = EStateCreate;
sl@0
   371
	        CreateRendererAndSurfaceL(1);
sl@0
   372
	        break;
sl@0
   373
	    case EBufferAvailable:
sl@0
   374
	    	iBuffAvailCallback++;
sl@0
   375
	    	if (iFsmState == EStateCreate && iBuffAvailCallback == 1)
sl@0
   376
	    		{
sl@0
   377
	            iFsmState = EStateUpdate;
sl@0
   378
sl@0
   379
    	    	// received the first callback, map surface to display
sl@0
   380
	            TInt err = SetBackgroundSurface(iSurfaceId);
sl@0
   381
	            TESTL(err == KErrNone);
sl@0
   382
sl@0
   383
	            // send the buffer
sl@0
   384
	            TTime presentationTime(0);
sl@0
   385
	            GetNextBufferAndSubmitUpdateL(0, KRgbGreen, presentationTime);
sl@0
   386
	    		}
sl@0
   387
	    	else if (iFsmState == EStateUpdate)
sl@0
   388
	    		{
sl@0
   389
	    		if (iBuffDisplayCallback == 1 && iBuffAvailCallback == 2)
sl@0
   390
	    			{
sl@0
   391
	    			iFsmState = EStateReplaceSurface;
sl@0
   392
	    			ReplaceSurfaceL();
sl@0
   393
	    			}
sl@0
   394
	    		}
sl@0
   395
	    	else if (iFsmState == EStateReplaceSurface && iBuffAvailCallback == 1)
sl@0
   396
	    		{
sl@0
   397
    	    	// received the first callback, map surface to display
sl@0
   398
	            TInt err = SetBackgroundSurface(iSurfaceId);
sl@0
   399
	            if (err != KErrNone)
sl@0
   400
	            	{
sl@0
   401
		        	ERR_PRINTF2(_L("RWindow::SetBackgroundSurface() returned %d"), err);
sl@0
   402
                    EndTest(EFail);
sl@0
   403
	            	}
sl@0
   404
	    		}
sl@0
   405
	    	else if (iFsmState == EStateReplaceSurface && iBuffAvailCallback == 2)
sl@0
   406
            	{
sl@0
   407
	            iFsmState = EStateUpdateAfterReplace;
sl@0
   408
sl@0
   409
	            // send the buffer
sl@0
   410
	            
sl@0
   411
	            TTime presentationTime1;
sl@0
   412
	            presentationTime1.UniversalTime();
sl@0
   413
	            TTimeIntervalMicroSeconds delay(500);
sl@0
   414
	            TTime presentationTime2 = presentationTime1 + delay;
sl@0
   415
	            
sl@0
   416
	            GetNextBufferAndSubmitUpdateL(0, KRgbGreen, presentationTime1);
sl@0
   417
	            GetNextBufferAndSubmitUpdateL(1, KRgbGreen, presentationTime2);
sl@0
   418
            	}
sl@0
   419
	    	else if (iFsmState == EStateUpdateAfterReplace)
sl@0
   420
	    		{
sl@0
   421
	    		if (iBuffDisplayCallback == 2 && iBuffAvailCallback == 3)
sl@0
   422
	    			{
sl@0
   423
	    			EndTest(EPass);
sl@0
   424
	    			}
sl@0
   425
	    		// else continue waiting for more callback
sl@0
   426
	    		}
sl@0
   427
	    	else
sl@0
   428
	    		{
sl@0
   429
	    		// unexpected state, fail test
sl@0
   430
	    		ERR_PRINTF2(_L("State %d was not expected when handling buffer available event."), iFsmState);
sl@0
   431
	        	EndTest(EFail);
sl@0
   432
	    		}
sl@0
   433
	
sl@0
   434
	    	break;
sl@0
   435
	    case EBufferDisplayed:
sl@0
   436
	    	iBuffDisplayCallback++;
sl@0
   437
	    	if (iFsmState == EStateUpdate && iBuffDisplayCallback == 1 && iBufferId == 0)
sl@0
   438
	    		{
sl@0
   439
	    		// receive display callback
sl@0
   440
	        	if (iBuffAvailCallback == 2)
sl@0
   441
	        		{
sl@0
   442
	    			iFsmState = EStateReplaceSurface;
sl@0
   443
	    			ReplaceSurfaceL();
sl@0
   444
	        		}
sl@0
   445
	    		}
sl@0
   446
	    	else if (iFsmState == EStateUpdateAfterReplace && iBuffDisplayCallback == 1 && iBufferId == 0)
sl@0
   447
	    		{
sl@0
   448
	    		// receive display callback
sl@0
   449
	    		}
sl@0
   450
	    	else if (iFsmState == EStateUpdateAfterReplace && iBuffDisplayCallback == 2 && iBufferId == 1)
sl@0
   451
	    		{
sl@0
   452
	        	if (iBuffAvailCallback == 3)
sl@0
   453
	        		{
sl@0
   454
	    			EndTest(EPass);
sl@0
   455
	        		}
sl@0
   456
	        	// else haven't received all callback, continue waiting
sl@0
   457
	    		}
sl@0
   458
	    	else
sl@0
   459
	    		{
sl@0
   460
	    		// not in a valid state
sl@0
   461
	    		ERR_PRINTF2(_L("State %d was not expected when handling buffer displayed event."), iFsmState);
sl@0
   462
	        	EndTest(EFail);
sl@0
   463
	    		}
sl@0
   464
	    	break;
sl@0
   465
	    case EBufferSkipped:
sl@0
   466
	    	ERR_PRINTF1(_L("Frame unexpectedly skipped"));
sl@0
   467
        	EndTest(EFail);
sl@0
   468
	    	break;
sl@0
   469
	    }
sl@0
   470
	}
sl@0
   471
sl@0
   472
void RTestRendererReplaceStep::ReplaceSurfaceL()
sl@0
   473
	{
sl@0
   474
	// reset the number of callback
sl@0
   475
	iBuffDisplayCallback = 0;
sl@0
   476
	iBuffAvailCallback = 0;
sl@0
   477
	
sl@0
   478
	RemoveBackgroundSurface();
sl@0
   479
	
sl@0
   480
	// received all expected callback for update
sl@0
   481
	// destroy surface and create new one for testing replace surface
sl@0
   482
	INFO_PRINTF1(_L("iVideoRenderer->DestroySurface()"));
sl@0
   483
	iVideoRenderer->DestroySurface(iSurfaceId);
sl@0
   484
	TInt buffers = 2;
sl@0
   485
	CTestGCEHarness::ResetBuffersL(buffers);
sl@0
   486
	CreateSurfaceL(buffers);
sl@0
   487
	}
sl@0
   488
sl@0
   489
/**
sl@0
   490
Standard static NewL() taking a callback function
sl@0
   491
*/
sl@0
   492
CCallBackTimer* CCallBackTimer::NewL(TCallBack aCallBack, TPriority aPriority)
sl@0
   493
	{
sl@0
   494
	CCallBackTimer* self = new(ELeave) CCallBackTimer(aCallBack, aPriority);
sl@0
   495
	CleanupStack::PushL(self);
sl@0
   496
	self->ConstructL();
sl@0
   497
	CleanupStack::Pop(self);
sl@0
   498
	return self;
sl@0
   499
	}
sl@0
   500
sl@0
   501
/**
sl@0
   502
Private c'tor
sl@0
   503
*/
sl@0
   504
CCallBackTimer::CCallBackTimer(TCallBack aCallBack, TPriority aPriority) :
sl@0
   505
	CTimer(aPriority), iCallBack(aCallBack)
sl@0
   506
	{
sl@0
   507
	CActiveScheduler::Add(this);
sl@0
   508
	}
sl@0
   509
sl@0
   510
/*
sl@0
   511
Callback on timer complete
sl@0
   512
*/
sl@0
   513
void CCallBackTimer::RunL()
sl@0
   514
	{
sl@0
   515
	iCallBack.CallBack();
sl@0
   516
	}