diff -r 890b5dd735f8 -r f15ac8e65a02 vtengines/videoteleng/Src/Media/CVtEngLocalVideo.cpp --- 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 #include #include +#include +#include +#include +#include #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(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 // ----------------------------------------------------------------------------- //