vtprotocolplugins/VideoSource/src/CVSDataProvider.cpp
changeset 18 d9b6a8729acd
parent 4 6dc066157ed4
child 23 c378a0498b84
child 27 dcbddbbaf8fd
--- a/vtprotocolplugins/VideoSource/src/CVSDataProvider.cpp	Tue Jan 26 12:01:21 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,543 +0,0 @@
-/*
-* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  Video Source subsystem.
-*
-*/
-
-
-// INCLUDE FILES
-#include <badesca.h>
-#include <e32svr.h>
-#include <featmgr.h>
-#include "CApiVideoSource.h"
-#include "CVSCameraDataProvider.h"
-#include "CVSStillImageDataProvider.h"
-#include "CVSOnboardCameraDataProvider.h"
-
-// EXTERNAL FUNCTION PROTOTYPES
-
-// MACROS
-
-#ifdef _DEBUG
-#    define __IF_DEBUG(t) {RDebug::t;}
-#else
-#    define __IF_DEBUG(t)
-#endif
-
-// LOCAL CONSTANTS AND MACROS
-
-class TSizeCount
-    {
-    public:
-        TInt    iCount;
-        TSize   iSize;
-    };
-
-class TRateCount
-    {
-    public:
-        TInt    iCount;
-        TReal32 iRate;
-    };
-
-// LOCAL FUNCTION PROTOTYPES
-
-static TInt TSizeCountTLinearOrderFunc( 
-    const TSizeCount& aSizeCount1, const TSizeCount& aSizeCount2 );
-static TBool TSizeCountTIdentityRelationFunc( 
-    const TSizeCount& aSizeCount1, const TSizeCount& aSizeCount2 );
-static TInt TRateCountTLinearOrderFunc( 
-    const TRateCount& aRateCount1, const TRateCount& aRateCount2 );
-static TBool TRateCountTIdentityRelationFunc( 
-    const TRateCount& aRateCount1, const TRateCount& aRateCount2 );
-
-// FORWARD DECLARATIONS
-
-// ============================= LOCAL FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// TSizeCountTLinearOrderFunc: Used in RArray<TSizeCount)::InsertInOrder
-// -----------------------------------------------------------------------------
-//
-static TInt TSizeCountTLinearOrderFunc( 
-    const TSizeCount& aSizeCount1,
-    const TSizeCount& aSizeCount2 )
-    {
-    if ( aSizeCount1.iSize == aSizeCount2.iSize )
-        {
-        return 0;
-        }
-    else
-        {
-        // It is assumed that width and height fit in 16-bit, if they don't,
-        // use TInt64
-        TInt32 s1 = 
-            ( aSizeCount1.iSize.iWidth & 0xffff ) << 16 | 
-            ( aSizeCount1.iSize.iHeight & 0xffff );
-        TInt32 s2 = 
-            ( aSizeCount2.iSize.iWidth & 0xffff ) << 16 | 
-            ( aSizeCount2.iSize.iHeight & 0xffff );
-        return s1 - s2;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// TSizeCountTIdentityRelationFunc: Used in RArray<TSizeCount)::Find
-// -----------------------------------------------------------------------------
-//
-static TBool TSizeCountTIdentityRelationFunc( 
-    const TSizeCount& aSizeCount1, 
-    const TSizeCount& aSizeCount2 )
-    {
-    if ( aSizeCount1.iSize == aSizeCount2.iSize )
-        {
-        return ETrue;
-        }
-    else
-        {
-        return EFalse;
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// TRateCountTLinearOrderFunc: Used in RArray<TRateCount)::InsertInOrder
-// -----------------------------------------------------------------------------
-//
-static TInt TRateCountTLinearOrderFunc( 
-    const TRateCount& aRateCount1, 
-    const TRateCount& aRateCount2 )
-    {
-    if ( aRateCount1.iRate > aRateCount2.iRate ) 
-        {
-        return 1;
-        }
-        
-    if ( aRateCount1.iRate < aRateCount2.iRate )
-        {
-        return -1;
-        }
-        
-    return 0;
-    }
-
-// -----------------------------------------------------------------------------
-// TRateCountTIdentityRelationFunc: Used in RArray<TRateCount)::Find
-// -----------------------------------------------------------------------------
-//
-static TBool TRateCountTIdentityRelationFunc( 
-    const TRateCount& aRateCount1, 
-    const TRateCount& aRateCount2 )
-    {
-    if ( aRateCount1.iRate == aRateCount2.iRate )
-        {
-        return ETrue;
-        }
-    else
-        {
-        return EFalse;
-        }
-    }
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::NewL
-// -----------------------------------------------------------------------------
-//
-CVSDataProvider* CVSDataProvider::NewL( 
-    TInt aProviderIndex, 
-    MVSDataProviderObserver* aObserver, 
-    MVSBufferPool* aPool )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::NewL() [aProviderIndex = %d] >>"), RThread().Id().operator TUint(), aProviderIndex));
-    
-    CVSDataProvider* self = NULL;
-    
-    // Is it ecam
-    TInt count = CamerasAvailable();
-    
-    // < 0 == error
-    if( count < 0 )
-        {
-        User::Leave( count );
-        }
-
-    if ( aProviderIndex < count )
-        {
-        self = CVSCameraDataProvider::NewL( aObserver, aProviderIndex, aPool );
-        }
-    else
-        {
-        // Is it still image
-        count += 1;
-
-        if ( aProviderIndex == ( count - 1) )
-            {
-            self = CVSStillImageDataProvider::NewL( aObserver, aPool );
-            }
-        else
-            {
-            User::Leave( KErrNotSupported );
-            }
-        }
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::NewL() <<"), RThread().Id().operator TUint()));
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::~CVSDataProvider
-// -----------------------------------------------------------------------------
-//
-CVSDataProvider::~CVSDataProvider()
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::~CVSDataProvider() >>"), RThread().Id().operator TUint()));
-    delete iErrorNotifier;
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::~CVSDataProvider() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::ProvidersAvailable
-// -----------------------------------------------------------------------------
-//
-TInt CVSDataProvider::ProvidersAvailable()
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ProvidersAvailable() >>"), RThread().Id().operator TUint()));
-    
-    // Count ecams
-    TInt numProviders = CamerasAvailable();
-
-    // < 0 == error
-    if ( numProviders < 0 )
-        {
-        numProviders = 1; // only still image provider
-        }
-    else
-        {
-        numProviders += 1; // add still
-        }
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ProvidersAvailable() [numProviders = %d] <<"), RThread().Id().operator TUint(), numProviders));
-
-    return numProviders;
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::ProviderInfoL
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::ProviderInfoL( 
-    TInt aProviderIndex, 
-    TVSDataProviderInfo& aInfo )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ProviderInfoL() >>"), RThread().Id().operator TUint()));
-    CVSDataProvider* provider = NewL( aProviderIndex, NULL, NULL);
-    provider->ProviderInfo( aInfo );
-    delete provider;
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ProviderInfoL() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::SetFillBufferParams
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::SetFillBufferParams( 
-    MVTVideoSink* aConsumer, 
-    TMediaId aMediaId )
-    {
-    iConsumer = aConsumer;
-    iMediaId = aMediaId;
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::NotifyError
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::NotifyError( TInt aError )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::NotifyError() >>"), RThread().Id().operator TUint()));
-    iErrorNotifier->NotifyError( &Observer(), aError );
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::NotifyError() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::CVSDataProvider
-// -----------------------------------------------------------------------------
-//
-CVSDataProvider::CVSDataProvider( 
-    MVSDataProviderObserver* aObserver, 
-    MVSBufferPool* aPool ) : 
-        iObserver( aObserver ), 
-        iPool ( aPool )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::CVSDataProvider() >>"), RThread().Id().operator TUint()));
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::CVSDataProvider() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::ConstructL
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::ConstructL()
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ConstructL() >>"), RThread().Id().operator TUint()));
-    iErrorNotifier = CProviderErrorNotifierAO::NewL();
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ConstructL() <<"), RThread().Id().operator TUint()));
-    }
-
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::TimeToPlay
-// -----------------------------------------------------------------------------
-//
-const TTimeIntervalMicroSeconds& CVSDataProvider::TimeToPlay()
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::TimeToPlay() >>"), RThread().Id().operator TUint()));
-
-    TTime now;
-    now.HomeTime();
-
-    TTimeIntervalMicroSeconds timeToPlay( now.MicroSecondsFrom( iStartTime ) );
-
-    if( timeToPlay <= iPreviousTimeToPlay )
-        {
-        __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::TimeToPlay(): *WARNING* Time warp backwards! Correcting.."), RThread().Id().operator TUint()));
-        iPreviousTimeToPlay = 
-            TTimeIntervalMicroSeconds( iPreviousTimeToPlay.Int64() + 1 );
-        }
-    else
-        {
-        iPreviousTimeToPlay = timeToPlay;
-        }
-
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::TimeToPlay() <<"), RThread().Id().operator TUint()));
-    return iPreviousTimeToPlay;
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::ResetStartTime
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::ResetStartTime()
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ResetStartTime() >>"), RThread().Id().operator TUint()));
-    iStartTime.HomeTime();
-    iPreviousTimeToPlay = iStartTime.MicroSecondsFrom( iStartTime );
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::ResetStartTime() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::CamerasAvailable()
-// -----------------------------------------------------------------------------
-//
-TInt CVSDataProvider::CamerasAvailable()
-    {
-    TRAPD( result, FeatureManager::InitializeLibL() );
-    
-    if( result != KErrNone )
-        {
-        return result;
-        }
-    
-    TInt count( 0 );
-
-    if( FeatureManager::FeatureSupported( KFeatureIdCamera ) )
-        {
-        count = CCamera::CamerasAvailable();
-        }
-
-    FeatureManager::UnInitializeLib();
-
-    return count;
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::SwitchFrom
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::SwitchFrom( const CVSDataProvider& anOldProvider )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::SwitchFrom() >>"), RThread().Id().operator TUint()));
-    iStartTime = anOldProvider.iStartTime;
-    iPreviousTimeToPlay = anOldProvider.iPreviousTimeToPlay;
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::SwitchFrom() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::EnumerateVideoFrameFormatsL
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::EnumerateVideoFrameFormatsL( 
-    CDesC8Array* aSupportedFormats )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameFormats() >>"), RThread().Id().operator TUint()));
-    TInt providerCount = ProvidersAvailable();    
-    TInt countOfProvidersThatSupportYUV420Planar = 0;
-    for ( TInt i = 0; i < providerCount; i++ )
-        {
-        TVSDataProviderInfo info;
-        ProviderInfoL( i, info );
-        if ( info.iVideoFrameFormatsSupported & CCamera::EFormatYUV420Planar )
-            {
-            countOfProvidersThatSupportYUV420Planar++;
-            }
-        }
-    if( providerCount > 0 && 
-        providerCount <= countOfProvidersThatSupportYUV420Planar )
-        {
-        aSupportedFormats->AppendL( KVtVideoMIMETypeYUV420 );
-        }
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameFormats() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::EnumerateVideoFrameSizesL
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::EnumerateVideoFrameSizesL( 
-    RArray<TSize>& aSupportedSizes, 
-    const TDesC8& aFormat )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameSizes() >>"), RThread().Id().operator TUint()));
-    RArray<TSizeCount> sizeCountArray;
-    CleanupClosePushL( sizeCountArray );
-    TInt providerCount = ProvidersAvailable();
-    for ( TInt i = 0; i < providerCount; i++ )
-        {
-        CVSDataProvider* p = CVSDataProvider::NewL( i, NULL, NULL );
-        CleanupStack::PushL( p );
-        TVSDataProviderInfo info;
-        ProviderInfoL( i, info );
-        for ( TInt j = 0; j < info.iNumVideoFrameSizesSupported; j++ )
-            {
-            TSize size;
-            p->GetVideoFrameSize( size, j, aFormat );
-            if ( size != TSize(0,0) )
-                {
-                TSizeCount sizeCount;
-                sizeCount.iCount = 1;
-                sizeCount.iSize = size;
-                TInt err = sizeCountArray.InsertInOrder( 
-                    sizeCount, 
-                    TLinearOrder<TSizeCount>( TSizeCountTLinearOrderFunc ) );
-                if ( err == KErrAlreadyExists )
-                    {
-                    TInt idx = sizeCountArray.Find( 
-                        sizeCount, 
-                        TIdentityRelation<TSizeCount>( 
-                            TSizeCountTIdentityRelationFunc ) );
-                    if ( idx == KErrNotFound )
-                        {
-                        User::Leave( KErrUnknown );
-                        }
-                    else
-                        {
-                        // Increment count of providers that supports the size
-                        sizeCountArray[idx].iCount++;
-                        }
-                    }
-                else
-                    {
-                    User::LeaveIfError( err );
-                    }
-                }
-            }
-        CleanupStack::PopAndDestroy(); // p
-        }
-    aSupportedSizes.Reset();
-    for ( TInt k = 0; k < sizeCountArray.Count(); k++ )
-        {
-        // Do all providers support the size
-        if ( providerCount > 0 && providerCount <= sizeCountArray[k].iCount ) 
-            {
-            User::LeaveIfError( 
-                aSupportedSizes.Append( sizeCountArray[k].iSize ) );
-            }
-        }
-    CleanupStack::PopAndDestroy( ); // sizeCountArray
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameSizes() <<"), RThread().Id().operator TUint()));
-    }
-
-// -----------------------------------------------------------------------------
-// CVSDataProvider::EnumerateVideoFrameRatesL
-// -----------------------------------------------------------------------------
-//
-void CVSDataProvider::EnumerateVideoFrameRatesL( 
-    RArray<TReal32>& aSupportedRates, 
-    const TDesC8& aFormat, 
-    const TSize& aSize )
-    {
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameRates() >>"), RThread().Id().operator TUint()));
-    RArray<TRateCount> rateCountArray;
-    CleanupClosePushL( rateCountArray );
-    TInt providerCount = ProvidersAvailable();
-    __IF_DEBUG(Print(_L("   LOOKING FOR COMMON SUPPORTED RATES, PROVIDER COUNT: %d"), providerCount));
-    for ( TInt i = 0; i < providerCount; i++ )
-        {
-        __IF_DEBUG(Print(_L("      PROVIDER %d"), i));
-        CVSDataProvider* p = CVSDataProvider::NewL( i, NULL, NULL );
-        CleanupStack::PushL( p );
-        TVSDataProviderInfo info;
-        ProviderInfoL( i, info );
-        __IF_DEBUG(Print(_L("         info.iNumVideoFrameRatesSupported: %d"), info.iNumVideoFrameRatesSupported));
-        for ( TInt j = 0; j < info.iNumVideoFrameRatesSupported; j++ )
-            {
-            TReal32 rate = 0.0;
-            p->GetVideoFrameRate( rate, j, aFormat, aSize );
-            __IF_DEBUG(Print(_L("         RATE FOR RATE INDEX %d IS %f"), j, rate));
-            if ( rate != 0.0 )
-                {
-                TRateCount rateCount;
-                rateCount.iCount = 1;
-                rateCount.iRate = rate;
-                TInt err = rateCountArray.InsertInOrder( 
-                    rateCount, 
-                    TLinearOrder<TRateCount>( TRateCountTLinearOrderFunc ) );
-                if ( err == KErrAlreadyExists )
-                    {
-                    TInt idx = rateCountArray.Find( 
-                        rateCount, 
-                        TIdentityRelation<TRateCount>( 
-                            TRateCountTIdentityRelationFunc ) );
-                    if ( idx == KErrNotFound )
-                        {
-                        User::Leave( KErrUnknown );
-                        }
-                    else
-                        {
-                        // Increment count of providers that supports the rate
-                        rateCountArray[idx].iCount++;
-                        }
-                    }
-                else
-                    {
-                    User::LeaveIfError( err );
-                    }
-                }
-            }
-        CleanupStack::PopAndDestroy(); // p
-        }
-    aSupportedRates.Reset();
-    for ( TInt k = 0; k < rateCountArray.Count(); k++ )
-        {
-        // Do all providers support the rate
-        if ( providerCount > 0 && providerCount <= rateCountArray[k].iCount )
-            {
-            User::LeaveIfError( 
-                aSupportedRates.Append( rateCountArray[k].iRate ) );
-            }
-        }
-    CleanupStack::PopAndDestroy( ); // rateCountArray
-    __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameRates() <<"), RThread().Id().operator TUint()));
-    }
-
-//  End of File