vtengines/videoteleng/Src/Media/CVtEngLocalVideo.cpp
branchRCL_3
changeset 24 f15ac8e65a02
parent 12 3e521e99f813
child 25 779871d1e4f4
--- a/vtengines/videoteleng/Src/Media/CVtEngLocalVideo.cpp	Thu Aug 19 09:57:36 2010 +0300
+++ b/vtengines/videoteleng/Src/Media/CVtEngLocalVideo.cpp	Tue Aug 31 15:16:10 2010 +0300
@@ -33,6 +33,10 @@
 #include    <capivideosource.h>
 #include    <cvtlogger.h>
 #include    <mvtprotocolhandler.h>
+#include    <fbs.h> 
+#include    <w32std.h> 
+#include    <graphics/suerror.h>
+#include    <graphics/surfaceconfiguration.h> 
 
 #include    "CVtEngCameraPreferences.h"
 
@@ -94,6 +98,8 @@
     iAsyncCallBack = new ( ELeave ) CAsyncCallBack(
         TCallBack( CallBackFunc, this ), EPriorityStandard );
 
+    iNGARender = CVtEngVFBitmapNGARender::NewL();
+
     TInt indexMobile( KErrNotFound );
     iShareImage = CVtEngShareImage::NewL( *this );
     iSourceController = CVSController::NewL( this );
@@ -368,6 +374,9 @@
     delete iSourceController;
     DeleteAudioSource();
     delete iShareImage;
+
+    delete iNGARender;
+    
     __VTPRINTEXIT( "LocVid.~" )
     }
 
@@ -833,8 +842,11 @@
     if ( iActiveProvider &&
          iActiveProvider->iType != KVtEngProviderNone )
         {
+#if 0
         TRAP_IGNORE( iOptions.iObserver->vtHandleFrameL(
             MVtEngFrameObserver::ELocalVideoFrame, &aFrame ) );
+#endif
+        iNGARender->UpdateBitmapL( aFrame );
         }
     __VTPRINTEXIT( "LocVid.vsViewFinderFrameReady" )
     }
@@ -1110,6 +1122,34 @@
     }
 
 // -----------------------------------------------------------------------------
+// CVtEngLocalVideo::SetViewFinderParameters
+// Configures parameters for rendering with NGA.
+// -----------------------------------------------------------------------------
+//
+void CVtEngLocalVideo::SetViewFinderParameters(
+    const TVtEngRenderingOptionsNGA &aNGA )
+    {
+    __VTPRINTENTER( "LocVid.SetVFParamsNGA" )
+
+    // Before setting the params, stop VF
+    if( ViewFinderStarted() )
+        {
+        StopViewFinder();
+        }
+
+    iOptions.iSize.SetSize( KVtEngLocalVideoDefaultWidth, 
+                            KVtEngLocalVideoDefaultHeight );
+    
+    iWindow = &aNGA.iWindow;
+    iWs = &aNGA.iWs;
+    
+    iRenderingMethod = EWindowServer;
+
+    iNGARender->AttachSurfaceL( iWs, iWindow );
+    __VTPRINTEXIT( "LocVid.SetVFParamsNGA" )
+    }
+
+// -----------------------------------------------------------------------------
 // CVtEngLocalVideo::SetDefaultStillImageL
 // Sets default still image.
 // -----------------------------------------------------------------------------
@@ -1884,8 +1924,10 @@
          iActiveProvider->iProvider &&
          iActiveProvider->iProvider->ViewFinderActive() )
         {
+#if 0
         TRAP_IGNORE( iOptions.iObserver->vtHandleFrameL(
             MVtEngFrameObserver::ELocalVideoFrame, NULL ) );
+#endif
         iActiveProvider->iProvider->StopViewFinder();
         __VTPRINT( DEBUG_MEDIA, "LocVideo.stopVF Stopped" )
         if ( IsFlag( EFlagAutomaticSwitchCallback )  ||
@@ -4500,6 +4542,224 @@
     }
 
 // -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::NewL
+// -----------------------------------------------------------------------------
+//
+CVtEngLocalVideo::CVtEngVFBitmapNGARender * 
+CVtEngLocalVideo::CVtEngVFBitmapNGARender::NewL()
+    {
+    CVtEngVFBitmapNGARender* self 
+        = new ( ELeave ) CVtEngVFBitmapNGARender();
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::~CVtEngVFBitmapNGARender
+// -----------------------------------------------------------------------------
+//
+CVtEngLocalVideo::CVtEngVFBitmapNGARender::~CVtEngVFBitmapNGARender()
+    {
+    __VTPRINTENTER( "LocVid.NGARender.~" )
+    Cancel();
+    
+    if ( iSurfaceCreated )
+        {
+        iWindow->RemoveBackgroundSurface(ETrue);
+        iWs->UnregisterSurface(0, iSurfaceId);
+        
+        iSurfaceManager.CloseSurface(iSurfaceId);
+        iSurfaceChunk->Close();
+        delete iSurfaceChunk;
+        iSurfaceChunk = NULL;
+        
+        iSurfaceManager.Close();
+            
+        iSurfaceUpdateSession.CancelAllUpdateNotifications();
+        iSurfaceUpdateSession.Close();    
+        }
+    
+    __VTPRINTEXIT( "LocVid.NGARender.~" )
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::UpdateBitmap
+// -----------------------------------------------------------------------------
+//
+TInt CVtEngLocalVideo::CVtEngVFBitmapNGARender::UpdateBitmapL( CFbsBitmap& aFrame )
+    {
+    __VTPRINTENTER( "LocVid.NGARender.UpdateBitmapL" )
+    // do nothing if we're already active, the newer bitmap will be ignored.
+    if ( IsActive() )
+        {
+        __VTPRINTEXIT( "LocVid.NGARender.UpdateBitmapL 0" )
+        return KErrNone;
+        }
+    else
+        {
+        if ( !iSurfaceCreated )
+            {
+            User::Leave( KErrNotReady );
+            }
+        aFrame.BeginDataAccess();
+        __VTPRINT2( DEBUG_MEDIA, "LocVid.NGARender.bitmap size = %d", aFrame.DataSize() );
+#if 0
+        memcpy( iBuffer, aFrame.DataAddress(), aFrame.DataSize() );
+#else
+        TInt size = aFrame.DataSize();
+        TPtr8 ptrBuffer( iBuffer, size );
+        ptrBuffer.Copy( reinterpret_cast<TUint8*>(aFrame.DataAddress()), size );
+#endif
+        __VTPRINT( DEBUG_MEDIA, "LocVid.NGARender.bitmap step 1" );
+        aFrame.EndDataAccess();
+        __VTPRINT( DEBUG_MEDIA, "LocVid.NGARender.bitmap step 2" );
+        iStatus = KRequestPending;
+        SetActive();
+        __VTPRINT( DEBUG_MEDIA, "LocVid.NGARender.bitmap step 3" );
+        iSurfaceUpdateSession.NotifyWhenDisplayed( iStatus, iTimeStamp );
+        __VTPRINT( DEBUG_MEDIA, "LocVid.NGARender.bitmap step 4" );
+        iSurfaceUpdateSession.SubmitUpdate( KAllScreens, iSurfaceId, 0, NULL );
+        __VTPRINT( DEBUG_MEDIA, "LocVid.NGARender.bitmap step 5" );
+
+        __VTPRINTEXIT( "LocVid.NGARender.UpdateBitmapL 1" )
+
+        return KErrNone;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::CreateSurfaceL
+// -----------------------------------------------------------------------------
+//
+TInt CVtEngLocalVideo::CVtEngVFBitmapNGARender::AttachSurfaceL( 
+        RWsSession *aWs, 
+        RWindow *aWindow )
+    {
+    __VTPRINTENTER( "LocVid.NGARender.AttachSurfaceL" )
+    
+    if ( aWs == NULL || aWindow == NULL )
+        {
+        User::Leave( KErrArgument );
+        }
+        
+        if(iSurfaceCreated)
+        	return KErrNone;
+    
+    if ( !iSurfaceCreated )
+        {    
+        TInt err;
+            
+        err = iSurfaceUpdateSession.Connect();    
+        User::LeaveIfError(err);
+            
+        err = iSurfaceManager.Open();
+        User::LeaveIfError(err);
+        
+        RSurfaceManager::TSurfaceCreationAttributesBuf attributes;
+        attributes().iPixelFormat           = iSurfaceFormat; 
+        attributes().iSize.SetSize( KVtEngLocalVideoDefaultWidth, 
+                                    KVtEngLocalVideoDefaultHeight );
+        attributes().iBuffers               = EVtEngVFMaxBuffers;
+        attributes().iStride                = attributes().iSize.iWidth*4;
+        attributes().iOffsetToFirstBuffer   = 0;
+        attributes().iAlignment             = 4;
+        attributes().iContiguous            = EFalse;
+        attributes().iMappable              = ETrue;
+    
+        err = iSurfaceManager.CreateSurface( attributes, iSurfaceId );
+        User::LeaveIfError( err );  
+        
+        // Map to chunk
+        iSurfaceChunk = new RChunk();
+        User::LeaveIfNull( iSurfaceChunk );    
+        err = iSurfaceManager.MapSurface( iSurfaceId, *iSurfaceChunk );
+        User::LeaveIfError( err );    
+    
+        // Get the info from the surfaceManager
+        RSurfaceManager::TInfoBuf info;
+        err = iSurfaceManager.SurfaceInfo( iSurfaceId, info );
+        User::LeaveIfError( err );    
+    
+        TInt offset;
+        iSurfaceManager.GetBufferOffset( iSurfaceId, 0, offset );
+        iBuffer = iSurfaceChunk->Base() + offset;
+        
+        iSurfaceCreated = ETrue;
+        }
+    else
+        {
+        if ( iWs == NULL || iWindow == NULL )
+            {
+            User::Leave( KErrGeneral );
+            }
+        
+        iWindow->RemoveBackgroundSurface(ETrue);
+        iWs->UnregisterSurface(0, iSurfaceId);
+        
+        __VTPRINT( DEBUG_MEDIA, "LocVid.NGARender.Surface exists, detach first!" )
+        }
+
+    iWs = aWs;
+    iWindow = aWindow;
+    iWs->RegisterSurface( 0, iSurfaceId );
+    
+    TSurfaceConfiguration surfaceConfig;
+    surfaceConfig.SetSurfaceId( iSurfaceId );
+    surfaceConfig.SetOrientation( CFbsBitGc::EGraphicsOrientationRotated270);
+    iWindow->SetBackgroundSurface( surfaceConfig, ETrue );
+    //iWindow->SetBackgroundSurface( iSurfaceId );
+    
+    __VTPRINTEXIT( "LocVid.NGARender.AttachSurfaceL" )
+    
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::~CVtEngVFBitmapNGARender
+// -----------------------------------------------------------------------------
+//
+CVtEngLocalVideo::CVtEngVFBitmapNGARender::CVtEngVFBitmapNGARender()
+    : CActive( CActive::EPriorityStandard ),
+      iSurfaceFormat( EUidPixelFormatXRGB_8888 )
+    {
+    iSurfaceCreated = EFalse;
+
+    CActiveScheduler::Add( this );        
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CVtEngLocalVideo::CVtEngVFBitmapNGARender::ConstructL( )
+    {
+    __VTPRINTENTER( "LocVid.NGARender.ConstructL" )  
+    __VTPRINTEXIT( "LocVid.NGARender.ConstructL" )
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::RunL
+// -----------------------------------------------------------------------------
+//
+void CVtEngLocalVideo::CVtEngVFBitmapNGARender::RunL()
+    {
+    __VTPRINTENTER( "LocVid.NGARender.RunL" )  
+    __VTPRINTEXIT( "LocVid.NGARender.RunL" )
+    }
+
+// -----------------------------------------------------------------------------
+// CVtEngLocalVideo::CVtEngVFBitmapNGARender::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CVtEngLocalVideo::CVtEngVFBitmapNGARender::DoCancel()
+    {
+    __VTPRINTENTER( "LocVid.NGARender.DoCancel" )  
+    __VTPRINTEXIT( "LocVid.NGARender.DoCancel" )
+    }
+
+// -----------------------------------------------------------------------------
 // CVtEngLocalVideo::CreateCameraPreferencesL
 // -----------------------------------------------------------------------------
 //