vtengines/videoteleng/Src/Media/CVtEngDrawNGA.cpp
changeset 0 ed9695c8bcbe
child 1 4fbbce2c82ba
equal deleted inserted replaced
-1:000000000000 0:ed9695c8bcbe
       
     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     __VTPRINTEXIT( "RVD(NGA).BaseVideoFrameSizeChangedL" )
       
   360     }
       
   361 
       
   362 // -----------------------------------------------------------------------------
       
   363 // CVtEngDrawDSA::Config
       
   364 // Returns current configuration.
       
   365 // -----------------------------------------------------------------------------
       
   366 //
       
   367 TVtEngRenderConfig& CVtEngDrawNGA::Config()
       
   368     {
       
   369     return iConfig;
       
   370     }
       
   371 
       
   372 // -----------------------------------------------------------------------------
       
   373 // CVtEngDrawNGA::RunL
       
   374 // CActive heir execution method.
       
   375 // -----------------------------------------------------------------------------
       
   376 //
       
   377 void CVtEngDrawNGA::RunL()
       
   378     {
       
   379     __VTPRINTENTER( "RVD(NGA).RunL" )
       
   380     
       
   381     TInt bitmapNo( iStatus.Int() );
       
   382 
       
   383     if ( bitmapNo < KErrNone )
       
   384         {
       
   385         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL notify rvd problem" )
       
   386         CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem );
       
   387         return;
       
   388         }
       
   389 
       
   390     TVtEngBuffer& buffer = iSurfaceBuffers[ bitmapNo ];
       
   391     
       
   392     if ( !iDSUpdated )
       
   393         {
       
   394         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL !Updated" )
       
   395         __VTPRINTEXIT( "RVD(NGA).RunL" )
       
   396         return;
       
   397         }
       
   398     else if ( buffer.SurfaceBuffer() == NULL )
       
   399         {
       
   400         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL signalled with NULL buffer" )
       
   401         TInt result( iBufferWaiter->FetchBuffer() );
       
   402         User::LeaveIfError( result );
       
   403         __VTPRINTEXIT( "RVD(NGA).RunL" )
       
   404         return;
       
   405         }
       
   406     
       
   407     // Image received, reset counter.
       
   408     iCheckpoint = KVtEngWatcherThreshold;
       
   409 
       
   410     __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL flags=%d", iFlags )
       
   411     TBool firstFrame( !IsFlag ( EFirstFrameReceived ) );
       
   412     SetFlag( EFirstFrameReceived );
       
   413     if ( firstFrame )
       
   414         {
       
   415         CVtEngEventManager::NotifyEvent( KVtEngRemoteVideoStarted );
       
   416         }
       
   417 
       
   418     TInt surfaceno = buffer.SurfaceBuffer()->SurfaceNo();
       
   419     __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL received buffer surface id %d", surfaceno )
       
   420     if ( iSubmitPending )
       
   421         {
       
   422         __VTPRINT( DEBUG_MEDIA, "RVD(NGA).RunL submit pending")
       
   423         iWaitingBuffers.AddLast(buffer);
       
   424         }
       
   425     else
       
   426         {
       
   427         iCallBackTable[surfaceno]->iStatus = KRequestPending;
       
   428         iCallBackTable[surfaceno]->SetActive();
       
   429         TTimeStamp timeStamp;
       
   430         iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, timeStamp);
       
   431         iSubmitPending = ETrue;
       
   432         iSurfaceUpdateSession.SubmitUpdate(0, iSurfaceId, surfaceno, NULL); 
       
   433         buffer.UnSet();
       
   434         }
       
   435     if ( iSurfaceBuffers[ KVtEngBitmapNoReversed[ bitmapNo ] ].IsSet() )
       
   436         {
       
   437         __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).RunL reactivating for buffer %d",
       
   438             KVtEngBitmapNoReversed[ bitmapNo ] )
       
   439         Activate();
       
   440         DisplaySink().NextFrame();
       
   441         }    
       
   442     TInt result = iBufferWaiter->FetchBuffer();
       
   443     User::LeaveIfError( result );    
       
   444     
       
   445     __VTPRINTEXIT( "RVD(NGA).RunL" )
       
   446     }
       
   447 
       
   448 
       
   449 // -----------------------------------------------------------------------------
       
   450 // CVtEngDrawNGA::BufferReadyL
       
   451 // BufferReadyL
       
   452 // -----------------------------------------------------------------------------
       
   453 //
       
   454 void CVtEngDrawNGA::BufferReadyL( TVTSurfaceBuffer* aBuffer )
       
   455     {
       
   456     __VTPRINTENTER( "RVD(NGA).BufferReadyL" )
       
   457     SetAvailableToSink( aBuffer );
       
   458     __VTPRINTEXIT( "RVD(NGA).BufferReadyL" )
       
   459     }
       
   460 
       
   461 // -----------------------------------------------------------------------------
       
   462 // CVtEngDrawNGA::FetchError
       
   463 // Buffer fetching error
       
   464 // -----------------------------------------------------------------------------
       
   465 //
       
   466 void CVtEngDrawNGA::FetchError( TInt )
       
   467     {
       
   468     __VTPRINTENTER( "RVD(NGA).FetchError" )
       
   469     CVtEngEventManager::NotifyEvent( KVtEngRemoteRenderingProblem );
       
   470     __VTPRINTEXIT( "RVD(NGA).FetchError" )
       
   471     }    
       
   472    
       
   473 // -----------------------------------------------------------------------------
       
   474 // CVtEngDrawNGA::DoBaseConstructL
       
   475 // Base construction implementation
       
   476 // -----------------------------------------------------------------------------
       
   477 //
       
   478 void CVtEngDrawNGA::DoBaseConstructL()
       
   479     {
       
   480     __VTPRINTENTER( "RVD(NGA).DoBaseConstructL" )
       
   481     delete iBufferWaiter;
       
   482     iBufferWaiter = NULL;
       
   483 
       
   484     iBufferWaiter =
       
   485         new ( ELeave ) CVtEngBufferWaiter( *this );
       
   486         
       
   487     for ( TInt i = MDisplaySink::EFirstBitmap;
       
   488           i < MDisplaySink::EFirstBitmap + KVtEngMaxSurfaceBuffers; i++ )
       
   489         {
       
   490         iSurfaceBuffers[ i ].UnSet();
       
   491         }     
       
   492     ClearFlag( EBaseConstructCalled );          
       
   493     __VTPRINTEXIT( "RVD(NGA).DoBaseConstructL" )
       
   494     }
       
   495           
       
   496 // -----------------------------------------------------------------------------
       
   497 // CVtEngDrawNGA::UpdateSinkParamsL
       
   498 // Updates sink params
       
   499 // -----------------------------------------------------------------------------
       
   500 //
       
   501 void CVtEngDrawNGA::UpdateSinkParamsL()
       
   502     {
       
   503     __VTPRINTENTER( "RVD(NGA).UpdateSinkParamsL" )
       
   504     if ( IsFlag( EBaseConstructCalled ) )
       
   505         {
       
   506         SetFlag( ESinkParamUpdateRequired );
       
   507         }
       
   508     else
       
   509         {
       
   510         DoUpdateSinkParamsL();
       
   511         }
       
   512     __VTPRINTEXIT( "RVD(NGA).UpdateSinkParamsL" )
       
   513     }
       
   514 
       
   515     
       
   516  // -----------------------------------------------------------------------------
       
   517 // CVtEngDrawNGA::DoBaseStartDrawL
       
   518 //
       
   519 // -----------------------------------------------------------------------------
       
   520 //
       
   521 void CVtEngDrawNGA::DoBaseStartDrawL()
       
   522     {
       
   523     __VTPRINTENTER( "RVD(NGA).DoBaseStartDrawL" )
       
   524     SetFlag( EReadyInternal );
       
   525     if ( !iWatcher->IsActive() )
       
   526        {
       
   527        iWatcher->Start( KVtEngWatcherTimeout, KVtEngWatcherTimeout,
       
   528              iCallback );
       
   529        }
       
   530     
       
   531     DoSurfaceBuffer0Ready();
       
   532     DoSurfaceBuffer1Ready();
       
   533     
       
   534     User::LeaveIfError( iBufferWaiter->FetchBuffer() );
       
   535     
       
   536         
       
   537     SetFlag( ERemoteVideoDrawing );             
       
   538     ClearFlag( EBaseBaseStartDrawCalled );
       
   539     __VTPRINTEXIT( "RVD(NGA).DoBaseStartDrawL" )
       
   540     }
       
   541                    
       
   542 // -----------------------------------------------------------------------------
       
   543 // CVtEngDrawNGA::DoCreateSurfaceL
       
   544 // Create surface implementation.
       
   545 // -----------------------------------------------------------------------------
       
   546 //
       
   547 void CVtEngDrawNGA::DoCreateSurfaceL()
       
   548     {
       
   549     __VTPRINTENTER( "RVD(NGA).DoCreateSurfaceL" )  
       
   550     TInt err;
       
   551     
       
   552     if(iSurfaceCreated)
       
   553         {
       
   554                 
       
   555         if (iSurfaceManager)
       
   556             {
       
   557             return;
       
   558             
       
   559             // Last return statement is for fixing an error causes
       
   560             // green screen of remote video when swapping image after
       
   561             // remote peer disabled video.
       
   562             // So we return here to prevent recreate the surface object
       
   563             // at this moment, codes below should NOT be removed due to
       
   564             // potential future uses.
       
   565             iConfig.iRemoteWindow->RemoveBackgroundSurface(ETrue);
       
   566             iConfig.iWsSession->UnregisterSurface(0, iSurfaceId);
       
   567             iSurfaceChunk->Close();
       
   568             delete iSurfaceChunk;
       
   569             iSurfaceChunk = NULL;
       
   570             iSurfaceManager->CloseSurface(iSurfaceId);
       
   571             iSurfaceUpdateSession.CancelAllUpdateNotifications();
       
   572             iSurfaceUpdateSession.Close();
       
   573                               
       
   574             /* Close the surface manager handle */
       
   575             iSurfaceManager->Close();
       
   576             delete iSurfaceManager;
       
   577             iSurfaceManager = 0;
       
   578             }
       
   579         for ( TInt i = KVtEngMaxSurfaceBuffers-1; i >= 0 ; i-- )
       
   580             {
       
   581                 if (iCallBackTable[i])
       
   582                     {
       
   583                     iCallBackTable[i]->Cancel();
       
   584                     delete iCallBackTable[i];
       
   585                     iCallBackTable[i] = NULL;
       
   586                     }
       
   587             }
       
   588         iSurfaceBuffers[ 0 ].UnSet();
       
   589         iSurfaceBuffers[ 1 ].UnSet();
       
   590         iSurfaceBuffer0.UnSet();
       
   591         iSurfaceBuffer1.UnSet();
       
   592         iWaitingBuffers.Reset();
       
   593         }
       
   594     
       
   595     err = iSurfaceUpdateSession.Connect();    
       
   596     User::LeaveIfError(err);
       
   597     
       
   598     iSurfaceManager = new RSurfaceManager();
       
   599     
       
   600     User::LeaveIfNull(iSurfaceManager); 
       
   601     err = iSurfaceManager->Open();
       
   602     User::LeaveIfError(err);
       
   603     
       
   604     RSurfaceManager::TSurfaceCreationAttributesBuf attributes;
       
   605     attributes().iPixelFormat           = iSurfaceFormat; 
       
   606     attributes().iSize                  = iSourceSize;
       
   607     attributes().iBuffers               = KVtEngMaxSurfaceBuffers;
       
   608 
       
   609     //attributes().iStride                = iSourceSize.iWidth*2;
       
   610     attributes().iStride                = iSourceSize.iWidth*3/2;
       
   611 
       
   612     attributes().iOffsetToFirstBuffer   = 0;
       
   613     attributes().iAlignment             = 4;
       
   614     attributes().iContiguous            = EFalse;
       
   615     attributes().iMappable              = ETrue;
       
   616         
       
   617     err = iSurfaceManager->CreateSurface(attributes, iSurfaceId);
       
   618     User::LeaveIfError(err);  
       
   619     
       
   620     // Map to chunk
       
   621     iSurfaceChunk = new RChunk();
       
   622     User::LeaveIfNull(iSurfaceChunk);    
       
   623     err = iSurfaceManager->MapSurface(iSurfaceId, *iSurfaceChunk);
       
   624     User::LeaveIfError(err);    
       
   625 
       
   626     // Get the info from the surfaceManager
       
   627     RSurfaceManager::TInfoBuf info;
       
   628     err = iSurfaceManager->SurfaceInfo(iSurfaceId, info);
       
   629     User::LeaveIfError(err);    
       
   630 
       
   631     TInt offset;
       
   632     iSurfaceManager->GetBufferOffset(iSurfaceId, 0, offset);
       
   633     iSurfaceBuffer0.Set(iSurfaceChunk->Base() + offset, 0 );
       
   634     iSurfaceManager->GetBufferOffset(iSurfaceId, 1, offset);
       
   635     iSurfaceBuffer1.Set(iSurfaceChunk->Base() + offset, 1 );
       
   636         
       
   637     iConfig.iWsSession->RegisterSurface(0, iSurfaceId);   
       
   638     iConfig.iRemoteWindow->SetBackgroundSurface(iSurfaceId);
       
   639     
       
   640     iCallBackTable[0] = new(ELeave) CActiveCallBack(TCallBack(SurfaceBuffer0Ready, this), CActive::EPriorityStandard-1);
       
   641     CActiveScheduler::Add(iCallBackTable[0]);
       
   642     iCallBackTable[1] = new(ELeave) CActiveCallBack(TCallBack(SurfaceBuffer1Ready, this), CActive::EPriorityStandard-1);
       
   643     CActiveScheduler::Add(iCallBackTable[1]);
       
   644     
       
   645     iSurfaceCreated = ETrue;    
       
   646     
       
   647     ClearFlag( EInitializePostingSurfaceCalled );
       
   648     __VTPRINTEXIT( "RVD(NGA).DoCreateSurfaceL" )
       
   649     }
       
   650     
       
   651 // -----------------------------------------------------------------------------
       
   652 // CVtEngDrawNGA::DoUpdateSinkParamsL
       
   653 // Updates sink params
       
   654 // -----------------------------------------------------------------------------
       
   655 //
       
   656 void CVtEngDrawNGA::DoUpdateSinkParamsL()
       
   657     {
       
   658     __VTPRINTENTER( "RVD(NGA).DoUpdateSinkParamsL" )
       
   659     TDisplaySinkParamsNGA params;
       
   660     GetSinkParams( params );
       
   661     DisplaySink().UpdateSinkParamsL( params, iDSUpdated );
       
   662     ClearFlag( ESinkParamUpdateRequired );
       
   663     if ( IsFlag( ESinkResumeRequired ) )
       
   664         {
       
   665         DisplaySink().Resume();
       
   666         ClearFlag( ESinkResumeRequired );
       
   667         }
       
   668     __VTPRINTEXIT( "RVD(DP).DoUpdateSinkParamsL" )
       
   669     }
       
   670       
       
   671 // -----------------------------------------------------------------------------
       
   672 // CVtEngDrawNGA::CreateSurfaceL
       
   673 // Create surface.
       
   674 // -----------------------------------------------------------------------------
       
   675 //
       
   676 void CVtEngDrawNGA::CreateSurfaceL()
       
   677     {
       
   678     __VTPRINTENTER( "RVD(NGA).CreateSurfaceL" )
       
   679     if ( IsFlag( EBaseConstructCalled ) )
       
   680         {
       
   681         SetFlag( EInitializePostingSurfaceCalled );
       
   682         }
       
   683     else
       
   684         {
       
   685         DoCreateSurfaceL();
       
   686         }
       
   687     __VTPRINTEXIT( "RVD(NGA).CreateSurfaceL" )
       
   688     }
       
   689            
       
   690 // -----------------------------------------------------------------------------
       
   691 // CVtEngDrawNGA::GetSinkParams
       
   692 // -----------------------------------------------------------------------------
       
   693 //
       
   694 void CVtEngDrawNGA::GetSinkParams( TDisplaySinkParamsNGA& aSinkParams )
       
   695     { 
       
   696     __VTPRINTENTER( "RVD(NGA).GetSinkParams" )
       
   697     Mem::FillZ( &aSinkParams, sizeof( TDisplaySinkParamsNGA ) );
       
   698     aSinkParams.iThreadId = RThread().Id();
       
   699     aSinkParams.iRequestStatusPtr = &iStatus;
       
   700     aSinkParams.iObserver = iObserver;
       
   701     aSinkParams.iSurfaceBuffer1 = &iSurfaceBuffers[ 0 ].Buffer();
       
   702     aSinkParams.iSurfaceBuffer2 = &iSurfaceBuffers[ 1 ].Buffer();
       
   703     aSinkParams.iFrameSize = iSourceSize;
       
   704     aSinkParams.iSurfaceFormat = iSurfaceFormat;
       
   705     aSinkParams.iFlags = TDisplaySinkParams::EDisplaySinkNGA;
       
   706     __VTPRINTEXITR( "RVD(NGA).GetSinkParams flags=%d",
       
   707         (TInt) aSinkParams.iFlags )	  
       
   708     }
       
   709     
       
   710 // -----------------------------------------------------------------------------
       
   711 // CVtEngDrawNGA::DisplaySink
       
   712 // Returns reference to sink.
       
   713 // -----------------------------------------------------------------------------
       
   714 //
       
   715 MDisplaySink& CVtEngDrawNGA::DisplaySink()
       
   716     {
       
   717     return *iDisplaySink;
       
   718     }
       
   719      
       
   720 // -----------------------------------------------------------------------------
       
   721 // CVtEngDrawNGA::SetToSink
       
   722 // Sets posting buffer  to sink.
       
   723 // -----------------------------------------------------------------------------
       
   724 //
       
   725 void CVtEngDrawNGA::SetAvailableToSink( TVTSurfaceBuffer* aBuffer )
       
   726     {
       
   727     __VTPRINTENTER( "RVD(NGA).SetAvailableToSink" )
       
   728     for ( TInt i = MDisplaySink::EFirstBitmap;
       
   729           i < MDisplaySink::EFirstBitmap + KVtEngMaxSurfaceBuffers; i++ )
       
   730         {
       
   731         if ( !iSurfaceBuffers[ i ].IsSet() )
       
   732             {
       
   733             iSurfaceBuffers[ i ].Set( aBuffer );
       
   734             Activate();
       
   735             DisplaySink().SetBitmapAvailable(
       
   736                 static_cast< MDisplaySink::TBitmapNo >( i ) );
       
   737             break;
       
   738             }
       
   739         }
       
   740     __VTPRINTEXIT( "RVD(NGA).SetAvailableToSink" )
       
   741     }  
       
   742 
       
   743 TInt CVtEngDrawNGA::SurfaceBuffer0Ready( TAny* aAny )
       
   744     {
       
   745     __VTPRINTENTER( "RVD(NGA).SurfaceBuffer0Ready" )
       
   746     __VTPRINTEXIT( "RVD(NGA).SurfaceBuffer0Ready" )
       
   747     return ((CVtEngDrawNGA*)aAny)->DoSurfaceBuffer0Ready();
       
   748     }
       
   749 
       
   750 TBool CVtEngDrawNGA::DoSurfaceBuffer0Ready()
       
   751     {
       
   752     __VTPRINTENTER( "RVD(NGA).DoSurfaceBuffer0Ready" )
       
   753     if ( iSubmitPending )
       
   754         {
       
   755         iSubmitPending = EFalse;
       
   756         }
       
   757     if (!iWaitingBuffers.IsEmpty())
       
   758         {
       
   759         TVtEngBuffer* buffer = iWaitingBuffers.First();
       
   760         TInt surfaceno = buffer->SurfaceBuffer()->SurfaceNo();
       
   761         __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).DoSurfaceBuffer0Ready, surface buffer %d is in waitingqueue", surfaceno )
       
   762         iCallBackTable[surfaceno]->iStatus = KRequestPending;
       
   763         iCallBackTable[surfaceno]->SetActive();
       
   764         TTimeStamp  timeStamp;
       
   765         iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, timeStamp);
       
   766         iSubmitPending = ETrue;
       
   767         iSurfaceUpdateSession.SubmitUpdate(0, iSurfaceId, surfaceno, NULL); 
       
   768         iWaitingBuffers.Remove(*buffer);
       
   769         buffer->UnSet();
       
   770         }
       
   771     iBufferWaiter->BufferAvailable(iSurfaceBuffer0);
       
   772     __VTPRINTEXIT( "RVD(NGA).DoSurfaceBuffer0Ready" )
       
   773     return ETrue;
       
   774     }
       
   775         
       
   776 TInt CVtEngDrawNGA::SurfaceBuffer1Ready( TAny* aAny )
       
   777     {
       
   778     __VTPRINTENTER( "RVD(NGA).SurfaceBuffer1Ready" )
       
   779     __VTPRINTEXIT( "RVD(NGA).SurfaceBuffer1Ready" )
       
   780     return ((CVtEngDrawNGA*)aAny)->DoSurfaceBuffer1Ready();
       
   781     }
       
   782 
       
   783 TBool CVtEngDrawNGA::DoSurfaceBuffer1Ready()
       
   784     {
       
   785     __VTPRINTENTER( "RVD(NGA).DoSurfaceBuffer1Ready" )
       
   786     if ( iSubmitPending )
       
   787         {
       
   788         iSubmitPending = EFalse;
       
   789         }
       
   790     
       
   791     if (!iWaitingBuffers.IsEmpty())
       
   792         {
       
   793         TVtEngBuffer* buffer = iWaitingBuffers.First();
       
   794         TInt surfaceno = buffer->SurfaceBuffer()->SurfaceNo();
       
   795         __VTPRINT2( DEBUG_MEDIA, "RVD(NGA).DoSurfaceBuffer0Ready, surface buffer %d is in waitingqueue", surfaceno )
       
   796         iCallBackTable[surfaceno]->iStatus = KRequestPending;
       
   797         iCallBackTable[surfaceno]->SetActive();
       
   798         TTimeStamp  timeStamp;
       
   799         iSurfaceUpdateSession.NotifyWhenDisplayed(iCallBackTable[surfaceno]->iStatus, timeStamp);
       
   800         iSubmitPending = ETrue;
       
   801         iSurfaceUpdateSession.SubmitUpdate(0, iSurfaceId, surfaceno, NULL); 
       
   802         iWaitingBuffers.Remove(*buffer);
       
   803         buffer->UnSet();
       
   804         }
       
   805     iBufferWaiter->BufferAvailable(iSurfaceBuffer1);
       
   806     __VTPRINTEXIT( "RVD(NGA).DoSurfaceBuffer1Ready" )
       
   807     return ETrue;
       
   808     }
       
   809 
       
   810 // -----------------------------------------------------------------------------
       
   811 // CVtEngDrawNGA::TVtEngBuffer::TVtEngBuffer
       
   812 //
       
   813 // -----------------------------------------------------------------------------
       
   814 //
       
   815 CVtEngDrawNGA::TVtEngBuffer::TVtEngBuffer()
       
   816     : iBuffer( 0 ), iSurfaceBuffer(0)
       
   817     {
       
   818     __VTPRINTENTER( "RVD(NGA).Buffer.Ctor" )
       
   819     __VTPRINTEXIT( "RVD(NGA).Buffer.Ctor" )
       
   820     }
       
   821 
       
   822 // -----------------------------------------------------------------------------
       
   823 // CVtEngDrawNGA::TVtEngBuffer::Set
       
   824 //
       
   825 // -----------------------------------------------------------------------------
       
   826 //
       
   827 void CVtEngDrawNGA::TVtEngBuffer::Set( TVTSurfaceBuffer* aBuffer )
       
   828     {
       
   829     __VTPRINTENTER( "RVD(NGA).Buffer.Set" )
       
   830     iSurfaceBuffer = aBuffer;
       
   831     iBuffer = aBuffer->Buffer();
       
   832     __VTPRINTEXIT( "RVD(NGA).Buffer.Set" )
       
   833     }
       
   834 
       
   835 // -----------------------------------------------------------------------------
       
   836 // CVtEngDrawNGA::TVtEngBuffer::UnSet
       
   837 //
       
   838 // -----------------------------------------------------------------------------
       
   839 //
       
   840 void CVtEngDrawNGA::TVtEngBuffer::UnSet()
       
   841     {
       
   842     __VTPRINTENTER( "RVD(NGA).Buffer.UnSet" )
       
   843     iSurfaceBuffer = 0;
       
   844     iBuffer = 0;
       
   845     __VTPRINTEXIT( "RVD(NGA).Buffer.UnSet" )
       
   846     }
       
   847 
       
   848 // -----------------------------------------------------------------------------
       
   849 // CVtEngDrawNGA::TVtEngBuffer::IsSet
       
   850 //
       
   851 // -----------------------------------------------------------------------------
       
   852 //
       
   853 TBool CVtEngDrawNGA::TVtEngBuffer::IsSet() const
       
   854     {
       
   855     return ( iSurfaceBuffer != NULL );
       
   856     }
       
   857 
       
   858 // -----------------------------------------------------------------------------
       
   859 // CVtEngDrawNGA::TVtEngBuffer::Buffer
       
   860 //
       
   861 // -----------------------------------------------------------------------------
       
   862 //
       
   863 TVTSurfaceBuffer* &CVtEngDrawNGA::TVtEngBuffer::SurfaceBuffer()
       
   864     {
       
   865     return iSurfaceBuffer;
       
   866     }
       
   867 
       
   868 // -----------------------------------------------------------------------------
       
   869 // CVtEngDrawNGA::TVtEngBuffer::Buffer
       
   870 //
       
   871 // -----------------------------------------------------------------------------
       
   872 //
       
   873 TUint8* &CVtEngDrawNGA::TVtEngBuffer::Buffer()
       
   874     {
       
   875     return iBuffer;
       
   876     }
       
   877 // -----------------------------------------------------------------------------
       
   878 // CVtEngDrawNGA::CVtEngBufferWaiter::CVtEngBufferWaiter
       
   879 // -----------------------------------------------------------------------------
       
   880 //
       
   881 CVtEngDrawNGA::CVtEngBufferWaiter::CVtEngBufferWaiter
       
   882     //( CVideoRenderer& aVideoRenderer, MVtEngNGABufferWaiterObserver& aObserver )
       
   883     ( MVtEngNGABufferWaiterObserver& aObserver )
       
   884     : CActive( CActive::EPriorityStandard ),
       
   885       iObserver( &aObserver )
       
   886     {
       
   887     __VTPRINTENTER( "RVD(NGA).BufferWaiter.Ctor" )
       
   888     for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
   889         {
       
   890         this->iBuffers[ i ] = NULL;
       
   891         }         
       
   892     CActiveScheduler::Add( this );
       
   893     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.Ctor" )
       
   894     }
       
   895 
       
   896 // -----------------------------------------------------------------------------
       
   897 // CVtEngDrawNGA::CVtEngBufferWaiter::~CVtEngBufferWaiter
       
   898 // -----------------------------------------------------------------------------
       
   899 //
       
   900 CVtEngDrawNGA::CVtEngBufferWaiter::~CVtEngBufferWaiter()
       
   901     {
       
   902     __VTPRINTENTER( "RVD(NGA).BufferWaiter.~" )
       
   903     Cancel();
       
   904     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.~" )
       
   905     }
       
   906 
       
   907 // -----------------------------------------------------------------------------
       
   908 // CVtEngDrawNGA::CVtEngBufferWaiter::Activate
       
   909 // -----------------------------------------------------------------------------
       
   910 //
       
   911 void CVtEngDrawNGA::CVtEngBufferWaiter::Activate()
       
   912     {
       
   913     __VTPRINTENTER( "RVD(NGA).BufferWaiter.Activate" )
       
   914     iStatus = KRequestPending;
       
   915     SetActive();
       
   916     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.Activate" )
       
   917     }
       
   918 
       
   919 // -----------------------------------------------------------------------------
       
   920 // CVtEngDrawNGA::CVtEngBufferWaiter::FetchBuffer
       
   921 // -----------------------------------------------------------------------------
       
   922 //
       
   923 TInt CVtEngDrawNGA::CVtEngBufferWaiter::FetchBuffer()
       
   924     {
       
   925     __VTPRINTENTER( "RVD(NGA).BufferWaiter.FetchBuffer" )
       
   926     if ( IsActive() )
       
   927     {
       
   928     	__VTPRINTEXIT( "RVD(NGA).BufferWaiter.FetchBuffer 1" )
       
   929       return KErrNone;
       
   930     }
       
   931     
       
   932     Activate();
       
   933     if (iStatus == KRequestPending)
       
   934         {
       
   935         for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
   936             {
       
   937             if(this->iBuffers[ i ] != NULL)
       
   938                 {
       
   939                 TRequestStatus* status = &iStatus;
       
   940                 User::RequestComplete( status, KErrNone );   
       
   941                 break;  	
       
   942                 }
       
   943             }
       
   944         }            
       
   945     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.FetchBuffer 2" )    
       
   946     return KErrNone;
       
   947     }
       
   948 
       
   949 // -----------------------------------------------------------------------------
       
   950 // CVtEngDrawNGA::CVtEngBufferWaiter::BufferAvailable
       
   951 // -----------------------------------------------------------------------------
       
   952 //
       
   953 void CVtEngDrawNGA::CVtEngBufferWaiter::BufferAvailable(TVTSurfaceBuffer& aBuffer)
       
   954 {
       
   955 	__VTPRINTENTER( "RVD(NGA).BufferWaiter.BufferAvailable" )
       
   956     for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
   957     {
       
   958       if(this->iBuffers[ i ] == NULL  )
       
   959       {
       
   960       this->iBuffers[ i ]= &aBuffer;
       
   961       break;  	
       
   962       }
       
   963     } 
       
   964     
       
   965     if(iStatus == KRequestPending )
       
   966     {
       
   967       for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
   968       {
       
   969         if(this->iBuffers[ i ] != NULL)
       
   970         {
       
   971           TRequestStatus* status = &iStatus;
       
   972           User::RequestComplete( status, KErrNone );   
       
   973           break;  	
       
   974         }
       
   975       }
       
   976     }    
       
   977      	
       
   978 	__VTPRINTEXIT( "RVD(NGA).BufferWaiter.BufferAvailable" )    
       
   979 }
       
   980 
       
   981 // -----------------------------------------------------------------------------
       
   982 // CVtEngDrawNGA::CVtEngBufferWaiter::RunL
       
   983 // -----------------------------------------------------------------------------
       
   984 //
       
   985 void CVtEngDrawNGA::CVtEngBufferWaiter::RunL()
       
   986     {
       
   987     __VTPRINTENTER( "RVD(NGA).BufferWaiter.RunL" )
       
   988     TInt result( iStatus.Int() );
       
   989     if (  result == KErrNone )
       
   990     {
       
   991       for ( TInt i = 0; i < KVtEngMaxSurfaceBuffers; i++ )
       
   992       {
       
   993         if(this->iBuffers[ i ] != NULL)
       
   994         {   	
       
   995           TRAP_IGNORE( iObserver->BufferReadyL( this->iBuffers[ i ] ) );
       
   996           this->iBuffers[ i ] = NULL;
       
   997           break;
       
   998         }
       
   999       }
       
  1000     }
       
  1001     else
       
  1002         {
       
  1003         iObserver->FetchError( result );
       
  1004         }
       
  1005     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.RunL" )
       
  1006     }
       
  1007 
       
  1008 // -----------------------------------------------------------------------------
       
  1009 // CVtEngDrawNGA::CVtEngBufferWaiter::DoCancel
       
  1010 // -----------------------------------------------------------------------------
       
  1011 //
       
  1012 void CVtEngDrawNGA::CVtEngBufferWaiter::DoCancel()
       
  1013     {
       
  1014     __VTPRINTENTER( "RVD(NGA).BufferWaiter.DoCancel" )    
       
  1015     
       
  1016    if ( iStatus == KRequestPending )
       
  1017        {
       
  1018        TRequestStatus* status = &iStatus;
       
  1019        User::RequestComplete(status, KErrCancel);
       
  1020        }
       
  1021     
       
  1022     __VTPRINTEXIT( "RVD(NGA).BufferWaiter.DoCancel" )
       
  1023     }            
       
  1024     
       
  1025 //  End of File