vtprotocolplugins/VideoSource/src/CVSCameraDataProvider.cpp
changeset 0 ed9695c8bcbe
equal deleted inserted replaced
-1:000000000000 0:ed9695c8bcbe
       
     1 /*
       
     2 * Copyright (c) 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:  Video Source subsystem.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 
       
    21 #include <e32svr.h>
       
    22 #include <fbs.h>
       
    23 
       
    24 #include "CVSCameraDataProvider.h"
       
    25 #include "CVSOnboardCameraDataProvider.h"
       
    26 #include "VSPanic.h"
       
    27 
       
    28 // EXTERNAL FUNCTION PROTOTYPES
       
    29 
       
    30 // MACROS
       
    31 
       
    32 #ifdef _DEBUG
       
    33 #    define __IF_DEBUG(t) {RDebug::t;}
       
    34 #else
       
    35 #    define __IF_DEBUG(t)
       
    36 #endif
       
    37 
       
    38 // LOCAL CONSTANTS AND MACROS
       
    39 
       
    40 static const TInt KQcifWidth = 176;
       
    41 static const TInt KQcifHeight = 144;
       
    42 static const TReal32 KFrameRate = 15.0;
       
    43 static const TInt KFrozenFrameBufferSize = ( KQcifWidth * KQcifHeight ) + ( KQcifWidth * KQcifHeight ) / 2;
       
    44 static const TInt KCCameraPriority = 80;
       
    45 
       
    46 // ============================ MEMBER FUNCTIONS ===============================
       
    47 
       
    48 // ============================= CVsFrameBuffer ================================
       
    49 
       
    50 // -----------------------------------------------------------------------------
       
    51 // CVsFrameBuffer::NewL( TInt aSize )
       
    52 // -----------------------------------------------------------------------------
       
    53 //
       
    54 EXPORT_C CVsFrameBuffer* CVsFrameBuffer::NewL( TInt aSize )
       
    55     {
       
    56     CVsFrameBuffer* self = new ( ELeave ) CVsFrameBuffer();
       
    57     CleanupStack::PushL( self );
       
    58     self->ConstructL( aSize );
       
    59     CleanupStack::Pop(); // self
       
    60     return self;
       
    61     }
       
    62 
       
    63 // -----------------------------------------------------------------------------
       
    64 // CVsFrameBuffer::~CVsFrameBuffer()
       
    65 // -----------------------------------------------------------------------------
       
    66 //
       
    67 EXPORT_C CVsFrameBuffer::~CVsFrameBuffer()
       
    68     {
       
    69     delete iBuffer;
       
    70     }
       
    71 
       
    72 // -----------------------------------------------------------------------------
       
    73 // CVsFrameBuffer::CopyProperties( MFrameBuffer* aSource )
       
    74 // -----------------------------------------------------------------------------
       
    75 //
       
    76 void CVsFrameBuffer::CopyProperties( MFrameBuffer* aSource )
       
    77     {
       
    78     MFrameBuffer::iIndexOfFirstFrameInBuffer = aSource->iIndexOfFirstFrameInBuffer;
       
    79     MFrameBuffer::iElapsedTime = aSource->iElapsedTime;
       
    80     }
       
    81 
       
    82 // -----------------------------------------------------------------------------
       
    83 // CVsFrameBuffer::CopyProperties( MCameraBuffer* aSource )
       
    84 // -----------------------------------------------------------------------------
       
    85 //
       
    86 void CVsFrameBuffer::CopyProperties( MCameraBuffer* aSource )
       
    87     {
       
    88     MCameraBuffer::iIndexOfFirstFrameInBuffer = aSource->iIndexOfFirstFrameInBuffer;
       
    89     MCameraBuffer::iElapsedTime = aSource->iElapsedTime;
       
    90     }
       
    91 
       
    92 // -----------------------------------------------------------------------------
       
    93 // CVsFrameBuffer::CopyFrameL( MFrameBuffer* aSource )
       
    94 // -----------------------------------------------------------------------------
       
    95 //
       
    96 void CVsFrameBuffer::CopyFrameL( MFrameBuffer* aSource )
       
    97     {
       
    98     iPtr = *( aSource->DataL( 0 ) );
       
    99     CopyProperties( aSource );
       
   100     }
       
   101 
       
   102 // -----------------------------------------------------------------------------
       
   103 // CVsFrameBuffer::CopyFrameL( MCameraBuffer* aSource )
       
   104 // -----------------------------------------------------------------------------
       
   105 //
       
   106 void CVsFrameBuffer::CopyFrameL( MCameraBuffer* aSource )
       
   107 	{
       
   108 	iPtr = *( aSource->DataL( 0 ) );
       
   109     CopyProperties( aSource );
       
   110 	}
       
   111 
       
   112 // -----------------------------------------------------------------------------
       
   113 // CVsFrameBuffer::DataL( TInt aIndex )
       
   114 // -----------------------------------------------------------------------------
       
   115 //
       
   116 TDesC8* CVsFrameBuffer::DataL( TInt aIndex )
       
   117     {
       
   118     if( aIndex != 0 )
       
   119         {
       
   120         User::Leave( KErrNotSupported );
       
   121         }
       
   122 
       
   123     return &iPtr;
       
   124     }
       
   125 
       
   126 // -----------------------------------------------------------------------------
       
   127 // CVsFrameBuffer::FrameL( TInt aIndex )
       
   128 // -----------------------------------------------------------------------------
       
   129 //
       
   130 CFbsBitmap* CVsFrameBuffer::FrameL( TInt aIndex )
       
   131     {
       
   132     ( void ) aIndex;
       
   133     User::Leave( KErrNotSupported );
       
   134     return 0;
       
   135     }
       
   136 
       
   137 // -----------------------------------------------------------------------------
       
   138 // CVsFrameBuffer::Release()
       
   139 // -----------------------------------------------------------------------------
       
   140 //
       
   141 void CVsFrameBuffer::Release()
       
   142     {
       
   143     // Nothing to do
       
   144     }
       
   145 
       
   146 // -----------------------------------------------------------------------------
       
   147 // CVsFrameBuffer::FrameSize()
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 TInt CVsFrameBuffer::FrameSize( TInt /*aFrameIndex*/ )
       
   151     {
       
   152     return KErrNotSupported;
       
   153     }
       
   154 // -----------------------------------------------------------------------------
       
   155 // CVsFrameBuffer::ChunkOffsetL()
       
   156 // -----------------------------------------------------------------------------
       
   157 //
       
   158 TInt CVsFrameBuffer::ChunkOffsetL( TInt /*aFrameIndex*/ )
       
   159     {
       
   160     User::Leave( KErrNotSupported );
       
   161     return KErrNotSupported;
       
   162     }
       
   163 // -----------------------------------------------------------------------------
       
   164 // CVsFrameBuffer::ChunkL()
       
   165 // -----------------------------------------------------------------------------
       
   166 //
       
   167 RChunk& CVsFrameBuffer::ChunkL()
       
   168 	{
       
   169 	User::Leave( KErrNotSupported );
       
   170 	RChunk* help = NULL;
       
   171 	return *help;
       
   172 	}
       
   173 // -----------------------------------------------------------------------------
       
   174 // CVsFrameBuffer::BitmapL()
       
   175 // -----------------------------------------------------------------------------
       
   176 //
       
   177 CFbsBitmap& CVsFrameBuffer::BitmapL(TInt /*aFrameIndex*/ )
       
   178 	{
       
   179 	CFbsBitmap* helpbit = new (ELeave) CFbsBitmap;
       
   180 	CleanupStack::PushL( helpbit );
       
   181 	User::Leave( KErrNotSupported );
       
   182 	CleanupStack::Pop( helpbit );
       
   183 	delete helpbit;
       
   184 	return *helpbit;
       
   185 	}
       
   186 
       
   187 // -----------------------------------------------------------------------------
       
   188 // CVsFrameBuffer::NumFrames()
       
   189 // -----------------------------------------------------------------------------
       
   190 //
       
   191 TInt CVsFrameBuffer::NumFrames()
       
   192 	{
       
   193 	return KErrNotSupported;
       
   194 	}
       
   195 // -----------------------------------------------------------------------------
       
   196 // CVsFrameBuffer::CVsFrameBuffer()
       
   197 // -----------------------------------------------------------------------------
       
   198 //
       
   199 CVsFrameBuffer::CVsFrameBuffer()
       
   200 : iPtr( 0, 0 )
       
   201     {
       
   202     }
       
   203 
       
   204 // -----------------------------------------------------------------------------
       
   205 // CVsFrameBuffer::ConstructL( TInt aSize )
       
   206 // -----------------------------------------------------------------------------
       
   207 //
       
   208 void CVsFrameBuffer::ConstructL( TInt aSize )
       
   209     {
       
   210     iBuffer = HBufC8::NewL( aSize );
       
   211     iPtr.Set( iBuffer->Des() );
       
   212     }
       
   213 
       
   214 // ========================= CVSCameraDataProvider =============================
       
   215 
       
   216 // -----------------------------------------------------------------------------
       
   217 // CVSCameraDataProvider::NewL
       
   218 // -----------------------------------------------------------------------------
       
   219 //
       
   220 CVSCameraDataProvider* CVSCameraDataProvider::NewL(
       
   221     MVSDataProviderObserver* aObserver,
       
   222     TInt aProviderIndex,
       
   223     MVSBufferPool* aPool )
       
   224     {
       
   225     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::NewL() >>"), RThread().Id().operator TUint()));
       
   226     CVSCameraDataProvider* self =
       
   227         new (ELeave) CVSOnboardCameraDataProvider( aObserver, aPool );
       
   228     CleanupStack::PushL( self );
       
   229     self->ConstructL( aProviderIndex );
       
   230     CleanupStack::Pop( self );
       
   231     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::NewL() <<"), RThread().Id().operator TUint()));
       
   232     return self;
       
   233     }
       
   234 
       
   235 // -----------------------------------------------------------------------------
       
   236 // CVSCameraDataProvider::~CVSCameraDataProvider
       
   237 // -----------------------------------------------------------------------------
       
   238 //
       
   239 CVSCameraDataProvider::~CVSCameraDataProvider()
       
   240     {
       
   241     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::~CVSCameraDataProvider() >>"), RThread().Id().operator TUint()));
       
   242     delete iFrozenFrame;
       
   243     delete iFrozenVFFrameCopy;
       
   244     delete iSource;
       
   245     delete iFrozenVFFrameToBeSent;
       
   246     delete iTarget;
       
   247     delete iScaler;
       
   248     delete iCamImgProc;
       
   249     if ( &Camera() != NULL )
       
   250         {
       
   251         Camera().Release();
       
   252         }
       
   253     delete iCamera;
       
   254     iFreezeCS.Close();
       
   255     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::~CVSCameraDataProvider() <<"), RThread().Id().operator TUint()));
       
   256     }
       
   257 
       
   258 // -----------------------------------------------------------------------------
       
   259 // CVSCameraDataProvider::InitializeL
       
   260 // -----------------------------------------------------------------------------
       
   261 //
       
   262 void CVSCameraDataProvider::InitializeL( const TDesC8& /*aInitParams*/ )
       
   263     {
       
   264     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::InitializeL() >>"), RThread().Id().operator TUint()));
       
   265     Camera().Reserve();
       
   266     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::InitializeL() <<"), RThread().Id().operator TUint()));
       
   267     }
       
   268 
       
   269 // -----------------------------------------------------------------------------
       
   270 // CVSCameraDataProvider::DigitalZoomFactor
       
   271 // -----------------------------------------------------------------------------
       
   272 //
       
   273 TInt CVSCameraDataProvider::DigitalZoomFactor() const
       
   274     {
       
   275     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::DigitalZoomFactor() >>"), RThread().Id().operator TUint()));
       
   276     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::DigitalZoomFactor() <<"), RThread().Id().operator TUint()));
       
   277     return Camera().DigitalZoomFactor();
       
   278     }
       
   279 
       
   280 // -----------------------------------------------------------------------------
       
   281 // CVSCameraDataProvider::SetDigitalZoomFactorL
       
   282 // -----------------------------------------------------------------------------
       
   283 //
       
   284 void CVSCameraDataProvider::SetDigitalZoomFactorL( TInt aDigitalZoomFactor)
       
   285     {
       
   286     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetDigitalZoomFactorL() >>"), RThread().Id().operator TUint()));
       
   287     Camera().SetDigitalZoomFactorL( aDigitalZoomFactor );
       
   288     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetDigitalZoomFactorL() <<"), RThread().Id().operator TUint()));
       
   289     }
       
   290 
       
   291 // -----------------------------------------------------------------------------
       
   292 // CVSCameraDataProvider::StartViewFinderBitmapsL
       
   293 // -----------------------------------------------------------------------------
       
   294 //
       
   295 void CVSCameraDataProvider::StartViewFinderBitmapsL( TSize& aSize )
       
   296     {
       
   297     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint()));
       
   298     TCameraInfo info;
       
   299     Camera().CameraInfo( info );
       
   300     if ( !(info.iOptionsSupported & TCameraInfo::EViewFinderBitmapsSupported) )
       
   301         {
       
   302         User::Leave( KErrNotSupported );
       
   303         }
       
   304     if( IsFrozen()&& iHasFrozenVFFrameCopyCreated )
       
   305         {
       
   306         ScaleFrozenBitmapL( aSize );
       
   307         }
       
   308     Camera().StartViewFinderBitmapsL( aSize );
       
   309     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() <<"), RThread().Id().operator TUint()));
       
   310     }
       
   311 
       
   312 // -----------------------------------------------------------------------------
       
   313 // CVSCameraDataProvider::StartViewFinderBitmapsL
       
   314 // -----------------------------------------------------------------------------
       
   315 //
       
   316 void CVSCameraDataProvider::StartViewFinderBitmapsL( TSize&, TRect& )
       
   317     {
       
   318     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderBitmapsL() >>"), RThread().Id().operator TUint()));
       
   319     User::Leave( KErrNotSupported );
       
   320     }
       
   321 
       
   322 // -----------------------------------------------------------------------------
       
   323 // CVSCameraDataProvider::StopViewFinder
       
   324 // -----------------------------------------------------------------------------
       
   325 //
       
   326 void CVSCameraDataProvider::StopViewFinder()
       
   327     {
       
   328     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StopViewFinder() >>"), RThread().Id().operator TUint()));
       
   329     Camera().StopViewFinder();
       
   330     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StopViewFinder() <<"), RThread().Id().operator TUint()));
       
   331     }
       
   332 
       
   333 // -----------------------------------------------------------------------------
       
   334 // CVSCameraDataProvider::ViewFinderActive
       
   335 // -----------------------------------------------------------------------------
       
   336 //
       
   337 TBool CVSCameraDataProvider::ViewFinderActive() const
       
   338     {
       
   339     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderActive() >>"), RThread().Id().operator TUint()));
       
   340     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderActive() <<"), RThread().Id().operator TUint()));
       
   341     return Camera().ViewFinderActive();
       
   342     }
       
   343 
       
   344 // -----------------------------------------------------------------------------
       
   345 // CVSCameraDataProvider::StartViewFinderDirectL
       
   346 // -----------------------------------------------------------------------------
       
   347 //
       
   348 void CVSCameraDataProvider::StartViewFinderDirectL( RWsSession&,
       
   349     CWsScreenDevice&, RWindowBase&, TRect& )
       
   350     {
       
   351     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint()));
       
   352     User::Leave( KErrNotSupported );
       
   353     }
       
   354 
       
   355 // -----------------------------------------------------------------------------
       
   356 // CVSCameraDataProvider::StartViewFinderDirectL
       
   357 // -----------------------------------------------------------------------------
       
   358 //
       
   359 void CVSCameraDataProvider::StartViewFinderDirectL( RWsSession&,
       
   360     CWsScreenDevice&, RWindowBase&, TRect&, TRect& )
       
   361     {
       
   362     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::StartViewFinderDirectL() >>"), RThread().Id().operator TUint()));
       
   363     User::Leave( KErrNotSupported );
       
   364     }
       
   365 
       
   366 // -----------------------------------------------------------------------------
       
   367 // CVSCameraDataProvider::ProviderInfo
       
   368 // -----------------------------------------------------------------------------
       
   369 //
       
   370 void CVSCameraDataProvider::ProviderInfo( TVSDataProviderInfo& aInfo )
       
   371     {
       
   372     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfo() >>"), RThread().Id().operator TUint()));
       
   373     Camera().CameraInfo( static_cast< TCameraInfo& >( aInfo ) );
       
   374     aInfo.iFreezeSupported = ETrue;
       
   375     TRAP_IGNORE( ProviderInfoExL( aInfo ) );
       
   376     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfo() <<"), RThread().Id().operator TUint()));
       
   377     }
       
   378 
       
   379 // -----------------------------------------------------------------------------
       
   380 // CVSCameraDataProvider::SetViewFinderMirrorL
       
   381 // -----------------------------------------------------------------------------
       
   382 //
       
   383 void CVSCameraDataProvider::SetViewFinderMirrorL( TBool aMirror )
       
   384     {
       
   385     Camera().SetViewFinderMirrorL( aMirror );
       
   386     }
       
   387 
       
   388 // -----------------------------------------------------------------------------
       
   389 // CVSCameraDataProvider::ViewFinderMirror
       
   390 // -----------------------------------------------------------------------------
       
   391 //
       
   392 TBool CVSCameraDataProvider::ViewFinderMirror() const
       
   393     {
       
   394     return Camera().ViewFinderMirror();
       
   395     }
       
   396 
       
   397 // -----------------------------------------------------------------------------
       
   398 // CVSCameraDataProvider::FreezeL
       
   399 // -----------------------------------------------------------------------------
       
   400 //
       
   401 void CVSCameraDataProvider::FreezeL()
       
   402     {
       
   403     iFreezeCS.Wait();
       
   404     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeL() >>"), RThread().Id().operator TUint()));
       
   405     if( !IsFrozen() )
       
   406         {
       
   407         iFrozen = ETrue;
       
   408         iFrozenVfFrameReady = EFalse;
       
   409         iFreezePendingFlags = EViewFinderFreezePending | EVideoFrameFreezePending;
       
   410         }
       
   411     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeL() <<"), RThread().Id().operator TUint()));
       
   412     iFreezeCS.Signal();
       
   413     }
       
   414 
       
   415 // -----------------------------------------------------------------------------
       
   416 // CVSCameraDataProvider::UnfreezeL
       
   417 // -----------------------------------------------------------------------------
       
   418 //
       
   419 void CVSCameraDataProvider::UnfreezeL()
       
   420     {
       
   421     iFreezeCS.Wait();
       
   422     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::UnfreezeL() >>"), RThread().Id().operator TUint()));
       
   423     if( IsFrozen() )
       
   424         {
       
   425         iFrozen = EFalse;
       
   426         iFreezePendingFlags = 0;
       
   427         iHasFrozenVFFrameCopyCreated = EFalse;
       
   428         }
       
   429     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::UnfreezeL() <<"), RThread().Id().operator TUint()));
       
   430     iFreezeCS.Signal();
       
   431     }
       
   432 
       
   433 // -----------------------------------------------------------------------------
       
   434 // CVSCameraDataProvider::IsFrozen
       
   435 // -----------------------------------------------------------------------------
       
   436 //
       
   437 TBool CVSCameraDataProvider::IsFrozen() const
       
   438     {
       
   439     return iFrozen;
       
   440     }
       
   441 
       
   442 // -----------------------------------------------------------------------------
       
   443 // CVSCameraDataProvider::ImageReady
       
   444 // -----------------------------------------------------------------------------
       
   445 //
       
   446 void CVSCameraDataProvider::ImageReady(
       
   447     CFbsBitmap* /*aBitmap*/, HBufC8* /*aData*/, TInt /*aError*/ )
       
   448     {
       
   449     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageReady() >>"), RThread().Id().operator TUint()));
       
   450     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageReady() <<"), RThread().Id().operator TUint()));
       
   451     }
       
   452 
       
   453 // -----------------------------------------------------------------------------
       
   454 // CVSCameraDataProvider::PowerOnComplete
       
   455 // -----------------------------------------------------------------------------
       
   456 //
       
   457 void CVSCameraDataProvider::PowerOnComplete( TInt aError )
       
   458     {
       
   459     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::PowerOnComplete() >>"), RThread().Id().operator TUint()));
       
   460     if ( !iPowerOnComplete )
       
   461         {
       
   462         if ( aError == KErrNone )
       
   463             {
       
   464             iPowerOnComplete = ETrue;
       
   465             iCameraHandle = Camera().Handle();
       
   466             // Setup ECAM so that the returned image is ok even if view finder
       
   467             // is asked before video
       
   468             TCameraInfo info;
       
   469             Camera().CameraInfo( info );
       
   470             if ( !(info.iOptionsSupported &
       
   471                 TCameraInfo::EViewFinderBitmapsSupported) )
       
   472                 {
       
   473                 NotifyError( KErrNotSupported );
       
   474                 return; // End debug print is missed
       
   475                 }
       
   476             TInt sizeIndex, rateIndex;
       
   477             sizeIndex = rateIndex = 0;
       
   478             for (
       
   479                 sizeIndex = 0;
       
   480                 sizeIndex < info.iNumVideoFrameSizesSupported;
       
   481                 sizeIndex++ )
       
   482                 {
       
   483                 TSize size;
       
   484                 Camera().EnumerateVideoFrameSizes(
       
   485                     size,
       
   486                     sizeIndex,
       
   487                     CCamera::EFormatYUV420Planar );
       
   488                 if ( size == TSize( KQcifWidth, KQcifHeight ) )
       
   489                     {
       
   490                     TReal32 rate;
       
   491                     for (
       
   492                         rateIndex = 0;
       
   493                         rateIndex < info.iNumVideoFrameRatesSupported;
       
   494                         rateIndex++ )
       
   495                         {
       
   496                         Camera().EnumerateVideoFrameRates(
       
   497                             rate,
       
   498                             rateIndex,
       
   499                             CCamera::EFormatYUV420Planar,
       
   500                             sizeIndex );
       
   501                         if ( KFrameRate == rate )
       
   502                             {
       
   503                             TRAPD(
       
   504                                 err,
       
   505                                 Camera().PrepareVideoCaptureL(
       
   506                                     CCamera::EFormatYUV420Planar,
       
   507                                     sizeIndex,
       
   508                                     rateIndex,
       
   509                                     2,
       
   510                                     1) );
       
   511                             if ( err != KErrNone )
       
   512                                 {
       
   513                                 NotifyError( err );
       
   514                                 return; // End debug print is missed
       
   515                                 }
       
   516                             break;
       
   517                             }
       
   518                         }
       
   519                     break;
       
   520                     }
       
   521                 }
       
   522             Observer().vsProviderReady();
       
   523             }
       
   524         else
       
   525             {
       
   526             NotifyError( aError );
       
   527             }
       
   528         }
       
   529     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::PowerOnComplete() <<"), RThread().Id().operator TUint()));
       
   530     }
       
   531 
       
   532 // -----------------------------------------------------------------------------
       
   533 // CVSCameraDataProvider::ViewFinderFrameReady
       
   534 // -----------------------------------------------------------------------------
       
   535 //
       
   536 void CVSCameraDataProvider::ViewFinderFrameReady( CFbsBitmap& aFrame )
       
   537     {
       
   538     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderFrameReady() >>"), RThread().Id().operator TUint()));
       
   539     if( iFreezePendingFlags & EViewFinderFreezePending )
       
   540         {
       
   541         FreezeViewFinderFrame( aFrame );
       
   542         }
       
   543     if( IsFrozen() && !( iFreezePendingFlags & EViewFinderFreezePending ) && iFrozenVfFrameReady )
       
   544         {
       
   545         Observer().vsViewFinderFrameReady( *iFrozenVFFrameToBeSent );
       
   546         }
       
   547     else if( !IsFrozen() )
       
   548         {
       
   549         Observer().vsViewFinderFrameReady( aFrame );
       
   550         }
       
   551     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ViewFinderFrameReady() <<"), RThread().Id().operator TUint()));
       
   552     }
       
   553 
       
   554 // -----------------------------------------------------------------------------
       
   555 // CVSCameraDataProvider::ImageBufferReady
       
   556 // -----------------------------------------------------------------------------
       
   557 //
       
   558 void CVSCameraDataProvider::ImageBufferReady(MCameraBuffer& /*aCameraBuffer*/,TInt /*aError*/)
       
   559 	{
       
   560 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageBufferReady() >>"), RThread().Id().operator TUint()));
       
   561     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ImageBufferReady() <<"), RThread().Id().operator TUint()));
       
   562 	}
       
   563 
       
   564 // -----------------------------------------------------------------------------
       
   565 // CVSCameraDataProvider::ScalingFinished
       
   566 // -----------------------------------------------------------------------------
       
   567 //
       
   568 void CVSCameraDataProvider::ScalingFinished( TInt aError )
       
   569     {
       
   570     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScalingFinished() >>"), RThread().Id().operator TUint()));
       
   571     if( aError == KErrNone )
       
   572         {
       
   573         iFrozenVfFrameReady = ETrue;
       
   574         }
       
   575     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScalingFinished() <<"), RThread().Id().operator TUint()));
       
   576     }
       
   577 
       
   578 // -----------------------------------------------------------------------------
       
   579 // CVSCameraDataProvider::CVSCameraDataProvider
       
   580 // -----------------------------------------------------------------------------
       
   581 //
       
   582 CVSCameraDataProvider::CVSCameraDataProvider(
       
   583     MVSDataProviderObserver* aObserver,
       
   584     MVSBufferPool* aPool ) :
       
   585         CVSDataProvider( aObserver, aPool )
       
   586     {
       
   587     }
       
   588 
       
   589 // -----------------------------------------------------------------------------
       
   590 // CVSCameraDataProvider::ConstructL
       
   591 // -----------------------------------------------------------------------------
       
   592 //
       
   593 void CVSCameraDataProvider::ConstructL( TInt aProviderIndex )
       
   594     {
       
   595     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() >>"), RThread().Id().operator TUint()));
       
   596     CVSDataProvider::ConstructL();
       
   597     // New CCamera API imp
       
   598     // Check which API is suported
       
   599     TRAPD( error, iCamera =
       
   600         CCamera::New2L( *this, aProviderIndex, KCCameraPriority ) );
       
   601     // try to create using API
       
   602     if ( error )
       
   603     	{
       
   604         __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() New2L failed, using NewL instead"), RThread().Id().operator TUint()));
       
   605     	iCamera = CCamera::NewL( *this, aProviderIndex );
       
   606     	}
       
   607     iFrozenVFFrameCopy = new ( ELeave ) CFbsBitmap();
       
   608     iFrozenVFFrameToBeSent = new ( ELeave ) CFbsBitmap();
       
   609     iScaler = CVtImageScaler::NewL( *this );
       
   610     iFrozenFrame = CVsFrameBuffer::NewL( KFrozenFrameBufferSize );
       
   611     
       
   612     iHasFrozenVFFrameCopyCreated = EFalse;
       
   613     
       
   614     // Camera image processing
       
   615     TRAP( error, iCamImgProc =
       
   616         CCamera::CCameraImageProcessing::NewL( *iCamera ) );
       
   617     User::LeaveIfError( iFreezeCS.CreateLocal() );
       
   618     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ConstructL() <<"), RThread().Id().operator TUint()));
       
   619     }
       
   620 
       
   621 // -----------------------------------------------------------------------------
       
   622 // CVSCameraDataProvider::FreezeViewFinderFrame
       
   623 // -----------------------------------------------------------------------------
       
   624 //
       
   625 void CVSCameraDataProvider::FreezeViewFinderFrame( CFbsBitmap& aFrame )
       
   626     {
       
   627     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeViewFinderFrame() >>"), RThread().Id().operator TUint()));
       
   628 
       
   629     TSize frameSize( aFrame.SizeInPixels() );
       
   630 
       
   631     TUint scanlineLength( CFbsBitmap::ScanLineLength( frameSize.iWidth, aFrame.DisplayMode() ) );
       
   632 
       
   633     TInt result = iFrozenVFFrameCopy->Create( frameSize, aFrame.DisplayMode() );
       
   634 
       
   635     if( result != KErrNone )
       
   636         {
       
   637         Observer().vsProviderError( result );
       
   638         return;
       
   639         }
       
   640 
       
   641     iFrozenVFFrameCopy->LockHeap();
       
   642     const TUint8* source = reinterpret_cast< TUint8* >( aFrame.DataAddress() );
       
   643     TUint8* dest = reinterpret_cast< TUint8* >( iFrozenVFFrameCopy->DataAddress() );
       
   644     for( TInt y = frameSize.iHeight - 1; y >= 0; y-- )
       
   645         {
       
   646         Mem::Copy( dest, source, scanlineLength );
       
   647         dest += scanlineLength;
       
   648         source += scanlineLength;
       
   649         }
       
   650     iFrozenVFFrameCopy->UnlockHeap();
       
   651     TRAP( result, ScaleFrozenBitmapL( frameSize ) );
       
   652     iFreezePendingFlags &= ~EViewFinderFreezePending;
       
   653     iHasFrozenVFFrameCopyCreated = ETrue;
       
   654     if( result != KErrNone )
       
   655         {
       
   656         Observer().vsProviderError( result );
       
   657         }
       
   658     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::FreezeViewFinderFrame() <<"), RThread().Id().operator TUint()));
       
   659     }
       
   660 
       
   661 // -----------------------------------------------------------------------------
       
   662 // CVSCameraDataProvider::ScaleFrozenBitmapL
       
   663 // -----------------------------------------------------------------------------
       
   664 //
       
   665 void CVSCameraDataProvider::ScaleFrozenBitmapL( TSize& aSize )
       
   666     {
       
   667     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScaleFrozenBitmapL() >>"), RThread().Id().operator TUint()));
       
   668     iFrozenVfFrameReady = EFalse;
       
   669     delete iSource; iSource = 0;
       
   670     iSource = CVtImageBitmap::NewL( iFrozenVFFrameCopy->Handle() );
       
   671     User::LeaveIfError( iFrozenVFFrameToBeSent->Create( aSize, iFrozenVFFrameCopy->DisplayMode() ) );
       
   672     delete iTarget; iTarget = 0;
       
   673     iTarget = CVtImageBitmap::NewL( iFrozenVFFrameToBeSent->Handle() );
       
   674     iScaler->Cancel();
       
   675     iScaler->ScaleL( *iSource, *iTarget );
       
   676     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ScaleFrozenBitmapL() <<"), RThread().Id().operator TUint()));
       
   677     }
       
   678 
       
   679 // -----------------------------------------------------------------------------
       
   680 // CVSCameraDataProvider::ProviderInfoExL
       
   681 // -----------------------------------------------------------------------------
       
   682 //
       
   683 void CVSCameraDataProvider::ProviderInfoExL( TVSDataProviderInfo& aInfo )
       
   684     {
       
   685     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() >>"), RThread().Id().operator TUint()));
       
   686     aInfo.iSupportedColorTones = CCamera::CCameraImageProcessing::EEffectNone;
       
   687     // Check if colortone is suported and set colortone values
       
   688     if ( iCamImgProc )
       
   689     	{
       
   690         RArray< TUid > uids;
       
   691         CleanupClosePushL( uids );
       
   692         iCamImgProc->GetSupportedTransformationsL( uids );
       
   693         if ( uids.Find( KUidECamEventImageProcessingEffect ) != KErrNotFound )
       
   694             {
       
   695             TValueInfo type;
       
   696             RArray< TInt > values;
       
   697             CleanupClosePushL( values );
       
   698             iCamImgProc->GetTransformationSupportedValuesL(
       
   699                 KUidECamEventImageProcessingEffect, values, type );
       
   700             if ( ( type == EBitField ) && ( values.Count() > 0 ) )
       
   701                 {
       
   702                 aInfo.iSupportedColorTones = values[ 0 ];
       
   703                 }
       
   704             else
       
   705                 {
       
   706                 __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() valueType is NOT bitfield, fix me"), RThread().Id().operator TUint()));
       
   707                 }
       
   708             CleanupStack::PopAndDestroy(); // values.Close()
       
   709             }
       
   710         else
       
   711             {
       
   712             __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() camera image processing not supported"), RThread().Id().operator TUint()));
       
   713             }
       
   714         CleanupStack::PopAndDestroy(); // uids.Close()
       
   715     	}
       
   716     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::ProviderInfoExL() <<"), RThread().Id().operator TUint()));
       
   717     }
       
   718 
       
   719 // -----------------------------------------------------------------------------
       
   720 // CVSCameraDataProvider::SetContrastL
       
   721 // -----------------------------------------------------------------------------
       
   722 //
       
   723 void CVSCameraDataProvider::SetContrastL( TInt aContrast )
       
   724 	{
       
   725 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetContrastL() >>"), RThread().Id().operator TUint()));
       
   726     Camera().SetContrastL(aContrast);
       
   727     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetContrastL() <<"), RThread().Id().operator TUint()));
       
   728 	}
       
   729 
       
   730 // -----------------------------------------------------------------------------
       
   731 // CVSCameraDataProvider::GetContrast
       
   732 // -----------------------------------------------------------------------------
       
   733 //
       
   734 TInt CVSCameraDataProvider::GetContrast( TInt& aContrast ) const
       
   735 	{
       
   736 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() >>"), RThread().Id().operator TUint()));
       
   737 	TInt result( KErrNotSupported );
       
   738 	TCameraInfo info;
       
   739     Camera().CameraInfo( info );
       
   740 	if ( info.iOptionsSupported & TCameraInfo::EContrastSupported )
       
   741 		{
       
   742     	aContrast = Camera().Contrast();
       
   743 		__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() %d"), RThread().Id().operator TUint(), aContrast));
       
   744 		result = KErrNone;
       
   745 		}
       
   746      __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetContrast() <<"), RThread().Id().operator TUint()));
       
   747      return result;
       
   748 	}
       
   749 
       
   750 // -----------------------------------------------------------------------------
       
   751 // CVSCameraDataProvider::SetBrightnessL
       
   752 // -----------------------------------------------------------------------------
       
   753 //
       
   754 void CVSCameraDataProvider::SetBrightnessL( TInt aBrightness )
       
   755 	{
       
   756 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetBrightnessL() >>"), RThread().Id().operator TUint()));
       
   757     Camera().SetBrightnessL( aBrightness );
       
   758     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetBrightnessL() <<"), RThread().Id().operator TUint()));
       
   759 	}
       
   760 
       
   761 // -----------------------------------------------------------------------------
       
   762 // CVSCameraDataProvider::GetBrightness
       
   763 // -----------------------------------------------------------------------------
       
   764 //
       
   765 TInt CVSCameraDataProvider::GetBrightness( TInt& aBrightness ) const
       
   766 	{
       
   767 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() >>"), RThread().Id().operator TUint()));
       
   768 	TInt result( KErrNotSupported );
       
   769 	TCameraInfo info;
       
   770     Camera().CameraInfo( info );
       
   771 	if ( info.iOptionsSupported & TCameraInfo::EBrightnessSupported )
       
   772 		{
       
   773     	aBrightness =  Camera().Brightness();
       
   774 		__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() %d"), aBrightness));
       
   775     	result = KErrNone;
       
   776 		}
       
   777     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetBrightness() <<"), RThread().Id().operator TUint()));
       
   778  	return result;
       
   779 	}
       
   780 
       
   781 // -----------------------------------------------------------------------------
       
   782 // CVSCameraDataProvider::SetWhiteBalanceL
       
   783 // -----------------------------------------------------------------------------
       
   784 //
       
   785 void CVSCameraDataProvider::SetWhiteBalanceL( CCamera::TWhiteBalance
       
   786     aWhiteBalance )
       
   787 	{
       
   788 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetWhiteBalanceL() >>"), RThread().Id().operator TUint()));
       
   789     Camera().SetWhiteBalanceL( aWhiteBalance );
       
   790     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetWhiteBalanceL() <<"), RThread().Id().operator TUint()));
       
   791 	}
       
   792 
       
   793 // -----------------------------------------------------------------------------
       
   794 // CVSCameraDataProvider::GetWhiteBalance
       
   795 // -----------------------------------------------------------------------------
       
   796 //
       
   797 TInt CVSCameraDataProvider::GetWhiteBalance( CCamera::TWhiteBalance&
       
   798     aWhiteBalance) const
       
   799 	{
       
   800 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetWhiteBalance() >>"),RThread().Id().operator TUint() ) );
       
   801     aWhiteBalance = Camera().WhiteBalance();
       
   802     __IF_DEBUG(Print(_L("WhiteBalance[%d]: CVSCameraDataProvider::GetWhiteBalance() %d"), aWhiteBalance ) );
       
   803     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetWhiteBalance() <<"), RThread().Id().operator TUint() ) );
       
   804     return KErrNone;
       
   805 	}
       
   806 
       
   807 // -----------------------------------------------------------------------------
       
   808 // CVSCameraDataProvider::SetColorToneL
       
   809 // -----------------------------------------------------------------------------
       
   810 //
       
   811 void CVSCameraDataProvider::SetColorToneL(
       
   812     CCamera::CCameraImageProcessing::TEffect aValue )
       
   813 	{
       
   814 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() >>"), RThread().Id().operator TUint()));
       
   815 	if ( iCamImgProc )
       
   816 		{
       
   817 		iCamImgProc->SetTransformationValue( KUidECamEventImageProcessingEffect, aValue );
       
   818 		}
       
   819 	else
       
   820 		{
       
   821 		//Set colortone that is not suported -> Leave
       
   822 		__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() LEAVE"), RThread().Id().operator TUint()));
       
   823 		User::Leave( KErrNotSupported );
       
   824 		}
       
   825     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::SetColorToneL() <<"), RThread().Id().operator TUint()));
       
   826 	}
       
   827 
       
   828 // -----------------------------------------------------------------------------
       
   829 // CVSCameraDataProvider::GetColorTone
       
   830 // -----------------------------------------------------------------------------
       
   831 //
       
   832 TInt CVSCameraDataProvider::GetColorTone(
       
   833 	CCamera::CCameraImageProcessing::TEffect& aColorTone ) const
       
   834 	{
       
   835 	__IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() >>"), RThread().Id().operator TUint()));
       
   836 	TInt result( KErrNotSupported );
       
   837 	if ( iCamImgProc )
       
   838 		{
       
   839 		aColorTone =
       
   840 		    static_cast< CCamera::CCameraImageProcessing::TEffect >(
       
   841 		        iCamImgProc->TransformationValue(
       
   842 		            KUidECamEventImageProcessingEffect ) );
       
   843         __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() %d"), RThread().Id().operator TUint(), aColorTone));
       
   844 		result = KErrNone;
       
   845 		}
       
   846     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::GetColorTone() <<"), RThread().Id().operator TUint()));
       
   847 	return 	result;
       
   848 	}
       
   849 
       
   850 // -----------------------------------------------------------------------------
       
   851 // CVSCameraDataProvider::CancelInitializing
       
   852 // -----------------------------------------------------------------------------
       
   853 //
       
   854 void CVSCameraDataProvider::CancelInitializing()
       
   855     {
       
   856     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::CancelInitializing() >>"), RThread().Id().operator TUint()));
       
   857     //There is a blank implemention.
       
   858     __IF_DEBUG(Print(_L("VideoSource[%d]: CVSCameraDataProvider::CancelInitializing() <<"), RThread().Id().operator TUint()));
       
   859     return;
       
   860     }
       
   861 
       
   862 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   863 
       
   864 //  End of File