vtengines/videoteleng/Src/Media/CVtEngDrawNGA.cpp
changeset 18 d9b6a8729acd
parent 4 6dc066157ed4
child 23 c378a0498b84
child 27 dcbddbbaf8fd
equal deleted inserted replaced
4:6dc066157ed4 18:d9b6a8729acd
     1 /*
       
     2 * Copyright (c) 2004-2006 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:  Class for NGA Drawer.
       
    15 *
       
    16 */
       
    17 
       
    18 // INCLUDE FILES
       
    19 
       
    20 #include "CVtEngDrawNGA.h"
       
    21 #include "CVtEngEventManager.h"
       
    22 #include "VtEngPanic.h"
       
    23 #include "MVtEngFrameObserver.h"
       
    24 #include "CVtEngSettings.h"
       
    25 #include "VtEngUtils.h"
       
    26 #include <videotelephonyvariant.hrh>
       
    27 #include <tdisplaysinkparamsnga.h>
       
    28 #include <cvtlogger.h>
       
    29 #include <graphics/surfaceconfiguration.h>
       
    30 
       
    31 // Reversed enumeration for the bitmaps.
       
    32 static const MDisplaySink::TBitmapNo KVtEngBitmapNoReversed[] =
       
    33         {
       
    34         MDisplaySink::ESecondBitmap,
       
    35         MDisplaySink::EFirstBitmap
       
    36         };
       
    37 
       
    38 // -----------------------------------------------------------------------------
       
    39 // CVtEngDrawNGA::TVTSurfaceBuffer::TVTSurfaceBuffer
       
    40 //
       
    41 // -----------------------------------------------------------------------------
       
    42 //
       
    43 TVTSurfaceBuffer::TVTSurfaceBuffer( TUint8* aBuffer, TInt aSurfaceNo )
       
    44     : iBuffer( aBuffer ), iSurfaceBufferNo(aSurfaceNo)
       
    45     {
       
    46     __VTPRINTENTER( "RVD(NGA).TVTSurfaceBuffer.Ctor" )
       
    47     __VTPRINTEXIT( "RVD(NGA).TVTSurfaceBuffer.Ctor" )
       
    48     }
       
    49 // -----------------------------------------------------------------------------
       
    50 // CVtEngDrawNGA::TVTSurfaceBuffer::Buffer
       
    51 //
       
    52 // -----------------------------------------------------------------------------
       
    53 //
       
    54 TUint8*& TVTSurfaceBuffer::Buffer()
       
    55     {
       
    56     return iBuffer;
       
    57     }
       
    58 
       
    59 // -----------------------------------------------------------------------------
       
    60 // CVtEngDrawNGA::TVTSurfaceBuffer::SurfaceNo
       
    61 //
       
    62 // -----------------------------------------------------------------------------
       
    63 //
       
    64 TInt TVTSurfaceBuffer::SurfaceNo()
       
    65     {
       
    66     return iSurfaceBufferNo;
       
    67     }
       
    68         
       
    69 void TVTSurfaceBuffer::Set( TUint8* aBuffer, TInt aSurfaceNo )
       
    70     {
       
    71     iBuffer = aBuffer;
       
    72     iSurfaceBufferNo = aSurfaceNo;
       
    73     }
       
    74     
       
    75 void TVTSurfaceBuffer::UnSet()
       
    76     {
       
    77     iBuffer = NULL;
       
    78     iSurfaceBufferNo = KErrNotFound;
       
    79     }
       
    80 // -----------------------------------------------------------------------------
       
    81 // CVtEngDrawNGA::NewL
       
    82 // Symbian 2nd phase constructor can leave.
       
    83 // -----------------------------------------------------------------------------
       
    84 //
       
    85 CVtEngDrawNGA* CVtEngDrawNGA::NewL(
       
    86     MDisplaySinkObserver* aObserver )
       
    87     {
       
    88     CVtEngDrawNGA* self = new ( ELeave ) CVtEngDrawNGA( aObserver );
       
    89     CleanupStack::PushL( self );
       
    90     self->ConstructL( );
       
    91     CleanupStack::Pop();
       
    92     return self;
       
    93     }
       
    94 
       
    95 // -----------------------------------------------------------------------------
       
    96 // CVtEngDrawNGA::~CVtEngDrawNGA
       
    97 // Destructor. Cannot leave.
       
    98 // -----------------------------------------------------------------------------
       
    99 //
       
   100 CVtEngDrawNGA::~CVtEngDrawNGA()
       
   101     {
       
   102     __VTPRINTENTER( "RVD(NGA).~" )
       
   103     Cancel();   
       
   104     
       
   105     if(iSurfaceCreated)
       
   106         {
       
   107         
       
   108         if (iSurfaceManager)
       
   109             {
       
   110             iConfig.iRemoteWindow->RemoveBackgroundSurface(ETrue);
       
   111             iConfig.iWsSession->UnregisterSurface(0, iSurfaceId);
       
   112             iSurfaceChunk->Close();
       
   113             delete iSurfaceChunk;
       
   114             iSurfaceChunk = NULL;
       
   115             iSurfaceManager->CloseSurface(iSurfaceId);
       
   116             iSurfaceUpdateSession.CancelAllUpdateNotifications();
       
   117             iSurfaceUpdateSession.Close();
       
   118                        
       
   119              /* Close the surface manager handle */
       
   120             iSurfaceManager->Close();
       
   121            
       
   122             delete iSurfaceManager;
       
   123             iSurfaceManager = 0;
       
   124             }
       
   125            
       
   126         for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- )
       
   127             {
       
   128             if (iCallBackTable[i])
       
   129                 {
       
   130                 iCallBackTable[i]->Cancel();
       
   131                 delete iCallBackTable[i];
       
   132                 iCallBackTable[i] = NULL;
       
   133                 }
       
   134             }
       
   135     
       
   136         iSurfaceBuffers[ 0 ].UnSet();
       
   137         iSurfaceBuffers[ 1 ].UnSet();
       
   138         iSurfaceBuffer0.UnSet();
       
   139         iSurfaceBuffer1.UnSet();
       
   140         }
       
   141     delete iBufferWaiter;   
       
   142     iWaitingBuffers.Reset();
       
   143     
       
   144     __VTPRINTEXIT( "RVD(NGA).~" )
       
   145     }
       
   146 
       
   147 // -----------------------------------------------------------------------------
       
   148 // CVtEngDrawNGA::CVtEngDrawNGA
       
   149 // C++ constructor. Cannot leave.
       
   150 // -----------------------------------------------------------------------------
       
   151 //
       
   152 CVtEngDrawNGA::CVtEngDrawNGA( MDisplaySinkObserver* aObserver ) :
       
   153     CVtEngDraw( aObserver ),
       
   154     iSurfaceFormat( EUidPixelFormatYUV_420Planar )
       
   155     
       
   156     {
       
   157     iConfig.iRemoteWindow = NULL;
       
   158     iConfig.iWsSession = NULL;
       
   159     iSurfaceCreated = EFalse;
       
   160     iWaitingBuffers.Reset();
       
   161     }
       
   162 
       
   163 // -----------------------------------------------------------------------------
       
   164 // CVtEngDrawNGA::BaseConstructL
       
   165 // Base construction.
       
   166 // -----------------------------------------------------------------------------
       
   167 //
       
   168 void CVtEngDrawNGA::BaseConstructL( )
       
   169     {
       
   170     __VTPRINTENTER( "RVD(NGA).BaseConstructL" )
       
   171     DoBaseConstructL();
       
   172     __VTPRINTEXIT( "RVD(NGA).BaseConstructL" )
       
   173     }
       
   174 
       
   175 // -----------------------------------------------------------------------------
       
   176 // CVtEngDrawNGA::CreateSinkL
       
   177 // Instantiates display sink.
       
   178 // -----------------------------------------------------------------------------
       
   179 //
       
   180 MDisplaySink* CVtEngDrawNGA::CreateSinkL()
       
   181     {
       
   182     __VTPRINTENTER( "RVD(NGA).CreateSinkL" )
       
   183     TDisplaySinkParamsNGA params;
       
   184     GetSinkParams( params );
       
   185     MDisplaySink* sink = ::CreateSinkL( params, KNullDesC8 );
       
   186     if ( IsFlag( EBaseConstructCalled ) )
       
   187         {
       
   188         sink->Pause();
       
   189         SetFlag( ESinkParamUpdateRequired | ESinkResumeRequired );
       
   190         }    
       
   191     __VTPRINTEXITR( "RVD(NGA).CreateSinkL flags=%d", params.iFlags )
       
   192     return sink;
       
   193     }
       
   194 
       
   195 // -----------------------------------------------------------------------------
       
   196 // CVtEngDrawNGA::BaseRefreshL
       
   197 // If using scaler, start the scaling otherwise draw a bitmap.
       
   198 // -----------------------------------------------------------------------------
       
   199 //
       
   200 void CVtEngDrawNGA::BaseRefreshL()
       
   201     {
       
   202     __VTPRINTENTER( "RVD(NGA).BaseRefreshL" )
       
   203     __VTPRINTEXIT( "RVD(NGA).BaseRefreshL" )
       
   204     }
       
   205    
       
   206 // -----------------------------------------------------------------------------
       
   207 // CVtEngDrawNGA::BaseRefreshBitmapsL
       
   208 // Refreshes bitmaps sizes and display mode if needed.
       
   209 // -----------------------------------------------------------------------------
       
   210 //
       
   211 void CVtEngDrawNGA::BaseRefreshBitmapsL()
       
   212     {
       
   213     __VTPRINTENTER( "RVD(NGA).BaseRefreshBitmapsL" )
       
   214     BaseConstructL();
       
   215     CreateSurfaceL();
       
   216     // set the params for DS
       
   217     UpdateSinkParamsL();
       
   218     ClearFlag( EFirstFrameReceived );    
       
   219     __VTPRINTEXIT( "RVD(NGA).BaseRefreshBitmapsL" )
       
   220     }   
       
   221     
       
   222 // -----------------------------------------------------------------------------
       
   223 // CVtEngDrawNGA::BaseDoCancel
       
   224 // DoCancel for derived class.
       
   225 // -----------------------------------------------------------------------------
       
   226 //
       
   227 void CVtEngDrawNGA::BaseDoCancel()
       
   228     {
       
   229     __VTPRINTENTER( "RVD(NGA).BaseDoCancel" )
       
   230     __VTPRINTEXIT( "RVD(NGA).BaseDoCancel" )
       
   231     }
       
   232 
       
   233 // -----------------------------------------------------------------------------
       
   234 // CVtEngDrawNGA::BaseVerifyConfigL
       
   235 // Checks current configuration against DSA implementation.
       
   236 // -----------------------------------------------------------------------------
       
   237 //
       
   238 void CVtEngDrawNGA::BaseVerifyConfigL()
       
   239     {
       
   240     __VTPRINTENTER( "RVD(NGA).BaseVerifyConfigL" )
       
   241     __VTPRINTEXIT( "RVD(NGA).BaseVerifyConfigL" )
       
   242     }
       
   243 
       
   244 // -----------------------------------------------------------------------------
       
   245 // CVtEngDrawNGA::BaseRestartL
       
   246 // -----------------------------------------------------------------------------
       
   247 //
       
   248 void CVtEngDrawNGA::BaseRestartL()
       
   249     {
       
   250     __VTPRINTENTER( "RVD(NGA).BaseRestartL" )
       
   251     __VTPRINTEXIT( "RVD(NGA).BaseRestartL" )
       
   252     }
       
   253 
       
   254 // -----------------------------------------------------------------------------
       
   255 // CVtEngDrawNGA::BaseAbortNow
       
   256 // -----------------------------------------------------------------------------
       
   257 //
       
   258 void CVtEngDrawNGA::BaseAbortNow()
       
   259     {
       
   260     __VTPRINTENTER( "RVD(NGA).BaseAbortNow" )
       
   261     __VTPRINTEXIT( "RVD(NGA).BaseAbortNow" )
       
   262     }
       
   263 
       
   264 // -----------------------------------------------------------------------------
       
   265 // CVtEngDrawNGA::BaseStartDrawL
       
   266 // Starts the drawing.
       
   267 // -----------------------------------------------------------------------------
       
   268 //
       
   269 void CVtEngDrawNGA::BaseStartDrawL()
       
   270     {
       
   271     __VTPRINTENTER( "RVD(NGA).BaseStartDrawL" )  
       
   272     if ( IsFlag( EBaseConstructCalled ) )
       
   273         {
       
   274         SetFlag( EBaseBaseStartDrawCalled );
       
   275         }
       
   276     else
       
   277         {
       
   278         DoBaseStartDrawL();
       
   279         }
       
   280     __VTPRINTEXIT( "RVD(NGA).BaseStartDrawL" )
       
   281     }
       
   282 
       
   283 // -----------------------------------------------------------------------------
       
   284 // CVtEngDrawNGA::BaseStopDraw
       
   285 // Stop the drawing.
       
   286 // -----------------------------------------------------------------------------
       
   287 //
       
   288 void CVtEngDrawNGA::BaseStopDraw()
       
   289     {
       
   290     // Cancel the timer in any case.
       
   291     __VTPRINTENTER( "RVD(NGA).BaseStopDraw" )
       
   292     ClearFlag( EBaseBaseStartDrawCalled );
       
   293     iWatcher->Cancel();
       
   294     iBufferWaiter->Cancel();
       
   295     ClearFlag( ERemoteVideoDrawing | EStarted );
       
   296     for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- )
       
   297         {
       
   298         if (iCallBackTable[i])
       
   299             {
       
   300             iCallBackTable[i]->Cancel();
       
   301             }
       
   302         }
       
   303     Cancel();
       
   304     
       
   305     __VTPRINTEXIT( "RVD(NGA).BaseStopDraw" )
       
   306     }
       
   307 
       
   308 // -----------------------------------------------------------------------------
       
   309 // CVtEngDrawNGA::BaseSetConfigL
       
   310 // Sets new configuration.
       
   311 // -----------------------------------------------------------------------------
       
   312 //
       
   313 void CVtEngDrawNGA::BaseSetConfigL( const TVtEngRenderConfig& aConfig )
       
   314     {
       
   315     __VTPRINTENTER( "RVD(NGA).BaseSetConfigL" )
       
   316     Mem::FillZ( &iConfig, sizeof( TVtEngRenderConfigNGA ) );
       
   317     iConfig = aConfig;
       
   318     if ( IsFlag( EBaseConstructCalled ) )
       
   319         {
       
   320         SetFlag( EBaseSetConfigCalled );
       
   321         }
       
   322     else
       
   323         {
       
   324         ConfigUpdatedL();
       
   325         }
       
   326     __VTPRINTEXIT( "RVD(NGA).BaseSetConfigL" )
       
   327     }
       
   328 
       
   329 // -----------------------------------------------------------------------------
       
   330 // CVtEngDrawNGA::BaseSetUIForegroundL
       
   331 // Sets UI foreground status.
       
   332 // -----------------------------------------------------------------------------
       
   333 //
       
   334 void CVtEngDrawNGA::BaseSetUIForegroundL( TBool aForeground )
       
   335     {
       
   336     __VTPRINTENTER( "RVD(NGA).BaseSetUIForegroundL" )
       
   337     __VTPRINTEXIT( "RVD(NGA).BaseSetUIForegroundL" )
       
   338     }
       
   339 
       
   340 // -----------------------------------------------------------------------------
       
   341 // CVtEngDrawNGA::BaseRequestLastFrame
       
   342 // Request update last remote video frame through MVtEngFrameObserver::vtSetFrame
       
   343 // -----------------------------------------------------------------------------
       
   344 //
       
   345 void CVtEngDrawNGA::BaseRequestLastFrame()
       
   346     {
       
   347     __VTPRINTENTER( "RVD(NGA).BaseRequestLastFrame" )
       
   348     __VTPRINTEXIT( "RVD(NGA).BaseRequestLastFrame" )    
       
   349     }
       
   350 
       
   351 // -----------------------------------------------------------------------------
       
   352 // CVtEngDrawNGA::BaseVideoFrameSizeChangedL
       
   353 // Called when incoming frame buffer size changes.
       
   354 // -----------------------------------------------------------------------------
       
   355 //
       
   356 void CVtEngDrawNGA::BaseVideoFrameSizeChangedL( const TSize& /*aTo*/ )
       
   357     {
       
   358     __VTPRINTENTER( "RVD(NGA).BaseVideoFrameSizeChangedL" )
       
   359     BaseConstructL();
       
   360     
       
   361     TInt err;
       
   362     
       
   363     iConfig.iRemoteWindow->RemoveBackgroundSurface(ETrue);
       
   364     iConfig.iWsSession->UnregisterSurface(0, iSurfaceId);
       
   365     
       
   366     iSurfaceChunk->Close();
       
   367     delete iSurfaceChunk;
       
   368     iSurfaceChunk = NULL;
       
   369     iSurfaceManager->CloseSurface(iSurfaceId);
       
   370     iSurfaceUpdateSession.CancelAllUpdateNotifications();
       
   371     iSurfaceUpdateSession.Close();
       
   372     
       
   373     /* Close the surface manager handle */
       
   374     iSurfaceManager->Close();
       
   375     delete iSurfaceManager;
       
   376     iSurfaceManager = 0;
       
   377     
       
   378     for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- )
       
   379         {
       
   380             if (iCallBackTable[i])
       
   381                 {
       
   382                 iCallBackTable[i]->Cancel();
       
   383                 delete iCallBackTable[i];
       
   384                 iCallBackTable[i] = NULL;
       
   385                 }
       
   386         }
       
   387     iSurfaceBuffers[ 0 ].UnSet();
       
   388     iSurfaceBuffers[ 1 ].UnSet();
       
   389     iSurfaceBuffer0.UnSet();
       
   390     iSurfaceBuffer1.UnSet();
       
   391     iWaitingBuffers.Reset();
       
   392     
       
   393     err = iSurfaceUpdateSession.Connect();    
       
   394     User::LeaveIfError(err);
       
   395     
       
   396     iSurfaceManager = new RSurfaceManager();
       
   397     
       
   398     User::LeaveIfNull(iSurfaceManager); 
       
   399     err = iSurfaceManager->Open();
       
   400     User::LeaveIfError(err);
       
   401     
       
   402     RSurfaceManager::TSurfaceCreationAttributesBuf attributes;
       
   403     attributes().iPixelFormat           = iSurfaceFormat; 
       
   404     attributes().iSize                  = iSourceSize;
       
   405     attributes().iBuffers               = KVtEngMaxSurfaceBuffers;
       
   406     
       
   407     //attributes().iStride                = iSourceSize.iWidth*2;
       
   408     attributes().iStride                = iSourceSize.iWidth*3/2;
       
   409     
       
   410     attributes().iOffsetToFirstBuffer   = 0;
       
   411     attributes().iAlignment             = 4;
       
   412     attributes().iContiguous            = EFalse;
       
   413     attributes().iMappable              = ETrue;
       
   414     
       
   415     err = iSurfaceManager->CreateSurface(attributes, iSurfaceId);
       
   416     User::LeaveIfError(err);  
       
   417     
       
   418     // Map to chunk
       
   419     iSurfaceChunk = new RChunk();
       
   420     User::LeaveIfNull(iSurfaceChunk);    
       
   421     err = iSurfaceManager->MapSurface(iSurfaceId, *iSurfaceChunk);
       
   422     User::LeaveIfError(err);    
       
   423     
       
   424     // Get the info from the surfaceManager
       
   425     RSurfaceManager::TInfoBuf info;
       
   426     err = iSurfaceManager->SurfaceInfo(iSurfaceId, info);
       
   427     User::LeaveIfError(err);    
       
   428     
       
   429     TInt offset;
       
   430     iSurfaceManager->GetBufferOffset(iSurfaceId, 0, offset);
       
   431     iSurfaceBuffer0.Set(iSurfaceChunk->Base() + offset, 0 );
       
   432     iSurfaceManager->GetBufferOffset(iSurfaceId, 1, offset);
       
   433     iSurfaceBuffer1.Set(iSurfaceChunk->Base() + offset, 1 );
       
   434     
       
   435     iConfig.iWsSession->RegisterSurface(0, iSurfaceId);   
       
   436     iConfig.iRemoteWindow->SetBackgroundSurface(iSurfaceId);
       
   437     
       
   438     iCallBackTable[0] = new(ELeave) CActiveCallBack(
       
   439             TCallBack(SurfaceBuffer0Ready, this), 
       
   440             CActive::EPriorityStandard-1);
       
   441     CActiveScheduler::Add(iCallBackTable[0]);
       
   442     
       
   443     iCallBackTable[1] = new(ELeave) CActiveCallBack(
       
   444             TCallBack(SurfaceBuffer1Ready, this), 
       
   445             CActive::EPriorityStandard-1);
       
   446     CActiveScheduler::Add(iCallBackTable[1]);
       
   447     
       
   448     iSurfaceCreated = ETrue;    
       
   449     
       
   450     ClearFlag( EInitializePostingSurfaceCalled );   
       
   451     
       
   452     // set the params for DS
       
   453     UpdateSinkParamsL();
       
   454     ClearFlag( EFirstFrameReceived );  
       
   455 
       
   456     __VTPRINTEXIT( "RVD(NGA).BaseVideoFrameSizeChangedL" )
       
   457     }
       
   458 
       
   459 // -----------------------------------------------------------------------------
       
   460 // CVtEngDrawDSA::Config
       
   461 // Returns current configuration.
       
   462 // -----------------------------------------------------------------------------
       
   463 //
       
   464 TVtEngRenderConfig& CVtEngDrawNGA::Config()
       
   465     {
       
   466     return iConfig;
       
   467     }
       
   468 
       
   469 // -----------------------------------------------------------------------------
       
   470 // CVtEngDrawNGA::RunL
       
   471 // CActive heir execution method.
       
   472 // -----------------------------------------------------------------------------
       
   473 //
       
   474 void CVtEngDrawNGA::RunL()
       
   475     {
       
   476     __VTPRINTENTER( "RVD(NGA).RunL" )
       
   477     
       
   478     TInt bitmapNo( iStatus.Int() );
       
   479 
       
   480     if ( bitmapNo < KErrNone )
       
   481         {
       
   482         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL notify rvd problem" )
       
   483         CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem );
       
   484         return;
       
   485         }
       
   486 
       
   487     TVtEngBuffer& buffer = iSurfaceBuffers[ bitmapNo ];
       
   488     
       
   489     if ( !iDSUpdated )
       
   490         {
       
   491         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL !Updated" )
       
   492         __VTPRINTEXIT( "RVD(NGA).RunL" )
       
   493         return;
       
   494         }
       
   495     else if ( buffer.SurfaceBuffer() == NULL )
       
   496         {
       
   497         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL signalled with NULL buffer" )
       
   498         TInt result( iBufferWaiter->FetchBuffer() );
       
   499         User::LeaveIfError( result );
       
   500         __VTPRINTEXIT( "RVD(NGA).RunL" )
       
   501         return;
       
   502         }
       
   503     
       
   504     // Image received, reset counter.
       
   505     iCheckpoint = KVtEngWatcherThreshold;
       
   506 
       
   507     __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL flags=%d", iFlags )
       
   508     TBool firstFrame( !IsFlag ( EFirstFrameReceived ) );
       
   509     SetFlag( EFirstFrameReceived );
       
   510     if ( firstFrame )
       
   511         {
       
   512         CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted );
       
   513         }
       
   514 
       
   515     TInt surfaceno = buffer.SurfaceBuffer()->SurfaceNo();
       
   516     __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL received buffer surface id %d", surfaceno )
       
   517     if ( iSubmitPending )
       
   518         {
       
   519         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL submit pending")
       
   520         iWaitingBuffers.AddLast(buffer);
       
   521         }
       
   522     else
       
   523         {
       
   524         iCallBackTable[surfaceno]->iStatus = KRequestPending;
       
   525         iCallBackTable[surfaceno]->SetActive();
       
   526         iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, iTimeStamp);
       
   527         iSubmitPending = ETrue;
       
   528         iSurfaceUpdateSession.SubmitUpdate(0, iSurfaceId, surfaceno, NULL); 
       
   529         buffer.UnSet();
       
   530         }
       
   531     if ( iSurfaceBuffers[ KVtEngBitmapNoReversed[ bitmapNo ] ].IsSet() )
       
   532         {
       
   533         __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL reactivating for buffer %d",
       
   534             KVtEngBitmapNoReversed[ bitmapNo ] )
       
   535         Activate();
       
   536         DisplaySink().NextFrame();
       
   537         }    
       
   538     TInt result = iBufferWaiter->FetchBuffer();
       
   539     User::LeaveIfError( result );    
       
   540     
       
   541     __VTPRINTEXIT( "RVD(NGA).RunL" )
       
   542     }
       
   543 
       
   544 
       
   545 // -----------------------------------------------------------------------------
       
   546 // CVtEngDrawNGA::BufferReadyL
       
   547 // BufferReadyL
       
   548 // -----------------------------------------------------------------------------
       
   549 //
       
   550 void CVtEngDrawNGA::BufferReadyL( TVTSurfaceBuffer* aBuffer )
       
   551     {
       
   552     __VTPRINTENTER( "RVD(NGA).BufferReadyL" )
       
   553     SetAvailableToSink( aBuffer );
       
   554     __VTPRINTEXIT( "RVD(NGA).BufferReadyL" )
       
   555     }
       
   556 
       
   557 // -----------------------------------------------------------------------------
       
   558 // CVtEngDrawNGA::FetchError
       
   559 // Buffer fetching error
       
   560 // -----------------------------------------------------------------------------
       
   561 //
       
   562 void CVtEngDrawNGA::FetchError( TInt )
       
   563     {
       
   564     __VTPRINTENTER( "RVD(NGA).FetchError" )
       
   565     CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem );
       
   566     __VTPRINTEXIT( "RVD(NGA).FetchError" )
       
   567     }    
       
   568    
       
   569 // -----------------------------------------------------------------------------
       
   570 // CVtEngDrawNGA::DoBaseConstructL
       
   571 // Base construction implementation
       
   572 // -----------------------------------------------------------------------------
       
   573 //
       
   574 void CVtEngDrawNGA::DoBaseConstructL()
       
   575     {
       
   576     __VTPRINTENTER( "RVD(NGA).DoBaseConstructL" )
       
   577     delete iBufferWaiter;
       
   578     iBufferWaiter = NULL;
       
   579 
       
   580     iBufferWaiter =
       
   581         new ( ELeave ) CVtEngBufferWaiter( *this );
       
   582         
       
   583     for ( TInt i = MDisplaySink::EFirstBitmap;
       
   584           i < MDisplaySink::EFirstBitmap + KVtEngMaxSurfaceBuffers; i++ )
       
   585         {
       
   586         iSurfaceBuffers[ i ].UnSet();
       
   587         }     
       
   588     ClearFlag( EBaseConstructCalled );          
       
   589     __VTPRINTEXIT( "RVD(NGA).DoBaseConstructL" )
       
   590     }
       
   591           
       
   592 // -----------------------------------------------------------------------------
       
   593 // CVtEngDrawNGA::UpdateSinkParamsL
       
   594 // Updates sink params
       
   595 // -----------------------------------------------------------------------------
       
   596 //
       
   597 void CVtEngDrawNGA::UpdateSinkParamsL()
       
   598     {
       
   599     __VTPRINTENTER( "RVD(NGA).UpdateSinkParamsL" )
       
   600     if ( IsFlag( EBaseConstructCalled ) )
       
   601         {
       
   602         SetFlag( ESinkParamUpdateRequired );
       
   603         }
       
   604     else
       
   605         {
       
   606         DoUpdateSinkParamsL();
       
   607         }
       
   608     __VTPRINTEXIT( "RVD(NGA).UpdateSinkParamsL" )
       
   609     }
       
   610 
       
   611     
       
   612  // -----------------------------------------------------------------------------
       
   613 // CVtEngDrawNGA::DoBaseStartDrawL
       
   614 //
       
   615 // -----------------------------------------------------------------------------
       
   616 //
       
   617 void CVtEngDrawNGA::DoBaseStartDrawL()
       
   618     {
       
   619     __VTPRINTENTER( "RVD(NGA).DoBaseStartDrawL" )
       
   620     SetFlag( EReadyInternal );
       
   621     if ( !iWatcher->IsActive() )
       
   622        {
       
   623        iWatcher->Start( KVtEngWatcherTimeout, KVtEngWatcherTimeout,
       
   624              iCallback );
       
   625        }
       
   626     
       
   627     DoSurfaceBuffer0Ready();
       
   628     DoSurfaceBuffer1Ready();
       
   629     
       
   630     User::LeaveIfError( iBufferWaiter->FetchBuffer() );
       
   631     
       
   632         
       
   633     SetFlag( ERemoteVideoDrawing );             
       
   634     ClearFlag( EBaseBaseStartDrawCalled );
       
   635     __VTPRINTEXIT( "RVD(NGA).DoBaseStartDrawL" )
       
   636     }
       
   637                    
       
   638 // -----------------------------------------------------------------------------
       
   639 // CVtEngDrawNGA::DoCreateSurfaceL
       
   640 // Create surface implementation.
       
   641 // -----------------------------------------------------------------------------
       
   642 //
       
   643 void CVtEngDrawNGA::DoCreateSurfaceL()
       
   644     {
       
   645     __VTPRINTENTER( "RVD(NGA).DoCreateSurfaceL" )  
       
   646     TInt err;
       
   647     
       
   648     if(iSurfaceCreated)
       
   649         {
       
   650                 
       
   651         if (iSurfaceManager)
       
   652             {
       
   653             /* Change log for recreate surface objects
       
   654              * Surface staffs should NOT be recreated once created,
       
   655              * but unregister and register needs to be done since the 
       
   656              * bounding window change its position and size. At this
       
   657              * moment, reset the iWaitingBuffers and reset the callbacks
       
   658              * are recommended.
       
   659              */
       
   660             iConfig.iRemoteWindow->RemoveBackgroundSurface(ETrue);
       
   661             iConfig.iWsSession->UnregisterSurface(0, iSurfaceId);
       
   662             
       
   663             /* Comment out below code to prevent delete the surface objects 
       
   664              * at this current stage, code below should NOT be removed due to
       
   665              * potential future uses.
       
   666              */
       
   667             /*
       
   668             iSurfaceChunk->Close();
       
   669             delete iSurfaceChunk;
       
   670             iSurfaceChunk = NULL;
       
   671             iSurfaceManager->CloseSurface(iSurfaceId);
       
   672             iSurfaceUpdateSession.CancelAllUpdateNotifications();
       
   673             iSurfaceUpdateSession.Close();
       
   674             */
       
   675             
       
   676             /* Close the surface manager handle */
       
   677             /*
       
   678             iSurfaceManager->Close();
       
   679             delete iSurfaceManager;
       
   680             iSurfaceManager = 0;
       
   681             */
       
   682             }
       
   683         for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- )
       
   684             {
       
   685                 if (iCallBackTable[i])
       
   686                     {
       
   687                     iCallBackTable[i]->Cancel();
       
   688                     delete iCallBackTable[i];
       
   689                     iCallBackTable[i] = NULL;
       
   690                     }
       
   691             }
       
   692         /* Comment out below code to prevent delete the surface buffers, 
       
   693          * otherwise the last buffer would not store the last frame. 
       
   694          * Code below should NOT be removed due to potential future uses.
       
   695          */
       
   696         /*
       
   697         iSurfaceBuffers[ 0 ].UnSet();
       
   698         iSurfaceBuffers[ 1 ].UnSet();
       
   699         iSurfaceBuffer0.UnSet();
       
   700         iSurfaceBuffer1.UnSet();
       
   701         */
       
   702         iWaitingBuffers.Reset();
       
   703         }
       
   704     /* Add else branch to escape the recreate of the surface objects, 
       
   705      * it could be changed in future.
       
   706      */
       
   707     else
       
   708         {
       
   709         err = iSurfaceUpdateSession.Connect();    
       
   710         User::LeaveIfError(err);
       
   711         
       
   712         iSurfaceManager = new RSurfaceManager();
       
   713         
       
   714         User::LeaveIfNull(iSurfaceManager); 
       
   715         err = iSurfaceManager->Open();
       
   716         User::LeaveIfError(err);
       
   717         
       
   718         RSurfaceManager::TSurfaceCreationAttributesBuf attributes;
       
   719         attributes().iPixelFormat           = iSurfaceFormat; 
       
   720         attributes().iSize                  = iSourceSize;
       
   721         attributes().iBuffers               = KVtEngMaxSurfaceBuffers;
       
   722         
       
   723         //attributes().iStride                = iSourceSize.iWidth*2;
       
   724         attributes().iStride                = iSourceSize.iWidth*3/2;
       
   725         
       
   726         attributes().iOffsetToFirstBuffer   = 0;
       
   727         attributes().iAlignment             = 4;
       
   728         attributes().iContiguous            = EFalse;
       
   729         attributes().iMappable              = ETrue;
       
   730         
       
   731         err = iSurfaceManager->CreateSurface(attributes, iSurfaceId);
       
   732         User::LeaveIfError(err);  
       
   733         
       
   734         // Map to chunk
       
   735         iSurfaceChunk = new RChunk();
       
   736         User::LeaveIfNull(iSurfaceChunk);    
       
   737         err = iSurfaceManager->MapSurface(iSurfaceId, *iSurfaceChunk);
       
   738         User::LeaveIfError(err);    
       
   739         
       
   740         // Get the info from the surfaceManager
       
   741         RSurfaceManager::TInfoBuf info;
       
   742         err = iSurfaceManager->SurfaceInfo(iSurfaceId, info);
       
   743         User::LeaveIfError(err);    
       
   744         
       
   745         TInt offset;
       
   746         iSurfaceManager->GetBufferOffset(iSurfaceId, 0, offset);
       
   747         iSurfaceBuffer0.Set(iSurfaceChunk->Base() + offset, 0 );
       
   748         iSurfaceManager->GetBufferOffset(iSurfaceId, 1, offset);
       
   749         iSurfaceBuffer1.Set(iSurfaceChunk->Base() + offset, 1 );
       
   750         }
       
   751     
       
   752     iConfig.iWsSession->RegisterSurface(0, iSurfaceId);   
       
   753     iConfig.iRemoteWindow->SetBackgroundSurface(iSurfaceId);
       
   754     
       
   755     iCallBackTable[0] = new(ELeave) CActiveCallBack(
       
   756             TCallBack(SurfaceBuffer0Ready, this), 
       
   757             CActive::EPriorityStandard-1);
       
   758     CActiveScheduler::Add(iCallBackTable[0]);
       
   759     
       
   760     iCallBackTable[1] = new(ELeave) CActiveCallBack(
       
   761             TCallBack(SurfaceBuffer1Ready, this), 
       
   762             CActive::EPriorityStandard-1);
       
   763     CActiveScheduler::Add(iCallBackTable[1]);
       
   764     
       
   765     iSurfaceCreated = ETrue;    
       
   766     
       
   767     ClearFlag( EInitializePostingSurfaceCalled );
       
   768     __VTPRINTEXIT( "RVD(NGA).DoCreateSurfaceL" )
       
   769     }
       
   770     
       
   771 // -----------------------------------------------------------------------------
       
   772 // CVtEngDrawNGA::DoUpdateSinkParamsL
       
   773 // Updates sink params
       
   774 // -----------------------------------------------------------------------------
       
   775 //
       
   776 void CVtEngDrawNGA::DoUpdateSinkParamsL()
       
   777     {
       
   778     __VTPRINTENTER( "RVD(NGA).DoUpdateSinkParamsL" )
       
   779     TDisplaySinkParamsNGA params;
       
   780     GetSinkParams( params );
       
   781     DisplaySink().UpdateSinkParamsL( params, iDSUpdated );
       
   782     ClearFlag( ESinkParamUpdateRequired );
       
   783     if ( IsFlag( ESinkResumeRequired ) )
       
   784         {
       
   785         DisplaySink().Resume();
       
   786         ClearFlag( ESinkResumeRequired );
       
   787         }
       
   788     __VTPRINTEXIT( "RVD(DP).DoUpdateSinkParamsL" )
       
   789     }
       
   790       
       
   791 // -----------------------------------------------------------------------------
       
   792 // CVtEngDrawNGA::CreateSurfaceL
       
   793 // Create surface.
       
   794 // -----------------------------------------------------------------------------
       
   795 //
       
   796 void CVtEngDrawNGA::CreateSurfaceL()
       
   797     {
       
   798     __VTPRINTENTER( "RVD(NGA).CreateSurfaceL" )
       
   799     if ( IsFlag( EBaseConstructCalled ) )
       
   800         {
       
   801         SetFlag( EInitializePostingSurfaceCalled );
       
   802         }
       
   803     else
       
   804         {
       
   805         DoCreateSurfaceL();
       
   806         }
       
   807     __VTPRINTEXIT( "RVD(NGA).CreateSurfaceL" )
       
   808     }
       
   809            
       
   810 // -----------------------------------------------------------------------------
       
   811 // CVtEngDrawNGA::GetSinkParams
       
   812 // -----------------------------------------------------------------------------
       
   813 //
       
   814 void CVtEngDrawNGA::GetSinkParams( TDisplaySinkParamsNGA& aSinkParams )
       
   815     { 
       
   816     __VTPRINTENTER( "RVD(NGA).GetSinkParams" )
       
   817     Mem::FillZ( &aSinkParams, sizeof( TDisplaySinkParamsNGA ) );
       
   818     aSinkParams.iThreadId = RThread().Id();
       
   819     aSinkParams.iRequestStatusPtr = &iStatus;
       
   820     aSinkParams.iObserver = iObserver;
       
   821     aSinkParams.iSurfaceBuffer1 = &iSurfaceBuffers[ 0 ].Buffer();
       
   822     aSinkParams.iSurfaceBuffer2 = &iSurfaceBuffers[ 1 ].Buffer();
       
   823     aSinkParams.iFrameSize = iSourceSize;
       
   824     aSinkParams.iSurfaceFormat = iSurfaceFormat;
       
   825     aSinkParams.iFlags = TDisplaySinkParams::EDisplaySinkNGA;
       
   826     __VTPRINTEXITR( "RVD(NGA).GetSinkParams flags=%d",
       
   827         (TInt) aSinkParams.iFlags )	  
       
   828     }
       
   829     
       
   830 // -----------------------------------------------------------------------------
       
   831 // CVtEngDrawNGA::DisplaySink
       
   832 // Returns reference to sink.
       
   833 // -----------------------------------------------------------------------------
       
   834 //
       
   835 MDisplaySink& CVtEngDrawNGA::DisplaySink()
       
   836     {
       
   837     return *iDisplaySink;
       
   838     }
       
   839      
       
   840 // -----------------------------------------------------------------------------
       
   841 // CVtEngDrawNGA::SetToSink
       
   842 // Sets posting buffer  to sink.
       
   843 // -----------------------------------------------------------------------------
       
   844 //
       
   845 void CVtEngDrawNGA::SetAvailableToSink( TVTSurfaceBuffer* aBuffer )
       
   846     {
       
   847     __VTPRINTENTER( "RVD(NGA).SetAvailableToSink" )
       
   848     for ( TInt i = MDisplaySink::EFirstBitmap;
       
   849           i < MDisplaySink::EFirstBitmap + KVtEngMaxSurfaceBuffers; i++ )
       
   850         {
       
   851         if ( !iSurfaceBuffers[ i ].IsSet() )
       
   852             {
       
   853             iSurfaceBuffers[ i ].Set( aBuffer );
       
   854             Activate();
       
   855             DisplaySink().SetBitmapAvailable(
       
   856                 static_cast< MDisplaySink::TBitmapNo >( i ) );
       
   857             break;
       
   858             }
       
   859         }
       
   860     __VTPRINTEXIT( "RVD(NGA).SetAvailableToSink" )
       
   861     }  
       
   862 
       
   863 TInt CVtEngDrawNGA::SurfaceBuffer0Ready( TAny* aAny )
       
   864     {
       
   865     __VTPRINTENTER( "RVD(NGA).SurfaceBuffer0Ready" )
       
   866     __VTPRINTEXIT( "RVD(NGA).SurfaceBuffer0Ready" )
       
   867     return ((CVtEngDrawNGA*)aAny)->DoSurfaceBuffer0Ready();
       
   868     }
       
   869 
       
   870 TBool CVtEngDrawNGA::DoSurfaceBuffer0Ready()
       
   871     {
       
   872     __VTPRINTENTER( "RVD(NGA).DoSurfaceBuffer0Ready" )
       
   873     if ( iSubmitPending )
       
   874         {
       
   875         iSubmitPending = EFalse;
       
   876         }
       
   877     if (!iWaitingBuffers.IsEmpty())
       
   878         {
       
   879         TVtEngBuffer* buffer = iWaitingBuffers.First();
       
   880         TInt surfaceno = buffer->SurfaceBuffer()->SurfaceNo();
       
   881         __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).DoSurfaceBuffer0Ready, surface buffer %d is in waitingqueue", surfaceno )
       
   882         iCallBackTable[surfaceno]->iStatus = KRequestPending;
       
   883         iCallBackTable[surfaceno]->SetActive();
       
   884         iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, iTimeStamp);
       
   885         iSubmitPending = ETrue;
       
   886         iSurfaceUpdateSession.SubmitUpdate(0, iSurfaceId, surfaceno, NULL); 
       
   887         iWaitingBuffers.Remove(*buffer);
       
   888         buffer->UnSet();
       
   889         }
       
   890     iBufferWaiter->BufferAvailable(iSurfaceBuffer0);
       
   891     __VTPRINTEXIT( "RVD(NGA).DoSurfaceBuffer0Ready" )
       
   892     return ETrue;
       
   893     }
       
   894         
       
   895 TInt CVtEngDrawNGA::SurfaceBuffer1Ready( TAny* aAny )
       
   896     {
       
   897     __VTPRINTENTER( "RVD(NGA).SurfaceBuffer1Ready" )
       
   898     __VTPRINTEXIT( "RVD(NGA).SurfaceBuffer1Ready" )
       
   899     return ((CVtEngDrawNGA*)aAny)->DoSurfaceBuffer1Ready();
       
   900     }
       
   901 
       
   902 TBool CVtEngDrawNGA::DoSurfaceBuffer1Ready()
       
   903     {
       
   904     __VTPRINTENTER( "RVD(NGA).DoSurfaceBuffer1Ready" )
       
   905     if ( iSubmitPending )
       
   906         {
       
   907         iSubmitPending = EFalse;
       
   908         }
       
   909     
       
   910     if (!iWaitingBuffers.IsEmpty())
       
   911         {
       
   912         TVtEngBuffer* buffer = iWaitingBuffers.First();
       
   913         TInt surfaceno = buffer->SurfaceBuffer()->SurfaceNo();
       
   914         __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).DoSurfaceBuffer0Ready, surface buffer %d is in waitingqueue", surfaceno )
       
   915         iCallBackTable[surfaceno]->iStatus = KRequestPending;
       
   916         iCallBackTable[surfaceno]->SetActive();
       
   917         iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, iTimeStamp);
       
   918         iSubmitPending = ETrue;
       
   919         iSurfaceUpdateSession.SubmitUpdate(0, iSurfaceId, surfaceno, NULL); 
       
   920         iWaitingBuffers.Remove(*buffer);
       
   921         buffer->UnSet();
       
   922         }
       
   923     iBufferWaiter->BufferAvailable(iSurfaceBuffer1);
       
   924     __VTPRINTEXIT( "RVD(NGA).DoSurfaceBuffer1Ready" )
       
   925     return ETrue;
       
   926     }
       
   927 
       
   928 // -----------------------------------------------------------------------------
       
   929 // CVtEngDrawNGA::TVtEngBuffer::TVtEngBuffer
       
   930 //
       
   931 // -----------------------------------------------------------------------------
       
   932 //
       
   933 CVtEngDrawNGA::TVtEngBuffer::TVtEngBuffer()
       
   934     : iBuffer( 0 ), iSurfaceBuffer(0)
       
   935     {
       
   936     __VTPRINTENTER( "RVD(NGA).Buffer.Ctor" )
       
   937     __VTPRINTEXIT( "RVD(NGA).Buffer.Ctor" )
       
   938     }
       
   939 
       
   940 // -----------------------------------------------------------------------------
       
   941 // CVtEngDrawNGA::TVtEngBuffer::Set
       
   942 //
       
   943 // -----------------------------------------------------------------------------
       
   944 //
       
   945 void CVtEngDrawNGA::TVtEngBuffer::Set( TVTSurfaceBuffer* aBuffer )
       
   946     {
       
   947     __VTPRINTENTER( "RVD(NGA).Buffer.Set" )
       
   948     iSurfaceBuffer = aBuffer;
       
   949     iBuffer = aBuffer->Buffer();
       
   950     __VTPRINTEXIT( "RVD(NGA).Buffer.Set" )
       
   951     }
       
   952 
       
   953 // -----------------------------------------------------------------------------
       
   954 // CVtEngDrawNGA::TVtEngBuffer::UnSet
       
   955 //
       
   956 // -----------------------------------------------------------------------------
       
   957 //
       
   958 void CVtEngDrawNGA::TVtEngBuffer::UnSet()
       
   959     {
       
   960     __VTPRINTENTER( "RVD(NGA).Buffer.UnSet" )
       
   961     iSurfaceBuffer = 0;
       
   962     iBuffer = 0;
       
   963     __VTPRINTEXIT( "RVD(NGA).Buffer.UnSet" )
       
   964     }
       
   965 
       
   966 // -----------------------------------------------------------------------------
       
   967 // CVtEngDrawNGA::TVtEngBuffer::IsSet
       
   968 //
       
   969 // -----------------------------------------------------------------------------
       
   970 //
       
   971 TBool CVtEngDrawNGA::TVtEngBuffer::IsSet() const
       
   972     {
       
   973     return ( iSurfaceBuffer != NULL );
       
   974     }
       
   975 
       
   976 // -----------------------------------------------------------------------------
       
   977 // CVtEngDrawNGA::TVtEngBuffer::Buffer
       
   978 //
       
   979 // -----------------------------------------------------------------------------
       
   980 //
       
   981 TVTSurfaceBuffer* &CVtEngDrawNGA::TVtEngBuffer::SurfaceBuffer()
       
   982     {
       
   983     return iSurfaceBuffer;
       
   984     }
       
   985 
       
   986 // -----------------------------------------------------------------------------
       
   987 // CVtEngDrawNGA::TVtEngBuffer::Buffer
       
   988 //
       
   989 // -----------------------------------------------------------------------------
       
   990 //
       
   991 TUint8* &CVtEngDrawNGA::TVtEngBuffer::Buffer()
       
   992     {
       
   993     return iBuffer;
       
   994     }
       
   995 // -----------------------------------------------------------------------------
       
   996 // CVtEngDrawNGA::CVtEngBufferWaiter::CVtEngBufferWaiter
       
   997 // -----------------------------------------------------------------------------
       
   998 //
       
   999 CVtEngDrawNGA::CVtEngBufferWaiter::CVtEngBufferWaiter
       
  1000     //( CVideoRenderer& aVideoRenderer, MVtEngNGABufferWaiterObserver& aObserver )
       
  1001     ( MVtEngNGABufferWaiterObserver& aObserver )
       
  1002     : CActive( CActive::EPriorityStandard ),
       
  1003       iObserver( &aObserver )
       
  1004     {
       
  1005     __VTPRINTENTER( "RVD(NGA).BufferWaiter.Ctor" )
       
  1006     for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
  1007         {
       
  1008         this->iBuffers[ i ] = NULL;
       
  1009         }         
       
  1010     CActiveScheduler::Add( this );
       
  1011     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.Ctor" )
       
  1012     }
       
  1013 
       
  1014 // -----------------------------------------------------------------------------
       
  1015 // CVtEngDrawNGA::CVtEngBufferWaiter::~CVtEngBufferWaiter
       
  1016 // -----------------------------------------------------------------------------
       
  1017 //
       
  1018 CVtEngDrawNGA::CVtEngBufferWaiter::~CVtEngBufferWaiter()
       
  1019     {
       
  1020     __VTPRINTENTER( "RVD(NGA).BufferWaiter.~" )
       
  1021     Cancel();
       
  1022     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.~" )
       
  1023     }
       
  1024 
       
  1025 // -----------------------------------------------------------------------------
       
  1026 // CVtEngDrawNGA::CVtEngBufferWaiter::Activate
       
  1027 // -----------------------------------------------------------------------------
       
  1028 //
       
  1029 void CVtEngDrawNGA::CVtEngBufferWaiter::Activate()
       
  1030     {
       
  1031     __VTPRINTENTER( "RVD(NGA).BufferWaiter.Activate" )
       
  1032     iStatus = KRequestPending;
       
  1033     SetActive();
       
  1034     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.Activate" )
       
  1035     }
       
  1036 
       
  1037 // -----------------------------------------------------------------------------
       
  1038 // CVtEngDrawNGA::CVtEngBufferWaiter::FetchBuffer
       
  1039 // -----------------------------------------------------------------------------
       
  1040 //
       
  1041 TInt CVtEngDrawNGA::CVtEngBufferWaiter::FetchBuffer()
       
  1042     {
       
  1043     __VTPRINTENTER( "RVD(NGA).BufferWaiter.FetchBuffer" )
       
  1044     if ( IsActive() )
       
  1045     {
       
  1046     	__VTPRINTEXIT( "RVD(NGA).BufferWaiter.FetchBuffer 1" )
       
  1047       return KErrNone;
       
  1048     }
       
  1049     
       
  1050     Activate();
       
  1051     if (iStatus == KRequestPending)
       
  1052         {
       
  1053         for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
  1054             {
       
  1055             if(this->iBuffers[ i ] != NULL)
       
  1056                 {
       
  1057                 TRequestStatus* status = &iStatus;
       
  1058                 User::RequestComplete( status, KErrNone );   
       
  1059                 break;  	
       
  1060                 }
       
  1061             }
       
  1062         }            
       
  1063     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.FetchBuffer 2" )    
       
  1064     return KErrNone;
       
  1065     }
       
  1066 
       
  1067 // -----------------------------------------------------------------------------
       
  1068 // CVtEngDrawNGA::CVtEngBufferWaiter::BufferAvailable
       
  1069 // -----------------------------------------------------------------------------
       
  1070 //
       
  1071 void CVtEngDrawNGA::CVtEngBufferWaiter::BufferAvailable(TVTSurfaceBuffer& aBuffer)
       
  1072 {
       
  1073 	__VTPRINTENTER( "RVD(NGA).BufferWaiter.BufferAvailable" )
       
  1074     for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
  1075     {
       
  1076       if(this->iBuffers[ i ] == NULL  )
       
  1077       {
       
  1078       this->iBuffers[ i ]= &aBuffer;
       
  1079       break;  	
       
  1080       }
       
  1081     } 
       
  1082     
       
  1083     if(iStatus == KRequestPending )
       
  1084     {
       
  1085       for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
  1086       {
       
  1087         if(this->iBuffers[ i ] != NULL)
       
  1088         {
       
  1089           TRequestStatus* status = &iStatus;
       
  1090           User::RequestComplete( status, KErrNone );   
       
  1091           break;  	
       
  1092         }
       
  1093       }
       
  1094     }    
       
  1095      	
       
  1096 	__VTPRINTEXIT( "RVD(NGA).BufferWaiter.BufferAvailable" )    
       
  1097 }
       
  1098 
       
  1099 // -----------------------------------------------------------------------------
       
  1100 // CVtEngDrawNGA::CVtEngBufferWaiter::RunL
       
  1101 // -----------------------------------------------------------------------------
       
  1102 //
       
  1103 void CVtEngDrawNGA::CVtEngBufferWaiter::RunL()
       
  1104     {
       
  1105     __VTPRINTENTER( "RVD(NGA).BufferWaiter.RunL" )
       
  1106     TInt result( iStatus.Int() );
       
  1107     if (  result == KErrNone )
       
  1108     {
       
  1109       for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
  1110       {
       
  1111         if(this->iBuffers[ i ] != NULL)
       
  1112         {   	
       
  1113           TRAP_IGNORE( iObserver->BufferReadyL( this->iBuffers[ i ] ) );
       
  1114           this->iBuffers[ i ] = NULL;
       
  1115           break;
       
  1116         }
       
  1117       }
       
  1118     }
       
  1119     else
       
  1120         {
       
  1121         iObserver->FetchError( result );
       
  1122         }
       
  1123     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.RunL" )
       
  1124     }
       
  1125 
       
  1126 // -----------------------------------------------------------------------------
       
  1127 // CVtEngDrawNGA::CVtEngBufferWaiter::DoCancel
       
  1128 // -----------------------------------------------------------------------------
       
  1129 //
       
  1130 void CVtEngDrawNGA::CVtEngBufferWaiter::DoCancel()
       
  1131     {
       
  1132     __VTPRINTENTER( "RVD(NGA).BufferWaiter.DoCancel" )    
       
  1133     
       
  1134    if ( iStatus == KRequestPending )
       
  1135        {
       
  1136        TRequestStatus* status = &iStatus;
       
  1137        User::RequestComplete(status, KErrCancel);
       
  1138        }
       
  1139     
       
  1140     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.DoCancel" )
       
  1141     }            
       
  1142     
       
  1143 //  End of File