diff -r 6dc066157ed4 -r d9b6a8729acd vtprotocolplugins/VideoSource/src/CVSDataProvider.cpp --- 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 -#include -#include -#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 aRateCount2.iRate ) - { - return 1; - } - - if ( aRateCount1.iRate < aRateCount2.iRate ) - { - return -1; - } - - return 0; - } - -// ----------------------------------------------------------------------------- -// TRateCountTIdentityRelationFunc: Used in RArray>"), 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& aSupportedSizes, - const TDesC8& aFormat ) - { - __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameSizes() >>"), RThread().Id().operator TUint())); - RArray 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( TSizeCountTLinearOrderFunc ) ); - if ( err == KErrAlreadyExists ) - { - TInt idx = sizeCountArray.Find( - sizeCount, - TIdentityRelation( - 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& aSupportedRates, - const TDesC8& aFormat, - const TSize& aSize ) - { - __IF_DEBUG(Print(_L("VideoSource[%d]: CVSDataProvider::EnumerateVideoFrameRates() >>"), RThread().Id().operator TUint())); - RArray 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( TRateCountTLinearOrderFunc ) ); - if ( err == KErrAlreadyExists ) - { - TInt idx = rateCountArray.Find( - rateCount, - TIdentityRelation( - 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